[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49677] trunk/blender:

Mitchell Stokes mogurijin at gmail.com
Wed Aug 8 03:24:54 CEST 2012


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;
 




More information about the Bf-blender-cvs mailing list