#pragma once #ifndef _LBT_BODYTYPE__H_ #define _LBT_BODYTYPE__H_ #include "LogicalBodyTypes/Layers.h" #include "LogicalBodyTypes/Filter.h" #include "LogicalBodyTypes/SurfaceCache.h" #include "LogicalBodyTypes/SurfaceDB.h" #include "LogicalBodyTypes/PaletteDB.h" #include "LogicalBodyTypes/PaletteTable.h" #include "Animation Data.h" #include "Animation Control.h" namespace LogicalBodyTypes { class BodyType { public: struct LogicalSurfaceType { LogicalSurfaceType(AnimationSurfaceType* physicalSurfaceType, AnimationSurfaceType* alphaSurfaceType, UINT32 alphaSurfaceIdx, PaletteTable* paletteTable) : paletteTable(paletteTable), physicalSurfaceType(physicalSurfaceType), alphaSurfaceType(alphaSurfaceType), alphaSurfaceIdx(alphaSurfaceIdx) {}; const PaletteTable* paletteTable; const AnimationSurfaceType* physicalSurfaceType; const AnimationSurfaceType* alphaSurfaceType; UINT32 alphaSurfaceIdx; } typedef LogicalSurfaceType; private: typedef std::pair > FilterSurfaceTypePair; typedef std::list FilterSurfaceTypeList; typedef std::vector LayerVector; typedef std::vector AnimStateVector; typedef std::vector PhysAnimSurfaceVector; AnimStateVector animstates; PhysAnimSurfaceVector physAnimSurfaces; Layers::LayerPropertiesVector layerProperties; Filter* filter; bool hasSurfaces; UINT32 numCacheNodes; UINT32 maxCacheNodes; SurfaceCache* cache; public: BodyType(UINT32 cacheSize, Filter* filterP = NULL); ~BodyType(void); void AddSurfaceForAnimState(UINT16 usAnimState, Layers::LayerPropertiesVector::size_type layer, AnimationSurfaceType* animSurfaceType, AnimationSurfaceType* alphaSurfaceType = NULL, Filter* filter = NULL, PaletteTable* paletteTable = NULL); void AddSurfaceForPhysSurface(UINT16 usAnimSurface, Layers::LayerPropertiesVector::size_type layer, AnimationSurfaceType* animSurfaceType, AnimationSurfaceType* alphaSurfaceType = NULL, Filter* filter = NULL, PaletteTable* paletteTable = NULL); void SetLayerProperties(Layers::LayerPropertiesVector::size_type index, Layers::LayerProperties properties); const Layers::LayerProperties* GetLayerProperties(Layers::LayerPropertiesVector::size_type index); inline bool Match(SOLDIERTYPE* pSoldier) { if (filter != NULL) return filter->Match(pSoldier); return false; // no filter specified - matches none }; inline bool HasSurfaces() { return hasSurfaces; } inline BodyType::LogicalSurfaceType* GetLogicalSurfaceType(Layers::LayerPropertiesVector::size_type layer, SOLDIERTYPE* pSoldier) { FilterSurfaceTypeList::iterator end = animstates[pSoldier->usAnimState][layer].end(); for (FilterSurfaceTypeList::iterator i = animstates[pSoldier->usAnimState][layer].begin(); i != end; i++) { Filter* f = (*i).first; if (f != NULL) { if (f->Match(pSoldier)) { bool isLoaded = cache->GetLoadedSurface((*i).second.first) != NULL; if ((*i).second.second.alphaSurfaceType != NULL) { isLoaded = isLoaded && (cache->GetLoadedSurface((*i).second.second.alphaSurfaceIdx) != NULL); } return (isLoaded) ? &(*i).second.second : NULL; } } else { // no filter specified - matches all bool isLoaded = cache->GetLoadedSurface((*i).second.first) != NULL; if ((*i).second.second.alphaSurfaceType != NULL) { isLoaded = isLoaded && (cache->GetLoadedSurface((*i).second.second.alphaSurfaceIdx) != NULL); } return (isLoaded) ? &(*i).second.second : NULL; } } end = physAnimSurfaces[pSoldier->usAnimSurface][layer].end(); for (FilterSurfaceTypeList::iterator i = physAnimSurfaces[pSoldier->usAnimSurface][layer].begin(); i != end; i++) { Filter* f = (*i).first; if (f != NULL) { if (f->Match(pSoldier)) { bool isLoaded = cache->GetLoadedSurface((*i).second.first) != NULL; if ((*i).second.second.alphaSurfaceType != NULL) { isLoaded = isLoaded && (cache->GetLoadedSurface((*i).second.second.alphaSurfaceIdx) != NULL); } return (isLoaded) ? &(*i).second.second : NULL; } } else { // no filter specified - matches all bool isLoaded = cache->GetLoadedSurface((*i).second.first) != NULL; if ((*i).second.second.alphaSurfaceType != NULL) { isLoaded = isLoaded && (cache->GetLoadedSurface((*i).second.second.alphaSurfaceIdx) != NULL); } return (isLoaded) ? &(*i).second.second : NULL; } } return NULL; }; }; } #endif