Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCian Jinks <cjinks99@gmail.com>2021-09-22 17:09:31 +0300
committerCian Jinks <cjinks99@gmail.com>2021-09-22 17:09:31 +0300
commite734491048ef2436af41e272b8900f20785ecbe6 (patch)
tree8cee3fc068c782c0ba8cb9a581e768968c565569 /source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc
parentf21cd0881948f6eaf16af0b354cd904df7407bda (diff)
parent204b01a254ac2445fea217e5211b2ed6aef631ca (diff)
Merge branch 'master' into soc-2021-knife-toolssoc-2021-knife-tools
Diffstat (limited to 'source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc')
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc44
1 files changed, 31 insertions, 13 deletions
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc
index d8f40b0a0df..8de2975f9b0 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc
@@ -124,37 +124,55 @@ static Mesh *cdt_to_mesh(const blender::meshintersect::CDT_result<double> &resul
return mesh;
}
-static Mesh *curve_fill_calculate(GeoNodeExecParams &params, const CurveComponent &component)
+static void curve_fill_calculate(GeometrySet &geometry_set, const GeometryNodeCurveFillMode mode)
{
- const CurveEval &curve = *component.get_for_read();
- if (curve.splines().size() == 0) {
- return nullptr;
+ if (!geometry_set.has_curve()) {
+ return;
}
- const NodeGeometryCurveFill &storage = *(const NodeGeometryCurveFill *)params.node().storage;
- const GeometryNodeCurveFillMode mode = (GeometryNodeCurveFillMode)storage.mode;
+ const CurveEval &curve = *geometry_set.get_curve_for_read();
+ if (curve.splines().is_empty()) {
+ geometry_set.replace_curve(nullptr);
+ return;
+ }
const CDT_output_type output_type = (mode == GEO_NODE_CURVE_FILL_MODE_NGONS) ?
CDT_CONSTRAINTS_VALID_BMESH_WITH_HOLES :
CDT_INSIDE_WITH_HOLES;
const blender::meshintersect::CDT_result<double> results = do_cdt(curve, output_type);
- return cdt_to_mesh(results);
+ Mesh *mesh = cdt_to_mesh(results);
+
+ geometry_set.replace_mesh(mesh);
+ geometry_set.replace_curve(nullptr);
}
static void geo_node_curve_fill_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
- geometry_set = bke::geometry_set_realize_instances(geometry_set);
- if (!geometry_set.has_curve()) {
- params.set_output("Mesh", GeometrySet());
+ const NodeGeometryCurveFill &storage = *(const NodeGeometryCurveFill *)params.node().storage;
+ const GeometryNodeCurveFillMode mode = (GeometryNodeCurveFillMode)storage.mode;
+
+ if (geometry_set.has_instances()) {
+ InstancesComponent &instances = geometry_set.get_component_for_write<InstancesComponent>();
+ instances.ensure_geometry_instances();
+
+ threading::parallel_for(IndexRange(instances.references_amount()), 16, [&](IndexRange range) {
+ for (int i : range) {
+ GeometrySet &geometry_set = instances.geometry_set_from_reference(i);
+ geometry_set = bke::geometry_set_realize_instances(geometry_set);
+ curve_fill_calculate(geometry_set, mode);
+ }
+ });
+
+ params.set_output("Mesh", std::move(geometry_set));
return;
}
- Mesh *mesh = curve_fill_calculate(params,
- *geometry_set.get_component_for_read<CurveComponent>());
- params.set_output("Mesh", GeometrySet::create_with_mesh(mesh));
+ curve_fill_calculate(geometry_set, mode);
+
+ params.set_output("Mesh", std::move(geometry_set));
}
} // namespace blender::nodes