1
1
forked from 0ad/0ad

Add flag to VisualActor for entities that should only be visible in Atlas. Patch by KareemErgawy. Fixes #1411.

This was SVN commit r13465.
This commit is contained in:
leper 2013-06-09 23:18:21 +00:00
parent 5246e9a576
commit 29549561e1
12 changed files with 35 additions and 13 deletions

View File

@ -3,5 +3,6 @@
<VisualActor>
<SilhouetteDisplay>false</SilhouetteDisplay>
<SilhouetteOccluder>false</SilhouetteOccluder>
<VisibleInAtlasOnly>false</VisibleInAtlasOnly>
</VisualActor>
</Entity>

View File

@ -4,6 +4,7 @@
<Actor>example</Actor>
<SilhouetteDisplay>false</SilhouetteDisplay>
<SilhouetteOccluder>false</SilhouetteOccluder>
<VisibleInAtlasOnly>false</VisibleInAtlasOnly>
</VisualActor>
<Selectable/>
<Position>

View File

@ -4,6 +4,7 @@
<Actor>example</Actor>
<SilhouetteDisplay>false</SilhouetteDisplay>
<SilhouetteOccluder>false</SilhouetteOccluder>
<VisibleInAtlasOnly>false</VisibleInAtlasOnly>
</VisualActor>
<Selectable/>
<Position>

View File

@ -15,5 +15,6 @@
<Actor>(should be overridden)</Actor>
<SilhouetteDisplay>false</SilhouetteDisplay>
<SilhouetteOccluder>false</SilhouetteOccluder>
<VisibleInAtlasOnly>false</VisibleInAtlasOnly>
</VisualActor>
</Entity>

View File

@ -40,5 +40,6 @@
<SilhouetteDisplay>false</SilhouetteDisplay>
<SilhouetteOccluder>true</SilhouetteOccluder>
<Actor>structures/hellenes/wall_medium.xml</Actor>
<VisibleInAtlasOnly>true</VisibleInAtlasOnly>
</VisualActor>
</Entity>

View File

@ -40,5 +40,6 @@
<SilhouetteDisplay>false</SilhouetteDisplay>
<SilhouetteOccluder>true</SilhouetteOccluder>
<Actor>structures/hellenes/wall_medium.xml</Actor>
<VisibleInAtlasOnly>true</VisibleInAtlasOnly>
</VisualActor>
</Entity>

View File

@ -27,5 +27,6 @@
<VisualActor>
<SilhouetteDisplay>false</SilhouetteDisplay>
<SilhouetteOccluder>true</SilhouetteOccluder>
<VisibleInAtlasOnly>false</VisibleInAtlasOnly>
</VisualActor>
</Entity>

View File

@ -21,5 +21,6 @@
<Actor>structures/rubble_stone_3x3.xml</Actor>
<SilhouetteDisplay>false</SilhouetteDisplay>
<SilhouetteOccluder>false</SilhouetteOccluder>
<VisibleInAtlasOnly>false</VisibleInAtlasOnly>
</VisualActor>
</Entity>

View File

@ -104,5 +104,6 @@
<ConstructionPreview/>
<SilhouetteDisplay>false</SilhouetteDisplay>
<SilhouetteOccluder>true</SilhouetteOccluder>
<VisibleInAtlasOnly>false</VisibleInAtlasOnly>
</VisualActor>
</Entity>

View File

@ -119,5 +119,6 @@
<VisualActor>
<SilhouetteDisplay>true</SilhouetteDisplay>
<SilhouetteOccluder>false</SilhouetteOccluder>
<VisibleInAtlasOnly>false</VisibleInAtlasOnly>
</VisualActor>
</Entity>

View File

@ -62,6 +62,7 @@ public:
DEFAULT_COMPONENT_ALLOCATOR(VisualActor)
private:
std::wstring m_ActorName;
CUnit* m_Unit;
@ -85,9 +86,17 @@ public:
bool m_ConstructionPreview;
fixed m_ConstructionProgress;
bool m_VisibleInAtlasOnly;
bool m_NeedsInterpolation;
bool m_PositionChanged;
/// Whether the visual actor has been rendered at least once.
/// Necessary because the visibility update runs on simulation update,
/// which may not occur immediately if the game starts paused.
bool m_PreviouslyRendered;
public:
static std::string GetSchema()
{
return
@ -153,7 +162,10 @@ public:
"</element>"
"</choice>"
"</element>"
"</optional>";
"</optional>"
"<element name='VisibleInAtlasOnly'>"
"<data type='boolean'/>"
"</element>";
}
virtual void Init(const CParamNode& paramNode)
@ -173,6 +185,8 @@ public:
else
m_ActorName = paramNode.GetChild("Actor").ToString();
m_VisibleInAtlasOnly = paramNode.GetChild("VisibleInAtlasOnly").ToBool();
InitModel(paramNode);
// We need to select animation even if graphics are disabled, as this modifies serialized state
@ -497,11 +511,6 @@ public:
}
private:
/// Whether the visual actor has been rendered at least once.
/// Necessary because the visibility update runs on simulation update,
/// which may not occur immediately if the game starts paused.
bool m_PreviouslyRendered;
/// Helper function shared by component init and actor reloading
void InitModel(const CParamNode& paramNode);
@ -831,5 +840,8 @@ void CCmpVisualActor::RenderSubmit(SceneCollector& collector, const CFrustum& fr
if (culling && !frustum.IsBoxVisible(CVector3D(0, 0, 0), model.GetWorldBoundsRec()))
return;
if (!g_AtlasGameLoop->running && m_VisibleInAtlasOnly)
return;
collector.SubmitRecursive(&model);
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2012 Wildfire Games.
/* Copyright (C) 2013 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -79,14 +79,14 @@ public:
TS_ASSERT(actor != NULL);
TS_ASSERT_WSTR_EQUALS(actor->ToXML(),
L"<Footprint><Circle radius=\"2.0\"></Circle><Height>1.0</Height></Footprint><Selectable><EditorOnly></EditorOnly><Overlay><Texture><MainTexture>actor.png</MainTexture><MainTextureMask>actor_mask.png</MainTextureMask></Texture></Overlay></Selectable>"
L"<VisualActor><Actor>example1</Actor><SilhouetteDisplay>false</SilhouetteDisplay><SilhouetteOccluder>false</SilhouetteOccluder></VisualActor>");
L"<VisualActor><Actor>example1</Actor><SilhouetteDisplay>false</SilhouetteDisplay><SilhouetteOccluder>false</SilhouetteOccluder><VisibleInAtlasOnly>false</VisibleInAtlasOnly></VisualActor>");
const CParamNode* preview = tempMan->LoadTemplate(ent2, "preview|unit", -1);
TS_ASSERT(preview != NULL);
TS_ASSERT_WSTR_EQUALS(preview->ToXML(),
L"<Position><Altitude>0</Altitude><Anchor>upright</Anchor><Floating>false</Floating><TurnRate>6.0</TurnRate></Position>"
L"<Vision><AlwaysVisible>true</AlwaysVisible><Range>0</Range><RetainInFog>false</RetainInFog></Vision>"
L"<VisualActor><Actor>example</Actor><SilhouetteDisplay>false</SilhouetteDisplay><SilhouetteOccluder>false</SilhouetteOccluder></VisualActor>");
L"<VisualActor><Actor>example</Actor><SilhouetteDisplay>false</SilhouetteDisplay><SilhouetteOccluder>false</SilhouetteOccluder><VisibleInAtlasOnly>false</VisibleInAtlasOnly></VisualActor>");
const CParamNode* previewobstruct = tempMan->LoadTemplate(ent2, "preview|unitobstruct", -1);
TS_ASSERT(previewobstruct != NULL);
@ -100,14 +100,14 @@ public:
L"</Obstruction>"
L"<Position><Altitude>0</Altitude><Anchor>upright</Anchor><Floating>false</Floating><TurnRate>6.0</TurnRate></Position>"
L"<Vision><AlwaysVisible>true</AlwaysVisible><Range>0</Range><RetainInFog>false</RetainInFog></Vision>"
L"<VisualActor><Actor>example</Actor><SilhouetteDisplay>false</SilhouetteDisplay><SilhouetteOccluder>false</SilhouetteOccluder></VisualActor>");
L"<VisualActor><Actor>example</Actor><SilhouetteDisplay>false</SilhouetteDisplay><SilhouetteOccluder>false</SilhouetteOccluder><VisibleInAtlasOnly>false</VisibleInAtlasOnly></VisualActor>");
const CParamNode* previewactor = tempMan->LoadTemplate(ent2, "preview|actor|example2", -1);
TS_ASSERT(previewactor != NULL);
TS_ASSERT_WSTR_EQUALS(previewactor->ToXML(),
// the actor's <Selectable> element is not part of the preview element subset, hence not included
L"<Footprint><Circle radius=\"2.0\"></Circle><Height>1.0</Height></Footprint><Vision><AlwaysVisible>true</AlwaysVisible><Range>0</Range><RetainInFog>false</RetainInFog></Vision>"
L"<VisualActor><Actor>example2</Actor><SilhouetteDisplay>false</SilhouetteDisplay><SilhouetteOccluder>false</SilhouetteOccluder></VisualActor>");
L"<VisualActor><Actor>example2</Actor><SilhouetteDisplay>false</SilhouetteDisplay><SilhouetteOccluder>false</SilhouetteOccluder><VisibleInAtlasOnly>false</VisibleInAtlasOnly></VisualActor>");
}
void test_LoadTemplate_scriptcache()
@ -140,11 +140,11 @@ public:
const CParamNode* actor = tempMan->LoadTemplate(ent2, "actor|example1", -1);
val = CScriptValRooted(cx, ScriptInterface::ToJSVal(cx, &actor->GetChild("VisualActor")));
TS_ASSERT_WSTR_EQUALS(man.GetScriptInterface().ToString(val.get()), L"({Actor:\"example1\", SilhouetteDisplay:\"false\", SilhouetteOccluder:\"false\"})");
TS_ASSERT_WSTR_EQUALS(man.GetScriptInterface().ToString(val.get()), L"({Actor:\"example1\", SilhouetteDisplay:\"false\", SilhouetteOccluder:\"false\", VisibleInAtlasOnly:\"false\"})");
const CParamNode* foundation = tempMan->LoadTemplate(ent2, "foundation|actor|example1", -1);
val = CScriptValRooted(cx, ScriptInterface::ToJSVal(cx, &foundation->GetChild("VisualActor")));
TS_ASSERT_WSTR_EQUALS(man.GetScriptInterface().ToString(val.get()), L"({Actor:\"example1\", Foundation:(void 0), SilhouetteDisplay:\"false\", SilhouetteOccluder:\"false\"})");
TS_ASSERT_WSTR_EQUALS(man.GetScriptInterface().ToString(val.get()), L"({Actor:\"example1\", Foundation:(void 0), SilhouetteDisplay:\"false\", SilhouetteOccluder:\"false\", VisibleInAtlasOnly:\"false\"})");
}
void test_LoadTemplate_errors()