Index: binaries/data/mods/public/simulation/templates/template_unit_cavalry.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_cavalry.xml +++ binaries/data/mods/public/simulation/templates/template_unit_cavalry.xml @@ -68,6 +68,7 @@ + 128x256/ellipse.png Index: binaries/data/mods/public/simulation/templates/template_unit_hero_infantry.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_hero_infantry.xml +++ binaries/data/mods/public/simulation/templates/template_unit_hero_infantry.xml @@ -28,6 +28,7 @@ upright + 128x128/star.png Index: binaries/data/mods/public/simulation/templates/units/maur_elephant_archer_b.xml =================================================================== --- binaries/data/mods/public/simulation/templates/units/maur_elephant_archer_b.xml +++ binaries/data/mods/public/simulation/templates/units/maur_elephant_archer_b.xml @@ -47,10 +47,11 @@ + - 256x256/ellipse.png - 256x256/ellipse_mask.png + 128x256/ellipse.png + 128x256/ellipse_mask.png Index: binaries/data/mods/public/simulation/templates/units/maur_support_elephant.xml =================================================================== --- binaries/data/mods/public/simulation/templates/units/maur_support_elephant.xml +++ binaries/data/mods/public/simulation/templates/units/maur_support_elephant.xml @@ -45,10 +45,11 @@ false + - 256x256/ellipse.png - 256x256/ellipse_mask.png + 128x256/ellipse.png + 128x256/ellipse_mask.png Index: source/simulation2/components/CCmpSelectable.cpp =================================================================== --- source/simulation2/components/CCmpSelectable.cpp +++ source/simulation2/components/CCmpSelectable.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2019 Wildfire Games. +/* Copyright (C) 2020 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -107,9 +107,36 @@ "" "" "" - ""; + "" + "" + "" + "" + "" + "" + "0.0" + "" + "" + "" + "" + "0.0" + "" + "" + "" + "" + "" + "" + "0.0" + "" + "" + "" + "" + ""; } + EShape m_Shape; + entity_pos_t m_Size0; // width/radius + entity_pos_t m_Size1; // height/radius + virtual void Init(const CParamNode& paramNode) { m_EditorOnly = paramNode.GetChild("EditorOnly").IsOk(); @@ -145,6 +172,22 @@ m_OverlayDescriptor.m_LineThickness = outlineNode.GetChild("LineThickness").ToFloat(); } + if (paramNode.GetChild("Square").IsOk()) + { + m_Shape = SQUARE; + m_Size0 = paramNode.GetChild("Square").GetChild("@width").ToFixed(); + m_Size1 = paramNode.GetChild("Square").GetChild("@depth").ToFixed(); + } + else if (paramNode.GetChild("Circle").IsOk()) + { + m_Shape = CIRCLE; + m_Size0 = m_Size1 = paramNode.GetChild("Circle").GetChild("@radius").ToFixed(); + } + else + { + m_Shape = NONE; + } + m_EnabledInterpolate = false; m_EnabledRenderSubmit = false; UpdateMessageSubscriptions(); @@ -218,7 +261,7 @@ void RenderSubmit(SceneCollector& collector, const CFrustum& frustum, bool culling); /** - * Draw a textured line overlay. The selection overlays for structures are based solely on footprint shape. + * Draw a textured line overlay. */ void UpdateTexturedLineOverlay(const SOverlayDescriptor* overlayDescriptor, SOverlayTexturedLine& overlay, float frameOffset); @@ -427,14 +470,17 @@ return; CmpPtr cmpPosition(GetEntityHandle()); - CmpPtr cmpFootprint(GetEntityHandle()); - if (!cmpFootprint || !cmpPosition || !cmpPosition->IsInWorld()) + if (!cmpPosition || !cmpPosition->IsInWorld()) return; - ICmpFootprint::EShape fpShape; - entity_pos_t fpSize0_fixed, fpSize1_fixed, fpHeight_fixed; - cmpFootprint->GetShape(fpShape, fpSize0_fixed, fpSize1_fixed, fpHeight_fixed); - + ICmpFootprint::EShape shape; + if (m_Shape == ICmpSelectable::NONE) { + CmpPtr cmpFootprint(GetEntityHandle()); + if (!cmpFootprint) + return; + entity_pos_t h; + cmpFootprint->GetShape(shape, m_Size0, m_Size1, h); + } float rotY; CVector2D origin; cmpPosition->GetInterpolatedPosition2D(frameOffset, origin.X, origin.Y, rotY); @@ -443,10 +489,10 @@ overlay.m_Color = m_Color; overlay.CreateOverlayTexture(overlayDescriptor); - if (fpShape == ICmpFootprint::SQUARE) - SimRender::ConstructTexturedLineBox(overlay, origin, cmpPosition->GetRotation(), fpSize0_fixed.ToFloat(), fpSize1_fixed.ToFloat()); + if (m_Shape == ICmpSelectable::SQUARE || shape == ICmpFootprint::SQUARE) + SimRender::ConstructTexturedLineBox(overlay, origin, cmpPosition->GetRotation(), m_Size0.ToFloat(), m_Size1.ToFloat()); else - SimRender::ConstructTexturedLineCircle(overlay, origin, fpSize0_fixed.ToFloat()); + SimRender::ConstructTexturedLineCircle(overlay, origin, m_Size0.ToFloat()); } void CCmpSelectable::UpdateDynamicOverlay(float frameOffset) @@ -462,9 +508,17 @@ return; CmpPtr cmpPosition(GetEntityHandle()); - CmpPtr cmpFootprint(GetEntityHandle()); - if (!cmpFootprint || !cmpPosition || !cmpPosition->IsInWorld()) + if (!cmpPosition || !cmpPosition->IsInWorld()) return; + + ICmpFootprint::EShape shape; + if (m_Shape == ICmpSelectable::NONE) { + CmpPtr cmpFootprint(GetEntityHandle()); + if (!cmpFootprint) + return; + entity_pos_t h; + cmpFootprint->GetShape(shape, m_Size0, m_Size1, h); + } float rotY; CVector2D position; @@ -477,10 +531,6 @@ CTerrain* terrain = cmpTerrain->GetCTerrain(); ENSURE(terrain); - ICmpFootprint::EShape fpShape; - entity_pos_t fpSize0_fixed, fpSize1_fixed, fpHeight_fixed; - cmpFootprint->GetShape(fpShape, fpSize0_fixed, fpSize1_fixed, fpHeight_fixed); - // --------------------------------------------------------------------------------- if (!m_UnitOverlay) @@ -510,9 +560,9 @@ CVector2D unitX(c, s); CVector2D unitZ(-s, c); - float halfSizeX = fpSize0_fixed.ToFloat(); - float halfSizeZ = fpSize1_fixed.ToFloat(); - if (fpShape == ICmpFootprint::SQUARE) + float halfSizeX = m_Size0.ToFloat(); + float halfSizeZ = m_Size1.ToFloat(); + if (m_Shape == ICmpSelectable::SQUARE || shape == ICmpFootprint::SQUARE) { halfSizeX /= 2.0f; halfSizeZ /= 2.0f; Index: source/simulation2/components/ICmpSelectable.h =================================================================== --- source/simulation2/components/ICmpSelectable.h +++ source/simulation2/components/ICmpSelectable.h @@ -25,6 +25,12 @@ class ICmpSelectable : public IComponent { public: + enum EShape + { + NONE, + CIRCLE, + SQUARE + }; /** * Returns true if the entity is only selectable in Atlas editor, e.g. a decorative visual actor. */