[Bf-blender-cvs] [df7d0e5423e] fracture_modifier: extended the remesh modifier by a metaball mode
Martin Felke
noreply at git.blender.org
Mon Dec 25 01:12:37 CET 2017
Commit: df7d0e5423ee6ee95f676e97042d32b7920f6851
Author: Martin Felke
Date: Mon Dec 25 01:12:23 2017 +0100
Branches: fracture_modifier
https://developer.blender.org/rBdf7d0e5423ee6ee95f676e97042d32b7920f6851
extended the remesh modifier by a metaball mode
===================================================================
M release/scripts/startup/bl_ui/properties_data_modifier.py
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/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index a2ed493e4e3..c269f0f13e4 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1119,18 +1119,31 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
layout.prop(md, "mode")
- row = layout.row()
- row.prop(md, "octree_depth")
- row.prop(md, "scale")
- if md.mode == 'SHARP':
- layout.prop(md, "sharpness")
+ if md.mode == 'METABALL':
+ row = layout.row()
+ col = row.column(align=True)
+ col.prop(md, "mball_size")
+ col = row.column(align=True)
+ col.label("Display Parameters:")
+ col.prop(md, "mball_threshold")
+ col.prop(md, "mball_resolution")
+ col.prop(md, "mball_render_resolution")
+ layout.prop(md, "use_smooth_shade")
- layout.prop(md, "use_smooth_shade")
- layout.prop(md, "use_remove_disconnected")
- row = layout.row()
- row.active = md.use_remove_disconnected
- row.prop(md, "threshold")
+ else:
+ row = layout.row()
+ row.prop(md, "octree_depth")
+ row.prop(md, "scale")
+
+ if md.mode == 'SHARP':
+ layout.prop(md, "sharpness")
+
+ layout.prop(md, "use_smooth_shade")
+ layout.prop(md, "use_remove_disconnected")
+ row = layout.row()
+ row.active = md.use_remove_disconnected
+ row.prop(md, "threshold")
@staticmethod
def vertex_weight_mask(layout, ob, md):
diff --git a/source/blender/blenkernel/BKE_mball_tessellate.h b/source/blender/blenkernel/BKE_mball_tessellate.h
index 361f31b704c..a554cc5f3c9 100644
--- a/source/blender/blenkernel/BKE_mball_tessellate.h
+++ b/source/blender/blenkernel/BKE_mball_tessellate.h
@@ -26,6 +26,8 @@
struct EvaluationContext;
struct Object;
struct Scene;
+struct DerivedMesh;
+struct DispList;
void BKE_mball_polygonize(
struct EvaluationContext *eval_ctx, struct Scene *scene,
@@ -33,4 +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);
+
+void BKE_dm_from_metaball(struct DispList *dl, struct DerivedMesh *dm);
+
#endif /* __BKE_MBALL_TESSELLATE_H__ */
diff --git a/source/blender/blenkernel/intern/mball_tessellate.c b/source/blender/blenkernel/intern/mball_tessellate.c
index 76965176be8..c1e43264fa2 100644
--- a/source/blender/blenkernel/intern/mball_tessellate.c
+++ b/source/blender/blenkernel/intern/mball_tessellate.c
@@ -52,12 +52,17 @@
#include "BKE_scene.h"
#include "BKE_displist.h"
#include "BKE_mball_tessellate.h" /* own include */
+#include "BKE_cdderivedmesh.h"
#include "BLI_strict_flags.h"
/* experimental (faster) normal calculation */
// #define USE_ACCUM_NORMAL
+struct MVert;
+struct MLoop;
+struct MPoly;
+
/* Data types */
typedef struct corner { /* corner of a cube */
@@ -1324,3 +1329,269 @@ 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])
+{
+ float quat[4];
+ unsigned int i;
+ int totvert = dm->getNumVerts(dm), j;
+ MVert* mvert = dm->getVertArray(dm);
+
+ unit_qt(quat);
+
+ /* make main array */
+ for (j = 0; j < totvert; j++, mvert++)
+ {
+ //float size[3] = {1.0f, 1.0f, 1.0f};
+ float expx, expy, expz;
+ float tempmin[3], tempmax[3];
+
+ MetaElem *new_ml;
+
+ /* make a copy because of duplicates */
+ new_ml = BLI_memarena_alloc(process->pgn_elements, sizeof(MetaElem));
+ new_ml->bb = BLI_memarena_alloc(process->pgn_elements, sizeof(BoundBox));
+ new_ml->mat = BLI_memarena_alloc(process->pgn_elements, 4 * 4 * sizeof(float));
+ new_ml->imat = BLI_memarena_alloc(process->pgn_elements, 4 * 4 * sizeof(float));
+
+ //init new_ml
+ new_ml->type = MB_BALL;
+ new_ml->flag = MB_SCALE_RAD;
+ /* too big stiffness seems only ugly due to linear interpolation
+ * no need to have possibility for too big stiffness */
+ //if (ml->s > 10.0f) new_ml->s = 10.0f;
+ //else new_ml->s = ml->s;
+ new_ml->s = stiffness;
+
+ /* if metaball is negative, set stiffness negative */
+ //if (new_ml->flag & MB_NEGATIVE) new_ml->s = -new_ml->s;
+
+ /* Translation of MetaElem */
+ /*unit_m4(pos);
+ pos[3][0] = mvert->co[0];
+ pos[3][1] = mvert->co[1];
+ pos[3][2] = mvert->co[2];*/
+
+ new_ml->x = mvert->co[0];
+ new_ml->y = mvert->co[1];
+ new_ml->z = mvert->co[2];
+
+ /* 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);
+ invert_m4_m4((float(*)[4])new_ml->imat,(float(*)[4])new_ml->mat);
+
+#if 0
+ /* basis object space -> world -> ml object space -> position -> rotation -> ml local space */
+ mul_m4_series((float(*)[4])new_ml->mat, obinv, bob->obmat, pos, rot);
+ /* ml local space -> basis object space */
+ invert_m4_m4((float(*)[4])new_ml->imat, (float(*)[4])new_ml->mat);
+#endif
+
+ /* rad2 is inverse of squared radius */
+ new_ml->rad = radius;
+ new_ml->rad2 = 1 / (radius * radius);
+
+ /* initial dimensions = radius */
+ expx = radius;
+ expy = radius;
+ expz = radius;
+
+ new_ml->expx = expx;
+ new_ml->expy = expy;
+ new_ml->expz = expz;
+
+#if 0
+ switch (ml->type) {
+ case MB_BALL:
+ break;
+ case MB_CUBE: /* cube is "expanded" by expz, expy and expx */
+ expz += ml->expz;
+ ATTR_FALLTHROUGH;
+ case MB_PLANE: /* plane is "expanded" by expy and expx */
+ expy += ml->expy;
+ ATTR_FALLTHROUGH;
+ case MB_TUBE: /* tube is "expanded" by expx */
+ expx += ml->expx;
+ break;
+ case MB_ELIPSOID: /* ellipsoid is "stretched" by exp* */
+ expx *= ml->expx;
+ expy *= ml->expy;
+ expz *= ml->expz;
+ break;
+ }
+#endif
+
+ /* untransformed Bounding Box of MetaElem */
+ /* TODO, its possible the elem type has been changed and the exp* values can use a fallback */
+ copy_v3_fl3(new_ml->bb->vec[0], -expx, -expy, -expz); /* 0 */
+ copy_v3_fl3(new_ml->bb->vec[1], +expx, -expy, -expz); /* 1 */
+ copy_v3_fl3(new_ml->bb->vec[2], +expx, +expy, -expz); /* 2 */
+ copy_v3_fl3(new_ml->bb->vec[3], -expx, +expy, -expz); /* 3 */
+ copy_v3_fl3(new_ml->bb->vec[4], -expx, -expy, +expz); /* 4 */
+ copy_v3_fl3(new_ml->bb->vec[5], +expx, -expy, +expz); /* 5 */
+ copy_v3_fl3(new_ml->bb->vec[6], +expx, +expy, +expz); /* 6 */
+ copy_v3_fl3(new_ml->bb->vec[7], -expx, +expy, +expz); /* 7 */
+
+ /* transformation of Metalem bb */
+ for (i = 0; i < 8; i++)
+ mul_m4_v3((float(*)[4])new_ml->mat, new_ml->bb->vec[i]);
+
+ /* find max and min of transformed bb */
+ INIT_MINMAX(tempmin, tempmax);
+ for (i = 0; i < 8; i++) {
+ DO_MINMAX(new_ml->bb->vec[i], tempmin, tempmax);
+ }
+
+ /* set only point 0 and 6 - AABB of Metaelem */
+ copy_v3_v3(new_ml->bb->vec[0], tempmin);
+ copy_v3_v3(new_ml->bb->vec[6], tempmax);
+
+ /* add new_ml to mainb[] */
+ if (UNLIKELY(process->totelem == process->mem)) {
+ process->mem = process->mem * 2 + 10;
+ process->mainb = MEM_reallocN(process->mainb, sizeof(MetaElem *) * process->mem);
+ }
+ process->mainb[process->totelem++] = new_ml;
+ }
+
+ /* compute AABB of all Metaelems */
+ if (process->totelem > 0) {
+ copy_v3_v3(process->allbb.min, process->mainb[0]->bb->vec[0]);
+ copy_v3_v3(process->allbb.max, process->mainb[0]->bb->vec[6]);
+ for (i = 1; i < process->totelem; i++)
+ make_box_union(process->mainb[i]->bb, &process->allbb, &process->allbb);
+ }
+}
+
+void BKE_dm_from_metaball(DispList *dl, DerivedMesh *dm)
+{
+ MVert *mvert;
+ MLoop *mloop, *allloop;
+ MPoly *mpoly;
+ const float *nors, *verts;
+ int a, *index;
+
+ if (dl == NULL) return;
+
+ if (dl->type == DL_INDEX4) {
+ //mvert = CustomData_add_layer(&dm->vertData, CD_MVERT, CD_CALLOC, NULL, dl->nr);
+ //allloop = mloop = CustomData_add_layer(&dm->loopData, CD_MLOOP, CD_CALLOC, NULL, dl->parts * 4);
+ //mpoly = CustomData_add_layer(&dm->polyData, CD_MPOLY, CD_CALLOC, NULL, dl->parts);
+
+ //dm->numVertData = dl->nr;
+ //dm->numPolyData = dl->parts;
+ mvert = dm->getVertArray(dm);
+ allloop = mloop = dm->getLoopArray(dm);
+ mpoly = dm->getPolyArray(dm);
+
+ a = dl->nr;
+ nors = dl->nors;
+ verts = dl->verts;
+ while (a--) {
+ copy_v3_v3(mvert->co, verts);
+ normal_float_to_short_v3(mvert->no, nors);
+ mvert++;
+ nors += 3;
+ verts += 3;
+ }
+
+ a = dl->parts;
+ index = dl->index;
+ while (a--) {
+ int count = index[2] != index[3] ? 4 : 3;
+
+ mloop[0].v = (unsigned int)index[0];
+ mloop[1].v = (unsigned int)index[1];
+ mloop[2].v = (unsigned int) index[2];
+ if (count == 4)
+ mloop[3].v = (unsigned int)index[3];
+
+ mpoly->totloop = count;
+ mpoly->loopstart = (int)(mloop - allloop);
+ //mpoly->flag = ME_SMOOTH;
+
+
+ mpoly++;
+ mloop += count;
+ dm->numLoopData += count;
+ index += 4;
+ }
+
+ CDDM_calc_normals(dm);
+ CDDM_calc_edges(dm);
+ }
+}
+
+
+DerivedMesh* BKE_repolygonize_dm(DerivedMesh *dm, float thresh, float basesize[3], float wiresize, float rendersize, bool render)
+{
+ DerivedMesh *result = NULL;
+ DispList *dl;
+ unsigned int a;
+ PROCESS process = {0};
+ process.thresh = thresh;
+
+ if (process.thresh < 0.001f) process.converge_res = 16;
+ else if (process.thresh < 0.01f) process.converge_res = 8;
+ else if (process.thresh < 0.1f) process.converge_res = 4;
+ else process.converge_res = 2;
+
+ //if ((!render) && (mb->flag == MB_UPDATE_NEVER)) return;
+ //if ((G.moving & (G_TRANSFORM_OBJ | G_TRANSFORM_EDIT)) && mb->flag == MB_UPDATE_FAST) return;
+
+ if (render) {
+ process.size = rendersize;
+ }
+ else {
+ process.size = wiresize;
+ /*if ((G.moving & (G_TRANSFORM_OBJ | G_TRANSFORM_EDIT)) && mb->flag == MB_UPDATE_HALFRES) {
+ process.size *= 2.0f;
+ }*/
+ }
+
+ process.delta = process.size * 0.001f;
+
+ process.pgn_elemen
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list