diff options
author | Daniel Stokes <kupomail@gmail.com> | 2013-12-18 02:42:47 +0400 |
---|---|---|
committer | kupoman <kupomail@gmail.com> | 2013-12-18 05:03:27 +0400 |
commit | e9e08a1d12594eab0e341049fc252ff8578e9333 (patch) | |
tree | ac7c15959b03398babb68058f3824c2a4dbff5b7 /source/gameengine/Converter/BL_BlenderDataConversion.cpp | |
parent | 173f7a3d30db8cba95656bf03dc842b9300c2436 (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.cpp | 30 |
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 |