Commit: 05fdb2e63f20e403a69c28d0f2731cdbeaa8a4f2
Author: Martin Felke
Date:   Sat Dec 6 22:53:50 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rB05fdb2e63f20e403a69c28d0f2731cdbeaa8a4f2

added a breakable checkbox for fracture modifier, this is an attempt to enable 
destructability later on when needed

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

M       release/scripts/startup/bl_ui/properties_physics_fracture.py
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/makesrna/intern/rna_modifier.c
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 5bd3dd3..5f4cfdf 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -119,7 +119,9 @@ class PHYSICS_PT_fracture_simulation(PhysicButtonsPanel, 
Panel):
         ob = context.object
 
         layout.label("Constraint Building Settings")
-        layout.prop(md, "use_constraints")
+        row = layout.row()
+        row.prop(md, "use_constraints")
+        row.prop(md, "use_breaking")
         col = layout.column(align=True)
         col.prop(md, "constraint_limit", text="Constraint limit, per 
MeshIsland")
         col.prop(md, "contact_dist")
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index bb401dc..fde1185 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1466,7 +1466,7 @@ void 
BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyS
                        }
                }
        }
-       if (rbc->physics_constraint == NULL || rebuild || (rbc->flag & 
RBC_FLAG_USE_KINEMATIC_DEACTIVATION)) {
+       if (rbc->physics_constraint == NULL || rebuild || (rbc->flag & 
RBC_FLAG_USE_KINEMATIC_DEACTIVATION) || (rbc->flag & RBC_FLAG_NEEDS_VALIDATE)) {
 
                /* remove constraint if it already exists before creating a new 
one */
                if (rbc->physics_constraint) {
@@ -1603,6 +1603,7 @@ void 
BKE_rigidbody_validate_sim_shard_constraint(RigidBodyWorld *rbw, RigidBodyS
        }
 
        rbc->flag &= ~RBC_FLAG_USE_KINEMATIC_DEACTIVATION;
+       rbc->flag &= ~RBC_FLAG_NEEDS_VALIDATE;
 }
 
 static bool colgroup_check(int group1, int group2)
@@ -2656,8 +2657,8 @@ static void rigidbody_update_simulation(Scene *scene, 
RigidBodyWorld *rbw, bool
 
                        if (isModifierActive(rmd)) {
                                float max_con_mass = 0;
-                       
                                int count = BLI_countlist(&rmd->meshIslands);
+
                                for (mi = rmd->meshIslands.first; mi; mi = 
mi->next) {
                                        if (mi->rigidbody == NULL) {
                                                continue;
@@ -2666,65 +2667,74 @@ static void rigidbody_update_simulation(Scene *scene, 
RigidBodyWorld *rbw, bool
                                                /* perform simulation data 
updates as tagged */
                                                /* refresh object... */
                                                int do_rebuild = rebuild;
-                                               float weight = 
mi->thresh_weight;
-                                               int breaking_percentage = 
rmd->breaking_percentage_weighted ? (rmd->breaking_percentage * weight) : 
rmd->breaking_percentage;
-                                               
-                                               if (rmd->breaking_percentage > 
0 || (rmd->breaking_percentage_weighted && weight > 0)) {
-                                                       int broken_cons = 0, 
cons = 0, i = 0, cluster_cons = 0, broken_cluster_cons = 0;
-                                                       RigidBodyShardCon *con;
-                                                       
-                                                       cons = 
mi->participating_constraint_count;
-                                                       /* calc ratio of broken 
cons here, per MeshIsland and flag the rest to be broken too*/
-                                                       for (i = 0; i < cons; 
i++) {
-                                                               con = 
mi->participating_constraints[i];
-                                                               if (con && 
con->physics_constraint) {
-                                                                       if 
(rmd->cluster_breaking_percentage > 0)
-                                                                       {
-                                                                               
/*only count as broken if between clusters!*/
-                                                                               
if (con->mi1->particle_index != con->mi2->particle_index)
+                                               if (rmd->use_breaking)
+                                               {
+                                                       float weight = 
mi->thresh_weight;
+                                                       int breaking_percentage 
= rmd->breaking_percentage_weighted ? (rmd->breaking_percentage * weight) : 
rmd->breaking_percentage;
+
+                                                       if 
(rmd->breaking_percentage > 0 || (rmd->breaking_percentage_weighted && weight > 
0)) {
+                                                               int broken_cons 
= 0, cons = 0, i = 0, cluster_cons = 0, broken_cluster_cons = 0;
+                                                               
RigidBodyShardCon *con;
+
+                                                               cons = 
mi->participating_constraint_count;
+                                                               /* calc ratio 
of broken cons here, per MeshIsland and flag the rest to be broken too*/
+                                                               for (i = 0; i < 
cons; i++) {
+                                                                       con = 
mi->participating_constraints[i];
+                                                                       if (con 
&& con->physics_constraint) {
+                                                                               
if (rmd->cluster_breaking_percentage > 0)
                                                                                
{
-                                                                               
        cluster_cons++;
-
-                                                                               
        if (!RB_constraint_is_enabled(con->physics_constraint)) {
-                                                                               
                broken_cluster_cons++;
+                                                                               
        /*only count as broken if between clusters!*/
+                                                                               
        if (con->mi1->particle_index != con->mi2->particle_index)
+                                                                               
        {
+                                                                               
                cluster_cons++;
+
+                                                                               
                if (!RB_constraint_is_enabled(con->physics_constraint)) {
+                                                                               
                        broken_cluster_cons++;
+                                                                               
                }
                                                                                
        }
                                                                                
}
-                                                                       }
 
-                                                                       if 
(!RB_constraint_is_enabled(con->physics_constraint)) {
-                                                                               
broken_cons++;
+                                                                               
if (!RB_constraint_is_enabled(con->physics_constraint)) {
+                                                                               
        broken_cons++;
+                                                                               
}
                                                                        }
                                                                }
-                                                       }
-
-                                                       if (cluster_cons > 0) {
-                                                               if 
((float)broken_cluster_cons / (float)cluster_cons * 100 >= 
rmd->cluster_breaking_percentage) {
-                                                                       for (i 
= 0; i < cons; i++) {
-                                                                               
con = mi->participating_constraints[i];
-                                                                               
if (con && con->mi1->particle_index != con->mi2->particle_index) {
-                                                                               
        con->flag &= ~RBC_FLAG_ENABLED;
-                                                                               
        con->flag |= RBC_FLAG_NEEDS_VALIDATE;
 
-                                                                               
        if (con->physics_constraint) {
-                                                                               
                RB_constraint_set_enabled(con->physics_constraint, false);
+                                                               if 
(cluster_cons > 0) {
+                                                                       if 
((float)broken_cluster_cons / (float)cluster_cons * 100 >= 
rmd->cluster_breaking_percentage) {
+                                                                               
for (i = 0; i < cons; i++) {
+                                                                               
        con = mi->participating_constraints[i];
+                                                                               
        if (con && con->mi1->particle_index != con->mi2->particle_index) {
+                                                                               
                if (rmd->use_breaking)
+                                                                               
                {
+                                                                               
                        con->flag &= ~RBC_FLAG_ENABLED;
+                                                                               
                        con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+
+                                                                               
                        if (con->physics_constraint) {
+                                                                               
                                
RB_constraint_set_enabled(con->physics_constraint, false);
+                                                                               
                        }
+                                                                               
                }
                                                                                
        }
                                                                                
}
                                                                        }
                                                                }
-                                                       }
 
-                                                       
-                                                       if (cons > 0) {
-                                                               if 
((float)broken_cons / (float)cons * 100 >= breaking_percentage) {
-                                                                       /* 
break all cons if over percentage */
-                                                                       for (i 
= 0; i < cons; i++) {
-                                                                               
con = mi->participating_constraints[i];
-                                                                               
if (con) {
-                                                                               
        con->flag &= ~RBC_FLAG_ENABLED;
-                                                                               
        con->flag |= RBC_FLAG_NEEDS_VALIDATE;
-                                                                               
        
-                                                                               
        if (con->physics_constraint) {
-                                                                               
                RB_constraint_set_enabled(con->physics_constraint, false);
+
+                                                               if (cons > 0) {
+                                                                       if 
((float)broken_cons / (float)cons * 100 >= breaking_percentage) {
+                                                                               
/* break all cons if over percentage */
+                                                                               
for (i = 0; i < cons; i++) {
+                                                                               
        con = mi->participating_constraints[i];
+                                                                               
        if (con) {
+                                                                               
                if (rmd->use_breaking)
+                                                                               
                {
+                                                                               
                        con->flag &= ~RBC_FLAG_ENABLED;
+                                                                               
                        con->flag |= RBC_FLAG_NEEDS_VALIDATE;
+
+                                                                               
                        if (con->physics_constraint) {
+                                                                               
                                
RB_constraint_set_enabled(con->physics_constraint, false);
+                                                                               
                        }
+                                                                               
                }
                                                                                
        }
                                                                                
}
                                                                        }
@@ -2760,85 +2770,97 @@ static void rigidbody_update_simulation(Scene *scene, 
RigidBodyWorld *rbw, bool
                                                        iterations = 
rmd->solver_iterations_override;
                                                }
                                        }
-                                       
+
                                        if (iterations > 0) {
                                                rbsc->flag |= 
RBC_FLAG_OVERRIDE_SOLVER_ITERATIONS;
                                                rbsc->num_solver_iterations = 
iterations;
                                        }
-                                       
+
                                        if 
((rmd->use_mass_dependent_thresholds)) {
                                                
BKE_rigidbody_calc_threshold(max_con_mass, rmd, rbsc);
                                        }
-                                       
+
                                        if (((rmd->breaking_angle) > 0) || 
(rmd->breaking_angle_weighted && weight > 0) ||
-                                           (((rmd->breaking_distance > 0) || 
(rmd->breaking_distance_weighted && weight > 0)) ||
-                                            (rmd->cluster_breaking_angle > 0 
|| rmd->cluster_breaking_distance > 0)) && !rebuild )
+                                               (((rmd->breaking_distance > 0) 
|| (rmd->breaking_distance_weighted && weight > 0)) ||
+                                                (rmd->cluster_breaking_angle > 
0 || rmd->cluster_breaking_distance > 0)) && !rebuild )
                                        {
                                                float dist, angle, distdiff, 
anglediff;
                                                calc_dist_angle(rbsc, &dist, 
&angle);
-                                               
+
                                                anglediff = fabs(angle - 
rbsc->start_angle);
                                                distdiff = fabs(dist - 
rbsc->start_dist);
 
                                                /* Treat angles here */
                                                if ((rmd->breaking_angle > 0 || 
(rmd->breaking_angle_weighted && weight > 0)) &&
-                                                   (anglediff > 
breaking_angle))
+                                                       (anglediff > 
breaking_angle))
                                                {
                                                        /* if we have cluster 
breaking angle, then only treat equal cluster indexes like the default, else 
all */
                                                        if 
((rmd->cluster_breaking_angle > 0 && rbsc->mi1->particle_index == 
rbsc->mi2->particle_index) ||
-                                                            
rmd->cluster_breaking_angle == 0)
+                                                                
rmd->cluster_breaking_angle == 0)
                                                        {
-                                                               rbsc->flag &= 
~RBC_FLAG_ENABLED;
-                                                               rbsc->flag |= 
RBC_FLAG_NEEDS_VALIDATE;
-                                                       
-                                                               if 
(rbsc->physics_constraint) {
-                                                                       
RB_constraint_set_enabled(rbsc->physics_constraint, false);
+                                                               if 
(rmd->use_breaking)
+                                                               {
+                                                                       
rbsc->flag &= ~RBC_FLAG_ENABLED;
+                                                                       
rbsc->flag |= RBC_FLAG_NEEDS_VALIDATE;
+
+                                                                       if 
(rbsc->physics_constraint) {
+                                                                               
RB_constraint_set_enabled(rbsc->physics_constraint, false);
+                                                                       }
                                                                }
                                                        }
                                                }
 
                                                if 
((rmd->cluster_breaking_angle > 0) && (rbsc->mi1->particle_index != 
rbsc->mi2->particle_index)
-                                                   && anglediff > 
rmd->cluster_breaking_angle)
+                                                       && anglediff > 
rmd->cluster_breaking_angle)
                                                {
-                                                       rbsc->flag &= 
~RBC_FLAG_ENABLED;
-                                                       rbsc->flag |= 
RBC_FLAG_NEEDS_VALIDATE;
+                                                       if (rmd->use_breaking)
+                                                       {
+                                                               rbsc->flag &= 
~RBC_FLAG_ENABLED;
+                                                               rbsc->flag |= 
RBC_FLAG_NEEDS_VALIDATE;
 
-                                                       if 
(rbsc->physics_constraint) {
-                                                               
RB_constraint_set_enabled(rbsc->physics_constraint, false);
+                                                               if 
(rbsc->physics_constraint) {
+                                                                       
RB_constraint_set_enabled(rbsc->physics_constraint, false);
+                                                               }
                                                        }
                                                }
-                                               
+
                                                /* Treat distances here */
                                                if ((rmd->breaking_distance > 0 
|| (rmd->breaking_distance_weighted && weight > 0)) &&
-                                                   (distdiff > 
breaking_distance))
+                                                       (distdiff > 
breaking_distance))
                                                {
                                                        /* if we have cluster 
breaking distance, then only treat equal cluster indexes like the default, else 
all */
                                                        if ((rmd->clust

@@ 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