[Bf-blender-cvs] [d165b13ee40] fracture_modifier: added override with particle size option to mball remesher
Martin Felke
noreply at git.blender.org
Fri Dec 29 21:54:14 CET 2017
Commit: d165b13ee40d63c9a1acc5fdfa4b84d82a62000b
Author: Martin Felke
Date: Fri Dec 29 21:54:02 2017 +0100
Branches: fracture_modifier
https://developer.blender.org/rBd165b13ee40d63c9a1acc5fdfa4b84d82a62000b
added override with particle size option to mball remesher
===================================================================
M source/blender/blenkernel/BKE_mball_tessellate.h
M source/blender/blenkernel/intern/mball_tessellate.c
M source/blender/makesdna/DNA_modifier_types.h
M source/blender/makesrna/intern/rna_modifier.c
M source/blender/modifiers/intern/MOD_remesh.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_mball_tessellate.h b/source/blender/blenkernel/BKE_mball_tessellate.h
index a554cc5f3c9..5109633c28a 100644
--- a/source/blender/blenkernel/BKE_mball_tessellate.h
+++ b/source/blender/blenkernel/BKE_mball_tessellate.h
@@ -35,7 +35,8 @@ void BKE_mball_polygonize(
void BKE_mball_cubeTable_free(void);
-struct DerivedMesh* BKE_repolygonize_dm(struct DerivedMesh *dm, float thresh, float basesize[3], float wiresize, float rendersize, bool render);
+struct DerivedMesh* BKE_repolygonize_dm(struct DerivedMesh *dm, float thresh, float basesize[3], float wiresize,
+ float rendersize, bool render, bool override_size);
void BKE_dm_from_metaball(struct DispList *dl, struct DerivedMesh *dm);
diff --git a/source/blender/blenkernel/intern/mball_tessellate.c b/source/blender/blenkernel/intern/mball_tessellate.c
index 21f73d2d931..e20616e0b17 100644
--- a/source/blender/blenkernel/intern/mball_tessellate.c
+++ b/source/blender/blenkernel/intern/mball_tessellate.c
@@ -1330,23 +1330,33 @@ void BKE_mball_polygonize(EvaluationContext *eval_ctx, Scene *scene, Object *ob,
freepolygonize(&process);
}
-static void init_meta_dm(PROCESS* process, DerivedMesh *dm, float stiffness, float radius, float size[3])
+static void init_meta_dm(PROCESS* process, DerivedMesh *dm, float stiffness, float radius, float size[3], bool override_size)
{
float quat[4];
unsigned int i;
int totvert = dm->getNumVerts(dm), j;
MVert* mvert = dm->getVertArray(dm);
+ float* psize = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "psize");
unit_qt(quat);
/* make main array */
for (j = 0; j < totvert; j++, mvert++)
{
+ MetaElem *new_ml;
+
//float size[3] = {1.0f, 1.0f, 1.0f};
float expx, expy, expz;
float tempmin[3], tempmax[3];
+ float sz[3];
- MetaElem *new_ml;
+ if (psize != NULL && psize[j] > 0.0f && override_size)
+ {
+ mul_v3_v3fl(sz, size, psize[j]);
+ }
+ else {
+ copy_v3_v3(sz, size);
+ }
/* make a copy because of duplicates */
new_ml = BLI_memarena_alloc(process->pgn_elements, sizeof(MetaElem));
@@ -1378,7 +1388,9 @@ static void init_meta_dm(PROCESS* process, DerivedMesh *dm, float stiffness, flo
/* Rotation of MetaElem is stored in quat */
//quat_to_mat4(rot, quat);
- loc_quat_size_to_mat4((float(*)[4])new_ml->mat, mvert->co, quat, size);
+
+
+ loc_quat_size_to_mat4((float(*)[4])new_ml->mat, mvert->co, quat, sz);
invert_m4_m4((float(*)[4])new_ml->imat,(float(*)[4])new_ml->mat);
#if 0
@@ -1530,7 +1542,8 @@ void BKE_dm_from_metaball(DispList *dl, DerivedMesh *dm)
}
-DerivedMesh* BKE_repolygonize_dm(DerivedMesh *dm, float thresh, float basesize[3], float wiresize, float rendersize, bool render)
+DerivedMesh* BKE_repolygonize_dm(DerivedMesh *dm, float thresh, float basesize[3], float wiresize, float rendersize,
+ bool render, bool override_size)
{
DerivedMesh *result = NULL;
DispList *dl;
@@ -1561,7 +1574,7 @@ DerivedMesh* BKE_repolygonize_dm(DerivedMesh *dm, float thresh, float basesize[3
process.pgn_elements = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "Metaball memarena");
/* initialize from DM */
- init_meta_dm(&process, dm, 2.0f, 2.0f, basesize);
+ init_meta_dm(&process, dm, 2.0f, 2.0f, basesize, override_size);
if (process.totelem > 0) {
build_bvh_spatial(&process, &process.metaball_bvh, 0, process.totelem, &process.allbb);
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 7b908fdf9d4..81b52c68a05 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1244,6 +1244,7 @@ typedef enum {
eRemeshFlag_Alive = (1 << 0),
eRemeshFlag_Dead = (1 << 1),
eRemeshFlag_Unborn = (1 << 2),
+ eRemeshFlag_Size = (1 << 3),
} MetaballRemeshPsysFlag;
typedef struct RemeshModifierData {
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index bf5b1ee6f14..5e8e3dd677d 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -3865,6 +3865,7 @@ static void rna_def_modifier_remesh(BlenderRNA *brna)
{eRemeshFlag_Alive, "ALIVE", 0, "Alive", "Output a metaball surface using alive particle input data"},
{eRemeshFlag_Dead, "DEAD", 0, "Dead", "Output a metaball surface using dead particle input data"},
{eRemeshFlag_Unborn, "UNBORN", 0, "Unborn", "Output a metaball surface using unborn particle input data"},
+ {eRemeshFlag_Size, "SIZE", 0, "Size", "Override metaball size by individual particle size"},
{0, NULL, 0, NULL, NULL}
};
diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c
index 5742cb2d4f8..65a0f9892cc 100644
--- a/source/blender/modifiers/intern/MOD_remesh.c
+++ b/source/blender/modifiers/intern/MOD_remesh.c
@@ -222,7 +222,9 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, DerivedMesh* derived,
DerivedMesh *dm = NULL, *result = NULL;
MVert *mv = NULL, *mv2 = NULL;
float (*pos)[3] = NULL;
+ float *psize = NULL;
int i = 0, n = 0;
+ bool override_size = rmd->pflag & eRemeshFlag_Size;
if (((rmd->input & MOD_REMESH_VERTICES)==0) && (rmd->input & MOD_REMESH_PARTICLES))
{
@@ -234,13 +236,15 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, DerivedMesh* derived,
n = get_particle_positions(rmd, psys, &pos);
dm = CDDM_new(n, 0, 0, 0, 0);
mv = dm->getVertArray(dm);
+ psize = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, n, "psize");
for (i = 0; i < n; i++)
{
copy_v3_v3(mv[i].co, pos[i]);
+ psize[i] = psys->particles[i].size;
}
- result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render);
+ result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
dm->release(dm);
if (pos)
@@ -251,7 +255,7 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, DerivedMesh* derived,
else if ((rmd->input & MOD_REMESH_VERTICES) && ((rmd->input & MOD_REMESH_PARTICLES) == 0))
{
//verts only
- return BKE_repolygonize_dm(derived, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render);
+ return BKE_repolygonize_dm(derived, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
}
else if ((rmd->input & MOD_REMESH_VERTICES) && (rmd->input & MOD_REMESH_PARTICLES))
{
@@ -262,20 +266,24 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, DerivedMesh* derived,
n = get_particle_positions(rmd, psys, &pos);
dm = CDDM_new(n + derived->numVertData, 0, 0, 0, 0);
+ psize = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, n + derived->numVertData, "psize");
+
mv = dm->getVertArray(dm);
mv2 = derived->getVertArray(derived);
for (i = 0; i < n; i++)
{
copy_v3_v3(mv[i].co, pos[i]);
+ psize[i] = psys->particles[i].size;
}
for (i = n; i < n + derived->numVertData; i++)
{
copy_v3_v3(mv[i].co, mv2[i-n].co);
+ psize[i] = -1.0f; //use mball sizep
}
- result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render);
+ result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
dm->release(dm);
if (pos)
More information about the Bf-blender-cvs
mailing list