Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2012-05-03 14:14:08 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2012-05-03 14:14:08 +0400
commit3ee4be913bbf475ae7ae3af0df7e47568efbadbe (patch)
tree19cfc3a5efd27328f6fb1b58bffe2cbb30373924 /source/blender/bmesh
parent949de4688d0626578ac4f0521117a0582de5de9b (diff)
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.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r--source/blender/bmesh/intern/bmesh_opdefines.c1
-rw-r--r--source/blender/bmesh/intern/bmesh_operators.h2
-rw-r--r--source/blender/bmesh/operators/bmo_subdivide.c29
-rw-r--r--source/blender/bmesh/operators/bmo_subdivide.h1
4 files changed, 19 insertions, 14 deletions
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c
index 2ff28aee191..b5e6d7e1f68 100644
--- a/source/blender/bmesh/intern/bmesh_opdefines.c
+++ b/source/blender/bmesh/intern/bmesh_opdefines.c
@@ -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"},
diff --git a/source/blender/bmesh/intern/bmesh_operators.h b/source/blender/bmesh/intern/bmesh_operators.h
index f4db13e2777..b0a647b7009 100644
--- a/source/blender/bmesh/intern/bmesh_operators.h
+++ b/source/blender/bmesh/intern/bmesh_operators.h
@@ -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,
diff --git a/source/blender/bmesh/operators/bmo_subdivide.c b/source/blender/bmesh/operators/bmo_subdivide.c
index d96d0f6c74d..736ce3bc033 100644
--- a/source/blender/bmesh/operators/bmo_subdivide.c
+++ b/source/blender/bmesh/operators/bmo_subdivide.c
@@ -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,
diff --git a/source/blender/bmesh/operators/bmo_subdivide.h b/source/blender/bmesh/operators/bmo_subdivide.h
index cc6ced8bfaa..d4b926b9275 100644
--- a/source/blender/bmesh/operators/bmo_subdivide.h
+++ b/source/blender/bmesh/operators/bmo_subdivide.h
@@ -31,6 +31,7 @@ typedef struct SubDParams {
int numcuts;
float smooth;
float fractal;
+ float along_normal;
//int beauty;
short use_smooth;
short use_sphere;