#pragma once #ifndef _LBT_LAYERS__H_ #define _LBT_LAYERS__H_ #include "LogicalBodyTypes/AbstractXMLLoader.h" #include namespace LogicalBodyTypes { // Layers configuration implemented as singleton and loadable from XML. class Layers : public AbstractXMLLoader, public Singleton { public: using Singleton ::Instance; struct LayerProperties { char* identifier; bool render; bool renderShadows; } typedef LayerProperties; typedef std::vector LayerPropertiesVector; private: enum ParseState { E_ELEMENT_LAYERS = FIRST_SUBCLASS_STATE, E_ELEMENT_LAYER }; typedef std::pair ZLevelPair; typedef std::stack ZStack; typedef std::vector ZStackVector; struct ParseData : public AbstractXMLLoader::ParseData { // shadow ParseData type and also extend the ParseData stuct of the base class ParseData(XML_Parser* parser) : AbstractXMLLoader::ParseData(parser) { directionZStacks.resize(NUM_WORLD_DIRECTIONS); }; ZStackVector directionZStacks; } typedef ParseData; struct LayerGraphNode { INT32 zIndex; LayerPropertiesVector::size_type index; LayerProperties* pLayerProperties; } typedef LayerGraphNode; typedef std::list LayerGraph; typedef std::vector LayerGraphsVector; LayerPropertiesVector layers; LayerGraphsVector directionLayerGraphs; public: typedef LayerGraph::iterator LayerGraphIterator; public: Layers(void); ~Layers(void); LayerPropertiesVector::size_type GetCount(); // returns -1 if layer doesn't exist LayerPropertiesVector::size_type GetIndex(std::string& identifier); const Layers::LayerProperties& GetLayerProperties(LayerPropertiesVector::size_type index); LayerGraphIterator GetIterator(WorldDirections direction); LayerGraphIterator GetIterationEnd(WorldDirections direction); LayerGraphIterator GetIterator(INT8 direction); LayerGraphIterator GetIterationEnd(INT8 direction); private: static void XMLCALL StartElementHandle(void* userData, const XML_Char* name, const XML_Char** atts); static void XMLCALL CharacterDataHandle(void* userData, const XML_Char* str, int len); static void XMLCALL EndElementHandle(void* userData, const XML_Char* name); void AddLayerGraphNode(WorldDirections dir, std::string identifier, bool render, bool renderShadows, INT32 zIndex); static AbstractXMLLoader::ParseData* MakeParseData(XML_Parser* parser); // shadow factory function for ParseData instances void UpdateConfiguration(); }; } #endif