Index: binaries/data/mods/public/art/actors/structures/athenians/civil_centre.xml =================================================================== --- binaries/data/mods/public/art/actors/structures/athenians/civil_centre.xml +++ binaries/data/mods/public/art/actors/structures/athenians/civil_centre.xml @@ -25,6 +25,24 @@ + + + + + structural/athen_cc_struct.dae + + + + + + + + + + + + + Index: binaries/data/mods/public/art/actors/units/athenians/infantry_archer_b.xml =================================================================== --- binaries/data/mods/public/art/actors/units/athenians/infantry_archer_b.xml +++ binaries/data/mods/public/art/actors/units/athenians/infantry_archer_b.xml @@ -15,6 +15,17 @@ + + skeletal/new/m_tunic_short.dae + + + + + + + + + Index: binaries/data/mods/public/art/actors/units/athenians/infantry_spearman_e.xml =================================================================== --- binaries/data/mods/public/art/actors/units/athenians/infantry_spearman_e.xml +++ binaries/data/mods/public/art/actors/units/athenians/infantry_spearman_e.xml @@ -11,6 +11,13 @@ + + skeletal/new/m_armor_tunic_short.dae + + + + + Index: source/simulation2/components/CCmpProjectileManager.cpp =================================================================== --- source/simulation2/components/CCmpProjectileManager.cpp +++ source/simulation2/components/CCmpProjectileManager.cpp @@ -35,6 +35,7 @@ #include "maths/Quaternion.h" #include "maths/Vector3D.h" #include "ps/CLogger.h" +#include "renderer/Renderer.h" #include "renderer/Scene.h" // Time (in seconds) before projectiles that stuck in the ground are destroyed @@ -373,6 +374,14 @@ // TODO: do something about LOS (copy from CCmpVisualActor) + CMatrix3D worldToCam; + g_Renderer.GetViewCamera().m_Orientation.GetInverse(worldToCam); + CVector3D modelpos = model.GetTransform().GetTranslation(); + float dist = worldToCam.Transform(modelpos).Z; + + if (dist > 250) + return; + collector.SubmitRecursive(&model); } Index: source/simulation2/components/CCmpUnitRenderer.cpp =================================================================== --- source/simulation2/components/CCmpUnitRenderer.cpp +++ source/simulation2/components/CCmpUnitRenderer.cpp @@ -40,6 +40,7 @@ #include "renderer/RenderingOptions.h" #include "renderer/Scene.h" +#include "renderer/Renderer.h" #include "tools/atlas/GameInterface/GameLoop.h" /** @@ -70,6 +71,8 @@ CUnit* actor; + bool LOD; + int flags; /** @@ -436,7 +439,40 @@ if (culling && !frustum.IsBoxVisible(unitModel.GetWorldBoundsRec())) continue; - collector.SubmitRecursive(&unitModel); + CMatrix3D worldToCam; + CRenderer::GetSingleton().GetViewCamera().m_Orientation.GetInverse(worldToCam); + CVector3D modelpos = unitModel.GetTransform().GetTranslation(); + float dist = worldToCam.Transform(modelpos).Z; + if (dist < 0) { + unit.culled = true; + continue; + } + if (dist > 100 && !unit.LOD) { + // Switch to low detail + std::map selections; + selections.insert(std::pair("lod", "low")); + unit.actor->SetEntitySelection(selections); + CModelAbstract& unitModel2 = unit.actor->GetModel(); + CmpPtr cmpPosition(unit.entity); + CMatrix3D transform(cmpPosition->GetInterpolatedTransform(m_FrameOffset)); + unitModel.SetTransform(transform); + collector.SubmitRecursive(&unitModel2); + unit.LOD = true; + } + else if(dist <= 100 && unit.LOD) { + // Switch to high detail + std::map selections; + selections.insert(std::pair("lod", "high")); + unit.actor->SetEntitySelection(selections); + CModelAbstract& unitModel2 = unit.actor->GetModel(); + CmpPtr cmpPosition(unit.entity); + CMatrix3D transform(cmpPosition->GetInterpolatedTransform(m_FrameOffset)); + collector.SubmitRecursive(&unitModel2); + unit.LOD = false; + } + else { + collector.SubmitRecursive(&unitModel); + } } for (size_t i = 0; i < m_DebugSpheres.size(); ++i)