[Bf-blender-cvs] [a323d8e] master: Curve Drawing: Add option to use new refit method

Campbell Barton noreply at git.blender.org
Mon Jul 25 06:59:15 CEST 2016


Commit: a323d8edbfde8140e364df28194bc9e08eb45354
Author: Campbell Barton
Date:   Mon Jul 25 14:14:31 2016 +1000
Branches: master
https://developer.blender.org/rBa323d8edbfde8140e364df28194bc9e08eb45354

Curve Drawing: Add option to use new refit method

===================================================================

M	release/scripts/startup/bl_ui/space_view3d_toolbar.py
M	source/blender/editors/curve/editcurve_paint.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/RNA_enum_types.h
M	source/blender/makesrna/intern/rna_scene.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index b0cc2c6..e9f4d71 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -570,6 +570,7 @@ class VIEW3D_PT_tools_curveedit_options_stroke(View3DPanel, Panel):
         if cps.curve_type == 'BEZIER':
             col.label("Bezier Options:")
             col.prop(cps, "error_threshold")
+            col.prop(cps, "fit_method")
             col.prop(cps, "use_corners_detect")
 
             col = layout.column()
diff --git a/source/blender/editors/curve/editcurve_paint.c b/source/blender/editors/curve/editcurve_paint.c
index ac0dc2a..37d2368 100644
--- a/source/blender/editors/curve/editcurve_paint.c
+++ b/source/blender/editors/curve/editcurve_paint.c
@@ -55,6 +55,8 @@
 #include "RNA_access.h"
 #include "RNA_define.h"
 
+#include "RNA_enum_types.h"
+
 #define USE_SPLINE_FIT
 
 #ifdef USE_SPLINE_FIT
@@ -730,6 +732,11 @@ static void curve_draw_exec_precalc(wmOperator *op)
 	const CurvePaintSettings *cps = &cdd->vc.scene->toolsettings->curve_paint_settings;
 	PropertyRNA *prop;
 
+	prop = RNA_struct_find_property(op->ptr, "fit_method");
+	if (!RNA_property_is_set(op->ptr, prop)) {
+		RNA_property_enum_set(op->ptr, prop, cps->fit_method);
+	}
+
 	prop = RNA_struct_find_property(op->ptr, "corner_angle");
 	if (!RNA_property_is_set(op->ptr, prop)) {
 		const float corner_angle = (cps->flag & CURVE_PAINT_FLAG_CORNERS_DETECT) ? cps->corner_angle : (float)M_PI;
@@ -868,6 +875,7 @@ static int curve_draw_exec(bContext *C, wmOperator *op)
 		unsigned int cubic_spline_len = 0;
 
 		/* error in object local space */
+		const int fit_method = RNA_enum_get(op->ptr, "fit_method");
 		const float error_threshold = RNA_float_get(op->ptr, "error_threshold");
 		const float corner_angle = RNA_float_get(op->ptr, "corner_angle");
 
@@ -894,7 +902,7 @@ static int curve_draw_exec(bContext *C, wmOperator *op)
 		unsigned int *corners = NULL;
 		unsigned int  corners_len = 0;
 
-		if (corner_angle < (float)M_PI) {
+		if ((fit_method == CURVE_PAINT_FIT_METHOD_SPLIT) && (corner_angle < (float)M_PI)) {
 			/* this could be configurable... */
 			const float corner_radius_min = error_threshold / 8;
 			const float corner_radius_max = error_threshold * 2;
@@ -910,12 +918,23 @@ static int curve_draw_exec(bContext *C, wmOperator *op)
 		unsigned int *corners_index = NULL;
 		unsigned int  corners_index_len = 0;
 
-		const int result = curve_fit_cubic_to_points_fl(
-		        coords, stroke_len, dims, error_threshold, CURVE_FIT_CALC_HIGH_QUALIY,
-		        corners, NULL, corners_len,
-		        &cubic_spline, &cubic_spline_len,
-		        NULL,
-		        &corners_index, &corners_index_len);
+		int result;
+		if (fit_method == CURVE_PAINT_FIT_METHOD_REFIT) {
+			result = curve_fit_cubic_to_points_refit_fl(
+			        coords, stroke_len, dims, error_threshold, CURVE_FIT_CALC_HIGH_QUALIY,
+			        NULL, 0, corner_angle,
+			        &cubic_spline, &cubic_spline_len,
+			        NULL,
+			        &corners_index, &corners_index_len);
+		}
+		else {
+			result = curve_fit_cubic_to_points_fl(
+			        coords, stroke_len, dims, error_threshold, CURVE_FIT_CALC_HIGH_QUALIY,
+			        corners, corners_len,
+			        &cubic_spline, &cubic_spline_len,
+			        NULL,
+			        &corners_index, &corners_index_len);
+		}
 
 		MEM_freeN(coords);
 		if (corners) {
@@ -1220,6 +1239,9 @@ void CURVE_OT_draw(wmOperatorType *ot)
 	        0.0001f, 10.0f);
 	RNA_def_property_ui_range(prop, 0.0, 10, 1, 4);
 
+	RNA_def_enum(ot->srna, "fit_method", rna_enum_curve_fit_method_items, CURVE_PAINT_FIT_METHOD_REFIT,
+	             "Fit Method", "");
+
 	prop = RNA_def_float_distance(
 	        ot->srna, "corner_angle", DEG2RADF(70.0f), 0.0f, M_PI, "Corner Angle", "", 0.0f, M_PI);
 	RNA_def_property_subtype(prop, PROP_ANGLE);
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 60bd377..c7578a1 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1273,7 +1273,9 @@ typedef struct CurvePaintSettings {
 	char flag;
 	char depth_mode;
 	char surface_plane;
-	int error_threshold;
+	char fit_method;
+	char pad;
+	short error_threshold;
 	float radius_min, radius_max;
 	float radius_taper_start, radius_taper_end;
 	float surface_offset;
@@ -1288,6 +1290,12 @@ enum {
 	CURVE_PAINT_FLAG_DEPTH_STROKE_OFFSET_ABS    = (1 << 3),
 };
 
+/* CurvePaintSettings.fit_method */
+enum {
+	CURVE_PAINT_FIT_METHOD_REFIT            = 0,
+	CURVE_PAINT_FIT_METHOD_SPLIT            = 1,
+};
+
 /* CurvePaintSettings.depth_mode */
 enum {
 	CURVE_PAINT_PROJECT_CURSOR              = 0,
diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h
index b1048f7..7ae3d55 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -52,6 +52,7 @@ extern EnumPropertyItem rna_enum_proportional_editing_items[];
 extern EnumPropertyItem rna_enum_snap_target_items[];
 extern EnumPropertyItem rna_enum_snap_element_items[];
 extern EnumPropertyItem rna_enum_snap_node_element_items[];
+extern EnumPropertyItem rna_enum_curve_fit_method_items[];
 extern EnumPropertyItem rna_enum_mesh_select_mode_items[];
 extern EnumPropertyItem rna_enum_mesh_delimit_mode_items[];
 extern EnumPropertyItem rna_enum_space_type_items[];
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index d1f8c4e..ed90f14 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -178,6 +178,11 @@ EnumPropertyItem snap_uv_element_items[] = {
 	{0, NULL, 0, NULL, NULL}
 };
 
+EnumPropertyItem rna_enum_curve_fit_method_items[] = {
+	{CURVE_PAINT_FIT_METHOD_REFIT, "REFIT", 0, "Refit", "Incrementally re-fit the curve (high quality)"},
+	{CURVE_PAINT_FIT_METHOD_SPLIT, "SPLIT", 0, "Split", "Split the curve until the tolerance is met (fast)"},
+	{0, NULL, 0, NULL, NULL}};
+
 /* workaround for duplicate enums,
  * have each enum line as a define then conditionally set it or not
  */
@@ -2638,6 +2643,11 @@ static void rna_def_curve_paint_settings(BlenderRNA  *brna)
 	RNA_def_property_range(prop, 1, 100);
 	RNA_def_property_ui_text(prop, "Tolerance", "Allow deviation for a smoother, less precise line");
 
+	prop = RNA_def_property(srna, "fit_method", PROP_ENUM, PROP_PIXEL);
+	RNA_def_property_enum_sdna(prop, NULL, "fit_method");
+	RNA_def_property_enum_items(prop, rna_enum_curve_fit_method_items);
+	RNA_def_property_ui_text(prop, "Method", "Curve fitting method");
+
 	prop = RNA_def_property(srna, "corner_angle", PROP_FLOAT, PROP_ANGLE);
 	RNA_def_property_range(prop, 0, M_PI);
 	RNA_def_property_ui_text(prop, "Corner Angle", "Angles above this are considered corners");




More information about the Bf-blender-cvs mailing list