#include "precompiled.h" #include "types.h" #include "MapReader.h" #include "UnitManager.h" #include "ObjectManager.h" #include "BaseEntity.h" #include "BaseEntityCollection.h" #include "EntityManager.h" #include "Model.h" #include "Terrain.h" #include "TextureManager.h" // CMapReader constructor: nothing to do at the minute CMapReader::CMapReader() { } // LoadMap: try to load the map from given file; reinitialise the scene to new data if successful void CMapReader::LoadMap(const char* filename, CTerrain *pTerrain, CUnitManager *pUnitMan, CLightEnv *pLightEnv) { CFileUnpacker unpacker; unpacker.Read(filename,"PSMP"); // check version if (unpacker.GetVersion()=2) { UnpackLightEnv(unpacker); } } // UnpackLightEnv: unpack lighting parameters from input stream void CMapReader::UnpackLightEnv(CFileUnpacker& unpacker) { unpacker.UnpackRaw(&m_LightEnv.m_SunColor,sizeof(m_LightEnv.m_SunColor)); unpacker.UnpackRaw(&m_LightEnv.m_Elevation,sizeof(m_LightEnv.m_Elevation)); unpacker.UnpackRaw(&m_LightEnv.m_Rotation,sizeof(m_LightEnv.m_Rotation)); unpacker.UnpackRaw(&m_LightEnv.m_TerrainAmbientColor,sizeof(m_LightEnv.m_TerrainAmbientColor)); unpacker.UnpackRaw(&m_LightEnv.m_UnitsAmbientColor,sizeof(m_LightEnv.m_UnitsAmbientColor)); } // UnpackObjects: unpack world objects from input stream void CMapReader::UnpackObjects(CFileUnpacker& unpacker) { // unpack object types u32 numObjTypes; unpacker.UnpackRaw(&numObjTypes,sizeof(numObjTypes)); m_ObjectTypes.resize(numObjTypes); for (uint i=0;iGetHandle(); } m_TerrainTextures.push_back(handle); } // unpack tile data u32 tilesPerSide=m_MapSize*PATCH_SIZE; m_Tiles.resize(SQR(tilesPerSide)); unpacker.UnpackRaw(&m_Tiles[0],(u32)(sizeof(STileDesc)*m_Tiles.size())); } // ApplyData: take all the input data, and rebuild the scene from it void CMapReader::ApplyData(CFileUnpacker& unpacker, CTerrain *pTerrain, CUnitManager *pUnitMan, CLightEnv *pLightEnv) { // initialise the terrain pTerrain->Initialize(m_MapSize,&m_Heightmap[0]); // setup the textures on the minipatches STileDesc* tileptr=&m_Tiles[0]; for (u32 j=0;jGetPatch(i,j)->m_MiniPatches[m][k]; mp.Tex1=m_TerrainTextures[tileptr->m_Tex1Index]; mp.Tex1Priority=tileptr->m_Priority; tileptr++; } } } } // empty out existing units pUnitMan->DeleteAll(); // add new objects for (u32 i=0;im_Model) { // Hijack the standard actor instantiation for actors that correspond to entities. // Not an ideal solution; we'll have to figure out a map format that can define entities seperately or somesuch. CBaseEntity* templateObject = g_EntityTemplateCollection.getTemplateByActor( objentry ); if( templateObject ) { CVector3D orient = ((CMatrix3D*)m_Objects[i].m_Transform)->GetIn(); CVector3D position = ((CMatrix3D*)m_Objects[i].m_Transform)->GetTranslation(); g_EntityManager.create( templateObject, position, atan2( -orient.X, -orient.Z ) ); } else { CUnit* unit=new CUnit(objentry,objentry->m_Model->Clone()); CMatrix3D transform; memcpy(&transform._11,m_Objects[i].m_Transform,sizeof(float)*16); unit->GetModel()->SetTransform(transform); // add this unit to list of units stored in unit manager pUnitMan->AddUnit(unit); } } } if (unpacker.GetVersion()>=2) { // copy over the lighting parameters *pLightEnv=m_LightEnv; } }