Danbias/Code/Game/GameLogic/LevelLoader/ParseFunctions.cpp

183 lines
4.3 KiB
C++
Raw Normal View History

//////////////////////////////////
// Created by Sam Svensson 2013 //
//////////////////////////////////
#include "ParseFunctions.h"
#include "../../../Misc/Packing/Packing.h"
#include "Loader.h"
#include <string>
using namespace Oyster::Packing;
using namespace GameLogic::LevelFileLoader;
using namespace GameLogic;
using namespace std;
namespace GameLogic
{
namespace LevelFileLoader
{
2014-02-12 14:48:58 +01:00
//can parse any struct if the struct doesnt contain strings or char[]
2014-01-28 16:15:10 +01:00
void ParseObject(char* buffer, void *header, int size)
{
memcpy(header, buffer, size);
}
2014-02-12 14:48:58 +01:00
void ParseObject(char* buffer, ObjectHeader& header, int& size, bool loadCgf)
2014-02-04 11:36:10 +01:00
{
char tempName[128];
unsigned int tempSize = 0;
2014-02-04 11:36:10 +01:00
int start = 0;
memcpy(&header.typeID, &buffer[start], 4);
start += 4;
memcpy(&header.specialTypeID, &buffer[start], 4);
start += 4;
2014-02-04 11:36:10 +01:00
memcpy(&tempSize, &buffer[start], 4);
start += 4;
memcpy(&tempName, &buffer[start], tempSize);
header.ModelFile.assign(&tempName[0], &tempName[tempSize]);
start += tempSize;
//The reset of the object struct
//3 float[3], 1 float
memcpy(&header.position, &buffer[start], 40);
start += 40;
2014-02-12 14:48:58 +01:00
//if loadCgf : Read path for bounding volume
if(loadCgf)
{
ParseBoundingVolume(&buffer[start], header.boundingVolume, start);
}
//else make sure the counter counts the name so we can jump over the string in the buffer.
else
{
memcpy(&tempSize, &buffer[start], 4);
start += 4;
memcpy(&tempName, &buffer[start], tempSize);
string fileName;
fileName.assign(&tempName[0], &tempName[tempSize]);
start += tempSize;
}
2014-02-04 11:36:10 +01:00
size += start;
}
2014-01-28 16:15:10 +01:00
void ParseLevelMetaData(char* buffer, LevelMetaData &header, int &size)
{
int start = 0;
unsigned int tempSize;
2014-02-04 11:36:10 +01:00
char tempName[128];
2014-01-28 16:15:10 +01:00
memcpy(&header.typeID, &buffer[start], 4);
start += 4;
2014-01-28 16:15:10 +01:00
memcpy(&tempSize , &buffer[start], 4);
start += 4;
2014-01-28 16:15:10 +01:00
memcpy(&tempName, &buffer[start], tempSize);
header.levelName.assign(&tempName[0], &tempName[tempSize]);
start += tempSize;
2014-01-28 16:15:10 +01:00
2014-02-04 14:30:45 +01:00
memcpy(&header.levelVersion, &buffer[start], 4);
start += 4;
2014-01-28 16:15:10 +01:00
memcpy(&tempSize, &buffer[start], 4);
start +=4;
2014-01-28 16:15:10 +01:00
memcpy(&tempName, &buffer[start], tempSize);
header.levelDescription.assign(&tempName[0], &tempName[tempSize]);
start += tempSize;
2014-01-28 16:15:10 +01:00
memcpy(&tempSize, &buffer[start], 4);
start += 4;
2014-01-28 16:15:10 +01:00
memcpy(&tempName, &buffer[start], tempSize);
header.levelAuthor.assign(&tempName[0], &tempName[tempSize]);
start += tempSize;
2014-01-28 16:15:10 +01:00
memcpy(&header.maxNumberOfPlayer, &buffer[start], 4);
start += 4;
2014-01-28 16:15:10 +01:00
memcpy(&header.worldSize, &buffer[start], 4);
start += 4;
2014-01-28 16:15:10 +01:00
2014-02-04 11:36:10 +01:00
memcpy(&tempSize, &buffer[start], 4);
start += 4;
2014-01-28 16:15:10 +01:00
2014-02-04 11:36:10 +01:00
memcpy(&tempName, &buffer[start], tempSize);
header.overviewPicturePath.assign(&tempName[0], &tempName[tempSize]);
start += tempSize;
memcpy(&tempSize, &buffer[start], 4);
start += 4;
2014-01-28 16:15:10 +01:00
int temp;
for(int i = 0; i < tempSize; i++)
{
memcpy(&temp, &buffer[start], 4);
start += 4;
header.gameModesSupported.push_back((GameMode)temp);
}
size += start;
}
void ParseBoundingVolume(char* buffer, LevelLoaderInternal::BoundingVolume& volume, int &size)
{
int start = 0;
int tempSize = 0;
char tempName[128];
memcpy(&tempSize, &buffer[start], 4);
start += 4;
memcpy(&tempName, &buffer[start], tempSize);
string fileName;
fileName.assign(&tempName[0], &tempName[tempSize]);
start += tempSize;
size += start;
//L<>s in filen.
int fileLength = 0;
Loader loader;
2014-02-12 14:48:58 +01:00
char* buf = loader.LoadFile("C:/Users/Sam/Documents/GitHub/Danbias/Bin/Content/worlds/cgf/"+ fileName, fileLength);
start = 0;
LevelLoaderInternal::FormatVersion version;
memcpy(&version, &buf[0], sizeof(version));
2014-02-12 14:48:58 +01:00
start += 8;
memcpy(&volume.geoType, &buf[start], sizeof(volume.geoType));
switch(volume.geoType)
{
case CollisionGeometryType_Box:
memcpy(&volume.box, &buf[start], sizeof(volume.box));
start += sizeof(volume.box);
break;
case CollisionGeometryType_Sphere:
memcpy(&volume.sphere, &buf[start], sizeof(volume.sphere));
start += sizeof(volume.sphere);
break;
case CollisionGeometryType_Cylinder:
memcpy(&volume.cylinder, &buf[start], sizeof(volume.cylinder));
start += sizeof(volume.cylinder);
break;
default:
break;
}
}
}
}