Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_nodes.cc
| Show First 20 Lines • Show All 208 Lines • ▼ Show 20 Lines | if (nmd->node_group == nullptr) { | ||||
| return true; | return true; | ||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| class GeometryNodesEvaluator { | class GeometryNodesEvaluator { | ||||
| private: | private: | ||||
| bNodeTree &btree_; | |||||
JacquesLucke: Should be `btree_orig_` or `btree_cow_`. | |||||
| blender::LinearAllocator<> allocator_; | blender::LinearAllocator<> allocator_; | ||||
| Map<const DInputSocket *, GMutablePointer> value_by_input_; | Map<const DInputSocket *, GMutablePointer> value_by_input_; | ||||
| Vector<const DInputSocket *> group_outputs_; | Vector<const DInputSocket *> group_outputs_; | ||||
| blender::nodes::MultiFunctionByNode &mf_by_node_; | blender::nodes::MultiFunctionByNode &mf_by_node_; | ||||
| const blender::nodes::DataTypeConversions &conversions_; | const blender::nodes::DataTypeConversions &conversions_; | ||||
| const PersistentDataHandleMap &handle_map_; | const PersistentDataHandleMap &handle_map_; | ||||
| const Object *self_object_; | const Object *self_object_; | ||||
| const ModifierData *modifier_; | |||||
| Depsgraph *depsgraph_; | Depsgraph *depsgraph_; | ||||
| public: | public: | ||||
| GeometryNodesEvaluator(const Map<const DOutputSocket *, GMutablePointer> &group_input_data, | GeometryNodesEvaluator(bNodeTree &btree, | ||||
| const Map<const DOutputSocket *, GMutablePointer> &group_input_data, | |||||
| Vector<const DInputSocket *> group_outputs, | Vector<const DInputSocket *> group_outputs, | ||||
| blender::nodes::MultiFunctionByNode &mf_by_node, | blender::nodes::MultiFunctionByNode &mf_by_node, | ||||
| const PersistentDataHandleMap &handle_map, | const PersistentDataHandleMap &handle_map, | ||||
| const Object *self_object, | const Object *self_object, | ||||
| const ModifierData *modifier, | |||||
| Depsgraph *depsgraph) | Depsgraph *depsgraph) | ||||
| : group_outputs_(std::move(group_outputs)), | : btree_(btree), | ||||
| group_outputs_(std::move(group_outputs)), | |||||
| mf_by_node_(mf_by_node), | mf_by_node_(mf_by_node), | ||||
| conversions_(blender::nodes::get_implicit_type_conversions()), | conversions_(blender::nodes::get_implicit_type_conversions()), | ||||
| handle_map_(handle_map), | handle_map_(handle_map), | ||||
| self_object_(self_object), | self_object_(self_object), | ||||
| modifier_(modifier), | |||||
| depsgraph_(depsgraph) | depsgraph_(depsgraph) | ||||
| { | { | ||||
| for (auto item : group_input_data.items()) { | for (auto item : group_input_data.items()) { | ||||
| this->forward_to_inputs(*item.key, item.value); | this->forward_to_inputs(*item.key, item.value); | ||||
| } | } | ||||
| } | } | ||||
| Vector<GMutablePointer> execute() | Vector<GMutablePointer> execute() | ||||
| { | { | ||||
| bNodeTree *original_ntree = (bNodeTree *)DEG_get_original_id(&(ID &)btree_); | |||||
| BKE_nodetree_error_messages_clear(original_ntree); | |||||
| Vector<GMutablePointer> results; | Vector<GMutablePointer> results; | ||||
| for (const DInputSocket *group_output : group_outputs_) { | for (const DInputSocket *group_output : group_outputs_) { | ||||
| GMutablePointer result = this->get_input_value(*group_output); | GMutablePointer result = this->get_input_value(*group_output); | ||||
| results.append(result); | results.append(result); | ||||
| } | } | ||||
| for (GMutablePointer value : value_by_input_.values()) { | for (GMutablePointer value : value_by_input_.values()) { | ||||
| value.destruct(); | value.destruct(); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | for (const DInputSocket *input_socket : node.inputs()) { | ||||
| if (input_socket->is_available()) { | if (input_socket->is_available()) { | ||||
| GMutablePointer value = this->get_input_value(*input_socket); | GMutablePointer value = this->get_input_value(*input_socket); | ||||
| node_inputs_map.add_new_direct(input_socket->identifier(), value); | node_inputs_map.add_new_direct(input_socket->identifier(), value); | ||||
| } | } | ||||
| } | } | ||||
| /* Execute the node. */ | /* Execute the node. */ | ||||
| GValueMap<StringRef> node_outputs_map{allocator_}; | GValueMap<StringRef> node_outputs_map{allocator_}; | ||||
| GeoNodeExecParams params{ | GeoNodeExecParams params{btree_, | ||||
| bnode, node_inputs_map, node_outputs_map, handle_map_, self_object_, depsgraph_}; | bnode, | ||||
| node_inputs_map, | |||||
| node_outputs_map, | |||||
| handle_map_, | |||||
| self_object_, | |||||
| modifier_, | |||||
| depsgraph_}; | |||||
| this->execute_node(node, params); | this->execute_node(node, params); | ||||
| /* Forward computed outputs to linked input sockets. */ | /* Forward computed outputs to linked input sockets. */ | ||||
| for (const DOutputSocket *output_socket : node.outputs()) { | for (const DOutputSocket *output_socket : node.outputs()) { | ||||
| if (output_socket->is_available()) { | if (output_socket->is_available()) { | ||||
| GMutablePointer value = node_outputs_map.extract(output_socket->identifier()); | GMutablePointer value = node_outputs_map.extract(output_socket->identifier()); | ||||
| this->forward_to_inputs(*output_socket, value); | this->forward_to_inputs(*output_socket, value); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 602 Lines • ▼ Show 20 Lines | for (const DOutputSocket *socket : remaining_input_sockets) { | ||||
| initialize_group_input(*nmd, handle_map, *socket->bsocket(), cpp_type, value_in); | initialize_group_input(*nmd, handle_map, *socket->bsocket(), cpp_type, value_in); | ||||
| group_inputs.add_new(socket, {cpp_type, value_in}); | group_inputs.add_new(socket, {cpp_type, value_in}); | ||||
| } | } | ||||
| } | } | ||||
| Vector<const DInputSocket *> group_outputs; | Vector<const DInputSocket *> group_outputs; | ||||
| group_outputs.append(&socket_to_compute); | group_outputs.append(&socket_to_compute); | ||||
| GeometryNodesEvaluator evaluator{ | bNodeTree *ntree = tree.btree(); | ||||
| group_inputs, group_outputs, mf_by_node, handle_map, ctx->object, ctx->depsgraph}; | GeometryNodesEvaluator evaluator{*ntree, | ||||
| group_inputs, | |||||
| group_outputs, | |||||
| mf_by_node, | |||||
| handle_map, | |||||
| ctx->object, | |||||
| (ModifierData *)nmd, | |||||
| ctx->depsgraph}; | |||||
| Vector<GMutablePointer> results = evaluator.execute(); | Vector<GMutablePointer> results = evaluator.execute(); | ||||
| BLI_assert(results.size() == 1); | BLI_assert(results.size() == 1); | ||||
| GMutablePointer result = results[0]; | GMutablePointer result = results[0]; | ||||
| GeometrySet output_geometry = std::move(*(GeometrySet *)result.get()); | GeometrySet output_geometry = std::move(*(GeometrySet *)result.get()); | ||||
| return output_geometry; | return output_geometry; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 288 Lines • Show Last 20 Lines | |||||
Should be btree_orig_ or btree_cow_.