// switch off warnings before including stl files #pragma warning(disable : 4786) // identifier truncated to 255 chars #include "Types.h" #include "MapReader.h" #include "UnitManager.h" #include "ObjectManager.h" #include "terrain/Model.h" #include "terrain/Terrain.h" #include "terrain/TextureManager.h" extern CTerrain g_Terrain; extern CLightEnv g_LightEnv; #include #include // 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) { 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;im_Handle; } m_TerrainTextures.push_back(handle); } // unpack tile data u32 tilesPerSide=m_MapSize*PATCH_SIZE; m_Tiles.resize(SQR(tilesPerSide)); unpacker.UnpackRaw(&m_Tiles[0],sizeof(STileDesc)*m_Tiles.size()); } // ApplyData: take all the input data, and rebuild the scene from it void CMapReader::ApplyData(CFileUnpacker& unpacker) { // initialise the terrain g_Terrain.Initialize(m_MapSize,&m_Heightmap[0]); // setup the textures on the minipatches STileDesc* tileptr=&m_Tiles[0]; for (u32 j=0;jm_MiniPatches[m][k]; mp.Tex1=m_TerrainTextures[tileptr->m_Tex1Index]; mp.Tex1Priority=tileptr->m_Priority; tileptr++; } } } } // empty out existing units g_UnitMan.DeleteAll(); // add new objects for (u32 i=0;im_Model) { // create new unit CUnit* unit=new CUnit; unit->m_Object=objentry; unit->m_Model=objentry->m_Model ? objentry->m_Model->Clone() : 0; CMatrix3D transform; memcpy(&transform._11,m_Objects[i].m_Transform,sizeof(float)*16); unit->m_Model->SetTransform(transform); // add this unit to list of units stored in unit manager g_UnitMan.AddUnit(unit); } } if (unpacker.GetVersion()>=2) { // copy over the lighting parameters g_LightEnv=m_LightEnv; } }