forked from bartvdbraak/blender
This commit is contained in:
parent
e9d73dbba5
commit
843b45cafa
@ -189,8 +189,16 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel, Panel):
|
|||||||
|
|
||||||
layout.operator("mesh.navmesh_reset")
|
layout.operator("mesh.navmesh_reset")
|
||||||
layout.operator("mesh.navmesh_clear")
|
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):
|
class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel, Panel):
|
||||||
bl_label = "Collision Bounds"
|
bl_label = "Collision Bounds"
|
||||||
COMPAT_ENGINES = {'BLENDER_GAME'}
|
COMPAT_ENGINES = {'BLENDER_GAME'}
|
||||||
|
@ -844,6 +844,8 @@ Object *BKE_object_add_only_object(int type, const char *name)
|
|||||||
ob->step_height = 0.15f;
|
ob->step_height = 0.15f;
|
||||||
ob->jump_speed = 10.0f;
|
ob->jump_speed = 10.0f;
|
||||||
ob->fall_speed = 55.0f;
|
ob->fall_speed = 55.0f;
|
||||||
|
ob->col_group = 0x01;
|
||||||
|
ob->col_mask = 0xff;
|
||||||
|
|
||||||
/* NT fluid sim defaults */
|
/* NT fluid sim defaults */
|
||||||
ob->fluidsimSettings = NULL;
|
ob->fluidsimSettings = NULL;
|
||||||
|
@ -7890,6 +7890,16 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
|
|||||||
ntreetype->foreach_nodetree(main, NULL, do_version_ntree_mask_264);
|
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!!!: pointers from libdata have not been converted yet here! */
|
||||||
/* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
|
/* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
|
||||||
|
|
||||||
|
@ -241,6 +241,9 @@ typedef struct Object {
|
|||||||
short recalc; /* dependency flag */
|
short recalc; /* dependency flag */
|
||||||
float anisotropicFriction[3];
|
float anisotropicFriction[3];
|
||||||
|
|
||||||
|
/** Collision mask settings */
|
||||||
|
unsigned short col_group, col_mask, col_pad[2];
|
||||||
|
|
||||||
ListBase constraints; /* object constraints */
|
ListBase constraints; /* object constraints */
|
||||||
ListBase nlastrips DNA_DEPRECATED; // XXX depreceated... old animation system
|
ListBase nlastrips DNA_DEPRECATED; // XXX depreceated... old animation system
|
||||||
ListBase hooks DNA_DEPRECATED; // XXX depreceated... old animation system
|
ListBase hooks DNA_DEPRECATED; // XXX depreceated... old animation system
|
||||||
@ -472,6 +475,9 @@ typedef struct DupliObject {
|
|||||||
/* controller state */
|
/* controller state */
|
||||||
#define OB_MAX_STATES 30
|
#define OB_MAX_STATES 30
|
||||||
|
|
||||||
|
/* collision masks */
|
||||||
|
#define OB_MAX_COL_MASKS 8
|
||||||
|
|
||||||
/* ob->gameflag */
|
/* ob->gameflag */
|
||||||
#define OB_DYNAMIC 1
|
#define OB_DYNAMIC 1
|
||||||
#define OB_CHILD 2
|
#define OB_CHILD 2
|
||||||
|
@ -1077,6 +1077,62 @@ static void rna_GameObjectSettings_state_set(PointerRNA *ptr, const int *values)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
static void rna_GameObjectSettings_used_state_get(PointerRNA *ptr, int *values)
|
||||||
{
|
{
|
||||||
Object *ob = (Object *)ptr->data;
|
Object *ob = (Object *)ptr->data;
|
||||||
@ -1438,6 +1494,8 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
|
|||||||
StructRNA *srna;
|
StructRNA *srna;
|
||||||
PropertyRNA *prop;
|
PropertyRNA *prop;
|
||||||
|
|
||||||
|
int default_col_mask[8] = {1,0,0,0, 0,0,0,0};
|
||||||
|
|
||||||
static EnumPropertyItem body_type_items[] = {
|
static EnumPropertyItem body_type_items[] = {
|
||||||
{OB_BODY_TYPE_NO_COLLISION, "NO_COLLISION", 0, "No Collision", "Disable collision for this object"},
|
{OB_BODY_TYPE_NO_COLLISION, "NO_COLLISION", 0, "No Collision", "Disable collision for this object"},
|
||||||
{OB_BODY_TYPE_STATIC, "STATIC", 0, "Static", "Stationary object"},
|
{OB_BODY_TYPE_STATIC, "STATIC", 0, "Static", "Stationary object"},
|
||||||
@ -1561,6 +1619,18 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
|
|||||||
RNA_def_property_ui_text(prop, "Fall Speed Max", "Maximum speed at which the character will fall");
|
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 */
|
/* lock position */
|
||||||
prop = RNA_def_property(srna, "lock_location_x", PROP_BOOLEAN, PROP_NONE);
|
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);
|
RNA_def_property_boolean_sdna(prop, NULL, "gameflag2", OB_LOCK_RIGID_BODY_X_AXIS);
|
||||||
|
@ -481,6 +481,19 @@ void KX_GameObject::ActivateGraphicController(bool recurse)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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()
|
CValue* KX_GameObject::GetReplica()
|
||||||
{
|
{
|
||||||
|
@ -98,6 +98,10 @@ protected:
|
|||||||
bool m_bIsNegativeScaling;
|
bool m_bIsNegativeScaling;
|
||||||
MT_Vector4 m_objectColor;
|
MT_Vector4 m_objectColor;
|
||||||
|
|
||||||
|
// Bit fields for user control over physics collisions
|
||||||
|
short m_userCollisionGroup;
|
||||||
|
short m_userCollisionMask;
|
||||||
|
|
||||||
// visible = user setting
|
// visible = user setting
|
||||||
// culled = while rendering, depending on camera
|
// culled = while rendering, depending on camera
|
||||||
bool m_bVisible;
|
bool m_bVisible;
|
||||||
@ -464,6 +468,13 @@ public:
|
|||||||
* @add/remove the graphic controller to the physic system
|
* @add/remove the graphic controller to the physic system
|
||||||
*/
|
*/
|
||||||
void ActivateGraphicController(bool recurse);
|
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
|
* \section Coordinate system manipulation functions
|
||||||
|
@ -2214,11 +2214,19 @@ void CcdPhysicsEnvironment::CallbackTriggers()
|
|||||||
bool CcdOverlapFilterCallBack::needBroadphaseCollision(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) const
|
bool CcdOverlapFilterCallBack::needBroadphaseCollision(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) const
|
||||||
{
|
{
|
||||||
btCollisionObject *colObj0, *colObj1;
|
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;
|
CcdPhysicsController *sensorCtrl, *objCtrl;
|
||||||
|
|
||||||
bool collides;
|
bool collides;
|
||||||
// first check the filters
|
// first check the filters
|
||||||
collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0;
|
collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0;
|
||||||
collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
|
collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
|
||||||
|
if (gameObj0 && gameObj1)
|
||||||
|
{
|
||||||
|
collides = collides && gameObj0->CheckCollision(gameObj1);
|
||||||
|
collides = collides && gameObj1->CheckCollision(gameObj0);
|
||||||
|
}
|
||||||
if (!collides)
|
if (!collides)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user