Fix #31139: fractal mesh subdivide was only working along normal where previously
it would displace in all directions. Now there's an operator option to control this.
This commit is contained in:
@@ -696,6 +696,7 @@ static BMOpDefine bmo_esubd_def = {
|
||||
{{BMO_OP_SLOT_ELEMENT_BUF, "edges"},
|
||||
{BMO_OP_SLOT_FLT, "smooth"},
|
||||
{BMO_OP_SLOT_FLT, "fractal"},
|
||||
{BMO_OP_SLOT_FLT, "along_normal"},
|
||||
{BMO_OP_SLOT_INT, "numcuts"},
|
||||
{BMO_OP_SLOT_INT, "seed"},
|
||||
{BMO_OP_SLOT_MAPPING, "custompatterns"},
|
||||
|
||||
@@ -98,7 +98,7 @@ extern int bmesh_total_ops;
|
||||
struct Object;
|
||||
|
||||
void BM_mesh_esubdivide(BMesh *bm, const char edge_hflag,
|
||||
float smooth, float fractal,
|
||||
float smooth, float fractal, float along_normal,
|
||||
int numcuts,
|
||||
int seltype, int cornertype,
|
||||
const short use_singleedge, const short use_gridfill,
|
||||
|
||||
@@ -141,23 +141,24 @@ static void alter_co(BMesh *bm, BMVert *v, BMEdge *UNUSED(origed), const SubDPar
|
||||
|
||||
if (params->use_fractal) {
|
||||
float len = len_v3v3(vsta->co, vend->co);
|
||||
float vec2[3] = {0.0f, 0.0f, 0.0f}, co2[3];
|
||||
float normal[3] = {0.0f, 0.0f, 0.0f}, co2[3], base1[3], base2[3];
|
||||
|
||||
fac = params->fractal * len;
|
||||
|
||||
add_v3_v3(vec2, vsta->no);
|
||||
add_v3_v3(vec2, vend->no);
|
||||
mul_v3_fl(vec2, 0.5f);
|
||||
mid_v3_v3v3(normal, vsta->no, vend->no);
|
||||
ortho_basis_v3v3_v3(base1, base2, normal);
|
||||
|
||||
add_v3_v3v3(co2, v->co, params->off);
|
||||
tvec[0] = fac * (BLI_gTurbulence(1.0, co2[0], co2[1], co2[2], 15, 0, 1) - 0.5f);
|
||||
tvec[1] = fac * (BLI_gTurbulence(1.0, co2[0], co2[1], co2[2], 15, 0, 1) - 0.5f);
|
||||
tvec[2] = fac * (BLI_gTurbulence(1.0, co2[0], co2[1], co2[2], 15, 0, 1) - 0.5f);
|
||||
mul_v3_fl(co2, 10.0f);
|
||||
|
||||
mul_v3_v3(vec2, tvec);
|
||||
tvec[0] = fac * (BLI_gTurbulence(1.0, co2[0], co2[1], co2[2], 15, 0, 2) - 0.5f);
|
||||
tvec[1] = fac * (BLI_gTurbulence(1.0, co2[1], co2[0], co2[2], 15, 0, 2) - 0.5f);
|
||||
tvec[2] = fac * (BLI_gTurbulence(1.0, co2[1], co2[2], co2[0], 15, 0, 2) - 0.5f);
|
||||
|
||||
/* add displacement */
|
||||
add_v3_v3v3(co, co, vec2);
|
||||
madd_v3_v3fl(co, normal, tvec[0]);
|
||||
madd_v3_v3fl(co, base1, tvec[1] * (1.0f - params->along_normal));
|
||||
madd_v3_v3fl(co, base2, tvec[2] * (1.0f - params->along_normal));
|
||||
}
|
||||
|
||||
/* apply the new difference to the rest of the shape keys,
|
||||
@@ -687,7 +688,7 @@ void bmo_esubd_exec(BMesh *bm, BMOperator *op)
|
||||
BLI_array_declare(facedata);
|
||||
BLI_array_declare(edges);
|
||||
BLI_array_declare(verts);
|
||||
float smooth, fractal;
|
||||
float smooth, fractal, along_normal;
|
||||
int use_sphere, cornertype, use_singleedge, use_gridfill;
|
||||
int skey, seed, i, j, matched, a, b, numcuts, totesel;
|
||||
|
||||
@@ -697,6 +698,7 @@ void bmo_esubd_exec(BMesh *bm, BMOperator *op)
|
||||
seed = BMO_slot_int_get(op, "seed");
|
||||
smooth = BMO_slot_float_get(op, "smooth");
|
||||
fractal = BMO_slot_float_get(op, "fractal");
|
||||
along_normal = BMO_slot_float_get(op, "along_normal");
|
||||
cornertype = BMO_slot_int_get(op, "quadcornertype");
|
||||
|
||||
use_singleedge = BMO_slot_bool_get(op, "use_singleedge");
|
||||
@@ -754,6 +756,7 @@ void bmo_esubd_exec(BMesh *bm, BMOperator *op)
|
||||
params.smooth = smooth;
|
||||
params.seed = seed;
|
||||
params.fractal = fractal;
|
||||
params.along_normal = along_normal;
|
||||
params.use_smooth = (smooth != 0.0f);
|
||||
params.use_fractal = (fractal != 0.0f);
|
||||
params.use_sphere = use_sphere;
|
||||
@@ -1025,7 +1028,7 @@ void bmo_esubd_exec(BMesh *bm, BMOperator *op)
|
||||
|
||||
/* editmesh-emulating function */
|
||||
void BM_mesh_esubdivide(BMesh *bm, const char edge_hflag,
|
||||
float smooth, float fractal,
|
||||
float smooth, float fractal, float along_normal,
|
||||
int numcuts,
|
||||
int seltype, int cornertype,
|
||||
const short use_singleedge, const short use_gridfill,
|
||||
@@ -1036,13 +1039,13 @@ void BM_mesh_esubdivide(BMesh *bm, const char edge_hflag,
|
||||
/* use_sphere isnt exposed here since its only used for new primitives */
|
||||
BMO_op_initf(bm, &op,
|
||||
"esubd edges=%he "
|
||||
"smooth=%f fractal=%f "
|
||||
"smooth=%f fractal=%f along_normal=%f "
|
||||
"numcuts=%i "
|
||||
"quadcornertype=%i "
|
||||
"use_singleedge=%b use_gridfill=%b "
|
||||
"seed=%i",
|
||||
edge_hflag,
|
||||
smooth, fractal,
|
||||
smooth, fractal, along_normal,
|
||||
numcuts,
|
||||
cornertype,
|
||||
use_singleedge, use_gridfill,
|
||||
|
||||
@@ -31,6 +31,7 @@ typedef struct SubDParams {
|
||||
int numcuts;
|
||||
float smooth;
|
||||
float fractal;
|
||||
float along_normal;
|
||||
//int beauty;
|
||||
short use_smooth;
|
||||
short use_sphere;
|
||||
|
||||
@@ -314,7 +314,7 @@ static void ringsel_finish(bContext *C, wmOperator *op)
|
||||
|
||||
if (lcd->do_cut) {
|
||||
BM_mesh_esubdivide(em->bm, BM_ELEM_SELECT,
|
||||
0.0f, 0.0f,
|
||||
0.0f, 0.0f, 0.0f,
|
||||
cuts,
|
||||
SUBDIV_SELECT_LOOPCUT, SUBD_PATH, 0, FALSE, 0);
|
||||
|
||||
|
||||
@@ -87,6 +87,7 @@ static int edbm_subdivide_exec(bContext *C, wmOperator *op)
|
||||
int cuts = RNA_int_get(op->ptr, "number_cuts");
|
||||
float smooth = 0.292f * RNA_float_get(op->ptr, "smoothness");
|
||||
float fractal = RNA_float_get(op->ptr, "fractal") / 2.5f;
|
||||
float along_normal = RNA_float_get(op->ptr, "fractal_along_normal");
|
||||
|
||||
if (RNA_boolean_get(op->ptr, "quadtri") &&
|
||||
RNA_enum_get(op->ptr, "quadcorner") == SUBD_STRAIGHT_CUT)
|
||||
@@ -95,7 +96,7 @@ static int edbm_subdivide_exec(bContext *C, wmOperator *op)
|
||||
}
|
||||
|
||||
BM_mesh_esubdivide(em->bm, BM_ELEM_SELECT,
|
||||
smooth, fractal,
|
||||
smooth, fractal, along_normal,
|
||||
cuts,
|
||||
SUBDIV_SELECT_ORIG, RNA_enum_get(op->ptr, "quadcorner"),
|
||||
RNA_boolean_get(op->ptr, "quadtri"), TRUE,
|
||||
@@ -143,6 +144,7 @@ void MESH_OT_subdivide(wmOperatorType *ot)
|
||||
"Quad Corner Type", "How to subdivide quad corners (anything other than Straight Cut will prevent ngons)");
|
||||
|
||||
RNA_def_float(ot->srna, "fractal", 0.0f, 0.0f, FLT_MAX, "Fractal", "Fractal randomness factor", 0.0f, 1000.0f);
|
||||
RNA_def_float(ot->srna, "fractal_along_normal", 0.0f, 0.0f, 1.0f, "Along Normal", "Apply fractal displacement along normal only", 0.0f, 1.0f);
|
||||
RNA_def_int(ot->srna, "seed", 0, 0, 10000, "Random Seed", "Seed for the random number generator", 0, 50);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user