Curves: add taper mode option

Currently, when a taper object is specified, the radius of the spline is
ignored. This patch adds a new option to control how the taper object
affect the effective radius of the spline. The option allow three modes
of operation:

- Override: The old method. The radius of the spline is ignored and
  overridden.
- Multiply: The radius of the spline is multiplied by the taper radius.
- Add: The radius of the spline is added to the taper radius.

Ref D10779
This commit is contained in:
Omar Emara 2021-03-23 18:26:13 +11:00 committed by Campbell Barton
parent f2f796e623
commit ec97450ac6
5 changed files with 53 additions and 1 deletions

View File

@ -175,6 +175,7 @@ class DATA_PT_geometry_curve(CurveButtonsPanelCurve, Panel):
sub.prop(curve, "extrude")
col.prop(curve, "taper_object")
col.prop(curve, "taper_radius_mode")
if type(curve) is not TextCurve:
# This setting makes no sense for texts, since we have no control over start/end of the bevel object curve.

View File

@ -1650,6 +1650,13 @@ static void do_makeDispListCurveTypes(Depsgraph *depsgraph,
}
radius_factor = displist_calc_taper(depsgraph, scene, cu->taperobj, taper_factor);
if (cu->taper_radius_mode == CU_TAPER_RADIUS_MULTIPLY) {
radius_factor *= bevp->radius;
}
else if (cu->taper_radius_mode == CU_TAPER_RADIUS_ADD) {
radius_factor += bevp->radius;
}
}
if (bevp->split_tag) {

View File

@ -50,6 +50,7 @@
.bevfac2_mapping = CU_BEVFAC_MAP_RESOLU, \
.bevresol = 4, \
.bevel_mode = CU_BEV_MODE_ROUND, \
.taper_radius_mode = CU_TAPER_RADIUS_OVERRIDE, \
}
/** \} */

View File

@ -269,7 +269,12 @@ typedef struct Curve {
char overflow;
char spacemode, align_y;
char bevel_mode;
char _pad[2];
/**
* Determine how the effective radius of the bevel point is computed when a taper object is
* specified. The effective radius is a function of the bevel point radius and the taper radius.
*/
char taper_radius_mode;
char _pad;
/* font part */
short lines;
@ -400,6 +405,16 @@ enum {
CU_BEV_MODE_CURVE_PROFILE = 2,
};
/** #Curve.taper_radius_mode */
enum {
/** Override the radius of the bevel point with the taper radius. */
CU_TAPER_RADIUS_OVERRIDE = 0,
/** Multiply the radius of the bevel point by the taper radius. */
CU_TAPER_RADIUS_MULTIPLY = 1,
/** Add the radius of the bevel point to the taper radius. */
CU_TAPER_RADIUS_ADD = 2,
};
/* Curve.overflow. */
enum {
CU_OVERFLOW_NONE = 0,

View File

@ -1576,6 +1576,25 @@ static void rna_def_curve(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL},
};
static const EnumPropertyItem curve_taper_radius_mode_items[] = {
{CU_TAPER_RADIUS_OVERRIDE,
"OVERRIDE",
0,
"Override",
"Override the radius of the spline point with the taper radius"},
{CU_TAPER_RADIUS_MULTIPLY,
"MULTIPLY",
0,
"Multiply",
"Multiply the radius of the spline point by the taper radius"},
{CU_TAPER_RADIUS_ADD,
"ADD",
0,
"Add",
"Add the radius of the bevel point to the taper radius"},
{0, NULL, 0, NULL, NULL},
};
srna = RNA_def_struct(brna, "Curve", "ID");
RNA_def_struct_ui_text(srna, "Curve", "Curve data-block storing curves, splines and NURBS");
RNA_def_struct_ui_icon(srna, ICON_CURVE_DATA);
@ -1757,6 +1776,15 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Twist Method", "The type of tilt calculation for 3D Curves");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop = RNA_def_property(srna, "taper_radius_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "taper_radius_mode");
RNA_def_property_enum_items(prop, curve_taper_radius_mode_items);
RNA_def_property_ui_text(prop,
"Taper Radius",
"Determine how the effective radius of the spline point is computed "
"when a taper object is specified");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop = RNA_def_property(srna, "bevel_factor_mapping_start", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "bevfac1_mapping");
RNA_def_property_enum_items(prop, bevfac_mapping_items);