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
