mirror of
https://github.com/1dot13/source.git
synced 2026-09-09 14:46:05 +02:00
LOBOT code (by Asdow, original code by Bio).
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8755 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
#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<Filter*, std::pair<UINT32, LogicalSurfaceType> > FilterSurfaceTypePair;
|
||||
typedef std::list<FilterSurfaceTypePair> FilterSurfaceTypeList;
|
||||
typedef std::vector<FilterSurfaceTypeList> LayerVector;
|
||||
typedef std::vector<LayerVector> AnimStateVector;
|
||||
typedef std::vector<LayerVector> 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
|
||||
Reference in New Issue
Block a user