[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51769] trunk/blender: BGE: Adding support for Bullet's collision masks.

Dalai Felinto dfelinto at gmail.com
Tue Oct 30 17:10:11 CET 2012


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 <mogurijin at gmail.com>:
> 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
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs


More information about the Bf-committers mailing list