[Bf-blender-cvs] [054d6d7ac38] fracture_modifier: deform motionblur support for FM and remesher with variable topology

Martin Felke noreply at git.blender.org
Thu Jan 4 19:32:39 CET 2018


Commit: 054d6d7ac3805b0c6d64fb41f461107950bc76d9
Author: Martin Felke
Date:   Thu Jan 4 19:32:13 2018 +0100
Branches: fracture_modifier
https://developer.blender.org/rB054d6d7ac3805b0c6d64fb41f461107950bc76d9

deform motionblur support for FM and remesher with variable topology

furthermore some tweaks to final solid mesh generation and trigger stuff
option to only output particles as vertexcloud in remesher

===================================================================

M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/blender/blender_util.h
M	intern/rigidbody/rb_bullet_api.cpp
M	source/blender/blenkernel/BKE_fracture.h
M	source/blender/blenkernel/intern/customdata.c
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/pointcache.c
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/bmesh/intern/bmesh_opdefines.c
M	source/blender/bmesh/operators/bmo_extrude.c
M	source/blender/editors/mesh/editmesh_tools.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/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 5b7fd3fafbf..f5186a547ac 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -941,7 +941,7 @@ static void sync_mesh_fluid_motion(BL::Object& b_ob, Scene *scene, Mesh *mesh)
 	}
 }
 
-static bool sync_mesh_precalculated_motion(BL::Mesh& b_mesh, Scene *scene, Mesh *mesh)
+static bool sync_mesh_precalculated_motion(BL::Mesh& b_mesh, BL::Scene& b_scene, Scene *scene, Mesh *mesh)
 {
 	if(scene->need_motion() == Scene::MOTION_NONE)
 		return false;
@@ -957,7 +957,8 @@ static bool sync_mesh_precalculated_motion(BL::Mesh& b_mesh, Scene *scene, Mesh
 	/* Only export previous and next frame, we don't have any in between data. */
 	float motion_times[2] = {-1.0f, 1.0f};
 	for(int step = 0; step < 2; step++) {
-		float relative_time = motion_times[step] * scene->motion_shutter_time() * 0.5f;
+		/* those are TIMES, but treated like Frames ? makes too high values, so take fps into account*/
+		float relative_time = motion_times[step] * scene->motion_shutter_time() * 0.5f / b_scene.render().fps();
 		float3 *mP = attr_mP->data_float3() + step*mesh->verts.size();
 
 		int i = 0;
@@ -982,6 +983,7 @@ static bool sync_mesh_precalculated_motion(BL::Mesh& b_mesh, Scene *scene, Mesh
 
 			//printf("Vel %f %f %f\n", (double)x, (double)y, (double)z);
 			mP[i] = P[i] + make_float3(x, y, z) * relative_time;
+			x = 1;
 		}
 	}
 
@@ -1122,7 +1124,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
 				b_ob.cache_release();
 			}
 
-			sync_mesh_precalculated_motion(b_mesh, scene, mesh);
+			sync_mesh_precalculated_motion(b_mesh, b_scene, scene, mesh);
 
 			/* free derived mesh */
 			b_data.meshes.remove(b_mesh, false);
@@ -1229,7 +1231,8 @@ void BlenderSync::sync_mesh_motion(BL::Object& b_ob,
 
 	/* other precalculated motion (remesher for now only) */
 	BL::RemeshModifier b_remesher = object_metaball_remesher_find(b_ob);
-	if(b_remesher)
+	BL::FractureModifier b_fracture = object_fracture_modifier_find(b_ob);
+	if(b_remesher || b_fracture)
 		return;
 
 	if(ccl::BKE_object_is_deform_modified(b_ob, b_scene, preview)) {
diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h
index 75aebb4a640..53d2a09fb70 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -581,6 +581,20 @@ static inline BL::RemeshModifier object_metaball_remesher_find(BL::Object b_ob)
 	return BL::RemeshModifier(PointerRNA_NULL);
 }
 
+static inline BL::FractureModifier object_fracture_modifier_find(BL::Object b_ob)
+{
+	BL::Object::modifiers_iterator b_mod;
+
+	for(b_ob.modifiers.begin(b_mod); b_mod != b_ob.modifiers.end(); ++b_mod) {
+		if(b_mod->is_a(&RNA_FractureModifier)) {
+			BL::FractureModifier b_fmd(*b_mod);
+			return b_fmd;
+		}
+	}
+
+	return BL::FractureModifier(PointerRNA_NULL);
+}
+
 static inline Mesh::SubdivisionType object_subdivision_type(BL::Object& b_ob, bool preview, bool experimental)
 {
 	PointerRNA cobj = RNA_pointer_get(&b_ob.ptr, "cycles");
diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index 9cfea3b4d5f..edfc0eb5f43 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -721,9 +721,6 @@ struct myResultCallback : public btCollisionWorld::ClosestRayResultCallback
 	}
 };
 
-#define MIN2(a, b)  ((a) < (b) ? (a) : (b))
-#define MIN3(a, b, c)       (MIN2(MIN2((a), (b)), (c)))
-
 struct rbFilterCallback : public btOverlapFilterCallback
 {
 	int (*callback)(void* world, void* island1, void* island2, void* blenderOb1, void* blenderOb2, bool activate);
@@ -745,38 +742,34 @@ struct rbFilterCallback : public btOverlapFilterCallback
 			bool meshShape0 = (stype0 == GIMPACT_SHAPE_PROXYTYPE) || (stype0 == TRIANGLE_MESH_SHAPE_PROXYTYPE);
 			bool meshShape1 = (stype1 == GIMPACT_SHAPE_PROXYTYPE) || (stype1 == TRIANGLE_MESH_SHAPE_PROXYTYPE);
 
-			if (rb0->blenderOb != rb1->blenderOb && (meshShape0 && meshShape1) && activate)
+			if ((rb0->blenderOb != rb1->blenderOb) && (meshShape0 || meshShape1))
 			{
-				btVector3 v0, v1;
+				btVector3 v0, v1, min0, max0, min1, max1, min, max;
 				v0 = rb0->body->getWorldTransform().getOrigin();
 				v1 = rb1->body->getWorldTransform().getOrigin();
-				float maxbound1 = MIN3(rb0->bbox->x(), rb0->bbox->y(), rb0->bbox->z());
-				float maxbound2 = MIN3(rb1->bbox->x(), rb1->bbox->y(), rb1->bbox->z());
-				float bound = maxbound1;
 
-				if (maxbound2 < maxbound1)
+				rb0->body->getAabb(min0, max0);
+				rb1->body->getAabb(min1, max1);
+
+				min = min1;
+				max = max1;
+
+				if ((max0-min0).length2() < (max1-min1).length2())
 				{
-					bound = maxbound2;
+					min = min0;
+					max = max0;
 				}
 
 				myResultCallback cb(v0, v1);
 				rb0->world->dynamicsWorld->rayTest(v0, v1, cb);
-				if (cb.m_collisionObject)
+				if (cb.m_collisionObject && TestPointAgainstAabb2(min, max, cb.m_hitPointWorld))
 				{
-					float dist_sq = (v0 - cb.m_collisionObject->getWorldTransform().getOrigin()).length2();
-					//float dist_sq2 = (v0 - v1).length2();
-					float dist_sq2 = bound * bound;
-					if (dist_sq < dist_sq2)
-					{
-						int result = this->callback(rb0->world->blenderWorld, rb0->meshIsland, rb1->meshIsland,
-						                            rb0->blenderOb, rb1->blenderOb, activate);
+					int result = this->callback(rb0->world->blenderWorld, rb0->meshIsland, rb1->meshIsland,
+												rb0->blenderOb, rb1->blenderOb,
+												activate && (cb.m_collisionObject == (btCollisionObject*)rb1->body));
+
+					collides = collides && (bool)result;
 
-						collides = collides && (bool)result;
-					}
-					else
-					{
-						collides = false;
-					}
 				}
 				else {
 					collides = false;
diff --git a/source/blender/blenkernel/BKE_fracture.h b/source/blender/blenkernel/BKE_fracture.h
index d62e6f46f6d..f610dc6e469 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -128,5 +128,6 @@ short BKE_fracture_collect_materials(struct Object* o, struct Object* ob, int ma
 void BKE_bm_mesh_hflag_flush_vert(struct BMesh *bm, const char hflag);
 void BKE_meshisland_constraint_create(struct FractureModifierData* fmd, struct MeshIsland *mi1, struct MeshIsland *mi2, int con_type, float thresh);
 void BKE_update_acceleration_map(struct FractureModifierData *fmd, struct MeshIsland* mi, struct Object* ob, int ctime, float acc, struct RigidBodyWorld *rbw);
+void BKE_update_velocity_layer(struct FractureModifierData *fmd, struct MeshIsland *mi);
 
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 25f43485282..1f72583e75c 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -1942,7 +1942,6 @@ void *CustomData_add_layer_named(CustomData *data, int type, int alloctype,
 	return NULL;
 }
 
-
 bool CustomData_free_layer(CustomData *data, int type, int totelem, int index)
 {
 	const int index_first = CustomData_get_layer_index(data, type);
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index ee511c0fa24..5431ce525bb 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -204,6 +204,29 @@ static int shard_sortsize(const void *s1, const void *s2, void* UNUSED(context))
 	return 0;
 }
 
+void* check_add_layer(CustomData *src, CustomData *dst, int type, int totelem, const char* name)
+{
+	void *layer =  CustomData_get_layer_named(dst, type, name);
+
+	if (!layer) {
+		void* orig = NULL;
+
+		if (src) {
+			orig = CustomData_get_layer_named(src, type, name);
+		}
+
+		if (orig) {
+			return CustomData_add_layer_named(dst, type, CD_DUPLICATE, orig, totelem, name);
+		}
+		else{
+			return CustomData_add_layer_named(dst, type, CD_CALLOC, NULL, totelem, name);
+		}
+	}
+	else {
+		return layer;
+	}
+}
+
 Shard *BKE_custom_data_to_shard(Shard *s, DerivedMesh *dm)
 {
 	CustomData_reset(&s->vertData);
@@ -216,6 +239,11 @@ Shard *BKE_custom_data_to_shard(Shard *s, DerivedMesh *dm)
 	CustomData_copy(&dm->polyData, &s->polyData, CD_MASK_MTEXPOLY, CD_DUPLICATE, s->totpoly);
 	CustomData_copy(&dm->edgeData, &s->edgeData, CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_MEDGE, CD_DUPLICATE, s->totedge);
 
+	//add velocity vertex layers...
+	check_add_layer(&dm->vertData, &s->vertData, CD_PROP_FLT, s->totvert, "velX");
+	check_add_layer(&dm->vertData, &s->vertData, CD_PROP_FLT, s->totvert, "velY");
+	check_add_layer(&dm->vertData, &s->vertData, CD_PROP_FLT, s->totvert, "velZ");
+
 	return s;
 }
 
@@ -3153,6 +3181,7 @@ void fracture_collect_layers(Shard* s, DerivedMesh *dm, int vertstart, int polys
 	fracture_collect_layer(&s->edgeData, &dm->edgeData, totedge, CD_CREASE, edgestart, s->totedge);
 	fracture_collect_layer(&s->edgeData, &dm->edgeData, totedge, CD_BWEIGHT, edgestart, s->totedge);
 	//fracture_collect_layer(&s->edgeData, &dm->edgeData, totedge, CD_MEDGE, edgestart, s->totedge);
+	fracture_collect_layer(&s->vertData, &dm->vertData, totvert, CD_PROP_FLT, vertstart, s->totvert);
 }
 
 MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own, Object *target)
@@ -3707,3 +3736,56 @@ void BKE_update_acceleration_map(FractureModifierData *fmd, MeshIsland* mi, Obje
 		}
 	}
 }
+
+void BKE_update_velocity_layer(FractureModifierData *fmd, MeshIsland *mi)
+{
+	DerivedMesh *dm = fmd->visible_mesh_cached;
+	float* velX, *velY, *velZ;
+	RigidBodyOb *rbo = mi->rigidbody;
+	Shard *s, *t = NULL;
+	int i = 0;
+
+	if (!dm)
+		return;
+
+	//XXX TODO deal with split shards to islands etc, here take only "real" shards for now
+	for (s = fmd->frac_mesh->shard_map.first; s; s = s->next)
+	{
+		if (s->shard_id == mi->id)
+		{
+			t = s;
+			break;
+		}
+	}
+
+	velX = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velX");
+	velY = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velY");
+	velZ = CustomData_get_layer_named(&dm->vertData, CD_PROP_FLT, "velZ");
+
+	//XXX how to represent this in mblur ?
+	//zero_v3(rbo->ang_vel);
+
+	//if (!velX || !velY || !velZ)
+	

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list