diff --git a/binaries/data/mods/public/shaders/arb/model_common.fp b/binaries/data/mods/public/shaders/arb/model_common.fp index 911b4db560..78ad553a96 100644 --- a/binaries/data/mods/public/shaders/arb/model_common.fp +++ b/binaries/data/mods/public/shaders/arb/model_common.fp @@ -116,9 +116,11 @@ TEX tex, v_tex, texture[0], 2D; #endif #endif -// Multiply everything by the LOS texture -TEX tex.a, v_los, texture[2], 2D; -MUL color.rgb, color, tex.a; +#if !IGNORE_LOS + // Multiply everything by the LOS texture + TEX tex.a, v_los, texture[2], 2D; + MUL color.rgb, color, tex.a; +#endif MUL result.color.rgb, color, shadingColor; diff --git a/binaries/data/mods/public/shaders/glsl/model_common.fs b/binaries/data/mods/public/shaders/glsl/model_common.fs index 498a84311f..0dc92c5d77 100644 --- a/binaries/data/mods/public/shaders/glsl/model_common.fs +++ b/binaries/data/mods/public/shaders/glsl/model_common.fs @@ -108,8 +108,10 @@ void main() vec3 color = (texdiffuse * sundiffuse + specular) * get_shadow() + texdiffuse * ambient; - float los = texture2D(losTex, v_los).a; - color *= los; + #if !IGNORE_LOS + float los = texture2D(losTex, v_los).a; + color *= los; + #endif color *= shadingColor; diff --git a/source/graphics/Model.cpp b/source/graphics/Model.cpp index af9ce38e58..0bb0e0c491 100644 --- a/source/graphics/Model.cpp +++ b/source/graphics/Model.cpp @@ -589,6 +589,10 @@ void CModel::SetTransform(const CMatrix3D& transform) void CModel::AddFlagsRec(int flags) { m_Flags |= flags; + + if (flags & MODELFLAG_IGNORE_LOS) + m_Material.AddShaderDefine("IGNORE_LOS", "1"); + for (size_t i = 0; i < m_Props.size(); ++i) if (m_Props[i].m_Model->ToCModel()) m_Props[i].m_Model->ToCModel()->AddFlagsRec(flags); diff --git a/source/graphics/Model.h b/source/graphics/Model.h index 31c6d3ed2c..93c7173dd4 100644 --- a/source/graphics/Model.h +++ b/source/graphics/Model.h @@ -40,7 +40,8 @@ class CSkeletonAnimManager; #define MODELFLAG_NOLOOPANIMATION (1<<1) #define MODELFLAG_SILHOUETTE_DISPLAY (1<<2) #define MODELFLAG_SILHOUETTE_OCCLUDER (1<<3) -#define MODELFLAG_FILTERED (1<<4) // used internally by renderer +#define MODELFLAG_IGNORE_LOS (1<<4) +#define MODELFLAG_FILTERED (1<<5) // used internally by renderer /////////////////////////////////////////////////////////////////////////////// // CModel: basically, a mesh object - holds the texturing and skinning diff --git a/source/graphics/Unit.cpp b/source/graphics/Unit.cpp index 245bf2d5ac..4da02fb92e 100644 --- a/source/graphics/Unit.cpp +++ b/source/graphics/Unit.cpp @@ -120,7 +120,7 @@ void CUnit::ReloadObject() newModel->ToCModel()->CopyAnimationFrom(m_Model->ToCModel()); // Copy flags that belong to this model instance (not those defined by the actor XML) - int instanceFlags = (MODELFLAG_SILHOUETTE_DISPLAY|MODELFLAG_SILHOUETTE_OCCLUDER) & m_Model->ToCModel()->GetFlags(); + int instanceFlags = (MODELFLAG_SILHOUETTE_DISPLAY|MODELFLAG_SILHOUETTE_OCCLUDER|MODELFLAG_IGNORE_LOS) & m_Model->ToCModel()->GetFlags(); newModel->ToCModel()->AddFlagsRec(instanceFlags); } diff --git a/source/simulation2/TypeList.h b/source/simulation2/TypeList.h index 696d2e07b1..987be63875 100644 --- a/source/simulation2/TypeList.h +++ b/source/simulation2/TypeList.h @@ -152,7 +152,7 @@ COMPONENT(Vision) // Note: this component relies on the Footprint component being initialized before itself. See the comments above for // the Footprint component to find out why. INTERFACE(Visual) -COMPONENT(VisualActor) // must be after Ownership (dependency in Deserialize) +COMPONENT(VisualActor) // must be after Ownership (dependency in Deserialize) and Vision (dependency in Init) INTERFACE(WaterManager) COMPONENT(WaterManager) diff --git a/source/simulation2/components/CCmpVisualActor.cpp b/source/simulation2/components/CCmpVisualActor.cpp index 33163db7c2..44c59bb37d 100644 --- a/source/simulation2/components/CCmpVisualActor.cpp +++ b/source/simulation2/components/CCmpVisualActor.cpp @@ -152,15 +152,23 @@ public: m_Unit = GetSimContext().GetUnitManager().CreateUnit(m_ActorName, GetActorSeed(), selections); if (m_Unit) { - u32 modelFlags = 0; - if (paramNode.GetChild("SilhouetteDisplay").ToBool()) - modelFlags |= MODELFLAG_SILHOUETTE_DISPLAY; - if (paramNode.GetChild("SilhouetteOccluder").ToBool()) - modelFlags |= MODELFLAG_SILHOUETTE_OCCLUDER; - CModelAbstract& model = m_Unit->GetModel(); if (model.ToCModel()) + { + u32 modelFlags = 0; + + if (paramNode.GetChild("SilhouetteDisplay").ToBool()) + modelFlags |= MODELFLAG_SILHOUETTE_DISPLAY; + + if (paramNode.GetChild("SilhouetteOccluder").ToBool()) + modelFlags |= MODELFLAG_SILHOUETTE_OCCLUDER; + + CmpPtr cmpVision(GetSimContext(), GetEntityId()); + if (cmpVision && cmpVision->GetAlwaysVisible()) + modelFlags |= MODELFLAG_IGNORE_LOS; + model.ToCModel()->AddFlagsRec(modelFlags); + } // Initialize the model's selection shape descriptor. This currently relies on the component initialization order; the // Footprint component must be initialized before this component (VisualActor) to support the ability to use the footprint