Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc
| Show First 20 Lines • Show All 222 Lines • ▼ Show 20 Lines | for (const InstancesComponent *component : src_components) { | ||||
| Span<float3> rotations = component->rotations(); | Span<float3> rotations = component->rotations(); | ||||
| Span<float3> scales = component->scales(); | Span<float3> scales = component->scales(); | ||||
| for (const int i : IndexRange(size)) { | for (const int i : IndexRange(size)) { | ||||
| dst_component.add_instance(instanced_data[i], positions[i], rotations[i], scales[i]); | dst_component.add_instance(instanced_data[i], positions[i], rotations[i], scales[i]); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void join_components(Span<const VolumeComponent *> src_components, GeometrySet &result) | |||||
| { | |||||
| /* Not yet supported. Joining volume grids with the same name requires resampling of at least one | |||||
| * of the grids. The cell size of the resulting volume has to be determined somehow. */ | |||||
| VolumeComponent &dst_component = result.get_component_for_write<VolumeComponent>(); | |||||
| UNUSED_VARS(src_components, dst_component); | |||||
| } | |||||
| template<typename Component> | template<typename Component> | ||||
| static void join_component_type(Span<const GeometrySet *> src_geometry_sets, GeometrySet &result) | static void join_component_type(Span<const GeometrySet *> src_geometry_sets, GeometrySet &result) | ||||
| { | { | ||||
| Vector<const Component *> components; | Vector<const Component *> components; | ||||
| for (const GeometrySet *geometry_set : src_geometry_sets) { | for (const GeometrySet *geometry_set : src_geometry_sets) { | ||||
| const Component *component = geometry_set->get_component_for_read<Component>(); | const Component *component = geometry_set->get_component_for_read<Component>(); | ||||
| if (component != nullptr && !component->is_empty()) { | if (component != nullptr && !component->is_empty()) { | ||||
| components.append(component); | components.append(component); | ||||
| Show All 16 Lines | static void geo_node_join_geometry_exec(GeoNodeExecParams params) | ||||
| GeometrySet geometry_set_b = params.extract_input<GeometrySet>("Geometry_001"); | GeometrySet geometry_set_b = params.extract_input<GeometrySet>("Geometry_001"); | ||||
| GeometrySet geometry_set_result; | GeometrySet geometry_set_result; | ||||
| std::array<const GeometrySet *, 2> src_geometry_sets = {&geometry_set_a, &geometry_set_b}; | std::array<const GeometrySet *, 2> src_geometry_sets = {&geometry_set_a, &geometry_set_b}; | ||||
| join_component_type<MeshComponent>(src_geometry_sets, geometry_set_result); | join_component_type<MeshComponent>(src_geometry_sets, geometry_set_result); | ||||
| join_component_type<PointCloudComponent>(src_geometry_sets, geometry_set_result); | join_component_type<PointCloudComponent>(src_geometry_sets, geometry_set_result); | ||||
| join_component_type<InstancesComponent>(src_geometry_sets, geometry_set_result); | join_component_type<InstancesComponent>(src_geometry_sets, geometry_set_result); | ||||
| join_component_type<VolumeComponent>(src_geometry_sets, geometry_set_result); | |||||
| params.set_output("Geometry", std::move(geometry_set_result)); | params.set_output("Geometry", std::move(geometry_set_result)); | ||||
| } | } | ||||
| } // namespace blender::nodes | } // namespace blender::nodes | ||||
| void register_node_type_geo_join_geometry() | void register_node_type_geo_join_geometry() | ||||
| { | { | ||||
| static bNodeType ntype; | static bNodeType ntype; | ||||
| geo_node_type_base(&ntype, GEO_NODE_JOIN_GEOMETRY, "Join Geometry", NODE_CLASS_GEOMETRY, 0); | geo_node_type_base(&ntype, GEO_NODE_JOIN_GEOMETRY, "Join Geometry", NODE_CLASS_GEOMETRY, 0); | ||||
| node_type_socket_templates(&ntype, geo_node_join_geometry_in, geo_node_join_geometry_out); | node_type_socket_templates(&ntype, geo_node_join_geometry_in, geo_node_join_geometry_out); | ||||
| ntype.geometry_node_execute = blender::nodes::geo_node_join_geometry_exec; | ntype.geometry_node_execute = blender::nodes::geo_node_join_geometry_exec; | ||||
| nodeRegisterType(&ntype); | nodeRegisterType(&ntype); | ||||
| } | } | ||||