diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-07-15 15:18:30 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-07-15 15:23:35 +0300 |
commit | e8f8c13d4b76ba587ef7cf33370b286d4fbd36bc (patch) | |
tree | 371472ae220ad8740b310aaa8f4c5746448302c5 /source/blender/nodes/intern/node_socket.cc | |
parent | 0c062a9e082130212447c2b67e8e16b8a2e622d1 (diff) | |
parent | 44bb73e765a6f79bc14a46449368f83e572d8bad (diff) |
PointCloud: Initial rendering support for Workbenchtmp-pointcloud-render
Also includes outline overlays. Removes the temp overlay drawing
We make the geometry follow camera like billboards this uses less
geometry. Currently we use half octahedron for now. Goal would be
to use icospheres.
This patch also optimize the case when pointcloud has uniform radius.
However we should premultiply the radius prop by the default radius
beforehand to avoid a multiplication on CPU.
Differential Revision: https://developer.blender.org/D8301
Diffstat (limited to 'source/blender/nodes/intern/node_socket.cc')
-rw-r--r-- | source/blender/nodes/intern/node_socket.cc | 113 |
1 files changed, 93 insertions, 20 deletions
diff --git a/source/blender/nodes/intern/node_socket.cc b/source/blender/nodes/intern/node_socket.cc index b23511c3bdb..02124465dda 100644 --- a/source/blender/nodes/intern/node_socket.cc +++ b/source/blender/nodes/intern/node_socket.cc @@ -25,6 +25,8 @@ #include "DNA_node_types.h" +#include "BLI_color.hh" +#include "BLI_float3.hh" #include "BLI_listbase.h" #include "BLI_math.h" #include "BLI_string.h" @@ -32,6 +34,7 @@ #include "BKE_lib_id.h" #include "BKE_node.h" +#include "BKE_node_tree_multi_function.hh" #include "RNA_access.h" #include "RNA_types.h" @@ -510,35 +513,105 @@ static bNodeSocketType *make_socket_type_control_flow(int type) return stype; } +static bNodeSocketType *make_socket_type_bool() +{ + bNodeSocketType *socktype = make_standard_socket_type(SOCK_BOOLEAN, PROP_NONE); + socktype->get_mf_data_type = []() { return blender::fn::MFDataType::ForSingle<bool>(); }; + socktype->expand_in_mf_network = [](blender::bke::SocketMFNetworkBuilder &builder) { + bool value = builder.socket_default_value<bNodeSocketValueBoolean>()->value; + builder.set_constant_value(value); + }; + return socktype; +} + +static bNodeSocketType *make_socket_type_float(PropertySubType subtype) +{ + bNodeSocketType *socktype = make_standard_socket_type(SOCK_FLOAT, subtype); + socktype->get_mf_data_type = []() { return blender::fn::MFDataType::ForSingle<float>(); }; + socktype->expand_in_mf_network = [](blender::bke::SocketMFNetworkBuilder &builder) { + float value = builder.socket_default_value<bNodeSocketValueFloat>()->value; + builder.set_constant_value(value); + }; + return socktype; +} + +static bNodeSocketType *make_socket_type_int(PropertySubType subtype) +{ + bNodeSocketType *socktype = make_standard_socket_type(SOCK_INT, subtype); + socktype->get_mf_data_type = []() { return blender::fn::MFDataType::ForSingle<int>(); }; + socktype->expand_in_mf_network = [](blender::bke::SocketMFNetworkBuilder &builder) { + int value = builder.socket_default_value<bNodeSocketValueInt>()->value; + builder.set_constant_value(value); + }; + return socktype; +} + +static bNodeSocketType *make_socket_type_vector(PropertySubType subtype) +{ + bNodeSocketType *socktype = make_standard_socket_type(SOCK_VECTOR, subtype); + socktype->get_mf_data_type = []() { + return blender::fn::MFDataType::ForSingle<blender::float3>(); + }; + socktype->expand_in_mf_network = [](blender::bke::SocketMFNetworkBuilder &builder) { + blender::float3 value = builder.socket_default_value<bNodeSocketValueVector>()->value; + builder.set_constant_value(value); + }; + return socktype; +} + +static bNodeSocketType *make_socket_type_rgba() +{ + bNodeSocketType *socktype = make_standard_socket_type(SOCK_RGBA, PROP_NONE); + socktype->get_mf_data_type = []() { + return blender::fn::MFDataType::ForSingle<blender::Color4f>(); + }; + socktype->expand_in_mf_network = [](blender::bke::SocketMFNetworkBuilder &builder) { + blender::Color4f value = builder.socket_default_value<bNodeSocketValueRGBA>()->value; + builder.set_constant_value(value); + }; + return socktype; +} + +static bNodeSocketType *make_socket_type_string() +{ + bNodeSocketType *socktype = make_standard_socket_type(SOCK_STRING, PROP_NONE); + socktype->get_mf_data_type = []() { return blender::fn::MFDataType::ForSingle<std::string>(); }; + socktype->expand_in_mf_network = [](blender::bke::SocketMFNetworkBuilder &builder) { + std::string value = builder.socket_default_value<bNodeSocketValueString>()->value; + builder.set_constant_value(value); + }; + return socktype; +} + void register_standard_node_socket_types(void) { /* draw callbacks are set in drawnode.c to avoid bad-level calls */ - nodeRegisterSocketType(make_standard_socket_type(SOCK_FLOAT, PROP_NONE)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_FLOAT, PROP_UNSIGNED)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_FLOAT, PROP_PERCENTAGE)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_FLOAT, PROP_FACTOR)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_FLOAT, PROP_ANGLE)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_FLOAT, PROP_TIME)); + nodeRegisterSocketType(make_socket_type_float(PROP_NONE)); + nodeRegisterSocketType(make_socket_type_float(PROP_UNSIGNED)); + nodeRegisterSocketType(make_socket_type_float(PROP_PERCENTAGE)); + nodeRegisterSocketType(make_socket_type_float(PROP_FACTOR)); + nodeRegisterSocketType(make_socket_type_float(PROP_ANGLE)); + nodeRegisterSocketType(make_socket_type_float(PROP_TIME)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_INT, PROP_NONE)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_INT, PROP_UNSIGNED)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_INT, PROP_PERCENTAGE)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_INT, PROP_FACTOR)); + nodeRegisterSocketType(make_socket_type_int(PROP_NONE)); + nodeRegisterSocketType(make_socket_type_int(PROP_UNSIGNED)); + nodeRegisterSocketType(make_socket_type_int(PROP_PERCENTAGE)); + nodeRegisterSocketType(make_socket_type_int(PROP_FACTOR)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_BOOLEAN, PROP_NONE)); + nodeRegisterSocketType(make_socket_type_bool()); - nodeRegisterSocketType(make_standard_socket_type(SOCK_VECTOR, PROP_NONE)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_VECTOR, PROP_TRANSLATION)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_VECTOR, PROP_DIRECTION)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_VECTOR, PROP_VELOCITY)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_VECTOR, PROP_ACCELERATION)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_VECTOR, PROP_EULER)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_VECTOR, PROP_XYZ)); + nodeRegisterSocketType(make_socket_type_vector(PROP_NONE)); + nodeRegisterSocketType(make_socket_type_vector(PROP_TRANSLATION)); + nodeRegisterSocketType(make_socket_type_vector(PROP_DIRECTION)); + nodeRegisterSocketType(make_socket_type_vector(PROP_VELOCITY)); + nodeRegisterSocketType(make_socket_type_vector(PROP_ACCELERATION)); + nodeRegisterSocketType(make_socket_type_vector(PROP_EULER)); + nodeRegisterSocketType(make_socket_type_vector(PROP_XYZ)); - nodeRegisterSocketType(make_standard_socket_type(SOCK_RGBA, PROP_NONE)); + nodeRegisterSocketType(make_socket_type_rgba()); - nodeRegisterSocketType(make_standard_socket_type(SOCK_STRING, PROP_NONE)); + nodeRegisterSocketType(make_socket_type_string()); nodeRegisterSocketType(make_standard_socket_type(SOCK_SHADER, PROP_NONE)); |