Hi Mitchell,

Just a quick remind to use real names in commit logs :)
So kudos for Daniel Stokes (Kupoman) for the original patch and Alex
Fraser (z0r) for testing.

--
Dalai

2012/10/30 Mitchell Stokes <[email protected]>:
> Revision: 51769
>           
> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51769
> Author:   moguri
> Date:     2012-10-30 15:44:16 +0000 (Tue, 30 Oct 2012)
> Log Message:
> -----------
> BGE: Adding support for Bullet's collision masks. Each object now has a 
> collision mask and a collision group. Object A and object B collide if object 
> A's groups is in object B's mask and object B's group is in object A's mask. 
> In other words, the group defines what the object is (collision wise) and the 
> group defines what the object can collide with.
>
> The majority of this patch was provided by Kupoman with some edits from me 
> and heavy testing by z0r.
>
> 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/Converter/BL_BlenderDataConversion.cpp
>     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-10-30 15:33:03 UTC (rev 51768)
> +++ trunk/blender/release/scripts/startup/bl_ui/properties_game.py      
> 2012-10-30 15:44:16 UTC (rev 51769)
> @@ -190,7 +190,15 @@
>              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-10-30 
> 15:33:03 UTC (rev 51768)
> +++ trunk/blender/source/blender/blenkernel/intern/object.c     2012-10-30 
> 15:44:16 UTC (rev 51769)
> @@ -854,7 +854,9 @@
>         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-10-30 
> 15:33:03 UTC (rev 51768)
> +++ trunk/blender/source/blender/blenloader/intern/readfile.c   2012-10-30 
> 15:44:16 UTC (rev 51769)
> @@ -8247,6 +8247,16 @@
>
>         }
>
> +       {
> +               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-10-30 
> 15:33:03 UTC (rev 51768)
> +++ trunk/blender/source/blender/makesdna/DNA_object_types.h    2012-10-30 
> 15:44:16 UTC (rev 51769)
> @@ -243,6 +243,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 
> deprecated... old animation system
>         ListBase hooks  DNA_DEPRECATED;                         // XXX 
> deprecated... old animation system
> @@ -479,6 +482,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-10-30 
> 15:33:03 UTC (rev 51768)
> +++ trunk/blender/source/blender/makesrna/intern/rna_object.c   2012-10-30 
> 15:44:16 UTC (rev 51769)
> @@ -1111,6 +1111,63 @@
>         }
>  }
>
> +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_Object_active_shape_key_index_range(PointerRNA *ptr, int 
> *min, int *max, int *softmin, int *softmax)
>  {
>         Object *ob = (Object *)ptr->id.data;
> @@ -1456,6 +1513,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"},
> @@ -1578,7 +1637,18 @@
>         RNA_def_property_range(prop, 0.0, 1000.0);
>         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/Converter/BL_BlenderDataConversion.cpp
> ===================================================================
> --- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp    
>   2012-10-30 15:33:03 UTC (rev 51768)
> +++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp    
>   2012-10-30 15:44:16 UTC (rev 51769)
> @@ -1587,9 +1587,17 @@
>         //bool bRigidBody = (userigidbody == 0);
>
>         // object has physics representation?
> -       if (!(blenderobject->gameflag & OB_COLLISION))
> +       if (!(blenderobject->gameflag & OB_COLLISION)) {
> +               // Respond to all collisions so that Near sensors work on No 
> Collision
> +               // objects.
> +               gameobj->SetUserCollisionGroup(0xff);
> +               gameobj->SetUserCollisionMask(0xff);
>                 return;
> +       }
>
> +       gameobj->SetUserCollisionGroup(blenderobject->col_group);
> +       gameobj->SetUserCollisionMask(blenderobject->col_mask);
> +
>         // get Root Parent of blenderobject
>         struct Object* parent= blenderobject->parent;
>         while (parent && parent->parent) {
>
> Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
> ===================================================================
> --- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2012-10-30 
> 15:33:03 UTC (rev 51768)
> +++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp    2012-10-30 
> 15:44:16 UTC (rev 51769)
> @@ -531,7 +531,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-10-30 
> 15:33:03 UTC (rev 51768)
> +++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.h      2012-10-30 
> 15:44:16 UTC (rev 51769)
> @@ -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;
> @@ -494,7 +498,14 @@
>          */
>         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-10-30 15:33:03 UTC (rev 51768)
> +++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp  
>   2012-10-30 15:44:16 UTC (rev 51769)
> @@ -2208,10 +2208,29 @@
>  {
>         btCollisionObject *colObj0, *colObj1;
>         CcdPhysicsController *sensorCtrl, *objCtrl;
> +
> +       KX_GameObject *kxObj0 = KX_GameObject::GetClientObject(
> +                       (KX_ClientObjectInfo*)
> +                       ((CcdPhysicsController*)
> +                                       
> (((btCollisionObject*)proxy0->m_clientObject)->getUserPointer()))
> +                       ->getNewClientInfo());
> +       KX_GameObject *kxObj1 = KX_GameObject::GetClientObject(
> +                       (KX_ClientObjectInfo*)
> +                       ((CcdPhysicsController*)
> +                                       
> (((btCollisionObject*)proxy1->m_clientObject)->getUserPointer()))
> +                       ->getNewClientInfo());
> +
> +       // First check the filters. Note that this is called during scene
> +       // conversion, so we can't assume the KX_GameObject instances exist. 
> This
> +       // may make some objects erroneously collide on the first frame, but 
> the
> +       // alternative is to have them erroneously miss.
>         bool collides;
> -       // first check the filters
>         collides = (proxy0->m_collisionFilterGroup & 
> proxy1->m_collisionFilterMask) != 0;
>
> @@ Diff output truncated at 10240 characters. @@
> _______________________________________________
> Bf-blender-cvs mailing list
> [email protected]
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
_______________________________________________
Bf-committers mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-committers

Reply via email to