Commit: 026ffafb1b4916d714621ec3fea4519244b20a8c
Author: Martin Felke
Date:   Sat Nov 1 01:28:20 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rB026ffafb1b4916d714621ec3fea4519244b20a8c

Bake modifier simulation to keyframed objects directly

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

M       release/scripts/startup/bl_ui/properties_physics_fracture.py
M       source/blender/blenkernel/BKE_rigidbody.h
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/blenloader/intern/writefile.c
M       source/blender/editors/object/object_intern.h
M       source/blender/editors/object/object_modifier.c
M       source/blender/editors/object/object_ops.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py 
b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index d8b9958..f43e368 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -155,6 +155,7 @@ class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, 
Panel):
             if not(md.refresh):
                 box.prop(md, "execute_threaded")
             box.operator("object.rigidbody_convert_to_objects", text = 
"Convert To Objects")
+            box.operator("object.rigidbody_convert_to_keyframes", text = 
"Convert To Keyframed Objects")
 
 if __name__ == "__main__":  # only for live edit.
     bpy.utils.register_module(__name__)
diff --git a/source/blender/blenkernel/BKE_rigidbody.h 
b/source/blender/blenkernel/BKE_rigidbody.h
index eef355c..7607370 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -82,7 +82,7 @@ void BKE_rigidbody_validate_sim_shard(struct RigidBodyWorld 
*rbw, struct MeshIsl
 void BKE_rigidbody_validate_sim_shard_shape(struct MeshIsland *mi, struct 
Object *ob, short rebuild);
 
 /* move the islands of the visible mesh according to shard rigidbody movement 
*/
-void BKE_rigidbody_update_cell(struct MeshIsland *mi, struct Object* ob, float 
loc[3], float rot[4], struct FractureModifierData *rmd);
+void BKE_rigidbody_update_cell(struct MeshIsland *mi, struct Object* ob, float 
loc[3], float rot[4], struct FractureModifierData *rmd, int frame);
 
 void BKE_rigidbody_calc_center_of_mass(struct Object *ob, float r_com[3]);
 
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 4dd39fc..a073705 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -66,6 +66,7 @@
 #include "BKE_rigidbody.h"
 #include "BKE_modifier.h"
 #include "BKE_depsgraph.h"
+#include "BKE_scene.h"
 
 #include "RNA_access.h"
 
@@ -390,11 +391,11 @@ static void initNormals(struct MeshIsland *mi, Object 
*ob, FractureModifierData
        }
 }
 
-void BKE_rigidbody_update_cell(struct MeshIsland *mi, Object *ob, float 
loc[3], float rot[4], FractureModifierData *rmd)
+void BKE_rigidbody_update_cell(struct MeshIsland *mi, Object *ob, float 
loc[3], float rot[4], FractureModifierData *rmd, int frame)
 {
        float startco[3], centr[3], size[3];
        short startno[3];
-       int j;
+       int j, i, n;
        bool invalidData;
 
        /* hrm have to init Normals HERE, because we cant do this in readfile.c 
in case the file is loaded (have no access to the Object there)*/
@@ -410,6 +411,26 @@ void BKE_rigidbody_update_cell(struct MeshIsland *mi, 
Object *ob, float loc[3],
 
        invert_m4_m4(ob->imat, ob->obmat);
        mat4_to_size(size, ob->obmat);
+
+       n = frame - mi->start_frame + 1;
+
+       if (mi->frame_count >= 0 && mi->frame_count < n)
+       {
+               mi->locs = MEM_reallocN(mi->locs, sizeof(float) * 3 * 
(mi->frame_count+1));
+               mi->rots = MEM_reallocN(mi->rots, sizeof(float) * 4 * 
(mi->frame_count+1));
+
+               i = mi->frame_count;
+               mi->locs[i*3] = loc[0];
+               mi->locs[i*3+1] = loc[1];
+               mi->locs[i*3+2] = loc[2];
+
+               mi->rots[i*4] = rot[0];
+               mi->rots[i*4+1] = rot[1];
+               mi->rots[i*4+2] = rot[2];
+               mi->rots[i*4+3] = rot[3];
+
+               mi->frame_count = n;
+       }
        
        for (j = 0; j < mi->vertex_count; j++) {
                struct MVert *vert;
@@ -2663,6 +2684,8 @@ void BKE_rigidbody_sync_transforms(RigidBodyWorld *rbw, 
Object *ob, float ctime)
                                }
 
                                for (mi = rmd->meshIslands.first; mi; mi = 
mi->next) {
+                                       int frame;
+
                                        rbo = mi->rigidbody;
                                        if (!rbo) {
                                                continue;
@@ -2685,7 +2708,9 @@ void BKE_rigidbody_sync_transforms(RigidBodyWorld *rbw, 
Object *ob, float ctime)
                                                mul_qt_v3(rbo->orn, centr);
                                                add_v3_v3(rbo->pos, centr);
                                        }
-                                       BKE_rigidbody_update_cell(mi, ob, 
rbo->pos, rbo->orn, rmd);
+
+                                       //frame = 
(int)BKE_scene_frame_get(md->scene);
+                                       BKE_rigidbody_update_cell(mi, ob, 
rbo->pos, rbo->orn, rmd, (int)ctime);
                                }
                                
                                break;
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index ca3b6f3..7ebd778 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4695,6 +4695,9 @@ static void read_meshIsland(FileData *fd, MeshIsland 
**address)
        mi->bb = newdataadr(fd, mi->bb);
        mi->vertex_indices = newdataadr(fd, mi->vertex_indices);
 
+       mi->locs = newdataadr(fd, mi->locs);
+       mi->rots = newdataadr(fd, mi->rots);
+
        /* will be refreshed on the fly */
        mi->participating_constraint_count = 0;
        mi->participating_constraints = NULL;
diff --git a/source/blender/blenloader/intern/writefile.c 
b/source/blender/blenloader/intern/writefile.c
index 7b8abde..dade6d8 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1511,6 +1511,9 @@ static void write_meshIsland(WriteData* wd, MeshIsland* 
mi)
        writedata(wd, DATA, sizeof(int) * mi->neighbor_count, mi->neighbor_ids);
        writestruct(wd, DATA, "BoundBox", 1, mi->bb);
        writedata(wd, DATA, sizeof(int) * mi->vertex_count, mi->vertex_indices);
+
+       writedata(wd, DATA, sizeof(float) * 3 * mi->frame_count, mi->locs);
+       writedata(wd, DATA, sizeof(float) * 4 * mi->frame_count, mi->rots);
 }
 
 static void write_modifiers(WriteData *wd, ListBase *modbase)
diff --git a/source/blender/editors/object/object_intern.h 
b/source/blender/editors/object/object_intern.h
index 344c5bf..6d45594 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -174,6 +174,7 @@ void OBJECT_OT_ocean_bake(struct wmOperatorType *ot);
 void OBJECT_OT_fracture_refresh(struct wmOperatorType *ot);
 void OBJECT_OT_rigidbody_constraints_refresh(struct wmOperatorType *ot);
 void OBJECT_OT_rigidbody_convert_to_objects(struct wmOperatorType *ot);
+void OBJECT_OT_rigidbody_convert_to_keyframes(struct wmOperatorType *ot);
 void OBJECT_OT_skin_root_mark(struct wmOperatorType *ot);
 void OBJECT_OT_skin_loose_mark_clear(struct wmOperatorType *ot);
 void OBJECT_OT_skin_radii_equalize(struct wmOperatorType *ot);
diff --git a/source/blender/editors/object/object_modifier.c 
b/source/blender/editors/object/object_modifier.c
index b168297..7b6779e 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -44,6 +44,7 @@
 #include "DNA_scene_types.h"
 #include "DNA_rigidbody_types.h"
 #include "DNA_fracture_types.h"
+#include "DNA_group_types.h"
 
 #include "BLI_bitmap.h"
 #include "BLI_math.h"
@@ -2674,3 +2675,144 @@ void 
OBJECT_OT_rigidbody_convert_to_objects(wmOperatorType *ot)
        edit_modifier_properties(ot);
 }
 
+static void convert_modifier_to_keyframes(bContext* C, wmOperator *op, 
FractureModifierData* fmd)
+{
+       Scene *scene = CTX_data_scene(C);
+       Object *ob = ED_object_active_context(C);
+       Main *bmain = CTX_data_main(C);
+       Group *gr = BKE_group_add(bmain, "Converted");
+
+       MeshIsland *mi = NULL;
+       for (mi = fmd->meshIslands.first; mi; mi = mi->next)
+       {
+               int i = 0;
+               Object* ob_new;
+               Mesh* me;
+               Base *bas;
+               float cent[3];
+               float origmat[4][4];
+               float origloc[3];
+
+               int start = 1;
+               int end = 250;
+
+               ob_new = BKE_object_add(G.main, scene, OB_MESH);
+               assign_matarar(ob_new, give_matarar(ob), *give_totcolp(ob));
+
+               bas = BKE_scene_base_find(scene, ob_new);
+               BKE_group_object_add(gr, ob_new, scene, bas);
+
+               ED_base_object_activate(C, bas);
+
+               me = (Mesh*)ob_new->data;
+               me->edit_btmesh = NULL;
+
+               DM_to_mesh(mi->physics_mesh, me, ob_new, CD_MASK_MESH);
+
+               /*set origin to centroid*/
+               copy_v3_v3(cent, mi->centroid);
+               mul_m4_v3(ob_new->obmat, cent);
+               copy_v3_v3(ob_new->loc, cent);
+
+               start = RNA_int_get(op->ptr, "start_frame");
+               end = RNA_int_get(op->ptr, "end_frame");
+
+               if (start < mi->start_frame) {
+                       start = mi->start_frame;
+               }
+
+               if (end > mi->start_frame + mi->frame_count) {
+                       end = mi->start_frame + mi->frame_count;
+               }
+
+               copy_m4_m4(origmat, ob_new->obmat);
+               copy_v3_v3(origloc, ob_new->loc);
+               for (i = start+1; i < end-1; i++)
+               {
+                       /*move object (loc, rot)*/
+
+                       float loc[3], rot[4];
+                       float mat[4][4];
+                       float size[3] = {1.0f, 1.0f, 1.0f};
+
+                       loc[0] = mi->locs[i*3];
+                       loc[1] = mi->locs[i*3+1];
+                       loc[2] = mi->locs[i*3+2];
+
+                       rot[0] = mi->rots[i*4];
+                       rot[1] = mi->rots[i*4+1];
+                       rot[2] = mi->rots[i*4+2];
+                       rot[3] = mi->rots[i*4+3];
+
+                       loc_quat_size_to_mat4(mat, loc, rot, size);
+
+                       BKE_scene_frame_set(scene, (double)i);
+
+                       copy_m4_m4(ob_new->obmat, mat);
+
+                       //copy_v3_v3(cent, mi->centroid);
+                       //mul_m4_v3(ob_new->obmat, cent);
+                       copy_v3_v3(ob_new->loc, loc);
+                       copy_qt_qt(ob_new->quat, rot);
+                       quat_to_eul(ob_new->rot, rot);
+
+                       /*Location, builtin = -1*/
+                       /*Rotation, builtin = -2*/
+                       RNA_enum_set(op->ptr, "type", -1);
+                       WM_operator_name_call(C, 
"ANIM_OT_keyframe_insert_menu", WM_OP_EXEC_DEFAULT, op->ptr);
+
+                       RNA_enum_set(op->ptr, "type", -2);
+                       WM_operator_name_call(C, 
"ANIM_OT_keyframe_insert_menu", WM_OP_EXEC_DEFAULT, op->ptr);
+               }
+
+               /*back to start*/
+               //copy_m4_m4(ob_new->obmat, origmat);
+               //copy_v3_v3(ob_new->loc, origloc);
+       }
+}
+
+static int rigidbody_convert_keyframes_exec(bContext *C, wmOperator *op)
+{
+       Object *obact = ED_object_active_context(C);
+       FractureModifierData *rmd;
+
+       rmd = (FractureModifierData *)modifiers_findByType(obact, 
eModifierType_Fracture);
+       if (rmd && rmd->refresh) {
+               return OPERATOR_CANCELLED;
+       }
+
+       if (rmd) {
+               convert_modifier_to_keyframes(C, op, rmd);
+               return OPERATOR_FINISHED;
+       }
+
+       return OPERATOR_CANCELLED;
+}
+
+void OBJECT_OT_rigidbody_convert_to_keyframes(wmOperatorType *ot)
+{
+       PropertyRNA *prop;
+
+       ot->name = "Convert To Keyframed Objects";
+       ot->description = "Convert the Rigid Body modifier shards to keyframed 
real objects";
+       ot->idname = "OBJECT_OT_rigidbody_convert_to_keyframes";
+
+       ot->poll = fracture_poll;
+       //ot->invoke = rigidbody_convert_invoke;
+       ot->exec = rigidbody_convert_keyframes_exec;
+
+       RNA_def_int(ot->srna, "start_frame", 1,  0, 100000, "Start Frame", "", 
0, 100000);
+       RNA_def_int(ot->srna, "end_frame", 250, 0, 100000, "End Frame", "", 0,

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to