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)