[Bf-blender-cvs] [bdb663df0c6] temp-fracture-modifier-2.8: yay, finally it compiled. but py is broken still

Martin Felke noreply at git.blender.org
Fri Aug 10 14:00:26 CEST 2018


Commit: bdb663df0c6b620142010da93d81d74cdfa6a7e3
Author: Martin Felke
Date:   Tue Aug 7 20:56:04 2018 +0200
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rBbdb663df0c6b620142010da93d81d74cdfa6a7e3

yay, finally it compiled. but py is broken still

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

M	source/blender/blenkernel/BKE_rigidbody.h
M	source/blender/blenkernel/intern/fracture.c
M	source/blender/blenkernel/intern/fracture_external.c
M	source/blender/blenkernel/intern/rigidbody.c

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

diff --git a/source/blender/blenkernel/BKE_rigidbody.h b/source/blender/blenkernel/BKE_rigidbody.h
index 9e422491fbd..da18de93b99 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -70,7 +70,7 @@ void BKE_rigidbody_world_id_loop(struct RigidBodyWorld *rbw, RigidbodyWorldIDFun
 struct RigidBodyWorld *BKE_rigidbody_create_world(struct Scene *scene);
 struct RigidBodyOb *BKE_rigidbody_create_object(struct Scene *scene, struct Object *ob, short type, struct MeshIsland *mi);
 struct RigidBodyCon *BKE_rigidbody_create_constraint(struct Scene *scene, struct Object *ob, short type, struct RigidBodyShardCon *con);
-struct RigidBodyOb *BKE_rigidbody_create_shard(struct Scene *scene, struct Object *ob, struct Object *target, struct MeshIsland *mi);
+struct RigidBodyOb *BKE_rigidbody_create_shard(struct Main *bmain, struct Scene *scene, struct Object *ob, struct Object *target, struct MeshIsland *mi);
 struct RigidBodyShardCon *BKE_rigidbody_create_shard_constraint(struct Scene *scene, short type, bool reset);
 
 /* copy */
diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index 6c1d41c4655..1d506557530 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -42,6 +42,7 @@
 #include "BKE_fracture_util.h"
 #include "BKE_global.h"
 #include "BKE_material.h"
+#include "BKE_main.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
 #include "BKE_object.h"
@@ -4319,10 +4320,10 @@ static int do_shard_to_island(FractureModifierData *fmd, BMesh* bm_new, ShardID
 }
 
 //bke
-static void do_rigidbody(Scene* scene, MeshIsland* mi, Object* ob, Mesh *orig_dm, short rb_type, int i)
+static void do_rigidbody(Main* bmain, Scene* scene, MeshIsland* mi, Object* ob, Mesh *orig_dm, short rb_type, int i)
 {
     mi->rigidbody = NULL;
-    mi->rigidbody = BKE_rigidbody_create_shard(scene, ob, NULL, mi);
+    mi->rigidbody = BKE_rigidbody_create_shard(bmain, scene, ob, NULL, mi);
     mi->rigidbody->type = rb_type;
     mi->rigidbody->meshisland_index = i;
     BKE_rigidbody_calc_shard_mass(ob, mi, orig_dm);
@@ -4369,7 +4370,7 @@ static void do_fix_normals(FractureModifierData *fmd, MeshIsland *mi)
 
 static float do_setup_meshisland(FractureModifierData *fmd, Object *ob, int totvert, float centroid[3],
                                  BMVert **verts, float *vertco, short *vertno, BMesh **bm_new, Mesh *orig_dm,
-                                 int id, Scene *scene)
+                                 int id, Scene *scene, Main *bmain)
 {
     MeshIsland *mi;
     Mesh *dm;
@@ -4462,7 +4463,7 @@ static float do_setup_meshisland(FractureModifierData *fmd, Object *ob, int totv
 
     rb_type = do_vert_index_map(fmd, mi, NULL);
     i = BLI_listbase_count(&fmd->meshIslands);
-    do_rigidbody(scene, mi, ob, orig_dm, rb_type, i);
+    do_rigidbody(bmain, scene, mi, ob, orig_dm, rb_type, i);
 
     mi->start_frame = scene->rigidbody_world->shared->pointcache->startframe;
     BLI_addtail(&fmd->meshIslands, mi);
@@ -4513,7 +4514,8 @@ static float mesh_separate_tagged(FractureModifierData *fmd, Object *ob, BMVert
         sub_v3_v3(v->co, centroid);
     }
 
-    vol = do_setup_meshisland(fmd, ob, v_count, centroid, v_tag, startco, startno, &bm_new, orig_dm, id, scene);
+    //xxxx need some solution for G.main
+    vol = do_setup_meshisland(fmd, ob, v_count, centroid, v_tag, startco, startno, &bm_new, orig_dm, id, scene, G.main);
 
     /* deselect loose data - this used to get deleted,
      * we could de-select edges and verts only, but this turns out to be less complicated
@@ -5251,7 +5253,7 @@ void set_rigidbody_type(FractureModifierData *fmd, Shard *s, MeshIsland *mi)
 #endif
 
 static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s, Mesh *orig_dm,
-                                 int i, int thresh_defgrp_index, int ground_defgrp_index, int vertstart, Scene *scene)
+                                 int i, int thresh_defgrp_index, int ground_defgrp_index, int vertstart, Scene *scene, Main *bmain)
 {
     MeshIsland *mi;
     MeshIsland *par = NULL;
@@ -5391,7 +5393,7 @@ static void do_island_from_shard(FractureModifierData *fmd, Object *ob, Shard* s
     mi->neighbor_count = s->neighbor_count;
 
     rb_type = do_vert_index_map(fmd, mi, par);
-    do_rigidbody(scene, mi, ob, orig_dm, rb_type, i);
+    do_rigidbody(bmain, scene, mi, ob, orig_dm, rb_type, i);
 
     if (fmd->fracture_mode == MOD_FRACTURE_DYNAMIC)
     {
@@ -5478,7 +5480,9 @@ MDeformVert* BKE_fracture_shards_to_islands(FractureModifierData* fmd, Object* o
     shardlist = fmd->frac_mesh->shard_map;
 
     for (s = shardlist.first; s; s = s->next) {
-        do_island_from_shard(fmd, ob, s, orig_dm, i, thresh_defgrp_index, ground_defgrp_index, vertstart, scene);
+
+        // XXX need some solution for G.main...
+        do_island_from_shard(fmd, ob, s, orig_dm, i, thresh_defgrp_index, ground_defgrp_index, vertstart, scene, G.main);
         vertstart += s->totvert;
         i++;
     }
diff --git a/source/blender/blenkernel/intern/fracture_external.c b/source/blender/blenkernel/intern/fracture_external.c
index 2035f1458ca..6e4be7c96e8 100644
--- a/source/blender/blenkernel/intern/fracture_external.c
+++ b/source/blender/blenkernel/intern/fracture_external.c
@@ -338,7 +338,7 @@ MeshIsland* BKE_fracture_mesh_island_add(Main* bmain, FractureModifierData *fmd,
     copy_qt_qt(mi->rot, quat);
     copy_v3_v3(mi->centroid, loc);
 
-    mi->rigidbody = BKE_rigidbody_create_shard(scene, own, target, mi);
+    mi->rigidbody = BKE_rigidbody_create_shard(bmain, scene, own, target, mi);
     if (mi->rigidbody)
     {
         mi->rigidbody->meshisland_index = mi->id;
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 5e00a25f82d..503585b4cc7 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -71,6 +71,7 @@
 #include "BKE_layer.h"
 #include "BKE_library.h"
 #include "BKE_library_query.h"
+#include "BKE_main.h"
 #include "BKE_mesh.h"
 #include "BKE_mesh_runtime.h"
 #include "BKE_object.h"
@@ -981,37 +982,119 @@ RigidBodyWorld *BKE_rigidbody_create_world(Scene *scene)
 	rbw->steps_per_second = 60; /* Bullet default (60 Hz) */
 	rbw->num_solver_iterations = 10; /* 10 is bullet default */
 
-	rbw->shared->pointcache = BKE_ptcache_add(&(rbw->shared->ptcaches));
-	rbw->shared->pointcache->step = 1;
+	rbw->pointcache = BKE_ptcache_add(&(rbw->ptcaches));
+	rbw->pointcache->step = 1;
+	rbw->flag &=~ RBW_FLAG_OBJECT_CHANGED;
+	rbw->flag &=~ RBW_FLAG_REFRESH_MODIFIERS;
+
+	rbw->objects = MEM_mallocN(sizeof(Object *), "objects");
+	rbw->cache_index_map = MEM_mallocN(sizeof(RigidBodyOb *), "cache_index_map");
+	rbw->cache_offset_map = MEM_mallocN(sizeof(int), "cache_offset_map");
 
 	/* return this sim world */
 	return rbw;
 }
 
-RigidBodyWorld *BKE_rigidbody_world_copy(RigidBodyWorld *rbw, const int flag)
+/* Add rigid body settings to the specified shard */
+RigidBodyOb *BKE_rigidbody_create_shard(Main* bmain, Scene *scene, Object *ob, Object *target, MeshIsland *mi)
 {
-	RigidBodyWorld *rbw_copy = MEM_dupallocN(rbw);
+	RigidBodyOb *rbo;
+	RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene);
+	float centr[3], size[3], mat[4][4];
 
-	if (rbw->effector_weights) {
-		rbw_copy->effector_weights = MEM_dupallocN(rbw->effector_weights);
+	/* sanity checks
+	 *	- rigidbody world must exist
+	 *	- shard must exist
+	 *	- cannot add rigid body if it already exists
+	 */
+	if (mi == NULL || (mi->rigidbody != NULL))
+		return NULL;
+
+	if (ob->type != OB_MESH && ob->type != OB_FONT && ob->type != OB_CURVE && ob->type != OB_SURF) {
+		return NULL;
 	}
-	if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
-		id_us_plus((ID *)rbw_copy->group);
-		id_us_plus((ID *)rbw_copy->constraints);
+	
+	if ((ob->type == OB_MESH) && (((Mesh *)ob->data)->totvert == 0)) {
+		return NULL;
+	}
+
+	/* Add rigid body world and group if they don't exist for convenience */
+	if (rbw == NULL) {
+		rbw = BKE_rigidbody_create_world(scene);
+		BKE_rigidbody_validate_sim_world(scene, rbw, false);
+		scene->rigidbody_world = rbw;
+	}
+	if (rbw->group == NULL) {
+        rbw->group = BKE_collection_add(bmain, NULL, "RigidBodyWorld");
+	}
+
+	/* make rigidbody object settings */
+	if (ob->rigidbody_object == NULL) {
+		ob->rigidbody_object = BKE_rigidbody_create_object(scene, ob, RBO_TYPE_ACTIVE, NULL);
+	}
+	else {
+		ob->rigidbody_object->type = RBO_TYPE_ACTIVE;
+		ob->rigidbody_object->flag |= RBO_FLAG_NEEDS_VALIDATE;
+	}
+
+    if (!BKE_collection_has_object(rbw->group, ob))
+        BKE_collection_object_add(bmain, rbw->group, ob);
+
+    DEG_id_tag_update(&ob->id, OB_RECALC_OB);
+
+	/* since we are always member of an object, dupe its settings,
+	 * create new settings data, and link it up */
+	if (target && target->rigidbody_object)
+	{
+        rbo = BKE_rigidbody_copy_object(target, 0);
+		mat4_to_loc_quat(rbo->pos, rbo->orn, target->obmat);
+		zero_v3(rbo->lin_vel);
+		zero_v3(rbo->ang_vel);
 	}
+	else
+	{
+		/* regular FM case */
+        rbo = BKE_rigidbody_copy_object(ob, 0);
+		rbo->type = mi->ground_weight > 0.01f ? RBO_TYPE_PASSIVE : RBO_TYPE_ACTIVE;
 
-	if ((flag & LIB_ID_CREATE_NO_MAIN) == 0) {
-		/* This is a regular copy, and not a CoW copy for depsgraph evaluation */
-		rbw_copy->shared = MEM_callocN(sizeof(*rbw_copy->shared), "RigidBodyWorld_Shared");
-		BKE_ptcache_copy_list(&rbw_copy->shared->ptcaches, &rbw->shared->ptcaches, LIB_ID_COPY_CACHES);
-		rbw_copy->shared->pointcache = rbw_copy->shared->ptcaches.first;
+		/* set initial transform */
+		mat4_to_loc_quat(rbo->pos, rbo->orn, ob->obmat);
+		mat4_to_size(size, ob->obmat);
+
+		//add initial "offset" (centroid), maybe subtract ob->obmat ?? (not sure)
+		copy_v3_v3(centr, mi->centroid);
+		mul_v3_v3(centr, size);
+		mul_qt_v3(rbo->orn, centr);
+		add_v3_v3(rbo->pos, centr);
+		zero_v3(rbo->lin_vel);
+		zero_v3(rbo->ang_vel);
 	}
 
-	rbw_copy->objects = NULL;
-	rbw_copy->numbodies = 0;
-	rigidbody_update_ob_array(rbw_copy);
+	/* return this object */
+	return rbo;
+}
+
+RigidBodyWorld *BKE_rigidbody_wo

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list