Merge branch 'GameClient' of https://github.com/dean11/Danbias into GameClient
This commit is contained in:
commit
14deeeebca
|
@ -1,52 +0,0 @@
|
||||||
//////////////////////////////////
|
|
||||||
// Created by Sam Svensson 2013 //
|
|
||||||
//////////////////////////////////
|
|
||||||
|
|
||||||
#include "LevelLoader.h"
|
|
||||||
#include "LevelParser.h"
|
|
||||||
|
|
||||||
using namespace GameLogic;
|
|
||||||
using namespace GameLogic::LevelFileLoader;
|
|
||||||
|
|
||||||
struct LevelLoader::PrivData
|
|
||||||
{
|
|
||||||
LevelParser parser;
|
|
||||||
std::wstring folderPath;
|
|
||||||
};
|
|
||||||
|
|
||||||
LevelLoader::LevelLoader()
|
|
||||||
: pData(new PrivData)
|
|
||||||
{
|
|
||||||
//standard path
|
|
||||||
pData->folderPath = L"";
|
|
||||||
}
|
|
||||||
|
|
||||||
LevelLoader::LevelLoader(std::wstring folderPath)
|
|
||||||
: pData(new PrivData)
|
|
||||||
{
|
|
||||||
pData->folderPath = folderPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
LevelLoader::~LevelLoader()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<Utility::DynamicMemory::SmartPointer<ObjectTypeHeader>> LevelLoader::LoadLevel(std::wstring fileName)
|
|
||||||
{
|
|
||||||
return pData->parser.Parse(pData->folderPath + fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
LevelMetaData LevelLoader::LoadLevelHeader(std::wstring fileName)
|
|
||||||
{
|
|
||||||
return pData->parser.ParseHeader(pData->folderPath + fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::wstring LevelLoader::GetFolderPath()
|
|
||||||
{
|
|
||||||
return this->pData->folderPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LevelLoader::SetFolderPath(std::wstring folderPath)
|
|
||||||
{
|
|
||||||
this->pData->folderPath = folderPath;
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
//////////////////////////////////
|
|
||||||
// Created by Sam Svensson 2013 //
|
|
||||||
//////////////////////////////////
|
|
||||||
|
|
||||||
#ifndef LEVELLOADER_H
|
|
||||||
#define LEVELLOADER_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include "Utilities.h"
|
|
||||||
#include "ObjectDefines.h"
|
|
||||||
|
|
||||||
namespace GameLogic
|
|
||||||
{
|
|
||||||
class LevelLoader
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
LevelLoader();
|
|
||||||
/***********************************************************
|
|
||||||
* Lets you set the standard folderpath for the levels
|
|
||||||
********************************************************/
|
|
||||||
LevelLoader(std::wstring folderPath);
|
|
||||||
~LevelLoader();
|
|
||||||
|
|
||||||
/********************************************************
|
|
||||||
* Loads the level and objects from file.
|
|
||||||
* @param fileName: Path/name to the level-file that you want to load.
|
|
||||||
* @return: Returns all structs with objects and information about the level.
|
|
||||||
********************************************************/
|
|
||||||
std::vector<Utility::DynamicMemory::SmartPointer<ObjectTypeHeader>> LoadLevel(std::wstring fileName);
|
|
||||||
|
|
||||||
/********************************************************
|
|
||||||
* Just for fast access for the meta information about the level.
|
|
||||||
* @param fileName: Path to the level-file that you want to load.
|
|
||||||
* @return: Returns the meta information about the level.
|
|
||||||
********************************************************/
|
|
||||||
LevelMetaData LoadLevelHeader(std::wstring fileName); //.
|
|
||||||
|
|
||||||
/***********************************************************
|
|
||||||
* @return: Returns the current standard folder path
|
|
||||||
********************************************************/
|
|
||||||
std::wstring GetFolderPath();
|
|
||||||
|
|
||||||
/***********************************************************
|
|
||||||
* Sets the standard folder path
|
|
||||||
********************************************************/
|
|
||||||
void SetFolderPath(std::wstring folderPath);
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct PrivData;
|
|
||||||
Utility::DynamicMemory::SmartPointer<PrivData> pData;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,320 +0,0 @@
|
||||||
/////////////////////////////////////
|
|
||||||
// Created by Pontus Fransson 2013 //
|
|
||||||
/////////////////////////////////////
|
|
||||||
|
|
||||||
#include "LevelParser.h"
|
|
||||||
#include "Loader.h"
|
|
||||||
#include "ParseFunctions.h"
|
|
||||||
|
|
||||||
using namespace GameLogic;
|
|
||||||
using namespace ::LevelFileLoader;
|
|
||||||
using namespace Utility::DynamicMemory;
|
|
||||||
|
|
||||||
LevelParser::LevelParser()
|
|
||||||
{
|
|
||||||
formatVersion.formatVersionMajor = 3;
|
|
||||||
formatVersion.formatVersionMinor = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
LevelParser::~LevelParser()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<SmartPointer<ObjectTypeHeader>> LevelParser::Parse(std::wstring filename)
|
|
||||||
{
|
|
||||||
int bufferSize = 0;
|
|
||||||
int counter = 0;
|
|
||||||
bool loadCgf;
|
|
||||||
|
|
||||||
std::vector<SmartPointer<ObjectTypeHeader>> objects;
|
|
||||||
|
|
||||||
//Read entire level file.
|
|
||||||
Loader loader;
|
|
||||||
char* buffer = (char*)loader.LoadFile(filename.c_str(), bufferSize);
|
|
||||||
|
|
||||||
// Check if file was loaded, else return empty vector
|
|
||||||
if(!buffer)
|
|
||||||
{
|
|
||||||
return std::vector<SmartPointer<ObjectTypeHeader>>();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Read format version
|
|
||||||
LevelLoaderInternal::FormatVersion levelFormatVersion;
|
|
||||||
ParseObject(&buffer[counter], &levelFormatVersion, sizeof(levelFormatVersion));
|
|
||||||
counter += sizeof(levelFormatVersion);
|
|
||||||
if(this->formatVersion != levelFormatVersion)
|
|
||||||
{
|
|
||||||
//Returns an empty vector, because it will most likely fail to read the level format.
|
|
||||||
return objects;
|
|
||||||
}
|
|
||||||
|
|
||||||
while(counter < bufferSize)
|
|
||||||
{
|
|
||||||
loadCgf = true;
|
|
||||||
//Get typeID
|
|
||||||
ObjectType typeID;
|
|
||||||
ParseObject(&buffer[counter], &typeID, sizeof(typeID));
|
|
||||||
switch((int)typeID)
|
|
||||||
{
|
|
||||||
case ObjectType_LevelMetaData:
|
|
||||||
{
|
|
||||||
SmartPointer<ObjectTypeHeader> header = new LevelMetaData;
|
|
||||||
ParseLevelMetaData(&buffer[counter], *(LevelMetaData*)header.Get(), counter);
|
|
||||||
objects.push_back(header);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ObjectType_SpawnPoint:
|
|
||||||
{
|
|
||||||
loadCgf = false;
|
|
||||||
ObjectHeader* header = new ObjectHeader;
|
|
||||||
ParseObject(&buffer[counter], *header, counter, loadCgf);
|
|
||||||
|
|
||||||
SpawnPointAttributes* spawn = new SpawnPointAttributes;
|
|
||||||
|
|
||||||
spawn->typeID = header->typeID;
|
|
||||||
|
|
||||||
for(int i = 0; i < 3; i++)
|
|
||||||
{
|
|
||||||
spawn->position[i] = header->position[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
delete header;
|
|
||||||
//objects.push_back(header);
|
|
||||||
objects.push_back(spawn);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//This is by design, static and dynamic is using the same converter. Do not add anything inbetween them.
|
|
||||||
//Unless they are changed to not be the same.
|
|
||||||
case ObjectType_Static: case ObjectType_Dynamic:
|
|
||||||
{
|
|
||||||
//Get specialType.
|
|
||||||
ObjectSpecialType specialType;
|
|
||||||
ParseObject(&buffer[counter+4], &specialType, sizeof(typeID));
|
|
||||||
|
|
||||||
switch(specialType)
|
|
||||||
{
|
|
||||||
//there is no difference when parsing these specialTypes.
|
|
||||||
case ObjectSpecialType_CrystalShard:
|
|
||||||
case ObjectSpecialType_CrystalFormation:
|
|
||||||
case ObjectSpecialType_Spike:
|
|
||||||
case ObjectSpecialType_SpikeBox:
|
|
||||||
case ObjectSpecialType_RedExplosiveBox:
|
|
||||||
case ObjectSpecialType_StandardBox:
|
|
||||||
case ObjectSpecialType_Stone:
|
|
||||||
case ObjectSpecialType_Building:
|
|
||||||
{
|
|
||||||
ObjectHeader* header = new ObjectHeader;
|
|
||||||
ParseObject(&buffer[counter], *header, counter, loadCgf);
|
|
||||||
objects.push_back(header);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ObjectSpecialType_JumpPad:
|
|
||||||
{
|
|
||||||
JumpPadAttributes* header = new JumpPadAttributes;
|
|
||||||
ParseObject(&buffer[counter], *header, counter, loadCgf);
|
|
||||||
|
|
||||||
//Read the spec
|
|
||||||
ParseObject(&buffer[counter], header->direction, 16);
|
|
||||||
counter += 16;
|
|
||||||
objects.push_back(header);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ObjectSpecialType_Portal:
|
|
||||||
{
|
|
||||||
PortalAttributes* header = new PortalAttributes;
|
|
||||||
ParseObject(&buffer[counter], *header, counter, loadCgf);
|
|
||||||
|
|
||||||
ParseObject(&buffer[counter], header->destination, 12);
|
|
||||||
counter += 12;
|
|
||||||
objects.push_back(header);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ObjectSpecialType_World:
|
|
||||||
{
|
|
||||||
WorldAttributes* header = new WorldAttributes;
|
|
||||||
ParseObject(&buffer[counter], *header, counter, loadCgf);
|
|
||||||
|
|
||||||
ParseObject(&buffer[counter], &header->worldSize, 8);
|
|
||||||
counter += 8;
|
|
||||||
objects.push_back(header);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ObjectSpecialType_Sky:
|
|
||||||
{
|
|
||||||
loadCgf = false;
|
|
||||||
SkyAttributes* header = new SkyAttributes;
|
|
||||||
ParseObject(&buffer[counter], *header, counter, loadCgf);
|
|
||||||
|
|
||||||
ParseObject(&buffer[counter], &header->skySize, 4);
|
|
||||||
counter += 4;
|
|
||||||
objects.push_back(header);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
//Couldn't find specialType
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ObjectType_Light:
|
|
||||||
{
|
|
||||||
LightType lightType;
|
|
||||||
|
|
||||||
//Get Light type
|
|
||||||
ParseObject(&buffer[counter+4], &lightType, sizeof(lightType));
|
|
||||||
|
|
||||||
//We only support PointLight for now.
|
|
||||||
BasicLight* header = new BasicLight;
|
|
||||||
ParseObject(&buffer[counter], header, sizeof(*header));
|
|
||||||
counter += sizeof(*header);
|
|
||||||
objects.push_back(header);
|
|
||||||
/*switch(lightType)
|
|
||||||
{
|
|
||||||
case LightType_PointLight:
|
|
||||||
{
|
|
||||||
PointLight* header = new PointLight;
|
|
||||||
ParseObject(&buffer[counter], header, sizeof(*header));
|
|
||||||
counter += sizeof(*header);
|
|
||||||
objects.push_back(header);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case LightType_DirectionalLight:
|
|
||||||
{
|
|
||||||
DirectionalLight* header = new DirectionalLight;
|
|
||||||
ParseObject(&buffer[counter], header, sizeof(*header));
|
|
||||||
counter += sizeof(*header);
|
|
||||||
objects.push_back(header);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case LightType_SpotLight:
|
|
||||||
{
|
|
||||||
SpotLight* header = new SpotLight;
|
|
||||||
ParseObject(&buffer[counter], header, sizeof(*header));
|
|
||||||
counter += sizeof(*header);
|
|
||||||
objects.push_back(header);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
//Undefined LightType.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;*/
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
//Couldn't find typeID. FAIL!!!!!!
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return objects;
|
|
||||||
}
|
|
||||||
|
|
||||||
//för meta information om leveln.
|
|
||||||
LevelMetaData LevelParser::ParseHeader(std::wstring filename)
|
|
||||||
{
|
|
||||||
int bufferSize = 0;
|
|
||||||
int counter = 0;
|
|
||||||
|
|
||||||
LevelMetaData levelHeader;
|
|
||||||
levelHeader.typeID = ObjectType::ObjectType_Unknown;
|
|
||||||
|
|
||||||
//Read entire level file.
|
|
||||||
Loader loader;
|
|
||||||
char* buffer = (char*)loader.LoadFile(filename.c_str(), bufferSize);
|
|
||||||
|
|
||||||
//Read format version
|
|
||||||
LevelLoaderInternal::FormatVersion levelFormatVersion;
|
|
||||||
ParseObject(&buffer[counter], &levelFormatVersion, sizeof(formatVersion));
|
|
||||||
counter += sizeof(levelFormatVersion);
|
|
||||||
if(this->formatVersion != levelFormatVersion)
|
|
||||||
{
|
|
||||||
//Do something if it's not the same version
|
|
||||||
|
|
||||||
//Returns an empty levelHeader with ObjectType_Unknown.
|
|
||||||
//Because it will not be able to read another version of the level format.
|
|
||||||
return levelHeader;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Find the header in the returned string.
|
|
||||||
while(counter < bufferSize)
|
|
||||||
{
|
|
||||||
ObjectType typeID;
|
|
||||||
ParseObject(&buffer[counter], &typeID, sizeof(typeID));
|
|
||||||
|
|
||||||
switch(typeID)
|
|
||||||
{
|
|
||||||
case ObjectType_LevelMetaData:
|
|
||||||
ParseLevelMetaData(&buffer[counter], levelHeader, counter);
|
|
||||||
return levelHeader;
|
|
||||||
break;
|
|
||||||
|
|
||||||
//This is by design, static and dynamic is using the same converter. Do not add anything inbetween them.
|
|
||||||
case ObjectType_Static: case ObjectType_Dynamic:
|
|
||||||
{
|
|
||||||
ObjectHeader header;
|
|
||||||
ParseObject(&buffer[counter], &header, counter);
|
|
||||||
|
|
||||||
switch(header.specialTypeID)
|
|
||||||
{
|
|
||||||
case ObjectSpecialType_JumpPad:
|
|
||||||
counter += sizeof(16);
|
|
||||||
break;
|
|
||||||
case ObjectSpecialType_Portal:
|
|
||||||
counter += sizeof(12);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ObjectType_Light:
|
|
||||||
{
|
|
||||||
LightType lightType;
|
|
||||||
ParseObject(&buffer[counter+4], &lightType, sizeof(lightType));
|
|
||||||
|
|
||||||
//We only support pointlight for now.
|
|
||||||
counter += sizeof(BasicLight);
|
|
||||||
/*
|
|
||||||
switch(lightType)
|
|
||||||
{
|
|
||||||
case LightType_PointLight:
|
|
||||||
{
|
|
||||||
counter += sizeof(PointLight);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case LightType_DirectionalLight:
|
|
||||||
{
|
|
||||||
counter += sizeof(DirectionalLight);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case LightType_SpotLight:
|
|
||||||
{
|
|
||||||
counter += sizeof(SpotLight);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
//Undefined LightType.
|
|
||||||
break;
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
//Couldn't find typeID. FAIL!!!!!!
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return levelHeader;
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
#ifndef LEVEL_PARSER_H
|
|
||||||
#define LEVEL_PARSER_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include "ObjectDefines.h"
|
|
||||||
#include "Utilities.h"
|
|
||||||
|
|
||||||
namespace GameLogic
|
|
||||||
{
|
|
||||||
namespace LevelFileLoader
|
|
||||||
{
|
|
||||||
class LevelParser
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
LevelParser();
|
|
||||||
~LevelParser();
|
|
||||||
|
|
||||||
//
|
|
||||||
std::vector<Utility::DynamicMemory::SmartPointer<ObjectTypeHeader>> Parse(std::wstring filename);
|
|
||||||
|
|
||||||
//
|
|
||||||
LevelMetaData ParseHeader(std::wstring filename);
|
|
||||||
|
|
||||||
private:
|
|
||||||
LevelLoaderInternal::FormatVersion formatVersion;
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,22 +0,0 @@
|
||||||
//////////////////////////////////
|
|
||||||
// Created by Sam Svensson 2013 //
|
|
||||||
//////////////////////////////////
|
|
||||||
|
|
||||||
#include "Loader.h"
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
using namespace GameLogic::LevelFileLoader;
|
|
||||||
using namespace Oyster::Resource;
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
char* Loader::LoadFile(std::wstring fileName, int &size)
|
|
||||||
{
|
|
||||||
//convert from string to wstring
|
|
||||||
//std::wstring temp(fileName.begin(), fileName.end());
|
|
||||||
|
|
||||||
//convert from wstring to wchar then loads the file
|
|
||||||
char* buffer = (char*)OysterResource::LoadResource(fileName.c_str(), Oyster::Resource::ResourceType::ResourceType_Byte_Raw, -1 , false);
|
|
||||||
|
|
||||||
size = OysterResource::GetResourceSize(buffer);
|
|
||||||
return buffer;
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
//////////////////////////////////
|
|
||||||
// Created by Sam Svensson 2013 //
|
|
||||||
//////////////////////////////////
|
|
||||||
|
|
||||||
#ifndef LOADER_H
|
|
||||||
#define LOADER_H
|
|
||||||
|
|
||||||
#include "Resource\OysterResource.h"
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace GameLogic
|
|
||||||
{
|
|
||||||
namespace LevelFileLoader
|
|
||||||
{
|
|
||||||
class Loader
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Loader (){};
|
|
||||||
~Loader(){};
|
|
||||||
char* LoadFile(std::wstring fileName, int &size);
|
|
||||||
|
|
||||||
//TODO:
|
|
||||||
//Add functionality to load physicsObjects (hitboxes)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif;
|
|
|
@ -1,290 +0,0 @@
|
||||||
#ifndef OBJECT_DEFINES_H
|
|
||||||
#define OBJECT_DEFINES_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace GameLogic
|
|
||||||
{
|
|
||||||
/************************************
|
|
||||||
Enums
|
|
||||||
*************************************/
|
|
||||||
|
|
||||||
enum ObjectType
|
|
||||||
{
|
|
||||||
ObjectType_LevelMetaData,
|
|
||||||
ObjectType_Static,
|
|
||||||
ObjectType_Dynamic,
|
|
||||||
ObjectType_Light,
|
|
||||||
ObjectType_SpawnPoint,
|
|
||||||
//Etc
|
|
||||||
|
|
||||||
ObjectType_NUM_OF_TYPES,
|
|
||||||
|
|
||||||
ObjectType_Unknown = -1
|
|
||||||
};
|
|
||||||
|
|
||||||
enum ObjectSpecialType
|
|
||||||
{
|
|
||||||
ObjectSpecialType_None,
|
|
||||||
ObjectSpecialType_Sky,
|
|
||||||
ObjectSpecialType_World, //Always the main celestial body
|
|
||||||
ObjectSpecialType_Building,
|
|
||||||
ObjectSpecialType_Stone,
|
|
||||||
ObjectSpecialType_StandardBox,
|
|
||||||
ObjectSpecialType_RedExplosiveBox,
|
|
||||||
ObjectSpecialType_SpikeBox,
|
|
||||||
ObjectSpecialType_Spike,
|
|
||||||
ObjectSpecialType_CrystalFormation,
|
|
||||||
ObjectSpecialType_CrystalShard,
|
|
||||||
ObjectSpecialType_JumpPad,
|
|
||||||
ObjectSpecialType_Portal,
|
|
||||||
ObjectSpecialType_Player,
|
|
||||||
ObjectSpecialType_Generic,
|
|
||||||
|
|
||||||
|
|
||||||
ObjectSpecialType_Count,
|
|
||||||
ObjectSpecialType_Unknown = -1
|
|
||||||
};
|
|
||||||
|
|
||||||
enum CollisionGeometryType
|
|
||||||
{
|
|
||||||
CollisionGeometryType_Box,
|
|
||||||
CollisionGeometryType_Sphere,
|
|
||||||
CollisionGeometryType_Cylinder,
|
|
||||||
CollisionGeometryType_TriangleMesh,
|
|
||||||
|
|
||||||
CollisionGeometryType_Count,
|
|
||||||
CollisionGeometryType_Unknown = -1
|
|
||||||
};
|
|
||||||
|
|
||||||
//Only supports Pointlight right now.
|
|
||||||
enum LightType
|
|
||||||
{
|
|
||||||
LightType_PointLight,
|
|
||||||
//LightType_DirectionalLight,
|
|
||||||
//LightType_SpotLight,
|
|
||||||
|
|
||||||
LightType_Count,
|
|
||||||
LightType_Unknown = -1
|
|
||||||
};
|
|
||||||
|
|
||||||
//Should this be moved somewhere else?
|
|
||||||
enum GameMode
|
|
||||||
{
|
|
||||||
GameMode_FreeForAll,
|
|
||||||
GameMode_TeamDeathMatch,
|
|
||||||
//Etc
|
|
||||||
|
|
||||||
GameMode_Count,
|
|
||||||
GameMode_Unknown = -1
|
|
||||||
};
|
|
||||||
|
|
||||||
enum WorldSize
|
|
||||||
{
|
|
||||||
WorldSize_Tiny,
|
|
||||||
WorldSize_Small,
|
|
||||||
WorldSize_Medium,
|
|
||||||
WorldSize_Big,
|
|
||||||
WorldSize_Humongous,
|
|
||||||
|
|
||||||
WorldSize_Count,
|
|
||||||
WorldSize_Unknown = -1
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/************************************
|
|
||||||
Structs
|
|
||||||
*************************************/
|
|
||||||
namespace LevelLoaderInternal
|
|
||||||
{
|
|
||||||
struct FormatVersion
|
|
||||||
{
|
|
||||||
unsigned int formatVersionMajor;
|
|
||||||
unsigned int formatVersionMinor;
|
|
||||||
|
|
||||||
FormatVersion()
|
|
||||||
: formatVersionMajor(0), formatVersionMinor(0)
|
|
||||||
{}
|
|
||||||
|
|
||||||
FormatVersion(unsigned int major, unsigned int minor)
|
|
||||||
: formatVersionMajor(major), formatVersionMinor(minor)
|
|
||||||
{}
|
|
||||||
|
|
||||||
bool operator ==(const FormatVersion& obj)
|
|
||||||
{
|
|
||||||
return (this->formatVersionMajor == obj.formatVersionMajor && this->formatVersionMinor == obj.formatVersionMinor);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator !=(const FormatVersion& obj)
|
|
||||||
{
|
|
||||||
return !(*this == obj);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ObjectTypeHeader
|
|
||||||
{
|
|
||||||
ObjectType typeID;
|
|
||||||
|
|
||||||
//Unless this is here the object destructor wont be called.
|
|
||||||
virtual ~ObjectTypeHeader(){}
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace LevelLoaderInternal
|
|
||||||
{
|
|
||||||
const FormatVersion boundingVolumeVersion(2, 0);
|
|
||||||
|
|
||||||
struct BoundingVolumeBase
|
|
||||||
{
|
|
||||||
CollisionGeometryType geoType;
|
|
||||||
float position[3];
|
|
||||||
float rotation[4];
|
|
||||||
float frictionCoeffStatic;
|
|
||||||
float frictionCoeffDynamic;
|
|
||||||
float restitutionCoeff;
|
|
||||||
float mass;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BoundingVolumeBox : public BoundingVolumeBase
|
|
||||||
{
|
|
||||||
float size[3];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BoundingVolumeSphere : public BoundingVolumeBase
|
|
||||||
{
|
|
||||||
float radius;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BoundingVolumeCylinder : public BoundingVolumeBase
|
|
||||||
{
|
|
||||||
float length;
|
|
||||||
float radius;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BoundingVolumeTriangleMesh : public BoundingVolumeBase
|
|
||||||
{
|
|
||||||
//Null terminated
|
|
||||||
wchar_t* filename;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BoundingVolume
|
|
||||||
{
|
|
||||||
CollisionGeometryType geoType;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
LevelLoaderInternal::BoundingVolumeBox box;
|
|
||||||
LevelLoaderInternal::BoundingVolumeSphere sphere;
|
|
||||||
LevelLoaderInternal::BoundingVolumeCylinder cylinder;
|
|
||||||
LevelLoaderInternal::BoundingVolumeTriangleMesh triangleMesh;
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual ~BoundingVolume()
|
|
||||||
{
|
|
||||||
if(geoType == CollisionGeometryType_TriangleMesh)
|
|
||||||
{
|
|
||||||
delete[] triangleMesh.filename;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
struct LevelMetaData : public ObjectTypeHeader
|
|
||||||
{
|
|
||||||
std::string levelName;
|
|
||||||
unsigned int levelVersion;
|
|
||||||
std::string levelDescription;
|
|
||||||
std::string levelAuthor;
|
|
||||||
unsigned int maxNumberOfPlayer;
|
|
||||||
WorldSize worldSize;
|
|
||||||
std::string overviewPicturePath;
|
|
||||||
std::vector<GameMode> gameModesSupported;
|
|
||||||
|
|
||||||
virtual ~LevelMetaData(){}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ObjectHeader : public ObjectTypeHeader
|
|
||||||
{
|
|
||||||
//Special type id for special objects: portal, jumppad, exploding objects, etc.
|
|
||||||
ObjectSpecialType specialTypeID;
|
|
||||||
//Model,
|
|
||||||
std::string ModelFile;
|
|
||||||
//Position
|
|
||||||
float position[3];
|
|
||||||
//Rotation Quaternion
|
|
||||||
float rotation[4];
|
|
||||||
//Scale
|
|
||||||
float scale[3];
|
|
||||||
|
|
||||||
::GameLogic::LevelLoaderInternal::BoundingVolume boundingVolume;
|
|
||||||
|
|
||||||
virtual ~ObjectHeader(){}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SpawnPointAttributes : public ObjectTypeHeader
|
|
||||||
{
|
|
||||||
ObjectSpecialType specialTypeID;
|
|
||||||
float position[3];
|
|
||||||
};
|
|
||||||
/************************************
|
|
||||||
Special objects
|
|
||||||
*************************************/
|
|
||||||
|
|
||||||
struct JumpPadAttributes : public ObjectHeader
|
|
||||||
{
|
|
||||||
float direction[3];
|
|
||||||
float power;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PortalAttributes : public ObjectHeader
|
|
||||||
{
|
|
||||||
float destination[3];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct WorldAttributes : public ObjectHeader
|
|
||||||
{
|
|
||||||
float worldSize;
|
|
||||||
float atmoSphereSize;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SkyAttributes : public ObjectHeader
|
|
||||||
{
|
|
||||||
float skySize;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/************************************
|
|
||||||
Lights
|
|
||||||
*************************************/
|
|
||||||
|
|
||||||
struct BasicLight : public ObjectTypeHeader
|
|
||||||
{
|
|
||||||
LightType lightType; //Is not used right now
|
|
||||||
float color[3];
|
|
||||||
float position[3];
|
|
||||||
float raduis;
|
|
||||||
float intensity;
|
|
||||||
};
|
|
||||||
/* We only support pointlight right now.
|
|
||||||
struct PointLight : public BasicLight
|
|
||||||
{
|
|
||||||
float position[3];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DirectionalLight : public BasicLight
|
|
||||||
{
|
|
||||||
float direction[3];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SpotLight : public BasicLight
|
|
||||||
{
|
|
||||||
float direction[3];
|
|
||||||
float range;
|
|
||||||
float attenuation[3];
|
|
||||||
};*/
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,195 +0,0 @@
|
||||||
//////////////////////////////////
|
|
||||||
// Created by Sam Svensson 2013 //
|
|
||||||
//////////////////////////////////
|
|
||||||
|
|
||||||
#include "ParseFunctions.h"
|
|
||||||
#include "Packing/Packing.h"
|
|
||||||
#include "Loader.h"
|
|
||||||
#include "Utilities.h"
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
using namespace Oyster::Packing;
|
|
||||||
using namespace GameLogic::LevelFileLoader;
|
|
||||||
using namespace GameLogic;
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
namespace GameLogic
|
|
||||||
{
|
|
||||||
namespace LevelFileLoader
|
|
||||||
{
|
|
||||||
//can parse any struct if the struct doesnt contain strings or char[]
|
|
||||||
void ParseObject(char* buffer, void *header, int size)
|
|
||||||
{
|
|
||||||
memcpy(header, buffer, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ParseObject(char* buffer, ObjectHeader& header, int& size, bool loadCgf)
|
|
||||||
{
|
|
||||||
char tempName[128];
|
|
||||||
unsigned int tempSize = 0;
|
|
||||||
int start = 0;
|
|
||||||
|
|
||||||
memcpy(&header.typeID, &buffer[start], 4);
|
|
||||||
start += 4;
|
|
||||||
|
|
||||||
memcpy(&header.specialTypeID, &buffer[start], 4);
|
|
||||||
start += 4;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
//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;
|
|
||||||
}
|
|
||||||
|
|
||||||
size += start;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ParseLevelMetaData(char* buffer, LevelMetaData &header, int &size)
|
|
||||||
{
|
|
||||||
int start = 0;
|
|
||||||
unsigned int tempSize;
|
|
||||||
char tempName[128];
|
|
||||||
|
|
||||||
memcpy(&header.typeID, &buffer[start], 4);
|
|
||||||
start += 4;
|
|
||||||
|
|
||||||
memcpy(&tempSize , &buffer[start], 4);
|
|
||||||
start += 4;
|
|
||||||
|
|
||||||
memcpy(&tempName, &buffer[start], tempSize);
|
|
||||||
header.levelName.assign(&tempName[0], &tempName[tempSize]);
|
|
||||||
start += tempSize;
|
|
||||||
|
|
||||||
memcpy(&header.levelVersion, &buffer[start], 4);
|
|
||||||
start += 4;
|
|
||||||
|
|
||||||
memcpy(&tempSize, &buffer[start], 4);
|
|
||||||
start +=4;
|
|
||||||
|
|
||||||
memcpy(&tempName, &buffer[start], tempSize);
|
|
||||||
header.levelDescription.assign(&tempName[0], &tempName[tempSize]);
|
|
||||||
start += tempSize;
|
|
||||||
|
|
||||||
memcpy(&tempSize, &buffer[start], 4);
|
|
||||||
start += 4;
|
|
||||||
|
|
||||||
memcpy(&tempName, &buffer[start], tempSize);
|
|
||||||
header.levelAuthor.assign(&tempName[0], &tempName[tempSize]);
|
|
||||||
start += tempSize;
|
|
||||||
|
|
||||||
memcpy(&header.maxNumberOfPlayer, &buffer[start], 4);
|
|
||||||
start += 4;
|
|
||||||
|
|
||||||
memcpy(&header.worldSize, &buffer[start], 4);
|
|
||||||
start += 4;
|
|
||||||
|
|
||||||
memcpy(&tempSize, &buffer[start], 4);
|
|
||||||
start += 4;
|
|
||||||
|
|
||||||
memcpy(&tempName, &buffer[start], tempSize);
|
|
||||||
header.overviewPicturePath.assign(&tempName[0], &tempName[tempSize]);
|
|
||||||
start += tempSize;
|
|
||||||
|
|
||||||
memcpy(&tempSize, &buffer[start], 4);
|
|
||||||
start += 4;
|
|
||||||
|
|
||||||
int temp;
|
|
||||||
|
|
||||||
for(int i = 0; i < (int)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;
|
|
||||||
char* buf = loader.LoadFile(L"../Content/Worlds/cgf/" + Utility::String::StringToWstring(fileName, wstring()), fileLength);
|
|
||||||
|
|
||||||
start = 0;
|
|
||||||
LevelLoaderInternal::FormatVersion version;
|
|
||||||
memcpy(&version, &buf[0], sizeof(version));
|
|
||||||
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;
|
|
||||||
|
|
||||||
case CollisionGeometryType_TriangleMesh:
|
|
||||||
//Get string size
|
|
||||||
memcpy(&tempSize, &buf[start], sizeof(tempSize));
|
|
||||||
start += sizeof(tempSize);
|
|
||||||
|
|
||||||
//Get actual string
|
|
||||||
volume.triangleMesh.filename = new wchar_t[tempSize+1];
|
|
||||||
memcpy(volume.triangleMesh.filename, &buf[start], tempSize);
|
|
||||||
volume.triangleMesh.filename[tempSize] = '\0';
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -48,5 +48,5 @@ std::string LevelLoader::GetFolderPath()
|
||||||
|
|
||||||
void LevelLoader::SetFolderPath(std::string folderPath)
|
void LevelLoader::SetFolderPath(std::string folderPath)
|
||||||
{
|
{
|
||||||
|
this->pData->folderPath = folderPath;
|
||||||
}
|
}
|
Loading…
Reference in New Issue