[Bf-blender-cvs] [3b521e7] fluid-mantaflow: new function that builds a derived mesh from the fluid objects mesh data (fluid object gets mesh data by reading bobj.gz)
Sebastián Barschkis
noreply at git.blender.org
Sat Jun 18 13:06:12 CEST 2016
Commit: 3b521e7012878197b088dc775604ad63ab2ffc40
Author: Sebastián Barschkis
Date: Fri Jun 17 11:04:19 2016 +0200
Branches: fluid-mantaflow
https://developer.blender.org/rB3b521e7012878197b088dc775604ad63ab2ffc40
new function that builds a derived mesh from the fluid objects mesh data (fluid object gets mesh data by reading bobj.gz)
===================================================================
M source/blender/blenkernel/intern/smoke.c
===================================================================
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index faf2aa7..fa8ff9e 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -2908,6 +2908,95 @@ static void step(Scene *scene, Object *ob, SmokeModifierData *smd, DerivedMesh *
}
}
+static DerivedMesh *createLiquidMesh(SmokeDomainSettings *sds, DerivedMesh *orgdm)
+{
+ DerivedMesh *dm;
+ MVert *mverts;
+ MPoly *mpolys;
+ MLoop *mloops;
+ short *normals, *no_s;
+ float no[3];
+
+ /* assign material + flags to new dm
+ * if there's no faces in original dm, keep materials and flags unchanged */
+ MPoly *mpoly;
+ MPoly mp_example = {0};
+ mpoly = orgdm->getPolyArray(orgdm);
+ if (mpoly) {
+ mp_example = *mpoly;
+ }
+
+ const short mp_mat_nr = mp_example.mat_nr;
+ const char mp_flag = mp_example.flag;
+
+ int i;
+ int num_verts = liquid_get_num_verts(sds->fluid);
+ int num_normals = liquid_get_num_normals(sds->fluid);
+ int num_faces = liquid_get_num_triangles(sds->fluid);
+
+ if (!num_verts || !num_normals || !num_faces)
+ return NULL;
+
+ dm = CDDM_new(num_verts, 0, 0, num_faces * 3, num_faces);
+ mverts = CDDM_get_verts(dm);
+ mpolys = CDDM_get_polys(dm);
+ mloops = CDDM_get_loops(dm);
+
+ if (!dm)
+ return NULL;
+
+ printf("num_verts: %d, num_normals: %d, num_triangles: %d\n", num_verts, num_normals, num_faces);
+
+ // Vertices
+ for (i = 0; i < num_verts; i++, mverts++)
+ {
+ mverts->co[0] = liquid_get_vertice_x_at(sds->fluid, i);
+ mverts->co[1] = liquid_get_vertice_y_at(sds->fluid, i);
+ mverts->co[2] = liquid_get_vertice_z_at(sds->fluid, i);
+
+// printf("mverts->co[0]: %f, mverts->co[1]: %f, mverts->co[2]: %f\n", mverts->co[0], mverts->co[1], mverts->co[2]);
+ }
+
+ // Normals
+ normals = MEM_callocN(sizeof(short) * num_normals * 3, "fluid_tmp_normals");
+
+ for (i = num_normals, no_s = normals; i > 0; i--, no_s += 3)
+ {
+ no[0] = liquid_get_normal_x_at(sds->fluid, i);
+ no[1] = liquid_get_normal_y_at(sds->fluid, i);
+ no[2] = liquid_get_normal_z_at(sds->fluid, i);
+
+ normal_float_to_short_v3(no_s, no);
+
+// printf("no_s[0]: %d, no_s[1]: %d, no_s[2]: %d\n", no_s[0], no_s[1], no_s[2]);
+ }
+
+ // Triangles
+ for (i = 0; i < num_faces; i++, mpolys++, mloops += 3)
+ {
+ /* initialize from existing face */
+ mpolys->mat_nr = mp_mat_nr; // TODO (sebbas)
+ mpolys->flag = mp_flag; // TODO (sebbas)
+
+ mpolys->loopstart = i * 3;
+ mpolys->totloop = 3;
+
+ mloops[0].v = liquid_get_triangle_x_at(sds->fluid, i);
+ mloops[1].v = liquid_get_triangle_y_at(sds->fluid, i);
+ mloops[2].v = liquid_get_triangle_z_at(sds->fluid, i);
+
+// printf("mloops[0].v: %d, mloops[1].v: %d, mloops[2].v: %d\n", mloops[0].v, mloops[1].v, mloops[2].v);
+ }
+
+ CDDM_calc_edges(dm);
+ CDDM_apply_vert_normals(dm, (short (*)[3])normals);
+
+ MEM_freeN(normals);
+ printf("returning derived mesh\n");
+
+ return dm;
+}
+
static DerivedMesh *createDomainGeometry(SmokeDomainSettings *sds, Object *ob)
{
DerivedMesh *result;
@@ -3165,6 +3254,12 @@ struct DerivedMesh *smokeModifier_do(SmokeModifierData *smd, Scene *scene, Objec
{
return createDomainGeometry(smd->domain, ob);
}
+ else if (smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain &&
+ smd->domain->type == MOD_SMOKE_DOMAIN_TYPE_LIQUID)
+ {
+ DerivedMesh *result = createLiquidMesh(smd->domain, dm);
+ return (result) ? CDDM_copy(result) : CDDM_copy(dm);
+ }
else {
return CDDM_copy(dm);
}
More information about the Bf-blender-cvs
mailing list