[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22209] branches/blender2.5/blender/source /blender: - allow changing game engine physics types in RNA

Campbell Barton ideasman42 at gmail.com
Tue Aug 4 11:20:48 CEST 2009


Revision: 22209
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22209
Author:   campbellbarton
Date:     2009-08-04 11:20:48 +0200 (Tue, 04 Aug 2009)

Log Message:
-----------
- allow changing game engine physics types in RNA
- allow appending with a NULL scene (only used to add object bases into the current scene)

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_object.c

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-08-04 07:28:17 UTC (rev 22208)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-08-04 09:20:48 UTC (rev 22209)
@@ -10543,7 +10543,7 @@
 					}
 				}
 
-				if(idcode==ID_OB) {	/* loose object: give a base */
+				if(idcode==ID_OB && scene) {	/* loose object: give a base */
 					base= MEM_callocN( sizeof(Base), "app_nam_part");
 					BLI_addtail(&scene->base, base);
 
@@ -10683,7 +10683,8 @@
 	if(fd) fd->reports= NULL;
 
 	/* do we need to do this? */
-	DAG_scene_sort(scene);
+	if(scene)
+		DAG_scene_sort(scene);
 
 	*bh= (BlendHandle*)fd;
 }

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_object.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_object.c	2009-08-04 07:28:17 UTC (rev 22208)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_object.c	2009-08-04 09:20:48 UTC (rev 22209)
@@ -57,6 +57,7 @@
 #include "DNA_key_types.h"
 
 #include "BKE_armature.h"
+#include "BKE_bullet.h"
 #include "BKE_context.h"
 #include "BKE_curve.h"
 #include "BKE_depsgraph.h"
@@ -479,6 +480,86 @@
 		strcpy(str, "");
 }
 
+/* why does this have to be so complicated?, can't all this crap be
+ * moved to in BGE conversion function? - Campbell *
+ *
+ * logic from check_body_type()
+ *  */
+static int rna_GameObjectSettings_physics_type_get(PointerRNA *ptr)
+{
+	Object *ob= (Object*)ptr->id.data;
+
+	/* determine the body_type setting based on flags */
+	if (!(ob->gameflag & OB_COLLISION)) {
+		if (ob->gameflag & OB_OCCLUDER) {
+			ob->body_type = OB_BODY_TYPE_OCCLUDER;
+		} else {
+			ob->body_type = OB_BODY_TYPE_NO_COLLISION;
+		}
+	} else if (ob->gameflag & OB_SENSOR) {
+		ob->body_type = OB_BODY_TYPE_SENSOR;
+	} else if (!(ob->gameflag & OB_DYNAMIC)) {
+		ob->body_type = OB_BODY_TYPE_STATIC;
+	} else if (!(ob->gameflag & (OB_RIGID_BODY|OB_SOFT_BODY))) {
+		ob->body_type = OB_BODY_TYPE_DYNAMIC;
+	} else if (ob->gameflag & OB_RIGID_BODY) {
+		ob->body_type = OB_BODY_TYPE_RIGID;
+	} else {
+		ob->body_type = OB_BODY_TYPE_SOFT;
+		/* create the structure here because we display soft body buttons in the main panel */
+		if (!ob->bsoft)
+			ob->bsoft = bsbNew();
+	}
+
+	return ob->body_type;
+}
+
+static void rna_GameObjectSettings_physics_type_set(PointerRNA *ptr, int value)
+{
+	Object *ob= (Object*)ptr->id.data;
+	ob->body_type= value;
+
+	switch (ob->body_type) {
+	case OB_BODY_TYPE_SENSOR:
+		ob->gameflag |= OB_SENSOR|OB_COLLISION|OB_GHOST;
+		ob->gameflag &= ~(OB_OCCLUDER|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_ACTOR|OB_ANISOTROPIC_FRICTION|OB_DO_FH|OB_ROT_FH|OB_COLLISION_RESPONSE);
+		break;
+	case OB_BODY_TYPE_OCCLUDER:
+		ob->gameflag |= OB_OCCLUDER;
+		ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC);
+		break;
+	case OB_BODY_TYPE_NO_COLLISION:
+		ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC);
+		break;
+	case OB_BODY_TYPE_STATIC:
+		ob->gameflag |= OB_COLLISION;
+		ob->gameflag &= ~(OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+		break;
+	case OB_BODY_TYPE_DYNAMIC:
+		ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_ACTOR;
+		ob->gameflag &= ~(OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+		break;
+	case OB_BODY_TYPE_RIGID:
+		ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_RIGID_BODY|OB_ACTOR;
+		ob->gameflag &= ~(OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+		break;
+	default:
+	case OB_BODY_TYPE_SOFT:
+		ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_SOFT_BODY|OB_ACTOR;
+		ob->gameflag &= ~(OB_RIGID_BODY|OB_OCCLUDER|OB_SENSOR);
+
+		/* assume triangle mesh, if no bounds chosen for soft body */
+		if ((ob->gameflag & OB_BOUNDS) && (ob->boundtype<OB_BOUND_POLYH))
+		{
+			ob->boundtype=OB_BOUND_POLYH;
+		}
+		/* create a BulletSoftBody structure if not already existing */
+		if (!ob->bsoft)
+			ob->bsoft = bsbNew();
+		break;
+	}
+}
+
 static PointerRNA rna_Object_active_particle_system_get(PointerRNA *ptr)
 {
 	Object *ob= (Object*)ptr->id.data;
@@ -667,11 +748,13 @@
 	PropertyRNA *prop;
 
 	static EnumPropertyItem body_type_items[] = {
-		{OB_BODY_TYPE_NO_COLLISION, "NO_COLLISION", 0, "No Collision", ""},
-		{OB_BODY_TYPE_STATIC, "STATIC", 0, "Static", ""},
-		{OB_BODY_TYPE_DYNAMIC, "DYNAMIC", 0, "Dynamic", ""},
-		{OB_BODY_TYPE_RIGID, "RIGID_BODY", 0, "Rigid Body", ""},
-		{OB_BODY_TYPE_SOFT, "SOFT_BODY", 0, "Soft Body", ""},
+		{OB_BODY_TYPE_NO_COLLISION, "NO_COLLISION", 0, "No Collision", "Disable colision for this object"},
+		{OB_BODY_TYPE_STATIC, "STATIC", 0, "Static", "Stationary object"},
+		{OB_BODY_TYPE_DYNAMIC, "DYNAMIC", 0, "Dynamic", "Linear physics"},
+		{OB_BODY_TYPE_RIGID, "RIGID_BODY", 0, "Rigid Body", "Linear and angular physics"},
+		{OB_BODY_TYPE_SOFT, "SOFT_BODY", 0, "Soft Body", "Soft body"},
+		{OB_BODY_TYPE_OCCLUDER, "OCCLUDE", 0, "Occlude", "Occluder for optimizing scene rendering"},
+		{OB_BODY_TYPE_SENSOR, "SENSOR", 0, "Sensor", "Collision Sensor, detects static and dynamic objects but not the other collision sensor objects"},
 		{0, NULL, 0, NULL, NULL}};
 
 	static EnumPropertyItem collision_bounds_items[] = {
@@ -726,7 +809,7 @@
 	prop= RNA_def_property(srna, "physics_type", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_sdna(prop, NULL, "body_type");
 	RNA_def_property_enum_items(prop, body_type_items);
-	RNA_def_property_clear_flag(prop, PROP_EDITABLE); // this controls various gameflags
+	RNA_def_property_enum_funcs(prop, "rna_GameObjectSettings_physics_type_get", "rna_GameObjectSettings_physics_type_set", NULL);
 	RNA_def_property_ui_text(prop, "Physics Type",  "Selects the type of physical representation.");
 
 	prop= RNA_def_property(srna, "actor", PROP_BOOLEAN, PROP_NONE);





More information about the Bf-blender-cvs mailing list