Added support for loading DCLN files and displaying them in the World Editor

This commit is contained in:
parax0
2015-09-26 16:55:14 -06:00
parent 19b3ae59be
commit 07d7f14dc7
45 changed files with 541 additions and 305 deletions

View File

@@ -9,6 +9,8 @@ CScriptObject::CScriptObject(CGameArea *pArea, CScriptLayer *pLayer, CScriptTemp
mpLayer = pLayer;
mpProperties = nullptr;
mpTemplate->AddObject(this);
mpDisplayModel = nullptr;
mpCollision = nullptr;
}
CScriptObject::~CScriptObject()
@@ -35,6 +37,7 @@ void CScriptObject::EvaluateProperties()
mpLightParameters = mpTemplate->FindLightParameters(mpProperties);
mVolumeShape = mpTemplate->VolumeShape(this);
EvaluateDisplayModel();
EvaluateCollisionModel();
}
void CScriptObject::EvaluateDisplayModel()
@@ -43,6 +46,12 @@ void CScriptObject::EvaluateDisplayModel()
mModelToken = CToken(mpDisplayModel);
}
void CScriptObject::EvaluateCollisionModel()
{
mpCollision = mpTemplate->FindCollision(mpProperties);
mCollisionToken = CToken(mpCollision);
}
// ************ GETTERS ************
CPropertyBase* CScriptObject::PropertyByIndex(u32 index) const
{
@@ -189,6 +198,11 @@ CModel* CScriptObject::GetDisplayModel() const
return mpDisplayModel;
}
CCollisionMeshGroup* CScriptObject::GetCollision() const
{
return mpCollision;
}
EVolumeShape CScriptObject::VolumeShape() const
{
return mVolumeShape;

View File

@@ -6,6 +6,7 @@
#include "CPropertyTemplate.h"
#include "CScriptTemplate.h"
#include "../model/CModel.h"
#include "../CCollisionMeshGroup.h"
class CGameArea;
class CScriptLayer;
@@ -31,7 +32,9 @@ class CScriptObject
CBoolProperty *mpActive;
CPropertyStruct *mpLightParameters;
CModel *mpDisplayModel;
CCollisionMeshGroup *mpCollision;
CToken mModelToken;
CToken mCollisionToken;
EVolumeShape mVolumeShape;
public:
@@ -41,6 +44,7 @@ public:
void CopyFromTemplate(CScriptTemplate *pTemp, u32 propCount);
void EvaluateProperties();
void EvaluateDisplayModel();
void EvaluateCollisionModel();
CScriptTemplate* Template() const;
CMasterTemplate* MasterTemplate() const;
@@ -69,6 +73,7 @@ public:
void SetActive(bool isActive);
CPropertyStruct* LightParameters() const;
CModel* GetDisplayModel() const;
CCollisionMeshGroup* GetCollision() const;
EVolumeShape VolumeShape() const;
};

View File

@@ -242,6 +242,39 @@ CModel* CScriptTemplate::FindDisplayModel(CPropertyStruct *pProperties)
return nullptr;
}
CCollisionMeshGroup* CScriptTemplate::FindCollision(CPropertyStruct *pProperties)
{
for (auto it = mAssets.begin(); it != mAssets.end(); it++)
{
CResource *pRes = nullptr;
// File
if (it->AssetSource == SEditorAsset::eFile)
{
std::string path = "../resources/" + it->AssetLocation;
pRes = gResCache.GetResource(path);
}
// Property
else
{
CPropertyBase *pProp = pProperties->PropertyByIDString(it->AssetLocation);
if (pProp->Type() == eFileProperty)
{
CFileProperty *pFile = static_cast<CFileProperty*>(pProp);
pRes = pFile->Get();
}
}
// Verify resource exists + is correct type
if (pRes && (pRes->Type() == eCollisionMeshGroup))
return static_cast<CCollisionMeshGroup*>(pRes);
}
return nullptr;
}
bool CScriptTemplate::HasPosition()
{
return (!mPositionIDString.empty());

View File

@@ -11,6 +11,7 @@
#include <vector>
#include <tinyxml2.h>
#include <Resource/model/CModel.h>
#include <Resource/CCollisionMeshGroup.h>
class CMasterTemplate;
class CScriptObject;
@@ -47,7 +48,7 @@ private:
struct SEditorAsset
{
enum {
eModel, eAnimParams
eModel, eAnimParams, eCollision
} AssetType;
enum {
@@ -114,6 +115,7 @@ public:
CBoolProperty* FindActive(CPropertyStruct *pProperties);
CPropertyStruct* FindLightParameters(CPropertyStruct *pProperties);
CModel* FindDisplayModel(CPropertyStruct *pProperties);
CCollisionMeshGroup* FindCollision(CPropertyStruct *pProperties);
bool HasPosition();
// Object Tracking