Curve Drawing: Add option to use new refit method
This commit is contained in:
parent
2418daede5
commit
a323d8edbf
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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[];
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue