[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57982] branches/soc-2013-bge/source: Cleaning up the game engine level of detail logic to avoid crashes with levels that have no source object defined .

Daniel Stokes kupomail at gmail.com
Thu Jul 4 04:40:00 CEST 2013


Revision: 57982
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57982
Author:   kupoman
Date:     2013-07-04 02:39:58 +0000 (Thu, 04 Jul 2013)
Log Message:
-----------
Cleaning up the game engine level of detail logic to avoid crashes with levels that have no source object defined.

Modified Paths:
--------------
    branches/soc-2013-bge/source/blender/blenkernel/intern/object.c
    branches/soc-2013-bge/source/blender/makesdna/DNA_object_types.h
    branches/soc-2013-bge/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    branches/soc-2013-bge/source/gameengine/Ketsji/KX_GameObject.cpp

Modified: branches/soc-2013-bge/source/blender/blenkernel/intern/object.c
===================================================================
--- branches/soc-2013-bge/source/blender/blenkernel/intern/object.c	2013-07-03 23:46:56 UTC (rev 57981)
+++ branches/soc-2013-bge/source/blender/blenkernel/intern/object.c	2013-07-04 02:39:58 UTC (rev 57982)
@@ -1014,7 +1014,6 @@
 	LodLevel* new_level = lod_level_select(ob, camera_position);
 
 	if (new_level != cur_level) {
-		printf("Level Switch!\n");
 		ob->currentlod = new_level;
 		return true;
 	}

Modified: branches/soc-2013-bge/source/blender/makesdna/DNA_object_types.h
===================================================================
--- branches/soc-2013-bge/source/blender/makesdna/DNA_object_types.h	2013-07-03 23:46:56 UTC (rev 57981)
+++ branches/soc-2013-bge/source/blender/makesdna/DNA_object_types.h	2013-07-04 02:39:58 UTC (rev 57982)
@@ -105,8 +105,7 @@
 typedef struct LodLevel {
 	struct LodLevel *next, *prev;
 	struct Object *source;
-	char level;		/* for BGE usage to handle lookups */
-	char use_mesh, use_mat, use_logic;
+	char use_mesh, use_mat, use_logic, pad;
 	float distance;
 } LodLevel;
 

Modified: branches/soc-2013-bge/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/soc-2013-bge/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2013-07-03 23:46:56 UTC (rev 57981)
+++ branches/soc-2013-bge/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2013-07-04 02:39:58 UTC (rev 57982)
@@ -2000,8 +2000,8 @@
 			Mesh* lodmesh = mesh;
 			Object* lodmatob = ob;
 			gameobj->AddLodMesh(meshobj);
-			for (int i = 1; lod; lod = lod->next, i++) {
-				lod->level = i;
+			for (; lod; lod = lod->next) {
+				if (!lod->source) continue;
 				if (lod->use_mesh) {
 					lodmesh = static_cast<Mesh*>(lod->source->data);
 				}

Modified: branches/soc-2013-bge/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- branches/soc-2013-bge/source/gameengine/Ketsji/KX_GameObject.cpp	2013-07-03 23:46:56 UTC (rev 57981)
+++ branches/soc-2013-bge/source/gameengine/Ketsji/KX_GameObject.cpp	2013-07-04 02:39:58 UTC (rev 57982)
@@ -732,13 +732,15 @@
 	MT_Vector3 delta = this->NodeGetWorldPosition() - cam_pos;
 	float distance2 = delta.dot(delta);
 
+	int level = 0;
 	Object *bob = this->GetBlenderObject();
 	LodLevel *lod = (LodLevel*) bob->lodlevels.first;
-	for (int i = 0; lod; lod = lod->next, i++) {
+	for (; lod; lod = lod->next, level++) {
+		if (!lod->source) level--;
 		if (!lod->next || lod->next->distance * lod->next->distance > distance2) break;
 	}
 
-	RAS_MeshObject *mesh = this->m_lodmeshes[lod->level];
+	RAS_MeshObject *mesh = this->m_lodmeshes[level];
 
 	if (mesh != this->m_meshes[0]) {
 		this->GetScene()->ReplaceMesh(this, mesh, true, false);




More information about the Bf-blender-cvs mailing list