Revision: 49677
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49677
Author:   moguri
Date:     2012-08-08 01:24:48 +0000 (Wed, 08 Aug 2012)
Log Message:
-----------


Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_game.py
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/makesdna/DNA_object_types.h
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_game.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_game.py      
2012-08-08 00:52:14 UTC (rev 49676)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_game.py      
2012-08-08 01:24:48 UTC (rev 49677)
@@ -189,8 +189,16 @@
 
             layout.operator("mesh.navmesh_reset")
             layout.operator("mesh.navmesh_clear")
-
-
+               
+        if physics_type not in {'NO_COLLISION', 'OCCLUDE'}:    
+            layout.separator()
+            split = layout.split()
+            
+            col = split.column()
+            col.prop(game, "collision_group")
+            col = split.column()
+            col.prop(game, "collision_mask")
+               
 class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel, Panel):
     bl_label = "Collision Bounds"
     COMPAT_ENGINES = {'BLENDER_GAME'}

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c     2012-08-08 
00:52:14 UTC (rev 49676)
+++ trunk/blender/source/blender/blenkernel/intern/object.c     2012-08-08 
01:24:48 UTC (rev 49677)
@@ -844,6 +844,8 @@
        ob->step_height = 0.15f;
        ob->jump_speed = 10.0f;
        ob->fall_speed = 55.0f;
+       ob->col_group = 0x01;
+       ob->col_mask = 0xff;
        
        /* NT fluid sim defaults */
        ob->fluidsimSettings = NULL;

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2012-08-08 
00:52:14 UTC (rev 49676)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2012-08-08 
01:24:48 UTC (rev 49677)
@@ -7890,6 +7890,16 @@
                        ntreetype->foreach_nodetree(main, NULL, 
do_version_ntree_mask_264);
        }
 
+       {
+               Object *ob;
+               for (ob = main->object.first; ob; ob = ob->id.next) {
+                       if (ob->col_group == 0) {
+                               ob->col_group = 0x01;
+                               ob->col_mask = 0xff;
+                       }
+               }
+       }
+
        /* WATCH IT!!!: pointers from libdata have not been converted yet here! 
*/
        /* WATCH IT 2!: Userdef struct init has to be in 
editors/interface/resources.c! */
 

Modified: trunk/blender/source/blender/makesdna/DNA_object_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_object_types.h    2012-08-08 
00:52:14 UTC (rev 49676)
+++ trunk/blender/source/blender/makesdna/DNA_object_types.h    2012-08-08 
01:24:48 UTC (rev 49677)
@@ -241,6 +241,9 @@
        short recalc;                   /* dependency flag */
        float anisotropicFriction[3];
 
+       /** Collision mask settings */
+       unsigned short col_group, col_mask, col_pad[2];
+
        ListBase constraints;           /* object constraints */
        ListBase nlastrips  DNA_DEPRECATED;                     // XXX 
depreceated... old animation system
        ListBase hooks  DNA_DEPRECATED;                         // XXX 
depreceated... old animation system
@@ -472,6 +475,9 @@
 /* controller state */
 #define OB_MAX_STATES          30
 
+/* collision masks */
+#define OB_MAX_COL_MASKS       8
+
 /* ob->gameflag */
 #define OB_DYNAMIC             1
 #define OB_CHILD               2

Modified: trunk/blender/source/blender/makesrna/intern/rna_object.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object.c   2012-08-08 
00:52:14 UTC (rev 49676)
+++ trunk/blender/source/blender/makesrna/intern/rna_object.c   2012-08-08 
01:24:48 UTC (rev 49677)
@@ -1077,6 +1077,62 @@
        }
 }
 
+static void rna_GameObjectSettings_col_group_get(PointerRNA *ptr, int *values)
+{
+       Object *ob = (Object*)ptr->data;
+       int i;
+
+       for (i = 0; i < OB_MAX_COL_MASKS; i++)
+               values[i] = (ob->col_group & (1<<i));
+}
+
+static void rna_GameObjectSettings_col_group_set(PointerRNA *ptr, const int 
*values)
+{
+       Object *ob = (Object*)ptr->data;
+       int i, tot = 0;
+
+       /* ensure we always have some group selected */
+       for (i = 0; i < OB_MAX_COL_MASKS; i++)
+               if(values[i])
+                       tot++;
+       
+       if (tot==0)
+               return;
+
+       for (i = 0; i < OB_MAX_COL_MASKS; i++) {
+               if (values[i]) ob->col_group |= (1<<i);
+               else ob->col_group &= ~(1<<i);
+       }
+}
+
+static void rna_GameObjectSettings_col_mask_get(PointerRNA *ptr, int *values)
+{
+       Object *ob = (Object*)ptr->data;
+       int i;
+
+       for (i = 0; i < OB_MAX_COL_MASKS; i++)
+               values[i] = (ob->col_mask & (1<<i));
+}
+
+static void rna_GameObjectSettings_col_mask_set(PointerRNA *ptr, const int 
*values)
+{
+       Object *ob = (Object*)ptr->data;
+       int i, tot = 0;
+
+       /* ensure we always have some mask selected */
+       for (i = 0; i < OB_MAX_COL_MASKS; i++)
+               if(values[i])
+                       tot++;
+       
+       if (tot==0)
+               return;
+
+       for (i = 0; i < OB_MAX_COL_MASKS; i++) {
+               if (values[i]) ob->col_mask |= (1<<i);
+               else ob->col_mask &= ~(1<<i);
+       }
+}
+
 static void rna_GameObjectSettings_used_state_get(PointerRNA *ptr, int *values)
 {
        Object *ob = (Object *)ptr->data;
@@ -1438,6 +1494,8 @@
        StructRNA *srna;
        PropertyRNA *prop;
 
+       int default_col_mask[8] = {1,0,0,0,  0,0,0,0};
+
        static EnumPropertyItem body_type_items[] = {
                {OB_BODY_TYPE_NO_COLLISION, "NO_COLLISION", 0, "No Collision", 
"Disable collision for this object"},
                {OB_BODY_TYPE_STATIC, "STATIC", 0, "Static", "Stationary 
object"},
@@ -1561,6 +1619,18 @@
        RNA_def_property_ui_text(prop, "Fall Speed Max", "Maximum speed at 
which the character will fall");
 
 
+       prop = RNA_def_property(srna, "collision_group", PROP_BOOLEAN, 
PROP_LAYER_MEMBER);
+       RNA_def_property_boolean_sdna(prop, NULL, "col_group", 1);
+       RNA_def_property_array(prop, OB_MAX_COL_MASKS);
+       RNA_def_property_ui_text(prop, "Collision Group", "The collision group 
of the object");
+       RNA_def_property_boolean_funcs(prop, 
"rna_GameObjectSettings_col_group_get", "rna_GameObjectSettings_col_group_set");
+
+       prop = RNA_def_property(srna, "collision_mask", PROP_BOOLEAN, 
PROP_LAYER_MEMBER);
+       RNA_def_property_boolean_sdna(prop, NULL, "col_mask", 1);
+       RNA_def_property_array(prop, OB_MAX_COL_MASKS);
+       RNA_def_property_ui_text(prop, "Collision Mask", "The groups this 
object can collide with");
+       RNA_def_property_boolean_funcs(prop, 
"rna_GameObjectSettings_col_mask_get", "rna_GameObjectSettings_col_mask_set");
+
        /* lock position */
        prop = RNA_def_property(srna, "lock_location_x", PROP_BOOLEAN, 
PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "gameflag2", 
OB_LOCK_RIGID_BODY_X_AXIS);

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2012-08-08 
00:52:14 UTC (rev 49676)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2012-08-08 
01:24:48 UTC (rev 49677)
@@ -481,7 +481,20 @@
        }
 }
 
+void KX_GameObject::SetUserCollisionGroup(short group)
+{
+       m_userCollisionGroup = group;
+}
+void KX_GameObject::SetUserCollisionMask(short mask)
+{
+       m_userCollisionMask = mask;
+}
 
+bool KX_GameObject::CheckCollision(KX_GameObject* other)
+{
+       return this->m_userCollisionGroup & other->m_userCollisionMask;
+}
+
 CValue* KX_GameObject::GetReplica()
 {
        KX_GameObject* replica = new KX_GameObject(*this);

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.h      2012-08-08 
00:52:14 UTC (rev 49676)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.h      2012-08-08 
01:24:48 UTC (rev 49677)
@@ -98,6 +98,10 @@
        bool                                                            
m_bIsNegativeScaling;
        MT_Vector4                                                      
m_objectColor;
 
+       // Bit fields for user control over physics collisions
+       short                                                           
m_userCollisionGroup;
+       short                                                           
m_userCollisionMask;
+
        // visible = user setting
        // culled = while rendering, depending on camera
        bool                                                            
m_bVisible; 
@@ -464,6 +468,13 @@
         * @add/remove the graphic controller to the physic system
         */
        void ActivateGraphicController(bool recurse);
+       
+       void SetUserCollisionGroup(short filter);
+       void SetUserCollisionMask(short mask);
+       /**
+        * Extra broadphase check for user controllable collisions
+        */
+       bool CheckCollision(KX_GameObject *other);
 
        /**
         * \section Coordinate system manipulation functions

Modified: 
trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp    
2012-08-08 00:52:14 UTC (rev 49676)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp    
2012-08-08 01:24:48 UTC (rev 49677)
@@ -2214,11 +2214,19 @@
 bool CcdOverlapFilterCallBack::needBroadphaseCollision(btBroadphaseProxy* 
proxy0,btBroadphaseProxy* proxy1) const
 {
        btCollisionObject *colObj0, *colObj1;
+       KX_GameObject *gameObj0 = 
KX_GameObject::GetClientObject((KX_ClientObjectInfo*)((CcdPhysicsController*)((btCollisionObject*)proxy0->m_clientObject)->getUserPointer())->getNewClientInfo());
+       KX_GameObject *gameObj1 = 
KX_GameObject::GetClientObject((KX_ClientObjectInfo*)((CcdPhysicsController*)((btCollisionObject*)proxy1->m_clientObject)->getUserPointer())->getNewClientInfo());
        CcdPhysicsController *sensorCtrl, *objCtrl;
+
        bool collides;
        // first check the filters
        collides = (proxy0->m_collisionFilterGroup & 
proxy1->m_collisionFilterMask) != 0;
        collides = collides && (proxy1->m_collisionFilterGroup & 
proxy0->m_collisionFilterMask);
+       if (gameObj0 && gameObj1)
+       {
+               collides = collides && gameObj0->CheckCollision(gameObj1);
+               collides = collides && gameObj1->CheckCollision(gameObj0);
+       }
        if (!collides)
                return false;
 

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

Reply via email to