Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stokes <kupomail@gmail.com>2013-12-18 02:42:47 +0400
committerkupoman <kupomail@gmail.com>2013-12-18 05:03:27 +0400
commite9e08a1d12594eab0e341049fc252ff8578e9333 (patch)
treeac7c15959b03398babb68058f3824c2a4dbff5b7 /source/gameengine/Converter/BL_BlenderDataConversion.cpp
parent173f7a3d30db8cba95656bf03dc842b9300c2436 (diff)
Game Engine: Level of detail support and tools
Levels of detail can be added and modified in the object panel. The object panel also contains new tools for generating levels of detail, setting up levels of detail based on object names (useful for importing), and clearing an object's level of detail settings. This is meant as a game engine feature, though the level of details settings can be previewed in the viewport. Reviewed By: moguri, nexyon, brecht Differential Revision: http://developer.blender.org/D109
Diffstat (limited to 'source/gameengine/Converter/BL_BlenderDataConversion.cpp')
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp30
1 files changed, 28 insertions, 2 deletions
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index eeaffd9005a..9998f10e417 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -93,6 +93,7 @@
#include "KX_SoftBodyDeformer.h"
//#include "BL_ArmatureController.h"
#include "BLI_utildefines.h"
+#include "BLI_listbase.h"
#include "BlenderWorldInfo.h"
#include "KX_KetsjiEngine.h"
@@ -938,8 +939,15 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, KX_Scene* scene,
RAS_MeshObject *meshobj;
int lightlayer = blenderobj ? blenderobj->lay:(1<<20)-1; // all layers if no object.
- if ((meshobj = converter->FindGameMesh(mesh/*, ob->lay*/)) != NULL)
- return meshobj;
+ // Without checking names, we get some reuse we don't want that can cause
+ // problems with material LoDs.
+ if ((meshobj = converter->FindGameMesh(mesh/*, ob->lay*/)) != NULL) {
+ STR_String bge_name = meshobj->GetName();
+ STR_String blender_name = ((Mesh*)blenderobj->data)->id.name+2;
+ if (bge_name == blender_name)
+ return meshobj;
+ }
+
// Get DerivedMesh data
DerivedMesh *dm = CDDM_from_mesh(mesh, blenderobj);
DM_ensure_tessface(dm);
@@ -1852,6 +1860,24 @@ static KX_GameObject *gameobject_from_blenderobject(
// set transformation
gameobj->AddMesh(meshobj);
+
+ // gather levels of detail
+ if (BLI_countlist(&ob->lodlevels) > 1) {
+ LodLevel *lod = ((LodLevel*)ob->lodlevels.first)->next;
+ Mesh* lodmesh = mesh;
+ Object* lodmatob = ob;
+ gameobj->AddLodMesh(meshobj);
+ for (; lod; lod = lod->next) {
+ if (!lod->source || lod->source->type != OB_MESH) continue;
+ if (lod->flags & OB_LOD_USE_MESH) {
+ lodmesh = static_cast<Mesh*>(lod->source->data);
+ }
+ if (lod->flags & OB_LOD_USE_MAT) {
+ lodmatob = lod->source;
+ }
+ gameobj->AddLodMesh(BL_ConvertMesh(lodmesh, lodmatob, kxscene, converter, libloading));
+ }
+ }
// for all objects: check whether they want to
// respond to updates