1
0
forked from 0ad/0ad

Add the Obstruction component to entity previews, to support collision detection for building placement

This was SVN commit r7360.
This commit is contained in:
Ykkrosh 2010-03-17 23:02:40 +00:00
parent 0f0a3774d0
commit 18b5a7f17c
3 changed files with 28 additions and 3 deletions

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<Entity>
<VisualActor>
<Actor>example</Actor>
</VisualActor>
<Selectable/>
<Position>
<Altitude>0</Altitude>
<Anchor>upright</Anchor>
<Floating>false</Floating>
</Position>
<UnitMotion/>
<Footprint>
<Circle radius="4"/>
</Footprint>
<Obstruction/>
</Entity>

View File

@ -351,12 +351,16 @@ void CCmpTemplateManager::CopyPreviewSubset(CParamNode& out, const CParamNode& i
permittedComponentTypes.insert("Ownership");
permittedComponentTypes.insert("Position");
permittedComponentTypes.insert("VisualActor");
permittedComponentTypes.insert("Footprint");
permittedComponentTypes.insert("Obstruction");
// (This could be initialised once and reused, but it's not worth the effort)
CParamNode::LoadXMLString(out, "<Entity/>");
out.CopyFilteredChildrenOfChild(in, "Entity", permittedComponentTypes);
// In the future, we might want to add some extra flags to certain components, to indicate they're
// running in 'preview' mode and should not e.g. register with global managers
// Disable the Obstruction component (if there is one) so it doesn't affect pathfinding
if (out.GetChild("Entity").GetChild("Obstruction").IsOk())
CParamNode::LoadXMLString(out, "<Entity><Obstruction><Inactive/></Obstruction></Entity>");
}
void CCmpTemplateManager::CopyFoundationSubset(CParamNode& out, const CParamNode& in)

View File

@ -79,10 +79,14 @@ public:
TS_ASSERT(preview != NULL);
TS_ASSERT_WSTR_EQUALS(preview->ToXML(), L"<Position><Altitude>0</Altitude><Anchor>upright</Anchor><Floating>false</Floating></Position><VisualActor><Actor>example</Actor></VisualActor>");
const CParamNode* previewobstruct = tempMan->LoadTemplate(ent2, L"preview|unitobstruct", -1);
TS_ASSERT(previewobstruct != NULL);
TS_ASSERT_WSTR_EQUALS(previewobstruct->ToXML(), L"<Footprint><Circle radius=\"4\"></Circle></Footprint><Obstruction><Inactive></Inactive></Obstruction><Position><Altitude>0</Altitude><Anchor>upright</Anchor><Floating>false</Floating></Position><VisualActor><Actor>example</Actor></VisualActor>");
const CParamNode* previewactor = tempMan->LoadTemplate(ent2, L"preview|actor|example2", -1);
TS_ASSERT(previewactor != NULL);
TS_ASSERT_WSTR_EQUALS(previewactor->ToXML(), L"<Position><Altitude>0</Altitude><Anchor>upright</Anchor><Floating>false</Floating></Position><VisualActor><Actor>example2</Actor></VisualActor>");
}
}
void test_LoadTemplate_errors()
{