[Bf-blender-cvs] [425614558df] temp-modifiers-instancing: initial object socket support
Jacques Lucke
noreply at git.blender.org
Tue Nov 10 16:39:22 CET 2020
Commit: 425614558df998a2310031583454567b52efa9ce
Author: Jacques Lucke
Date: Tue Nov 10 16:36:01 2020 +0100
Branches: temp-modifiers-instancing
https://developer.blender.org/rB425614558df998a2310031583454567b52efa9ce
initial object socket support
===================================================================
M source/blender/blenkernel/BKE_geometry_set.h
M source/blender/blenkernel/intern/object_dupli.c
M source/blender/makesdna/DNA_modifier_types.h
M source/blender/makesrna/intern/rna_modifier.c
M source/blender/modifiers/intern/MOD_nodes.cc
M source/blender/nodes/NOD_derived_node_tree.hh
M source/blender/nodes/NOD_geometry_exec.hh
M source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
M source/blender/nodes/intern/derived_node_tree.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_geometry_set.h b/source/blender/blenkernel/BKE_geometry_set.h
index f2414a941cf..be36ab47f85 100644
--- a/source/blender/blenkernel/BKE_geometry_set.h
+++ b/source/blender/blenkernel/BKE_geometry_set.h
@@ -27,7 +27,6 @@ extern "C" {
struct Object;
typedef struct GeometrySetC GeometrySetC;
-typedef struct InstancesComponentC InstancesComponentC;
void BKE_geometry_set_user_add(GeometrySetC *geometry_set_c);
void BKE_geometry_set_user_remove(GeometrySetC *geometry_set_c);
diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c
index a64858287c7..4da05a39f02 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -820,6 +820,9 @@ static void make_duplis_instances_component(const DupliContext *ctx)
for (int i = 0; i < amount; i++) {
Object *object = objects[i];
+ if (object == NULL) {
+ continue;
+ }
float mat[4][4];
unit_m4(mat);
copy_v3_v3(mat[3], positions[i]);
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 7386665381c..d7ad1d59002 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -2229,7 +2229,6 @@ typedef struct NodesModifierData {
ModifierData modifier;
struct bNodeTree *node_group;
struct NodesModifierSettings settings;
- struct Object *instance_object_temp;
} NodesModifierData;
typedef struct MeshToVolumeModifierData {
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 66cf1ea4782..349b6327ecb 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -6965,11 +6965,6 @@ static void rna_def_modifier_nodes(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_ui_text(prop, "Settings", "Settings that are passed into the node group");
- prop = RNA_def_property(srna, "instance_object_temp", PROP_POINTER, PROP_NONE);
- RNA_def_property_ui_text(prop, "Instance Object Temp", "Object to instance");
- RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
- RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
-
RNA_define_lib_overridable(false);
rna_def_modifier_nodes_settings(brna);
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 1e1bbfb55f1..3f622dee782 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -89,10 +89,6 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
if (nmd->node_group != nullptr) {
DEG_add_node_tree_relation(ctx->node, nmd->node_group, "Nodes Modifier");
}
- if (nmd->instance_object_temp) {
- DEG_add_object_relation(
- ctx->node, nmd->instance_object_temp, DEG_OB_COMP_GEOMETRY, "nodes modifier");
- }
/* TODO: Add relations for IDs in settings. */
}
@@ -101,7 +97,6 @@ static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *u
{
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
walk(userData, ob, (ID **)&nmd->node_group, IDWALK_CB_USER);
- walk(userData, ob, (ID **)&nmd->instance_object_temp, IDWALK_CB_USER);
struct ForeachSettingData {
IDWalkFunc walk;
@@ -142,14 +137,17 @@ class GeometryNodesEvaluator {
Vector<const DInputSocket *> group_outputs_;
MultiFunctionByNode &mf_by_node_;
const DataTypeConversions &conversions_;
+ const PersistentDataHandleMap &handle_map_;
public:
GeometryNodesEvaluator(const Map<const DOutputSocket *, GMutablePointer> &group_input_data,
Vector<const DInputSocket *> group_outputs,
- MultiFunctionByNode &mf_by_node)
+ MultiFunctionByNode &mf_by_node,
+ const PersistentDataHandleMap &handle_map)
: group_outputs_(std::move(group_outputs)),
mf_by_node_(mf_by_node),
- conversions_(get_implicit_type_conversions())
+ conversions_(get_implicit_type_conversions()),
+ handle_map_(handle_map)
{
for (auto item : group_input_data.items()) {
this->forward_to_inputs(*item.key, item.value);
@@ -187,17 +185,11 @@ class GeometryNodesEvaluator {
if (total_inputs == 0) {
/* The input is not connected, use the value from the socket itself. */
- bNodeSocket &bsocket = *socket_to_compute.bsocket();
- void *buffer = allocator_.allocate(type.size(), type.alignment());
- socket_cpp_value_get(bsocket, buffer);
- return GMutablePointer{type, buffer};
+ return get_unlinked_input_value(socket_to_compute);
}
if (from_group_inputs.size() == 1) {
/* The input gets its value from the input of a group that is not further connected. */
- bNodeSocket &bsocket = *from_group_inputs[0]->bsocket();
- void *buffer = allocator_.allocate(type.size(), type.alignment());
- socket_cpp_value_get(bsocket, buffer);
- return GMutablePointer{type, buffer};
+ return get_unlinked_input_value(socket_to_compute);
}
/* Compute the socket now. */
@@ -222,7 +214,7 @@ class GeometryNodesEvaluator {
/* Execute the node. */
GValueMap<StringRef> node_outputs_map{allocator_};
- GeoNodeInputs node_inputs{bnode, node_inputs_map};
+ GeoNodeInputs node_inputs{bnode, node_inputs_map, handle_map_};
GeoNodeOutputs node_outputs{bnode, node_outputs_map};
this->execute_node(node, node_inputs, node_outputs);
@@ -322,6 +314,30 @@ class GeometryNodesEvaluator {
}
}
}
+
+ GMutablePointer get_unlinked_input_value(const DInputSocket &socket)
+ {
+ bNodeSocket *bsocket;
+ if (socket.linked_group_inputs().size() == 0) {
+ bsocket = socket.bsocket();
+ }
+ else {
+ bsocket = socket.linked_group_inputs()[0]->bsocket();
+ }
+ const CPPType &type = *socket_cpp_type_get(*socket.typeinfo());
+ void *buffer = allocator_.allocate(type.size(), type.alignment());
+
+ if (bsocket->type == SOCK_OBJECT) {
+ Object *object = ((bNodeSocketValueObject *)bsocket->default_value)->value;
+ PersistentObjectHandle object_handle = handle_map_.lookup(object);
+ new (buffer) PersistentObjectHandle(object_handle);
+ }
+ else {
+ socket_cpp_value_get(*bsocket, buffer);
+ }
+
+ return {type, buffer};
+ }
};
/**
@@ -642,6 +658,23 @@ static void initialize_group_input(NodesModifierData &nmd,
property_type->init_cpp_value(*property, r_value);
}
+static void fill_data_handle_map(const DerivedNodeTree &tree, PersistentDataHandleMap &handle_map)
+{
+ int current_handle = 0;
+ for (const NodeTreeRef *tree_ref : tree.used_node_tree_refs()) {
+ for (const SocketRef *socket_ref : tree_ref->sockets()) {
+ const bNodeSocket *bsocket = socket_ref->bsocket();
+ if (bsocket->type == SOCK_OBJECT) {
+ Object *object = ((bNodeSocketValueObject *)bsocket->default_value)->value;
+ if (object != nullptr) {
+ handle_map.add(current_handle, object->id);
+ current_handle++;
+ }
+ }
+ }
+ }
+}
+
/**
* Evaluate a node group to compute the output geometry.
* Currently, this uses a fairly basic and inefficient algorithm that might compute things more
@@ -684,7 +717,10 @@ static GeometrySetPtr compute_geometry(const DerivedNodeTree &tree,
Vector<const DInputSocket *> group_outputs;
group_outputs.append(&socket_to_compute);
- GeometryNodesEvaluator evaluator{group_inputs, group_outputs, mf_by_node};
+ PersistentDataHandleMap handle_map;
+ fill_data_handle_map(tree, handle_map);
+
+ GeometryNodesEvaluator evaluator{group_inputs, group_outputs, mf_by_node, handle_map};
Vector<GMutablePointer> results = evaluator.execute();
BLI_assert(results.size() == 1);
GMutablePointer result = results[0];
@@ -789,21 +825,8 @@ static GeometrySetC *modifyPointCloud(ModifierData *md,
const ModifierEvalContext *ctx,
GeometrySetC *geometry_set_c)
{
- NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
-
GeometrySetPtr input_geometry_set = unwrap(geometry_set_c);
GeometrySetPtr output_geometry_set = modifyGeometry(md, ctx, std::move(input_geometry_set));
-
- make_geometry_set_mutable(output_geometry_set);
- InstancesComponent &component =
- output_geometry_set->get_component_for_write<InstancesComponent>();
- Vector<float3> positions;
- positions.append({1, 2, 3});
- positions.append({-1, 2, 3});
- positions.append({-1, -2, 3});
- positions.append({-1, -2, -3});
- component.replace(positions, nmd->instance_object_temp);
-
return wrap(output_geometry_set.release());
}
@@ -845,7 +868,6 @@ static void panel_draw(const bContext *UNUSED(C), Panel *panel)
uiLayoutSetPropDecorate(layout, false);
uiItemR(layout, ptr, "node_group", 0, nullptr, ICON_MESH_DATA);
- uiItemR(layout, ptr, "instance_object_temp", 0, nullptr, ICON_NONE);
if (nmd->node_group != nullptr && nmd->settings.properties != nullptr) {
PointerRNA settings_ptr;
diff --git a/source/blender/nodes/NOD_derived_node_tree.hh b/source/blender/nodes/NOD_derived_node_tree.hh
index 1a9f223cf6c..6166df6dc61 100644
--- a/source/blender/nodes/NOD_derived_node_tree.hh
+++ b/source/blender/nodes/NOD_derived_node_tree.hh
@@ -31,6 +31,8 @@
#include "NOD_node_tree_ref.hh"
+#include "BLI_vector_set.hh"
+
namespace blender::nodes {
class DSocket;
@@ -184,6 +186,7 @@ class DerivedNodeTree : NonCopyable, NonMovable {
Vector<DOutputSocket *> output_sockets_;
MultiValueMap<const bNodeType *, DNode *> nodes_by_type_;
+ VectorSet<const NodeTreeRef *> used_node_tree_refs_;
public:
DerivedNodeTree(bNodeTree *btree, NodeTreeRefMap &node_tree_refs);
@@ -199,6 +202,8 @@ class DerivedNodeTree : NonCopyable, NonMovable {
Span<const DGroupInput *> group_inputs() const;
+ Span<const NodeTreeRef *> used_node_tree_refs() const;
+
std::string to
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list