Commit: fb542eadd427e87996077ba2f4dc27dc4dd2c1c5
Author: Luca Rood
Date:   Fri Jan 6 23:36:30 2017 -0200
Branches: cloth-improvements
https://developer.blender.org/rBfb542eadd427e87996077ba2f4dc27dc4dd2c1c5

UI Cleanup: Separate object collisions from self collisions

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

M       release/scripts/startup/bl_ui/properties_physics_cloth.py
M       source/blender/blenkernel/intern/collision.c
M       source/blender/physics/intern/BPH_mass_spring.cpp

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

diff --git a/release/scripts/startup/bl_ui/properties_physics_cloth.py 
b/release/scripts/startup/bl_ui/properties_physics_cloth.py
index a4a32d7e9c..94c7197b97 100644
--- a/release/scripts/startup/bl_ui/properties_physics_cloth.py
+++ b/release/scripts/startup/bl_ui/properties_physics_cloth.py
@@ -195,12 +195,6 @@ class PHYSICS_PT_cloth_collision(PhysicButtonsPanel, 
Panel):
     bl_options = {'DEFAULT_CLOSED'}
     COMPAT_ENGINES = {'BLENDER_RENDER'}
 
-    def draw_header(self, context):
-        cloth = context.cloth.collision_settings
-
-        self.layout.active = cloth_panel_enabled(context.cloth)
-        self.layout.prop(cloth, "use_collision", text="")
-
     def draw(self, context):
         layout = self.layout
 
@@ -208,26 +202,46 @@ class PHYSICS_PT_cloth_collision(PhysicButtonsPanel, 
Panel):
         md = context.cloth
         ob = context.object
 
-        layout.active = cloth.use_collision and cloth_panel_enabled(md)
+        layout.active = cloth_panel_enabled(md)
 
         split = layout.split()
 
         col = split.column()
+        col.prop(cloth, "use_collision", text="Object Collision:")
+
+        sub = col.column()
+        sub.active = cloth.use_collision
+        sub.prop(cloth, "friction")
+        sub.prop(cloth, "repel_force", slider=True, text="Repel")
+
+        col = split.column()
+        col.active = cloth.use_collision
         col.prop(cloth, "collision_quality", text="Quality")
         col.prop(cloth, "distance_min", slider=True, text="Distance")
-        col.prop(cloth, "repel_force", slider=True, text="Repel")
         col.prop(cloth, "distance_repel", slider=True, text="Repel Distance")
-        col.prop(cloth, "friction")
 
-        col = split.column()
-        col.prop(cloth, "use_self_collision", text="Self Collision")
-        sub = col.column()
+        sub = layout.column()
+        sub.active = cloth.use_collision
+        sub.prop(cloth, "group")
+
+        layout.separator()
+
+        col = layout.column()
+
+        split = col.split()
+
+        split.prop(cloth, "use_self_collision", text="Self Collision:")
+        sub = split.column()
         sub.active = cloth.use_self_collision
         sub.prop(cloth, "self_collision_quality", text="Quality")
+
+        sub = col.column()
+        sub.active = cloth.use_self_collision
         sub.prop(cloth, "self_distance_min", slider=True, text="Distance")
-        sub.prop_search(cloth, "vertex_group_self_collisions", ob, 
"vertex_groups", text="")
 
-        layout.prop(cloth, "group")
+        sub = layout.column()
+        sub.active = cloth.use_self_collision
+        sub.prop_search(cloth, "vertex_group_self_collisions", ob, 
"vertex_groups", text="Vertex Group")
 
 
 class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel, Panel):
diff --git a/source/blender/blenkernel/intern/collision.c 
b/source/blender/blenkernel/intern/collision.c
index 858cfbdde3..bc722fc5fb 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -698,89 +698,95 @@ int cloth_bvh_objcollision(Object *ob, ClothModifierData 
*clmd, float step, floa
        // static collisions
        ////////////////////////////////////////////////////////////
 
-       // update cloth bvh
-       bvhtree_update_from_cloth ( clmd, 1 ); // 0 means STATIC, 1 means 
MOVING (see later in this function)
-       bvhselftree_update_from_cloth ( clmd, 0 ); // 0 means STATIC, 1 means 
MOVING (see later in this function)
-       
-       collobjs = get_collisionobjects(clmd->scene, ob, 
clmd->coll_parms->group, &numcollobj, eModifierType_Collision);
-       
-       if (!collobjs)
-               return 0;
-
-       /* move object to position (step) in time */
-       for (i = 0; i < numcollobj; i++) {
-               Object *collob= collobjs[i];
-               CollisionModifierData *collmd = (CollisionModifierData 
*)modifiers_findByType(collob, eModifierType_Collision);
-
-               if (!collmd->bvhtree)
-                       continue;
-
-               /* move object to position (step) in time */
-               collision_move_object ( collmd, step + dt, step );
-       }
+       if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) {
+               bvhtree_update_from_cloth ( clmd, 1 ); // 0 means STATIC, 1 
means MOVING (see later in this function)
 
-       do {
-               CollPair **collisions, **collisions_index;
+               collobjs = get_collisionobjects(clmd->scene, ob, 
clmd->coll_parms->group, &numcollobj, eModifierType_Collision);
                
-               ret2 = 0;
+               if (!collobjs)
+                       return 0;
 
-               collisions = MEM_callocN(sizeof(CollPair *) *numcollobj, 
"CollPair");
-               collisions_index = MEM_callocN(sizeof(CollPair *) *numcollobj, 
"CollPair");
-               
-               // check all collision objects
+               /* move object to position (step) in time */
                for (i = 0; i < numcollobj; i++) {
                        Object *collob= collobjs[i];
                        CollisionModifierData *collmd = (CollisionModifierData 
*)modifiers_findByType(collob, eModifierType_Collision);
-                       BVHTreeOverlap *overlap = NULL;
-                       unsigned int result = 0;
-                       
+
                        if (!collmd->bvhtree)
                                continue;
-                       
-                       /* search for overlapping collision pairs */
-                       overlap = BLI_bvhtree_overlap(cloth_bvh, 
collmd->bvhtree, &result, NULL, NULL);
-                               
-                       // go to next object if no overlap is there
-                       if ( result && overlap ) {
-                               /* check if collisions really happen (costly 
near check) */
-                               cloth_bvh_objcollisions_nearcheck ( clmd, 
collmd, &collisions[i], 
-                                       &collisions_index[i], result, overlap, 
dt/(float)clmd->coll_parms->loop_count);
-                       
-                               // resolve nearby collisions
-                               ret += cloth_bvh_objcollisions_resolve ( clmd, 
collmd, collisions[i],  collisions_index[i]);
-                               ret2 += ret;
-                       }
 
-                       if ( overlap )
-                               MEM_freeN ( overlap );
-               }
-               rounds++;
-               
-               for (i = 0; i < numcollobj; i++) {
-                       if ( collisions[i] ) MEM_freeN ( collisions[i] );
+                       /* move object to position (step) in time */
+                       collision_move_object ( collmd, step + dt, step );
                }
-                       
-               MEM_freeN(collisions);
-               MEM_freeN(collisions_index);
+       }
 
-               ////////////////////////////////////////////////////////////
-               // update positions
-               // this is needed for bvh_calc_DOP_hull_moving() [kdop.c]
-               ////////////////////////////////////////////////////////////
+       if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF) {
+               bvhselftree_update_from_cloth ( clmd, 0 ); // 0 means STATIC, 1 
means MOVING (see later in this function)
+       }
 
-               /* verts come from clmd */
-               for (i = 0; i < mvert_num; i++) {
-                       if ( clmd->sim_parms->vgroup_mass>0 ) {
-                               if ( verts [i].flags & CLOTH_VERT_FLAG_PINNED ) 
{
+       do {
+               ret2 = 0;
+
+               if (clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED) {
+                       CollPair **collisions, **collisions_index;
+
+                       collisions = MEM_callocN(sizeof(CollPair *) 
*numcollobj, "CollPair");
+                       collisions_index = MEM_callocN(sizeof(CollPair *) 
*numcollobj, "CollPair");
+
+                       // check all collision objects
+                       for (i = 0; i < numcollobj; i++) {
+                               Object *collob= collobjs[i];
+                               CollisionModifierData *collmd = 
(CollisionModifierData *)modifiers_findByType(collob, eModifierType_Collision);
+                               BVHTreeOverlap *overlap = NULL;
+                               unsigned int result = 0;
+
+                               if (!collmd->bvhtree)
                                        continue;
+
+                               /* search for overlapping collision pairs */
+                               overlap = BLI_bvhtree_overlap(cloth_bvh, 
collmd->bvhtree, &result, NULL, NULL);
+
+                               // go to next object if no overlap is there
+                               if ( result && overlap ) {
+                                       /* check if collisions really happen 
(costly near check) */
+                                       cloth_bvh_objcollisions_nearcheck ( 
clmd, collmd, &collisions[i],
+                                               &collisions_index[i], result, 
overlap, dt/(float)clmd->coll_parms->loop_count);
+
+                                       // resolve nearby collisions
+                                       ret += cloth_bvh_objcollisions_resolve 
( clmd, collmd, collisions[i],  collisions_index[i]);
+                                       ret2 += ret;
                                }
+
+                               if ( overlap )
+                                       MEM_freeN ( overlap );
                        }
 
-                       VECADD ( verts[i].tx, verts[i].txold, verts[i].tv );
+                       for (i = 0; i < numcollobj; i++) {
+                               if ( collisions[i] ) MEM_freeN ( collisions[i] 
);
+                       }
+
+                       MEM_freeN(collisions);
+                       MEM_freeN(collisions_index);
+
+                       
////////////////////////////////////////////////////////////
+                       // update positions
+                       // this is needed for bvh_calc_DOP_hull_moving() 
[kdop.c]
+                       
////////////////////////////////////////////////////////////
+
+                       /* verts come from clmd */
+                       for (i = 0; i < mvert_num; i++) {
+                               if ( clmd->sim_parms->vgroup_mass>0 ) {
+                                       if ( verts [i].flags & 
CLOTH_VERT_FLAG_PINNED ) {
+                                               continue;
+                                       }
+                               }
+
+                               VECADD ( verts[i].tx, verts[i].txold, 
verts[i].tv );
+                       }
+                       
////////////////////////////////////////////////////////////
                }
-               ////////////////////////////////////////////////////////////
-               
-               
+
+               rounds++;
+
                ////////////////////////////////////////////////////////////
                // Test on *simple* selfcollisions
                ////////////////////////////////////////////////////////////
diff --git a/source/blender/physics/intern/BPH_mass_spring.cpp 
b/source/blender/physics/intern/BPH_mass_spring.cpp
index 334d1681a2..5e23a83c9d 100644
--- a/source/blender/physics/intern/BPH_mass_spring.cpp
+++ b/source/blender/physics/intern/BPH_mass_spring.cpp
@@ -941,7 +941,7 @@ static void cloth_collision_solve_extra(Object *ob, 
ClothModifierData *clmd, Lis
        bool do_extra_solve;
        int i;
        
-       if (!(clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED))
+       if (!(clmd->coll_parms->flags & (CLOTH_COLLSETTINGS_FLAG_ENABLED | 
CLOTH_COLLSETTINGS_FLAG_SELF)))
                return;
        if (!clmd->clothObject->bvhtree)
                return;

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

Reply via email to