[Bf-blender-cvs] [e43428eba37] geometry-nodes-curve-support: Geometry Nodes Curves: Add more structure for the sample points node
Hans Goudey
noreply at git.blender.org
Mon Apr 19 01:50:55 CEST 2021
Commit: e43428eba371d8933e5f1b8f826b743572071758
Author: Hans Goudey
Date: Sun Apr 18 18:20:24 2021 -0500
Branches: geometry-nodes-curve-support
https://developer.blender.org/rBe43428eba371d8933e5f1b8f826b743572071758
Geometry Nodes Curves: Add more structure for the sample points node
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_curve_sample_points.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_sample_points.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_sample_points.cc
index 69a87d891de..b5878b04aed 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_sample_points.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_sample_points.cc
@@ -15,6 +15,7 @@
*/
#include "BKE_derived_curve.hh"
+#include "BKE_pointcloud.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -64,50 +65,39 @@ static void geo_node_curve_sample_points_update(bNodeTree *UNUSED(ntree), bNode
namespace blender::nodes {
-// /* Set the location for the first point. */
-// r_samples[0].x = profile->table[0].x;
-// r_samples[0].y = profile->table[0].y;
-
-// /* Travel along the path, recording the locations of segments as we pass them. */
-// float segment_left = segment_length;
-// for (int i = 1; i < n_segments; i++) {
-// /* Travel over all of the points that fit inside this segment. */
-// while (distance_to_next_table_point < segment_left) {
-// length_travelled += distance_to_next_table_point;
-// segment_left -= distance_to_next_table_point;
-// i_table++;
-// distance_to_next_table_point = curveprofile_distance_to_next_table_point(profile, i_table);
-// distance_to_previous_table_point = 0.0f;
-// }
-// /* We're at the last table point that fits inside the current segment, use interpolation. */
-// float factor = (distance_to_previous_table_point + segment_left) /
-// (distance_to_previous_table_point + distance_to_next_table_point);
-// r_samples[i].x = interpf(profile->table[i_table + 1].x, profile->table[i_table].x, factor);
-// r_samples[i].y = interpf(profile->table[i_table + 1].y, profile->table[i_table].y, factor);
-// BLI_assert(factor <= 1.0f && factor >= 0.0f);
-// #ifdef DEBUG_CURVEPROFILE_EVALUATE
-// printf("segment_left: %.3f\n", segment_left);
-// printf("i_table: %d\n", i_table);
-// printf("distance_to_previous_table_point: %.3f\n", distance_to_previous_table_point);
-// printf("distance_to_next_table_point: %.3f\n", distance_to_next_table_point);
-// printf("Interpolating with factor %.3f from (%.3f, %.3f) to (%.3f, %.3f)\n\n",
-// factor,
-// profile->table[i_table].x,
-// profile->table[i_table].y,
-// profile->table[i_table + 1].x,
-// profile->table[i_table + 1].y);
-// #endif
-
-// /* We sampled in between this table point and the next, so the next travel step is smaller. */
-// distance_to_next_table_point -= segment_left;
-// distance_to_previous_table_point += segment_left;
-// length_travelled += segment_left;
-// segment_left = segment_length;
-// }
+static void sample_points_from_spline(const Spline &spline,
+ const int offset,
+ const float sample_length,
+ PointCloudComponent &point_component)
+{
+}
+
+static Array<int> get_result_point_offsets(const DCurve &curve,
+ const GeometryNodeCurveSamplePointsMode mode,
+ const int count,
+ const float length)
+{
+ Array<int> offsets(curve.splines.size() + 1);
+
+ if (mode == GEO_NODE_CURVE_SAMPLE_POINTS_COUNT) {
+ for (const int i : curve.splines.index_range()) {
+ offsets[i] = count * i;
+ }
+ offsets.last() = curve.splines.size() * count;
+ }
+ else {
+ int offset = 0;
+ for (const int i : curve.splines.index_range()) {
+ offsets[i] = offset;
+ offset += curve.splines[i]->length() / length;
+ }
+ offsets.last() = offset;
+ }
+}
static void geo_node_curve_sample_points_exec(GeoNodeExecParams params)
{
- GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
+ const GeometrySet input_geometry_set = params.extract_input<GeometrySet>("Curve");
const bNode &node = params.node();
const NodeGeometryCurveSamplePoints &node_storage = *(const NodeGeometryCurveSamplePoints *)
@@ -115,27 +105,37 @@ static void geo_node_curve_sample_points_exec(GeoNodeExecParams params)
const GeometryNodeCurveSamplePointsMode mode = (GeometryNodeCurveSamplePointsMode)
node_storage.mode;
- params.error_message_add(NodeWarningType::Info, "The node doesn't do anything yet");
-
- if (!geometry_set.has_curve()) {
- params.set_output("Points", geometry_set);
+ if (!input_geometry_set.has_curve()) {
+ params.set_output("Points", GeometrySet());
}
- const DCurve &curve = *geometry_set.get_curve_for_read();
+ const DCurve &curve = *input_geometry_set.get_curve_for_read();
- switch (mode) {
- case GEO_NODE_CURVE_SAMPLE_POINTS_COUNT: {
- break;
- }
- case GEO_NODE_CURVE_SAMPLE_POINTS_LENGTH: {
- break;
+ const int count = (mode == GEO_NODE_CURVE_SAMPLE_POINTS_COUNT) ?
+ params.extract_input<int>("Count") :
+ 0;
+ const float length = (mode == GEO_NODE_CURVE_SAMPLE_POINTS_LENGTH) ?
+ params.extract_input<float>("Length") :
+ 0.0f;
+
+ Array<int> offsets = get_result_point_offsets(curve, mode, count, length);
+
+ PointCloud *pointcloud = BKE_pointcloud_new_nomain(offsets.last());
+ GeometrySet result_geometry_set = GeometrySet::create_with_pointcloud(pointcloud);
+ PointCloudComponent &point_component =
+ result_geometry_set.get_component_for_write<PointCloudComponent>();
+
+ if (mode == GEO_NODE_CURVE_SAMPLE_POINTS_COUNT) {
+ const int count = params.extract_input<int>("Count");
+ for (const int i : curve.splines.index_range()) {
+ Spline &spline = *curve.splines[i];
+ sample_points_from_spline(spline, point_component, offsets[i], spline.length() / count);
}
- default:
- BLI_assert_unreachable();
- break;
+ }
+ else {
}
- params.set_output("Geometry", geometry_set);
+ params.set_output("Geometry", result_geometry_set);
}
} // namespace blender::nodes
More information about the Bf-blender-cvs
mailing list