[Bf-blender-cvs] [8bd2323] fracture_modifier: further tweaks for dynamic fracture
Martin Felke
noreply at git.blender.org
Mon Oct 3 15:11:51 CEST 2016
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. @@
More information about the Bf-blender-cvs
mailing list