Commit: 8bd2323829f20bf06b4f1adb004f239302327388
Author: Martin Felke
Date:   Mon Oct 3 15:11:24 2016 +0200
Branches: fracture_modifier
https://developer.blender.org/rB8bd2323829f20bf06b4f1adb004f239302327388

further tweaks for dynamic fracture

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

M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/editors/object/object_modifier.c
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index 8234507..fc0d51b 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -2065,7 +2065,7 @@ static Shard* findShard(FractureModifierData *fmd, int id)
 static bool check_shard_size(FractureModifierData *fmd, int id)
 {
        FractureID *fid;
-       float size = 0.1f;
+       float size = 0.05f;
        Shard *s = NULL;
 
        s = findShard(fmd, id);
@@ -2077,13 +2077,17 @@ static bool check_shard_size(FractureModifierData *fmd, 
int id)
 
        BKE_shard_calc_minmax(s);
 
-       if ((fabsf(s->max[0] - s->min[0]) < size) ||
-          (fabsf(s->max[1] - s->min[1]) < size) ||
+       if ((fabsf(s->max[0] - s->min[0]) < size) &&
+          (fabsf(s->max[1] - s->min[1]) < size) &&
           (fabsf(s->max[2] - s->min[2]) < size))
        {
                return false;
        }
 
+       /*if (s->raw_volume < size) {
+               return false;
+       }*/
+
        for (fid = fmd->fracture_ids.first; fid; fid = fid->next)
        {
                if (fid->shardID == id)
@@ -2137,13 +2141,13 @@ static void check_fracture(rbContactPoint* cp, 
RigidBodyWorld *rbw)
                                int id = 
rbw->cache_index_map[linear_index1]->meshisland_index;
                                Shard *s = findShard(fmd1, id);
 
-                               if ((force > fmd1->dynamic_force && 
(!fmd1->limit_impact || (fmd1->limit_impact && s && (s->parent_id > 0 || 
s->shard_id > 0)) ||
-                                   (s && ob2 && (fmd1->limit_impact && 
can_break(ob2, ob1, fmd1->limit_impact, s))))))
+                               if ((force > fmd1->dynamic_force && 
(!fmd1->limit_impact || (fmd1->limit_impact && s && (s->parent_id > 0 || 
s->shard_id > 0)))) ||
+                                   (s && ob2 && (fmd1->limit_impact && 
can_break(ob2, ob1, fmd1->limit_impact, s))))
                                {
                                        if (s) {
                                                float size[3];
 
-                                               if (ob1 == ob2 || (ob2 && 
ob2->rigidbody_object && ob2->rigidbody_object->type == RBO_TYPE_PASSIVE)) {
+                                               if (s->parent_id > 0 || ob1 == 
ob2 || (ob2 && ob2->rigidbody_object && ob2->rigidbody_object->type == 
RBO_TYPE_PASSIVE)) {
                                                        size[0] = -1.0f; //mark 
as invalid, so the regular object size is used
                                                        size[1] = -1.0f;
                                                        size[2] = -1.0f;
@@ -2182,12 +2186,12 @@ static void check_fracture(rbContactPoint* cp, 
RigidBodyWorld *rbw)
                                int id = 
rbw->cache_index_map[linear_index2]->meshisland_index;
                                Shard *s = findShard(fmd2, id);
 
-                               if (force > fmd2->dynamic_force && 
(!fmd2->limit_impact || (fmd2->limit_impact && s && (s->parent_id > 0 || 
s->shard_id > 0)) ||
-                                       (ob1 && s && (fmd2->limit_impact && 
can_break(ob1, ob2, fmd2->limit_impact, s)))))
+                               if ((force > fmd2->dynamic_force && 
(!fmd2->limit_impact || (fmd2->limit_impact && s && (s->parent_id > 0 || 
s->shard_id > 0)))) ||
+                                       (ob1 && s && (fmd2->limit_impact && 
can_break(ob1, ob2, fmd2->limit_impact, s))))
                                {
                                        if (s) {
                                                float size[3];
-                                               if (ob1 == ob2 || (ob1 && 
ob1->rigidbody_object && ob1->rigidbody_object->type == RBO_TYPE_PASSIVE)) {
+                                               if (s->parent_id > 0 ||ob1 == 
ob2 || (ob1 && ob1->rigidbody_object && ob1->rigidbody_object->type == 
RBO_TYPE_PASSIVE)) {
                                                        size[0] = -1.0f; //mark 
as invalid, so the regular object size is used
                                                        size[1] = -1.0f;
                                                        size[2] = -1.0f;
diff --git a/source/blender/editors/object/object_modifier.c 
b/source/blender/editors/object/object_modifier.c
index b67f0bd..90ac189 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -108,6 +108,7 @@
 #include "PIL_time.h"
 
 static void modifier_skin_customdata_delete(struct Object *ob);
+static void apply_loc_rot_scale(struct Object* ob, struct Scene *scene);
 
 /******************************** API ****************************/
 
@@ -2465,76 +2466,34 @@ static int fracture_refresh_exec(bContext *C, 
wmOperator *op)
                return OPERATOR_CANCELLED;
        }
 
+#if 0
+       if (rmd->fracture_mode == MOD_FRACTURE_DYNAMIC) {
+               //apply rot and loc here too
+               copy_m4_m4(rmd->origmat, obact->obmat);
+               zero_m4(rmd->passive_parent_mat);
+
+               apply_loc_rot_scale(obact, scene);
+       }
+#endif
+
        BKE_scene_frame_set(scene, start);
        DAG_relations_tag_update(G.main);
        WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
        WM_event_add_notifier(C, NC_OBJECT | ND_PARENT, NULL);
        WM_event_add_notifier(C, NC_SCENE | ND_FRAME, NULL);
        
-       /*if (!rmd->execute_threaded)*/ {
-#if 0
-               float vec[3] = {0.0f, 0.0f, 0.0f};
-               if (rv3d != NULL)
-               {
-                       /* need 2, 6, and 10 as forward vector, as seen in a 
16-float array */
-                       vec[0] = rv3d->viewmat[0][2];
-                       vec[1] = rv3d->viewmat[1][2];
-                       vec[2] = rv3d->viewmat[2][2];
-               }
-               copy_v3_v3(rmd->forward_vector, vec);
-#endif
-               rmd->refresh = true;
-               rmd->last_frame = INT_MAX; // delete dynamic data as well
-               DAG_id_tag_update(&obact->id, OB_RECALC_DATA);
-               WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, obact);
-       }
-#if 0
-       else {
-               /* job stuff */
-               int factor, verts, shardprogress, halvingprogress, 
totalprogress;
-               scene->r.cfra = cfra;
-
-               /* setup job */
-               wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), 
scene, "Fracture",
-                                                        WM_JOB_PROGRESS, 
WM_JOB_TYPE_OBJECT_FRACTURE);
-               fj = MEM_callocN(sizeof(FractureJob), "object fracture job");
-               fj->fmd = rmd;
-               fj->ob = obact;
-               fj->scene = scene;
-
-               /* if we have shards, totalprogress = shards + islands
-                * if we dont have shards, then calculate number of processed 
halving steps
-                * if we split island to shards, add both */
-               factor = (fj->fmd->frac_algorithm == MOD_FRACTURE_BISECT_FAST) 
? 4 : 2;
-               shardprogress = fj->fmd->shard_count * (factor+1); /* +1 for 
the meshisland creation */
-
-               if (obact->derivedFinal) {
-                       verts = 
obact->derivedFinal->getNumVerts(obact->derivedFinal);
-               }
-               else {
-                       verts = ((Mesh*)obact->data)->totvert;
-               }
-
-               halvingprogress = (int)(verts / 1000) + (fj->fmd->shard_count * 
factor); /*-> 1000 size of each partitioned separate loose*/
-               totalprogress = (rmd->shards_to_islands || rmd->point_source != 
MOD_FRACTURE_UNIFORM) ? shardprogress + halvingprogress : shardprogress;
-               fj->total_progress = totalprogress;
-
-               WM_jobs_customdata_set(wm_job, fj, fracture_free);
-               WM_jobs_timer(wm_job, 0.1, NC_WM | ND_JOB, NC_OBJECT | 
ND_MODIFIER);
-               WM_jobs_callbacks(wm_job, fracture_startjob, NULL, 
fracture_update, fracture_endjob);
-
-               WM_jobs_start(CTX_wm_manager(C), wm_job);
-       }
-#endif
+       rmd->refresh = true;
+       rmd->last_frame = INT_MAX; // delete dynamic data as well
+       DAG_id_tag_update(&obact->id, OB_RECALC_DATA);
+       WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, obact);
 
        return OPERATOR_FINISHED;
 }
 
-static void apply_scale(Object* ob, Scene* scene)
-{
-       float mat[4][4], smat[3][3];
-       /*better apply scale prior to fracture, else shards get distorted*/
-       BKE_object_scale_to_mat3(ob, smat);
+static void apply_transform(Object* ob, Scene* scene, float smat[3][3]) {
+
+       float mat[4][4];
+
        copy_m4_m3(mat, smat);
 
        /* apply to object data */
@@ -2549,13 +2508,59 @@ static void apply_scale(Object* ob, Scene* scene)
                /* update normals */
                BKE_mesh_calc_normals(me);
        }
-       else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
+       else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
                float scale = 1.0f;
                Curve *cu = ob->data;
 
                scale = mat3_to_scale(smat);
                BKE_curve_transform_ex(cu, mat, true, scale);
        }
+       else if (ob->type == OB_FONT) {
+               Curve *cu = ob->data;
+               int i;
+               float scale;
+
+               scale = mat3_to_scale(smat);
+
+               for (i = 0; i < cu->totbox; i++) {
+                       TextBox *tb = &cu->tb[i];
+                       tb->x *= scale;
+                       tb->y *= scale;
+                       tb->w *= scale;
+                       tb->h *= scale;
+               }
+
+               cu->fsize *= scale;
+       }
+}
+
+static void apply_loc_rot_scale(Object* ob, Scene* scene)
+{
+       float rsmat[3][3];
+
+       //determine matrix
+       BKE_object_to_mat3(ob, rsmat);
+       copy_v3_v3(rsmat[3], ob->loc);
+
+       //apply to object data
+       apply_transform(ob, scene, rsmat);
+
+       //reset object values
+       zero_v3(ob->loc);
+       ob->size[0] = ob->size[1] = ob->size[2] = 1.0f;
+       zero_v3(ob->rot);
+       unit_qt(ob->quat);
+       unit_axis_angle(ob->rotAxis, &ob->rotAngle);
+}
+
+static void apply_scale(Object* ob, Scene* scene)
+{
+       float smat[3][3];
+       /*better apply scale prior to fracture, else shards get distorted*/
+       BKE_object_scale_to_mat3(ob, smat);
+
+       /* apply to object data */
+       apply_transform(ob, scene, smat);
 
        /*clear scale too*/
        ob->size[0] = ob->size[1] = ob->size[2] = 1.0f;
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index d017f7a..241ebb7 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1180,7 +1180,7 @@ static FracPointCloud 
get_points_global(FractureModifierData *emd, Object *ob, D
                if (emd->fracture_mode == MOD_FRACTURE_DYNAMIC && 
emd->limit_impact) {
                        //shrink pointcloud container around impact point, to a 
size
                        s = BKE_shard_by_id(emd->frac_mesh, id, fracmesh);
-                       if (s != NULL && (s->shard_id == 0 || s->parent_id == 0 
|| s->impact_size[0] > 0.0f)) {
+                       if (s != NULL && (/*s->shard_id == 0 || s->parent_id == 
0 || */s->impact_size[0] > 0.0f)) {
                                float size[3], nmin[3], nmax[3], loc[3], 
imat[4][4], tmin[3], tmax[3], quat[4];
                                print_v3("Impact Loc\n", s->impact_loc);
                                print_v3("Impact Size\n", s->impact_size);
@@ -3181,7 +3181,7 @@ static MeshIsland* find_meshisland(ListBase* meshIslands, 
int id)
 }
 
 
-#if 0
+
 static bool contains(float loc[3], float size[3], float point[3])
 {
        if ((fabsf(loc[0] - point[0]) < size[0]) &&
@@ -3194,6 +3194,7 @@ static bool contains(float loc[3], float size[3], float 
point[3])
        return false;
 }
 
+#if 0
 void set_rigidbody_type(FractureModifierData *fmd, Shard *s, MeshIsland *mi)
 {
        //how far is impact location away from this shard, if beyond a bbox, 
keep passive
@@ -3373,6 +3374,21 @@ static void do_island_from_shard(FractureModifierData 
*fmd, Object *ob, Shard* s
 
                        //keep 1st level shards kinematic if parent is triggered
                        if (par->id == 0 && (par->rigidbody->flag & 
RBO_FLAG_USE_KINEMATIC_DEACTIVATION) && fmd->limit_impact) {
+#if 0
+                               ShardSequence *prev_shards = 
fmd->current_shard_entry ? fmd->current_shard_entry->prev : NULL;
+                               Shard *par_shard = prev_shards ? 
BKE_shard_by_id(prev_shards->frac_mesh, s->parent_id, NULL) : NULL;
+
+                               if (par_shard) {
+

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to