Property cleanup

This commit is contained in:
Aruki 2018-09-22 13:36:50 -06:00
parent e68b961a8c
commit 31dac74a64
97 changed files with 287 additions and 3319 deletions

View File

@ -14,7 +14,7 @@ CAreaAttributes::~CAreaAttributes()
void CAreaAttributes::SetObject(CScriptObject *pObj) void CAreaAttributes::SetObject(CScriptObject *pObj)
{ {
CScriptTemplate* pTemplate = pObj->Template(); CScriptTemplate* pTemplate = pObj->Template();
CStructPropertyNew* pProperties = pTemplate->Properties(); CStructProperty* pProperties = pTemplate->Properties();
mpObject = pObj; mpObject = pObj;
mGame = pTemplate->MasterTemplate()->Game(); mGame = pTemplate->MasterTemplate()->Game();

View File

@ -91,7 +91,6 @@ HEADERS += \
Resource/Cooker/CMaterialCooker.h \ Resource/Cooker/CMaterialCooker.h \
Resource/Cooker/CModelCooker.h \ Resource/Cooker/CModelCooker.h \
Resource/Cooker/CSectionMgrOut.h \ Resource/Cooker/CSectionMgrOut.h \
Resource/Cooker/CTemplateWriter.h \
Resource/Cooker/CTextureEncoder.h \ Resource/Cooker/CTextureEncoder.h \
Resource/Cooker/CWorldCooker.h \ Resource/Cooker/CWorldCooker.h \
Resource/Factory/CAnimSetLoader.h \ Resource/Factory/CAnimSetLoader.h \
@ -115,7 +114,6 @@ HEADERS += \
Resource/Script/CScriptLayer.h \ Resource/Script/CScriptLayer.h \
Resource/Script/CScriptObject.h \ Resource/Script/CScriptObject.h \
Resource/Script/CScriptTemplate.h \ Resource/Script/CScriptTemplate.h \
Resource/Script/EPropertyType.h \
Resource/Script/EVolumeShape.h \ Resource/Script/EVolumeShape.h \
Resource/CCollisionMesh.h \ Resource/CCollisionMesh.h \
Resource/CCollisionMeshGroup.h \ Resource/CCollisionMeshGroup.h \
@ -163,9 +161,6 @@ HEADERS += \
OpenGL/GLCommon.h \ OpenGL/GLCommon.h \
ScriptExtra/CRadiusSphereExtra.h \ ScriptExtra/CRadiusSphereExtra.h \
Resource/Cooker/CAreaCooker.h \ Resource/Cooker/CAreaCooker.h \
Resource/Script/IPropertyValue.h \
Resource/Script/IPropertyTemplate.h \
Resource/Script/IProperty.h \
Resource/Model/EVertexAttribute.h \ Resource/Model/EVertexAttribute.h \
Render/FRenderOptions.h \ Render/FRenderOptions.h \
Scene/FShowFlags.h \ Scene/FShowFlags.h \
@ -231,9 +226,8 @@ HEADERS += \
IUIRelay.h \ IUIRelay.h \
Resource/CResTypeFilter.h \ Resource/CResTypeFilter.h \
GameProject/COpeningBanner.h \ GameProject/COpeningBanner.h \
Resource/Script/CPropertyNameGenerator.h \ Resource/Script/Property/CPropertyNameGenerator.h \
Resource/Script/IPropertyNew.h \ Resource/Script/Property/IProperty.h \
Resource/Script/TPropertyProxy.h \
Resource/Script/Property/CEnumProperty.h \ Resource/Script/Property/CEnumProperty.h \
Resource/Script/Property/CFlagsProperty.h \ Resource/Script/Property/CFlagsProperty.h \
Resource/Script/Property/CAssetProperty.h \ Resource/Script/Property/CAssetProperty.h \
@ -267,7 +261,6 @@ SOURCES += \
Resource/Area/CGameArea.cpp \ Resource/Area/CGameArea.cpp \
Resource/Cooker/CMaterialCooker.cpp \ Resource/Cooker/CMaterialCooker.cpp \
Resource/Cooker/CModelCooker.cpp \ Resource/Cooker/CModelCooker.cpp \
Resource/Cooker/CTemplateWriter.cpp \
Resource/Cooker/CTextureEncoder.cpp \ Resource/Cooker/CTextureEncoder.cpp \
Resource/Cooker/CWorldCooker.cpp \ Resource/Cooker/CWorldCooker.cpp \
Resource/Factory/CAnimSetLoader.cpp \ Resource/Factory/CAnimSetLoader.cpp \
@ -320,8 +313,6 @@ SOURCES += \
OpenGL/GLCommon.cpp \ OpenGL/GLCommon.cpp \
ScriptExtra/CRadiusSphereExtra.cpp \ ScriptExtra/CRadiusSphereExtra.cpp \
Resource/Cooker/CAreaCooker.cpp \ Resource/Cooker/CAreaCooker.cpp \
Resource/Script/IPropertyTemplate.cpp \
Resource/Script/IProperty.cpp \
Scene/FShowFlags.cpp \ Scene/FShowFlags.cpp \
Scene/CScene.cpp \ Scene/CScene.cpp \
Scene/CSceneIterator.cpp \ Scene/CSceneIterator.cpp \
@ -365,8 +356,8 @@ SOURCES += \
IUIRelay.cpp \ IUIRelay.cpp \
GameProject\COpeningBanner.cpp \ GameProject\COpeningBanner.cpp \
IProgressNotifier.cpp \ IProgressNotifier.cpp \
Resource/Script/CPropertyNameGenerator.cpp \ Resource/Script/Property/CPropertyNameGenerator.cpp \
Resource/Script/IPropertyNew.cpp \ Resource/Script/Property/IProperty.cpp \
Resource/Script/Property/CStructProperty.cpp \ Resource/Script/Property/CStructProperty.cpp \
Resource/Script/Property/CFlagsProperty.cpp Resource/Script/Property/CFlagsProperty.cpp

View File

@ -284,7 +284,7 @@ void GenerateAssetNames(CGameProject *pProj)
for (u32 iInst = 0; iInst < pLayer->NumInstances(); iInst++) for (u32 iInst = 0; iInst < pLayer->NumInstances(); iInst++)
{ {
CScriptObject* pInst = pLayer->InstanceByIndex(iInst); CScriptObject* pInst = pLayer->InstanceByIndex(iInst);
CStructPropertyNew* pProperties = pInst->Template()->Properties(); CStructProperty* pProperties = pInst->Template()->Properties();
if (pInst->ObjectTypeID() == 0x42 || pInst->ObjectTypeID() == FOURCC('POIN')) if (pInst->ObjectTypeID() == 0x42 || pInst->ObjectTypeID() == FOURCC('POIN'))
{ {

View File

@ -152,22 +152,22 @@ CScriptInstanceDependency* CScriptInstanceDependency::BuildTree(CScriptObject *p
return pInst; return pInst;
} }
void CScriptInstanceDependency::ParseStructDependencies(CScriptInstanceDependency* pInst, CScriptObject* pInstance, CStructPropertyNew *pStruct) void CScriptInstanceDependency::ParseStructDependencies(CScriptInstanceDependency* pInst, CScriptObject* pInstance, CStructProperty *pStruct)
{ {
// Recursive function for parsing script dependencies and loading them into the script instance dependency // Recursive function for parsing script dependencies and loading them into the script instance dependency
void* pPropertyData = pInstance->PropertyData(); void* pPropertyData = pInstance->PropertyData();
for (u32 PropertyIdx = 0; PropertyIdx < pStruct->NumChildren(); PropertyIdx++) for (u32 PropertyIdx = 0; PropertyIdx < pStruct->NumChildren(); PropertyIdx++)
{ {
IPropertyNew *pProp = pStruct->ChildByIndex(PropertyIdx); IProperty *pProp = pStruct->ChildByIndex(PropertyIdx);
EPropertyTypeNew Type = pProp->Type(); EPropertyType Type = pProp->Type();
// Technically we aren't parsing array children, but it's not really worth refactoring this function // Technically we aren't parsing array children, but it's not really worth refactoring this function
// to support it when there aren't any array properties that contain any asset references anyway... // to support it when there aren't any array properties that contain any asset references anyway...
if (Type == EPropertyTypeNew::Struct) if (Type == EPropertyType::Struct)
ParseStructDependencies(pInst, pInstance, TPropCast<CStructPropertyNew>(pProp)); ParseStructDependencies(pInst, pInstance, TPropCast<CStructProperty>(pProp));
else if (Type == EPropertyTypeNew::Sound) else if (Type == EPropertyType::Sound)
{ {
u32 SoundID = TPropCast<CSoundProperty>(pProp)->Value(pPropertyData); u32 SoundID = TPropCast<CSoundProperty>(pProp)->Value(pPropertyData);
@ -184,7 +184,7 @@ void CScriptInstanceDependency::ParseStructDependencies(CScriptInstanceDependenc
} }
} }
else if (Type == EPropertyTypeNew::Asset) else if (Type == EPropertyType::Asset)
{ {
CAssetID ID = TPropCast<CAssetProperty>(pProp)->Value(pPropertyData); CAssetID ID = TPropCast<CAssetProperty>(pProp)->Value(pPropertyData);
@ -195,7 +195,7 @@ void CScriptInstanceDependency::ParseStructDependencies(CScriptInstanceDependenc
} }
} }
else if (Type == EPropertyTypeNew::AnimationSet) else if (Type == EPropertyType::AnimationSet)
{ {
CAnimationParameters Params = TPropCast<CAnimationSetProperty>(pProp)->Value(pPropertyData); CAnimationParameters Params = TPropCast<CAnimationSetProperty>(pProp)->Value(pPropertyData);
CAssetID ID = Params.ID(); CAssetID ID = Params.ID();

View File

@ -8,7 +8,7 @@
class CScriptLayer; class CScriptLayer;
class CScriptObject; class CScriptObject;
class CStructPropertyNew; class CStructProperty;
class CAnimSet; class CAnimSet;
class CAnimationParameters; class CAnimationParameters;
struct SSetCharacter; struct SSetCharacter;
@ -145,7 +145,7 @@ public:
// Static // Static
static CScriptInstanceDependency* BuildTree(CScriptObject *pInstance); static CScriptInstanceDependency* BuildTree(CScriptObject *pInstance);
protected: protected:
static void ParseStructDependencies(CScriptInstanceDependency *pTree, CScriptObject* pInstance, CStructPropertyNew *pStruct); static void ParseStructDependencies(CScriptInstanceDependency *pTree, CScriptObject* pInstance, CStructProperty *pStruct);
}; };
// Node representing an animset character. Indicates what index the character is within the animset. // Node representing an animset character. Indicates what index the character is within the animset.

View File

@ -128,20 +128,20 @@ void CLight::SetAngleAtten(float AngleCoefA, float AngleCoefB, float AngleCoefC)
mAngleAttenCoefficients.Z = AngleCoefC; mAngleAttenCoefficients.Z = AngleCoefC;
} }
CStructPropertyNew* CLight::GetProperties() const CStructProperty* CLight::GetProperties() const
{ {
//@todo MP1 properties only //@todo MP1 properties only
//@todo we cannot display full properties because a lot of them are discarded on load //@todo we cannot display full properties because a lot of them are discarded on load
static CStructPropertyNew* pProperties = nullptr; static CStructProperty* pProperties = nullptr;
if (!pProperties) if (!pProperties)
{ {
pProperties = (CStructPropertyNew*) IPropertyNew::CreateIntrinsic(EPropertyTypeNew::Struct, pProperties = (CStructProperty*) IProperty::CreateIntrinsic(EPropertyType::Struct,
ePrime, ePrime,
0, 0,
"Light"); "Light");
CChoiceProperty* pLightType = (CChoiceProperty*) IPropertyNew::CreateIntrinsic(EPropertyTypeNew::Choice, CChoiceProperty* pLightType = (CChoiceProperty*) IProperty::CreateIntrinsic(EPropertyType::Choice,
pProperties, pProperties,
MEMBER_OFFSET(CLight, mType), MEMBER_OFFSET(CLight, mType),
"LightType"); "LightType");
@ -150,22 +150,22 @@ CStructPropertyNew* CLight::GetProperties() const
pLightType->AddValue("Spot", eSpot); pLightType->AddValue("Spot", eSpot);
pLightType->AddValue("Custom", eCustom); pLightType->AddValue("Custom", eCustom);
IPropertyNew::CreateIntrinsic(EPropertyTypeNew::Color, IProperty::CreateIntrinsic(EPropertyType::Color,
pProperties, pProperties,
MEMBER_OFFSET(CLight, mColor), MEMBER_OFFSET(CLight, mColor),
"Color"); "Color");
IPropertyNew::CreateIntrinsic(EPropertyTypeNew::Vector, IProperty::CreateIntrinsic(EPropertyType::Vector,
pProperties, pProperties,
MEMBER_OFFSET(CLight, mPosition), MEMBER_OFFSET(CLight, mPosition),
"Position"); "Position");
IPropertyNew::CreateIntrinsic(EPropertyTypeNew::Vector, IProperty::CreateIntrinsic(EPropertyType::Vector,
pProperties, pProperties,
MEMBER_OFFSET(CLight, mDirection), MEMBER_OFFSET(CLight, mDirection),
"Direction"); "Direction");
IPropertyNew::CreateIntrinsic(EPropertyTypeNew::Float, IProperty::CreateIntrinsic(EPropertyType::Float,
pProperties, pProperties,
MEMBER_OFFSET(CLight, mSpotCutoff), MEMBER_OFFSET(CLight, mSpotCutoff),
"SpotCutoff"); "SpotCutoff");

View File

@ -63,7 +63,7 @@ public:
void SetDistAtten(float DistCoefA, float DistCoefB, float DistCoefC); void SetDistAtten(float DistCoefA, float DistCoefB, float DistCoefC);
void SetAngleAtten(float AngleCoefA, float AngleCoefB, float AngleCoefC); void SetAngleAtten(float AngleCoefA, float AngleCoefB, float AngleCoefC);
CStructPropertyNew* GetProperties() const; CStructProperty* GetProperties() const;
// Other // Other
void Load() const; void Load() const;

View File

@ -5,7 +5,7 @@
#include <Core/Resource/Script/Property/CEnumProperty.h> #include <Core/Resource/Script/Property/CEnumProperty.h>
#include <Core/Resource/Script/Property/CFlagsProperty.h> #include <Core/Resource/Script/Property/CFlagsProperty.h>
void CScriptCooker::WriteProperty(IOutputStream& rOut, IPropertyNew* pProperty, bool InAtomicStruct) void CScriptCooker::WriteProperty(IOutputStream& rOut, IProperty* pProperty, bool InAtomicStruct)
{ {
u32 SizeOffset = 0, PropStart = 0; u32 SizeOffset = 0, PropStart = 0;
void* pData = (mpArrayItemData ? mpArrayItemData : mpObject->PropertyData()); void* pData = (mpArrayItemData ? mpArrayItemData : mpObject->PropertyData());
@ -21,118 +21,118 @@ void CScriptCooker::WriteProperty(IOutputStream& rOut, IPropertyNew* pProperty,
switch (pProperty->Type()) switch (pProperty->Type())
{ {
case EPropertyTypeNew::Bool: case EPropertyType::Bool:
{ {
CBoolProperty* pBool = TPropCast<CBoolProperty>(pProperty); CBoolProperty* pBool = TPropCast<CBoolProperty>(pProperty);
rOut.WriteBool( pBool->Value(pData) ); rOut.WriteBool( pBool->Value(pData) );
break; break;
} }
case EPropertyTypeNew::Byte: case EPropertyType::Byte:
{ {
CByteProperty* pByte = TPropCast<CByteProperty>(pProperty); CByteProperty* pByte = TPropCast<CByteProperty>(pProperty);
rOut.WriteByte( pByte->Value(pData) ); rOut.WriteByte( pByte->Value(pData) );
break; break;
} }
case EPropertyTypeNew::Short: case EPropertyType::Short:
{ {
CShortProperty* pShort = TPropCast<CShortProperty>(pProperty); CShortProperty* pShort = TPropCast<CShortProperty>(pProperty);
rOut.WriteShort( pShort->Value(pData) ); rOut.WriteShort( pShort->Value(pData) );
break; break;
} }
case EPropertyTypeNew::Int: case EPropertyType::Int:
{ {
CIntProperty* pInt = TPropCast<CIntProperty>(pProperty); CIntProperty* pInt = TPropCast<CIntProperty>(pProperty);
rOut.WriteLong( pInt->Value(pData) ); rOut.WriteLong( pInt->Value(pData) );
break; break;
} }
case EPropertyTypeNew::Float: case EPropertyType::Float:
{ {
CFloatProperty* pFloat = TPropCast<CFloatProperty>(pProperty); CFloatProperty* pFloat = TPropCast<CFloatProperty>(pProperty);
rOut.WriteFloat( pFloat->Value(pData) ); rOut.WriteFloat( pFloat->Value(pData) );
break; break;
} }
case EPropertyTypeNew::Choice: case EPropertyType::Choice:
{ {
CChoiceProperty* pChoice = TPropCast<CChoiceProperty>(pProperty); CChoiceProperty* pChoice = TPropCast<CChoiceProperty>(pProperty);
rOut.WriteLong( pChoice->Value(pData) ); rOut.WriteLong( pChoice->Value(pData) );
break; break;
} }
case EPropertyTypeNew::Enum: case EPropertyType::Enum:
{ {
CEnumProperty* pEnum = TPropCast<CEnumProperty>(pProperty); CEnumProperty* pEnum = TPropCast<CEnumProperty>(pProperty);
rOut.WriteLong( pEnum->Value(pData) ); rOut.WriteLong( pEnum->Value(pData) );
break; break;
} }
case EPropertyTypeNew::Flags: case EPropertyType::Flags:
{ {
CFlagsProperty* pFlags = TPropCast<CFlagsProperty>(pProperty); CFlagsProperty* pFlags = TPropCast<CFlagsProperty>(pProperty);
rOut.WriteLong( pFlags->Value(pData) ); rOut.WriteLong( pFlags->Value(pData) );
break; break;
} }
case EPropertyTypeNew::String: case EPropertyType::String:
{ {
CStringProperty* pString = TPropCast<CStringProperty>(pProperty); CStringProperty* pString = TPropCast<CStringProperty>(pProperty);
rOut.WriteString( pString->Value(pData) ); rOut.WriteString( pString->Value(pData) );
break; break;
} }
case EPropertyTypeNew::Vector: case EPropertyType::Vector:
{ {
CVectorProperty* pVector = TPropCast<CVectorProperty>(pProperty); CVectorProperty* pVector = TPropCast<CVectorProperty>(pProperty);
pVector->ValueRef(pData).Write(rOut); pVector->ValueRef(pData).Write(rOut);
break; break;
} }
case EPropertyTypeNew::Color: case EPropertyType::Color:
{ {
CColorProperty* pColor = TPropCast<CColorProperty>(pProperty); CColorProperty* pColor = TPropCast<CColorProperty>(pProperty);
pColor->ValueRef(pData).Write(rOut); pColor->ValueRef(pData).Write(rOut);
break; break;
} }
case EPropertyTypeNew::Asset: case EPropertyType::Asset:
{ {
CAssetProperty* pAsset = TPropCast<CAssetProperty>(pProperty); CAssetProperty* pAsset = TPropCast<CAssetProperty>(pProperty);
pAsset->ValueRef(pData).Write(rOut); pAsset->ValueRef(pData).Write(rOut);
break; break;
} }
case EPropertyTypeNew::Sound: case EPropertyType::Sound:
{ {
CSoundProperty* pSound = TPropCast<CSoundProperty>(pProperty); CSoundProperty* pSound = TPropCast<CSoundProperty>(pProperty);
rOut.WriteLong( pSound->Value(pData) ); rOut.WriteLong( pSound->Value(pData) );
break; break;
} }
case EPropertyTypeNew::Animation: case EPropertyType::Animation:
{ {
CAnimationProperty* pAnim = TPropCast<CAnimationProperty>(pProperty); CAnimationProperty* pAnim = TPropCast<CAnimationProperty>(pProperty);
rOut.WriteLong( pAnim->Value(pData) ); rOut.WriteLong( pAnim->Value(pData) );
break; break;
} }
case EPropertyTypeNew::AnimationSet: case EPropertyType::AnimationSet:
{ {
CAnimationSetProperty* pAnimSet = TPropCast<CAnimationSetProperty>(pProperty); CAnimationSetProperty* pAnimSet = TPropCast<CAnimationSetProperty>(pProperty);
pAnimSet->ValueRef(pData).Write(rOut); pAnimSet->ValueRef(pData).Write(rOut);
break; break;
} }
case EPropertyTypeNew::Sequence: case EPropertyType::Sequence:
{ {
// TODO // TODO
break; break;
} }
case EPropertyTypeNew::Spline: case EPropertyType::Spline:
{ {
CSplineProperty* pSpline = TPropCast<CSplineProperty>(pProperty); CSplineProperty* pSpline = TPropCast<CSplineProperty>(pProperty);
std::vector<char>& rBuffer = pSpline->ValueRef(pData); std::vector<char>& rBuffer = pSpline->ValueRef(pData);
@ -163,7 +163,7 @@ void CScriptCooker::WriteProperty(IOutputStream& rOut, IPropertyNew* pProperty,
break; break;
} }
case EPropertyTypeNew::Guid: case EPropertyType::Guid:
{ {
CGuidProperty* pGuid = TPropCast<CGuidProperty>(pProperty); CGuidProperty* pGuid = TPropCast<CGuidProperty>(pProperty);
std::vector<char>& rBuffer = pGuid->ValueRef(pData); std::vector<char>& rBuffer = pGuid->ValueRef(pData);
@ -175,14 +175,14 @@ void CScriptCooker::WriteProperty(IOutputStream& rOut, IPropertyNew* pProperty,
break; break;
} }
case EPropertyTypeNew::Struct: case EPropertyType::Struct:
{ {
CStructPropertyNew* pStruct = TPropCast<CStructPropertyNew>(pProperty); CStructProperty* pStruct = TPropCast<CStructProperty>(pProperty);
std::vector<IPropertyNew*> PropertiesToWrite; std::vector<IProperty*> PropertiesToWrite;
for (u32 ChildIdx = 0; ChildIdx < pStruct->NumChildren(); ChildIdx++) for (u32 ChildIdx = 0; ChildIdx < pStruct->NumChildren(); ChildIdx++)
{ {
IPropertyNew *pChild = pStruct->ChildByIndex(ChildIdx); IProperty *pChild = pStruct->ChildByIndex(ChildIdx);
if (pStruct->IsAtomic() || pChild->ShouldCook(pData)) if (pStruct->IsAtomic() || pChild->ShouldCook(pData))
PropertiesToWrite.push_back(pChild); PropertiesToWrite.push_back(pChild);
@ -202,7 +202,7 @@ void CScriptCooker::WriteProperty(IOutputStream& rOut, IPropertyNew* pProperty,
break; break;
} }
case EPropertyTypeNew::Array: case EPropertyType::Array:
{ {
CArrayProperty* pArray = TPropCast<CArrayProperty>(pProperty); CArrayProperty* pArray = TPropCast<CArrayProperty>(pProperty);
u32 Count = pArray->ArrayCount(pData); u32 Count = pArray->ArrayCount(pData);

View File

@ -15,7 +15,7 @@ class CScriptCooker
std::vector<CScriptObject*> mGeneratedObjects; std::vector<CScriptObject*> mGeneratedObjects;
bool mWriteGeneratedSeparately; bool mWriteGeneratedSeparately;
void WriteProperty(IOutputStream& rOut, IPropertyNew* pProperty, bool InAtomicStruct); void WriteProperty(IOutputStream& rOut, IProperty* pProperty, bool InAtomicStruct);
public: public:
CScriptCooker(EGame Game, bool WriteGeneratedObjectsSeparately = true) CScriptCooker(EGame Game, bool WriteGeneratedObjectsSeparately = true)

View File

@ -1,844 +0,0 @@
#include "CTemplateWriter.h"
#include "CAreaCooker.h"
#include <Common/FileUtil.h>
#include <Core/Resource/Script/IPropertyTemplate.h>
#include <tinyxml2.h>
#if 0
using namespace tinyxml2;
TString CTemplateWriter::smTemplatesDir = "../templates/";
CTemplateWriter::CTemplateWriter()
{
}
void CTemplateWriter::SavePropertyTemplate(IPropertyTemplate *pTemp)
{
// Check for a source file in the template's hierarchy; that indicates it's part of a struct template, not a script template
TString SourceFile = pTemp->FindStructSource();
// Struct
if (!SourceFile.IsEmpty())
{
CMasterTemplate *pMaster = pTemp->MasterTemplate();
auto StructIt = pMaster->mStructTemplates.find(SourceFile);
if (StructIt != pMaster->mStructTemplates.end())
{
CStructTemplate *pStruct = StructIt->second;
CTemplateWriter::SaveStructTemplate(pStruct);
}
}
// Script
else if (pTemp->ScriptTemplate())
CTemplateWriter::SaveScriptTemplate(pTemp->ScriptTemplate());
// Error
else
Log::Error("Couldn't save property template " + pTemp->IDString(true) + "; no struct template source path or script template found");
}
void CTemplateWriter::SaveAllTemplates()
{
// Create directory
std::list<CMasterTemplate*> MasterList = CMasterTemplate::MasterList();
FileUtil::MakeDirectory(smTemplatesDir);
// Resave property list
SavePropertyList();
// Resave master templates
for (auto it = MasterList.begin(); it != MasterList.end(); it++)
SaveGameTemplates(*it);
// Resave game list
XMLDocument GameList;
XMLDeclaration *pDecl = GameList.NewDeclaration();
GameList.LinkEndChild(pDecl);
XMLElement *pBase = GameList.NewElement("GameList");
pBase->SetAttribute("version", 4);
GameList.LinkEndChild(pBase);
XMLElement *pProperties = GameList.NewElement("properties");
pProperties->SetText("Properties.xml");
pBase->LinkEndChild(pProperties);
for (auto it = MasterList.begin(); it != MasterList.end(); it++)
{
CMasterTemplate *pMaster = *it;
XMLElement *pGame = GameList.NewElement("game");
pBase->LinkEndChild(pGame);
XMLElement *pGameName = GameList.NewElement("name");
pGameName->SetText(*pMaster->mGameName);
pGame->LinkEndChild(pGameName);
XMLElement *pAreaVersion = GameList.NewElement("mrea");
u32 VersionNumber = CAreaCooker::GetMREAVersion(pMaster->Game());
pAreaVersion->SetText(*TString::HexString(VersionNumber, 2));
pGame->LinkEndChild(pAreaVersion);
XMLElement *pTempPath = GameList.NewElement("master");
pTempPath->SetText(*pMaster->mSourceFile);
pGame->LinkEndChild(pTempPath);
}
TString GameListName = smTemplatesDir + "GameList.xml";
GameList.SaveFile(*GameListName);
}
void CTemplateWriter::SaveGameTemplates(CMasterTemplate *pMaster)
{
// Create directory
TString OutFile = smTemplatesDir + pMaster->mSourceFile;
TString OutDir = OutFile.GetFileDirectory();
FileUtil::MakeDirectory(OutDir);
// Resave script templates
for (auto it = pMaster->mTemplates.begin(); it != pMaster->mTemplates.end(); it++)
SaveScriptTemplate(it->second);
// Resave struct templates
for (auto it = pMaster->mStructTemplates.begin(); it != pMaster->mStructTemplates.end(); it++)
SaveStructTemplate(it->second);
// Resave master template
XMLDocument Master;
XMLDeclaration *pDecl = Master.NewDeclaration();
Master.LinkEndChild(pDecl);
XMLElement *pBase = Master.NewElement("MasterTemplate");
pBase->SetAttribute("version", 4);
Master.LinkEndChild(pBase);
// Write versions
if (!pMaster->mGameVersions.empty())
{
XMLElement *pVersionsBlock = Master.NewElement("versions");
pBase->LinkEndChild(pVersionsBlock);
for (auto it = pMaster->mGameVersions.begin(); it != pMaster->mGameVersions.end(); it++)
{
XMLElement *pVersion = Master.NewElement("version");
pVersion->SetText(*(*it));
pVersionsBlock->LinkEndChild(pVersion);
}
}
// Write script objects
XMLElement *pObjects = Master.NewElement("objects");
pBase->LinkEndChild(pObjects);
for (auto it = pMaster->mTemplates.begin(); it != pMaster->mTemplates.end(); it++)
{
u32 ObjID = (it->second)->ObjectID();
TString StrID;
if (ObjID <= 0xFF)
StrID = TString::HexString(ObjID, 2);
else
StrID = CFourCC(ObjID).ToString();
XMLElement *pObj = Master.NewElement("object");
pObj->SetAttribute("ID", *StrID);
pObj->SetAttribute("template", *(it->second)->mSourceFile);
pObjects->LinkEndChild(pObj);
}
// Write script states/messages
for (u32 iType = 0; iType < 2; iType++)
{
TString Type = (iType == 0 ? "state" : "message");
XMLElement *pElem = Master.NewElement(*(Type + "s"));
pBase->LinkEndChild(pElem);
u32 Num = (iType == 0 ? pMaster->NumStates() : pMaster->NumMessages());
for (u32 iScr = 0; iScr < Num; iScr++)
{
u32 ID;
TString Name;
if (iType == 0)
{
SState State = pMaster->StateByIndex(iScr);
ID = State.ID;
Name = State.Name;
}
else
{
SMessage Message = pMaster->MessageByIndex(iScr);
ID = Message.ID;
Name = Message.Name;
}
TString StrID;
if (ID <= 0xFF) StrID = TString::HexString(ID, 2);
else StrID = CFourCC(ID).ToString();
XMLElement *pSubElem = Master.NewElement(*Type);
pSubElem->SetAttribute("ID", *StrID);
pSubElem->SetAttribute("name", *Name);
pElem->LinkEndChild(pSubElem);
}
}
// Save file
Master.SaveFile(*OutFile);
}
void CTemplateWriter::SavePropertyList()
{
// Create XML
XMLDocument List;
XMLDeclaration *pDecl = List.NewDeclaration();
List.LinkEndChild(pDecl);
XMLElement *pBase = List.NewElement("Properties");
pBase->SetAttribute("version", 4);
List.LinkEndChild(pBase);
// Write properties
for (auto it = CMasterTemplate::smPropertyNames.begin(); it != CMasterTemplate::smPropertyNames.end(); it++)
{
u32 ID = it->first;
TString Name = it->second;
XMLElement *pElem = List.NewElement("property");
pElem->SetAttribute("ID", *TString::HexString(ID));
pElem->SetAttribute("name", *Name);
pBase->LinkEndChild(pElem);
}
TString OutFile = smTemplatesDir + "Properties.xml";
List.SaveFile(*OutFile);
}
void CTemplateWriter::SaveScriptTemplate(CScriptTemplate *pTemp)
{
CMasterTemplate *pMaster = pTemp->MasterTemplate();
// Create directory
TString OutFile = smTemplatesDir + pMaster->GetDirectory() + pTemp->mSourceFile;
TString OutDir = OutFile.GetFileDirectory();
FileUtil::MakeDirectory(*OutDir);
// Create new document
XMLDocument ScriptXML;
XMLDeclaration *pDecl = ScriptXML.NewDeclaration();
ScriptXML.LinkEndChild(pDecl);
// Base element
XMLElement *pRoot = ScriptXML.NewElement("ScriptTemplate");
pRoot->SetAttribute("version", 4);
ScriptXML.LinkEndChild(pRoot);
// Write object name
XMLElement *pName = ScriptXML.NewElement("name");
pName->SetText(*pTemp->Name());
pRoot->LinkEndChild(pName);
// Write modules
if (!pTemp->mModules.empty())
{
XMLElement *pModules = ScriptXML.NewElement("modules");
pRoot->LinkEndChild(pModules);
for (u32 iMod = 0; iMod < pTemp->mModules.size(); iMod++)
{
XMLElement *pModule = ScriptXML.NewElement("module");
pModule->SetText(*pTemp->mModules[iMod]);
pModules->LinkEndChild(pModule);
}
}
// Write properties
SaveProperties(&ScriptXML, pRoot, pTemp->mpBaseStruct);
// States/Messages [todo]
XMLElement *pStates = ScriptXML.NewElement("states");
pRoot->LinkEndChild(pStates);
XMLElement *pMessages = ScriptXML.NewElement("messages");
pRoot->LinkEndChild(pMessages);
// Write editor properties
XMLElement *pEditor = ScriptXML.NewElement("editor");
pRoot->LinkEndChild(pEditor);
// Editor Properties
XMLElement *pEditorProperties = ScriptXML.NewElement("properties");
pEditor->LinkEndChild(pEditorProperties);
TString PropNames[6] = {
"InstanceName", "Position", "Rotation",
"Scale", "Active", "LightParameters"
};
TIDString *pPropStrings[6] = {
&pTemp->mNameIDString, &pTemp->mPositionIDString, &pTemp->mRotationIDString,
&pTemp->mScaleIDString, &pTemp->mActiveIDString, &pTemp->mLightParametersIDString
};
for (u32 iProp = 0; iProp < 6; iProp++)
{
if (!pPropStrings[iProp]->IsEmpty())
{
XMLElement *pProperty = ScriptXML.NewElement("property");
pProperty->SetAttribute("name", *PropNames[iProp]);
pProperty->SetAttribute("ID", **pPropStrings[iProp]);
pEditorProperties->LinkEndChild(pProperty);
}
}
// Editor Assets
XMLElement *pAssets = ScriptXML.NewElement("assets");
pEditor->LinkEndChild(pAssets);
for (auto it = pTemp->mAssets.begin(); it != pTemp->mAssets.end(); it++)
{
TString Source = (it->AssetSource == CScriptTemplate::SEditorAsset::eFile ? "file" : "property");
TString Type;
switch (it->AssetType)
{
case CScriptTemplate::SEditorAsset::eModel: Type = "model"; break;
case CScriptTemplate::SEditorAsset::eAnimParams: Type = "animparams"; break;
case CScriptTemplate::SEditorAsset::eBillboard: Type = "billboard"; break;
case CScriptTemplate::SEditorAsset::eCollision: Type = "collision"; break;
}
s32 Force = -1;
if (it->AssetType == CScriptTemplate::SEditorAsset::eAnimParams)
Force = it->ForceNodeIndex;
XMLElement *pAsset = ScriptXML.NewElement(*Type);
pAsset->SetAttribute("source", *Source);
if (Force >= 0) pAsset->SetAttribute("force", *TString::FromInt32(Force, 0, 10));
pAsset->SetText(*it->AssetLocation);
pAssets->LinkEndChild(pAsset);
}
// Attachments
if (!pTemp->mAttachments.empty())
{
XMLElement *pAttachments = ScriptXML.NewElement("attachments");
pEditor->LinkEndChild(pAttachments);
for (auto it = pTemp->mAttachments.begin(); it != pTemp->mAttachments.end(); it++)
{
XMLElement *pAttachment = ScriptXML.NewElement("attachment");
pAttachment->SetAttribute("propertyID", *it->AttachProperty);
pAttachment->SetAttribute("locator", *it->LocatorName);
pAttachments->LinkEndChild(pAttachment);
// Sub-properties
if (it->AttachType != eAttach)
{
XMLElement *pAttachType = ScriptXML.NewElement("attach_type");
pAttachType->SetText("follow");
pAttachment->LinkEndChild(pAttachType);
}
}
}
// Preview Scale
if (pTemp->mPreviewScale != 1.f)
{
XMLElement *pPreviewScale = ScriptXML.NewElement("preview_scale");
pPreviewScale->SetText(*TString::FromFloat(pTemp->mPreviewScale));
pEditor->LinkEndChild(pPreviewScale);
}
// Rot/Scale Type
XMLElement *pRotType = ScriptXML.NewElement("rotation_type");
pEditor->LinkEndChild(pRotType);
pRotType->SetText(pTemp->mRotationType == CScriptTemplate::eRotationEnabled ? "enabled" : "disabled");
XMLElement *pScaleType = ScriptXML.NewElement("scale_type");
pEditor->LinkEndChild(pScaleType);
if (pTemp->mScaleType != CScriptTemplate::eScaleVolume)
pScaleType->SetText(pTemp->mScaleType == CScriptTemplate::eScaleEnabled ? "enabled" : "disabled");
else
{
pScaleType->SetText("volume");
// Volume Preview
XMLElement *pVolume = ScriptXML.NewElement("preview_volume");
pEditor->LinkEndChild(pVolume);
// Enum -> String conversion lambda to avoid redundant code
auto GetVolumeString = [](EVolumeShape shape) -> TString
{
switch (shape)
{
case eBoxShape: return "Box";
case eAxisAlignedBoxShape: return "AxisAlignedBox";
case eEllipsoidShape: return "Ellipsoid";
case eCylinderShape: return "Cylinder";
case eConditionalShape: return "Conditional";
default: return "INVALID";
}
};
pVolume->SetAttribute("shape", *GetVolumeString(pTemp->mVolumeShape));
if (pTemp->mVolumeScale != 1.f)
pVolume->SetAttribute("scale", pTemp->mVolumeScale);
if (pTemp->mVolumeShape == eConditionalShape)
{
pVolume->SetAttribute("propertyID", *pTemp->mVolumeConditionIDString);
// Find conditional test property
IPropertyTemplate *pProp = pTemp->mpBaseStruct->PropertyByIDString(pTemp->mVolumeConditionIDString);
// Write conditions
for (auto it = pTemp->mVolumeConditions.begin(); it != pTemp->mVolumeConditions.end(); it++)
{
// Value should be an integer, or a boolean condition
TString StrVal;
if (pProp->Type() == eBoolProperty)
StrVal = (it->Value == 1 ? "true" : "false");
else
StrVal = TString::HexString((u32) it->Value, (it->Value > 0xFF ? 8 : 2));
XMLElement *pCondition = ScriptXML.NewElement("condition");
pCondition->SetAttribute("value", *StrVal);
pCondition->SetAttribute("shape", *GetVolumeString(it->Shape));
if (it->Scale != 1.f) pCondition->SetAttribute("scale", it->Scale);
pVolume->LinkEndChild(pCondition);
}
}
}
// Write to file
ScriptXML.SaveFile(*OutFile);
}
void CTemplateWriter::SaveStructTemplate(CStructTemplate *pTemp)
{
// Create directory
CMasterTemplate *pMaster = pTemp->MasterTemplate();
TString OutFile = smTemplatesDir + pMaster->GetDirectory() + pTemp->mSourceFile;
TString OutDir = OutFile.GetFileDirectory();
TString Name = OutFile.GetFileName(false);
FileUtil::MakeDirectory(OutDir);
// Create new document and write struct properties to it
XMLDocument StructXML;
XMLDeclaration *pDecl = StructXML.NewDeclaration();
StructXML.LinkEndChild(pDecl);
XMLElement *pRoot = StructXML.NewElement("struct");
pRoot->SetAttribute("name", *Name);
pRoot->SetAttribute("type", (pTemp->IsSingleProperty() ? "single" : "multi"));
StructXML.LinkEndChild(pRoot);
SaveProperties(&StructXML, pRoot, pTemp);
StructXML.SaveFile(*OutFile);
}
void CTemplateWriter::SaveEnumTemplate(CEnumTemplate *pTemp)
{
// Create directory
CMasterTemplate *pMaster = pTemp->MasterTemplate();
TString OutFile = smTemplatesDir + pMaster->GetDirectory() + pTemp->mSourceFile;
TString OutDir = OutFile.GetFileDirectory();
TString Name = OutFile.GetFileName(false);
FileUtil::MakeDirectory(OutDir);
// Create new document and write enumerators to it
XMLDocument EnumXML;
XMLDeclaration *pDecl = EnumXML.NewDeclaration();
EnumXML.LinkEndChild(pDecl);
XMLElement *pRoot = EnumXML.NewElement("enum");
pRoot->SetAttribute("name", *Name);
EnumXML.LinkEndChild(pRoot);
SaveEnumerators(&EnumXML, pRoot, pTemp);
EnumXML.SaveFile(*OutFile);
}
void CTemplateWriter::SaveBitfieldTemplate(CBitfieldTemplate *pTemp)
{
// Create directory
CMasterTemplate *pMaster = pTemp->MasterTemplate();
TString OutFile = smTemplatesDir + pMaster->GetDirectory() + pTemp->mSourceFile;
TString OutDir = OutFile.GetFileDirectory();
TString Name = pTemp->mSourceFile.GetFileName(false);
FileUtil::MakeDirectory(OutDir);
// Create new document and write enumerators to it
XMLDocument BitfieldXML;
XMLDeclaration *pDecl = BitfieldXML.NewDeclaration();
BitfieldXML.LinkEndChild(pDecl);
XMLElement *pRoot = BitfieldXML.NewElement("bitfield");
pRoot->SetAttribute("name", *Name);
BitfieldXML.LinkEndChild(pRoot);
SaveBitFlags(&BitfieldXML, pRoot, pTemp);
BitfieldXML.SaveFile(*OutFile);
}
void CTemplateWriter::SaveProperties(XMLDocument *pDoc, XMLElement *pParent, CStructTemplate *pTemp)
{
// Create base element
XMLElement *pPropsBlock = pDoc->NewElement("properties");
pParent->LinkEndChild(pPropsBlock);
for (u32 iProp = 0; iProp < pTemp->Count(); iProp++)
{
// Get ID
IPropertyTemplate *pProp = pTemp->PropertyByIndex(iProp);
u32 ID = pProp->PropertyID();
TString StrID = TString::HexString(ID, (ID > 0xFF ? 8 : 2));
// Create element
XMLElement *pElem;
if (pProp->Type() == eStructProperty)
pElem = pDoc->NewElement("struct");
else if (pProp->Type() == eEnumProperty)
pElem = pDoc->NewElement("enum");
else if (pProp->Type() == eBitfieldProperty)
pElem = pDoc->NewElement("bitfield");
else if (pProp->Type() == eArrayProperty)
pElem = pDoc->NewElement("array");
else
pElem = pDoc->NewElement("property");
pPropsBlock->LinkEndChild(pElem);
// Set common property parameters, starting with ID
pElem->SetAttribute("ID", *StrID);
// Name
TString Name = pProp->Name();
if (pProp->Game() >= eEchoesDemo && ID > 0xFF)
{
TString MasterName = CMasterTemplate::PropertyName(ID);
if (Name != MasterName)
pElem->SetAttribute("name", *Name);
}
else
pElem->SetAttribute("name", *Name);
// Type
if (pProp->Type() == eStructProperty)
{
CStructTemplate *pStruct = static_cast<CStructTemplate*>(pProp);
if (pStruct->mSourceFile.IsEmpty())
pElem->SetAttribute("type", (pStruct->mIsSingleProperty ? "single" : "multi"));
}
else if (TString(pElem->Name()) == "property")
pElem->SetAttribute("type", *PropEnumToPropString(pProp->Type()));
// Versions
CMasterTemplate *pMaster = pProp->MasterTemplate();
u32 NumVersions = pProp->mAllowedVersions.size();
if (NumVersions > 0 && NumVersions != pMaster->mGameVersions.size())
{
XMLElement *pVersions = pDoc->NewElement("versions");
pElem->LinkEndChild(pVersions);
for (u32 iVer = 0; iVer < pMaster->mGameVersions.size(); iVer++)
{
if (pProp->IsInVersion(iVer))
{
XMLElement *pVersion = pDoc->NewElement("version");
pVersion->SetText(*pMaster->mGameVersions[iVer]);
pVersions->LinkEndChild(pVersion);
}
}
}
// Default
if (pProp->CanHaveDefault() && pProp->Game() >= eEchoesDemo)
{
XMLElement *pDefault = pDoc->NewElement("default");
pDefault->SetText(*pProp->DefaultToString());
pElem->LinkEndChild(pDefault);
}
// Description
if (!pProp->Description().IsEmpty())
{
XMLElement *pDesc = pDoc->NewElement("description");
pDesc->SetText(*pProp->Description());
pElem->LinkEndChild(pDesc);
}
// Range
if (pProp->IsNumerical() && pProp->HasValidRange())
{
XMLElement *pRange = pDoc->NewElement("range");
pRange->SetText(*pProp->RangeToString());
pElem->LinkEndChild(pRange);
}
// Suffix
if (pProp->IsNumerical())
{
TString Suffix = pProp->Suffix();
if (!Suffix.IsEmpty())
{
XMLElement *pSuffix = pDoc->NewElement("suffix");
pSuffix->SetText(*Suffix);
pElem->LinkEndChild(pSuffix);
}
}
// Cook Pref
ECookPreference CookPref = pProp->CookPreference();
if (CookPref != eNoCookPreference)
{
XMLElement *pCookPref = pDoc->NewElement("cook_pref");
pCookPref->SetText(CookPref == eAlwaysCook ? "always" : "never");
pElem->LinkEndChild(pCookPref);
}
// Asset-specific parameters
if (pProp->Type() == eAssetProperty)
{
CAssetTemplate *pAsset = static_cast<CAssetTemplate*>(pProp);
const CResTypeFilter& rkFilter = pAsset->TypeFilter();
TString ExtensionsString = rkFilter.ToString();
if (ExtensionsString.IsEmpty()) ExtensionsString = "UNKN";
pElem->SetAttribute("extensions", *ExtensionsString);
}
// Enum-specific parameters
else if (pProp->Type() == eEnumProperty)
{
CEnumTemplate *pEnum = static_cast<CEnumTemplate*>(pProp);
if (pEnum->mSourceFile.IsEmpty())
SaveEnumerators(pDoc, pElem, pEnum);
else
{
SaveEnumTemplate(pEnum);
pElem->SetAttribute("template", *pEnum->mSourceFile);
}
}
// Bitfield-specific parameters
else if (pProp->Type() == eBitfieldProperty)
{
CBitfieldTemplate *pBitfield = static_cast<CBitfieldTemplate*>(pProp);
if (pBitfield->mSourceFile.IsEmpty())
SaveBitFlags(pDoc, pElem, pBitfield);
else
{
SaveBitfieldTemplate(pBitfield);
pElem->SetAttribute("template", *pBitfield->mSourceFile);
}
}
// Struct/array-specific parameters
else if (pProp->Type() == eStructProperty || pProp->Type() == eArrayProperty)
{
// Element Name
if (pProp->Type() == eArrayProperty)
{
CArrayTemplate *pArray = static_cast<CArrayTemplate*>(pProp);
if (!pArray->ElementName().IsEmpty())
{
XMLElement *pElement = pDoc->NewElement("element_name");
pElement->SetText(*static_cast<CArrayTemplate*>(pProp)->ElementName());
pElem->LinkEndChild(pElement);
}
}
// Sub-properties
CStructTemplate *pStruct = static_cast<CStructTemplate*>(pProp);
if (pStruct->mSourceFile.IsEmpty())
SaveProperties(pDoc, pElem, pStruct);
else
{
CStructTemplate *pOriginal = pMaster->StructAtSource(pStruct->mSourceFile);
if (pOriginal)
SavePropertyOverrides(pDoc, pElem, pStruct, pOriginal);
pElem->SetAttribute("template", *pStruct->mSourceFile);
}
}
}
}
void CTemplateWriter::SavePropertyOverrides(XMLDocument *pDoc, XMLElement *pParent, CStructTemplate *pStruct, CStructTemplate *pOriginal)
{
if (!pStruct->StructDataMatches(pOriginal))
{
// Create base element
XMLElement *pPropsBlock = pDoc->NewElement("properties");
pParent->LinkEndChild(pPropsBlock);
for (u32 iProp = 0; iProp < pStruct->Count(); iProp++)
{
IPropertyTemplate *pProp = pStruct->PropertyByIndex(iProp);
IPropertyTemplate *pSource = pOriginal->PropertyByIndex(iProp);
if (!pProp->Matches(pSource))
{
// Create element
XMLElement *pElem;
if (pProp->Type() == eStructProperty)
pElem = pDoc->NewElement("struct");
else if (pProp->Type() == eEnumProperty)
pElem = pDoc->NewElement("enum");
else if (pProp->Type() == eBitfieldProperty)
pElem = pDoc->NewElement("bitfield");
else if (pProp->Type() == eArrayProperty)
pElem = pDoc->NewElement("array");
else
pElem = pDoc->NewElement("property");
pPropsBlock->LinkEndChild(pElem);
// ID
u32 ID = pProp->PropertyID();
pElem->SetAttribute("ID", *TString::HexString(pProp->PropertyID(), (ID > 0xFF ? 8 : 2)));
// Name
if (pProp->Name() != pSource->Name())
pElem->SetAttribute("name", *pProp->Name());
// Default
if (pProp->CanHaveDefault() && !pProp->RawDefaultValue()->Matches(pSource->RawDefaultValue()))
{
XMLElement *pDefault = pDoc->NewElement("default");
pDefault->SetText(*pProp->DefaultToString());
pElem->LinkEndChild(pDefault);
}
// Description
if (pProp->Description() != pSource->Description())
{
XMLElement *pDesc = pDoc->NewElement("description");
pDesc->SetText(*pProp->Description());
pElem->LinkEndChild(pDesc);
}
// Range
if (pProp->IsNumerical())
{
TString Range = pProp->RangeToString();
if (Range != pSource->RangeToString())
{
XMLElement *pRange = pDoc->NewElement("range");
pRange->SetText(*Range);
pElem->LinkEndChild(pRange);
}
}
// Suffix
if (pProp->Suffix() != pSource->Suffix())
{
XMLElement *pSuffix = pDoc->NewElement("suffix");
pSuffix->SetText(*pProp->Suffix());
pElem->LinkEndChild(pSuffix);
}
// Cook Pref
if (pProp->CookPreference() != pSource->CookPreference())
{
XMLElement *pCookPref = pDoc->NewElement("cook_pref");
TString PrefStr;
if (pProp->CookPreference() == eAlwaysCook) PrefStr = "always";
else if (pProp->CookPreference() == eNeverCook) PrefStr = "never";
else PrefStr = "none";
pCookPref->SetText(*PrefStr);
pElem->LinkEndChild(pCookPref);
}
// Asset-specific parameters
if (pProp->Type() == eAssetProperty)
{
CAssetTemplate *pAsset = static_cast<CAssetTemplate*>(pProp);
CAssetTemplate *pSourceAsset = static_cast<CAssetTemplate*>(pSource);
if (pAsset->TypeFilter() != pSourceAsset->TypeFilter())
{
TString ExtensionsString = pAsset->TypeFilter().ToString();
if (ExtensionsString.IsEmpty()) ExtensionsString = "UNKN";
pElem->SetAttribute("extensions", *ExtensionsString);
}
}
// Struct/array-specific parameters
else if (pProp->Type() == eStructProperty || pProp->Type() == eArrayProperty)
{
CStructTemplate *pChildStruct = static_cast<CStructTemplate*>(pProp);
CStructTemplate *pSourceStruct = static_cast<CStructTemplate*>(pSource);
SavePropertyOverrides(pDoc, pElem, pChildStruct, pSourceStruct);
}
}
}
}
}
void CTemplateWriter::SaveEnumerators(XMLDocument *pDoc, XMLElement *pParent, CEnumTemplate *pTemp)
{
XMLElement *pEnumerators = pDoc->NewElement("enumerators");
pParent->LinkEndChild(pEnumerators);
for (u32 iEnum = 0; iEnum < pTemp->NumEnumerators(); iEnum++)
{
XMLElement *pElem = pDoc->NewElement("enumerator");
u32 EnumerID = pTemp->EnumeratorID(iEnum);
pElem->SetAttribute("ID", *TString::HexString(EnumerID, (EnumerID > 0xFF ? 8 : 2)));
pElem->SetAttribute("name", *pTemp->EnumeratorName(iEnum));
pEnumerators->LinkEndChild(pElem);
}
}
void CTemplateWriter::SaveBitFlags(XMLDocument *pDoc, XMLElement *pParent, CBitfieldTemplate *pTemp)
{
XMLElement *pFlags = pDoc->NewElement("flags");
pParent->LinkEndChild(pFlags);
for (u32 iFlag = 0; iFlag < pTemp->NumFlags(); iFlag++)
{
XMLElement *pElem = pDoc->NewElement("flag");
pElem->SetAttribute("mask", *TString::HexString(pTemp->FlagMask(iFlag)));
pElem->SetAttribute("name", *pTemp->FlagName(iFlag));
pFlags->LinkEndChild(pElem);
}
}
#endif

View File

@ -1,30 +0,0 @@
#ifndef CTEMPLATEWRITER_H
#define CTEMPLATEWRITER_H
#include "Core/Resource/Script/CMasterTemplate.h"
#include "Core/Resource/Script/CScriptTemplate.h"
#include <tinyxml2.h>
#if 0
class CTemplateWriter
{
CTemplateWriter();
static TString smTemplatesDir;
public:
static void SavePropertyTemplate(IPropertyTemplate *pTemp);
static void SaveAllTemplates();
static void SaveGameTemplates(CMasterTemplate *pMaster);
static void SavePropertyList();
static void SaveScriptTemplate(CScriptTemplate *pTemp);
static void SaveStructTemplate(CStructTemplate *pTemp);
static void SaveEnumTemplate(CEnumTemplate *pTemp);
static void SaveBitfieldTemplate(CBitfieldTemplate *pTemp);
static void SaveProperties(tinyxml2::XMLDocument *pDoc, tinyxml2::XMLElement *pParent, CStructTemplate *pTemp);
static void SavePropertyOverrides(tinyxml2::XMLDocument *pDoc, tinyxml2::XMLElement *pParent, CStructTemplate *pStruct, CStructTemplate *pOriginal);
static void SaveEnumerators(tinyxml2::XMLDocument *pDoc, tinyxml2::XMLElement *pParent, CEnumTemplate *pTemp);
static void SaveBitFlags(tinyxml2::XMLDocument *pDoc, tinyxml2::XMLElement *pParent, CBitfieldTemplate *pTemp);
};
#endif
#endif // CTEMPLATEWRITER_H

View File

@ -19,49 +19,49 @@ CScriptLoader::CScriptLoader()
{ {
} }
void CScriptLoader::ReadProperty(IPropertyNew *pProp, u32 Size, IInputStream& rSCLY) void CScriptLoader::ReadProperty(IProperty *pProp, u32 Size, IInputStream& rSCLY)
{ {
void* pData = (mpArrayItemData ? mpArrayItemData : mpObj->mPropertyData.data()); void* pData = (mpArrayItemData ? mpArrayItemData : mpObj->mPropertyData.data());
switch (pProp->Type()) switch (pProp->Type())
{ {
case EPropertyTypeNew::Bool: case EPropertyType::Bool:
{ {
CBoolProperty* pBool = TPropCast<CBoolProperty>(pProp); CBoolProperty* pBool = TPropCast<CBoolProperty>(pProp);
pBool->ValueRef(pData) = rSCLY.ReadBool(); pBool->ValueRef(pData) = rSCLY.ReadBool();
break; break;
} }
case EPropertyTypeNew::Byte: case EPropertyType::Byte:
{ {
CByteProperty* pByte = TPropCast<CByteProperty>(pProp); CByteProperty* pByte = TPropCast<CByteProperty>(pProp);
pByte->ValueRef(pData) = rSCLY.ReadByte(); pByte->ValueRef(pData) = rSCLY.ReadByte();
break; break;
} }
case EPropertyTypeNew::Short: case EPropertyType::Short:
{ {
CShortProperty* pShort = TPropCast<CShortProperty>(pProp); CShortProperty* pShort = TPropCast<CShortProperty>(pProp);
pShort->ValueRef(pData) = rSCLY.ReadShort(); pShort->ValueRef(pData) = rSCLY.ReadShort();
break; break;
} }
case EPropertyTypeNew::Int: case EPropertyType::Int:
{ {
CIntProperty* pInt = TPropCast<CIntProperty>(pProp); CIntProperty* pInt = TPropCast<CIntProperty>(pProp);
pInt->ValueRef(pData) = rSCLY.ReadLong(); pInt->ValueRef(pData) = rSCLY.ReadLong();
break; break;
} }
case EPropertyTypeNew::Float: case EPropertyType::Float:
{ {
CFloatProperty* pFloat = TPropCast<CFloatProperty>(pProp); CFloatProperty* pFloat = TPropCast<CFloatProperty>(pProp);
pFloat->ValueRef(pData) = rSCLY.ReadFloat(); pFloat->ValueRef(pData) = rSCLY.ReadFloat();
break; break;
} }
case EPropertyTypeNew::Choice: case EPropertyType::Choice:
{ {
CChoiceProperty* pChoice = TPropCast<CChoiceProperty>(pProp); CChoiceProperty* pChoice = TPropCast<CChoiceProperty>(pProp);
pChoice->ValueRef(pData) = rSCLY.ReadLong(); pChoice->ValueRef(pData) = rSCLY.ReadLong();
@ -76,7 +76,7 @@ void CScriptLoader::ReadProperty(IPropertyNew *pProp, u32 Size, IInputStream& rS
break; break;
} }
case EPropertyTypeNew::Enum: case EPropertyType::Enum:
{ {
CEnumProperty* pEnum = TPropCast<CEnumProperty>(pProp); CEnumProperty* pEnum = TPropCast<CEnumProperty>(pProp);
pEnum->ValueRef(pData) = rSCLY.ReadLong(); pEnum->ValueRef(pData) = rSCLY.ReadLong();
@ -91,7 +91,7 @@ void CScriptLoader::ReadProperty(IPropertyNew *pProp, u32 Size, IInputStream& rS
break; break;
} }
case EPropertyTypeNew::Flags: case EPropertyType::Flags:
{ {
CFlagsProperty* pFlags = TPropCast<CFlagsProperty>(pProp); CFlagsProperty* pFlags = TPropCast<CFlagsProperty>(pProp);
pFlags->ValueRef(pData) = rSCLY.ReadLong(); pFlags->ValueRef(pData) = rSCLY.ReadLong();
@ -107,28 +107,28 @@ void CScriptLoader::ReadProperty(IPropertyNew *pProp, u32 Size, IInputStream& rS
break; break;
} }
case EPropertyTypeNew::String: case EPropertyType::String:
{ {
CStringProperty* pString = TPropCast<CStringProperty>(pProp); CStringProperty* pString = TPropCast<CStringProperty>(pProp);
pString->ValueRef(pData) = rSCLY.ReadString(); pString->ValueRef(pData) = rSCLY.ReadString();
break; break;
} }
case EPropertyTypeNew::Vector: case EPropertyType::Vector:
{ {
CVectorProperty* pVector = TPropCast<CVectorProperty>(pProp); CVectorProperty* pVector = TPropCast<CVectorProperty>(pProp);
pVector->ValueRef(pData) = CVector3f(rSCLY); pVector->ValueRef(pData) = CVector3f(rSCLY);
break; break;
} }
case EPropertyTypeNew::Color: case EPropertyType::Color:
{ {
CColorProperty* pColor = TPropCast<CColorProperty>(pProp); CColorProperty* pColor = TPropCast<CColorProperty>(pProp);
pColor->ValueRef(pData) = CColor(rSCLY); pColor->ValueRef(pData) = CColor(rSCLY);
break; break;
} }
case EPropertyTypeNew::Asset: case EPropertyType::Asset:
{ {
CAssetProperty* pAsset = TPropCast<CAssetProperty>(pProp); CAssetProperty* pAsset = TPropCast<CAssetProperty>(pProp);
pAsset->ValueRef(pData) = CAssetID(rSCLY, mpMaster->Game()); pAsset->ValueRef(pData) = CAssetID(rSCLY, mpMaster->Game());
@ -153,34 +153,34 @@ void CScriptLoader::ReadProperty(IPropertyNew *pProp, u32 Size, IInputStream& rS
break; break;
} }
case EPropertyTypeNew::Sound: case EPropertyType::Sound:
{ {
CSoundProperty* pSound = TPropCast<CSoundProperty>(pProp); CSoundProperty* pSound = TPropCast<CSoundProperty>(pProp);
pSound->ValueRef(pData) = rSCLY.ReadLong(); pSound->ValueRef(pData) = rSCLY.ReadLong();
break; break;
} }
case EPropertyTypeNew::Animation: case EPropertyType::Animation:
{ {
CAnimationProperty* pAnim = TPropCast<CAnimationProperty>(pProp); CAnimationProperty* pAnim = TPropCast<CAnimationProperty>(pProp);
pAnim->ValueRef(pData) = rSCLY.ReadLong(); pAnim->ValueRef(pData) = rSCLY.ReadLong();
break; break;
} }
case EPropertyTypeNew::AnimationSet: case EPropertyType::AnimationSet:
{ {
CAnimationSetProperty* pAnimSet = TPropCast<CAnimationSetProperty>(pProp); CAnimationSetProperty* pAnimSet = TPropCast<CAnimationSetProperty>(pProp);
pAnimSet->ValueRef(pData) = CAnimationParameters(rSCLY, mpMaster->Game()); pAnimSet->ValueRef(pData) = CAnimationParameters(rSCLY, mpMaster->Game());
break; break;
} }
case EPropertyTypeNew::Sequence: case EPropertyType::Sequence:
{ {
// TODO // TODO
break; break;
} }
case EPropertyTypeNew::Spline: case EPropertyType::Spline:
{ {
CSplineProperty* pSpline = TPropCast<CSplineProperty>(pProp); CSplineProperty* pSpline = TPropCast<CSplineProperty>(pProp);
std::vector<char>& Buffer = pSpline->ValueRef(pData); std::vector<char>& Buffer = pSpline->ValueRef(pData);
@ -189,7 +189,7 @@ void CScriptLoader::ReadProperty(IPropertyNew *pProp, u32 Size, IInputStream& rS
break; break;
} }
case EPropertyTypeNew::Guid: case EPropertyType::Guid:
{ {
ASSERT(Size == 16); ASSERT(Size == 16);
CGuidProperty* pGuid = TPropCast<CGuidProperty>(pProp); CGuidProperty* pGuid = TPropCast<CGuidProperty>(pProp);
@ -198,9 +198,9 @@ void CScriptLoader::ReadProperty(IPropertyNew *pProp, u32 Size, IInputStream& rS
break; break;
} }
case EPropertyTypeNew::Struct: case EPropertyType::Struct:
{ {
CStructPropertyNew* pStruct = TPropCast<CStructPropertyNew>(pProp); CStructProperty* pStruct = TPropCast<CStructProperty>(pProp);
if (mVersion < eEchoesDemo) if (mVersion < eEchoesDemo)
LoadStructMP1(rSCLY, pStruct); LoadStructMP1(rSCLY, pStruct);
@ -209,7 +209,7 @@ void CScriptLoader::ReadProperty(IPropertyNew *pProp, u32 Size, IInputStream& rS
break; break;
} }
case EPropertyTypeNew::Array: case EPropertyType::Array:
{ {
CArrayProperty *pArray = TPropCast<CArrayProperty>(pProp); CArrayProperty *pArray = TPropCast<CArrayProperty>(pProp);
int Count = rSCLY.ReadLong(); int Count = rSCLY.ReadLong();
@ -246,7 +246,7 @@ void CScriptLoader::ReadProperty(IPropertyNew *pProp, u32 Size, IInputStream& rS
} }
} }
void CScriptLoader::LoadStructMP1(IInputStream& rSCLY, CStructPropertyNew* pStruct) void CScriptLoader::LoadStructMP1(IInputStream& rSCLY, CStructProperty* pStruct)
{ {
u32 StructStart = rSCLY.Tell(); u32 StructStart = rSCLY.Tell();
@ -263,10 +263,10 @@ void CScriptLoader::LoadStructMP1(IInputStream& rSCLY, CStructPropertyNew* pStru
// Parse properties // Parse properties
for (u32 ChildIndex = 0; ChildIndex < PropertyCount; ChildIndex++) for (u32 ChildIndex = 0; ChildIndex < PropertyCount; ChildIndex++)
{ {
IPropertyNew *pProperty = pStruct->ChildByIndex(ChildIndex); IProperty *pProperty = pStruct->ChildByIndex(ChildIndex);
//@todo version check //@todo version check
if (pProperty->CookPreference() != ECookPreferenceNew::Never) if (pProperty->CookPreference() != ECookPreference::Never)
ReadProperty(pProperty, 0, rSCLY); ReadProperty(pProperty, 0, rSCLY);
} }
} }
@ -306,7 +306,7 @@ CScriptObject* CScriptLoader::LoadObjectMP1(IInputStream& rSCLY)
} }
// Load object... // Load object...
CStructPropertyNew* pProperties = pTemplate->Properties(); CStructProperty* pProperties = pTemplate->Properties();
LoadStructMP1(rSCLY, pProperties); LoadStructMP1(rSCLY, pProperties);
// Cleanup and return // Cleanup and return
@ -339,7 +339,7 @@ CScriptLayer* CScriptLoader::LoadLayerMP1(IInputStream& rSCLY)
return mpLayer; return mpLayer;
} }
void CScriptLoader::LoadStructMP2(IInputStream& rSCLY, CStructPropertyNew* pStruct) void CScriptLoader::LoadStructMP2(IInputStream& rSCLY, CStructProperty* pStruct)
{ {
// Verify property count // Verify property count
u32 ChildCount = pStruct->NumChildren(); u32 ChildCount = pStruct->NumChildren();
@ -350,7 +350,7 @@ void CScriptLoader::LoadStructMP2(IInputStream& rSCLY, CStructPropertyNew* pStru
// Parse properties // Parse properties
for (u32 ChildIdx = 0; ChildIdx < ChildCount; ChildIdx++) for (u32 ChildIdx = 0; ChildIdx < ChildCount; ChildIdx++)
{ {
IPropertyNew* pProperty = nullptr; IProperty* pProperty = nullptr;
u32 PropertyStart = rSCLY.Tell(); u32 PropertyStart = rSCLY.Tell();
u32 PropertyID = -1; u32 PropertyID = -1;
u16 PropertySize = 0; u16 PropertySize = 0;

View File

@ -19,13 +19,13 @@ class CScriptLoader
void* mpArrayItemData; void* mpArrayItemData;
CScriptLoader(); CScriptLoader();
void ReadProperty(IPropertyNew* pProp, u32 Size, IInputStream& rSCLY); void ReadProperty(IProperty* pProp, u32 Size, IInputStream& rSCLY);
void LoadStructMP1(IInputStream& rSCLY, CStructPropertyNew* pStruct); void LoadStructMP1(IInputStream& rSCLY, CStructProperty* pStruct);
CScriptObject* LoadObjectMP1(IInputStream& rSCLY); CScriptObject* LoadObjectMP1(IInputStream& rSCLY);
CScriptLayer* LoadLayerMP1(IInputStream& rSCLY); CScriptLayer* LoadLayerMP1(IInputStream& rSCLY);
void LoadStructMP2(IInputStream& rSCLY, CStructPropertyNew* pStruct); void LoadStructMP2(IInputStream& rSCLY, CStructProperty* pStruct);
CScriptObject* LoadObjectMP2(IInputStream& rSCLY); CScriptObject* LoadObjectMP2(IInputStream& rSCLY);
CScriptLayer* LoadLayerMP2(IInputStream& rSCLY); CScriptLayer* LoadLayerMP2(IInputStream& rSCLY);

View File

@ -1,6 +1,5 @@
#include "CTemplateLoader.h" #include "CTemplateLoader.h"
#include "CAreaLoader.h" #include "CAreaLoader.h"
#include "Core/Resource/Script/IPropertyTemplate.h"
#include "Core/Resource/Script/Property/Properties.h" #include "Core/Resource/Script/Property/Properties.h"
#include <Common/FileUtil.h> #include <Common/FileUtil.h>
#include <Common/Log.h> #include <Common/Log.h>
@ -108,6 +107,28 @@ using namespace tinyxml2;
break;\ break;\
}\ }\
EPropertyTypeNew PropStringToPropEnum(TString Prop)
{
Prop = Prop.ToLower();
if (Prop == "bool") return EPropertyTypeNew::Bool;
if (Prop == "byte") return EPropertyTypeNew::Byte;
if (Prop == "short") return EPropertyTypeNew::Short;
if (Prop == "long") return EPropertyTypeNew::Int;
if (Prop == "enum") return EPropertyTypeNew::Enum;
if (Prop == "bitfield") return EPropertyTypeNew::Flags;
if (Prop == "float") return EPropertyTypeNew::Float;
if (Prop == "string") return EPropertyTypeNew::String;
if (Prop == "color") return EPropertyTypeNew::Color;
if (Prop == "vector3f") return EPropertyTypeNew::Vector;
if (Prop == "sound") return EPropertyTypeNew::Sound;
if (Prop == "asset") return EPropertyTypeNew::Asset;
if (Prop == "struct") return EPropertyTypeNew::Struct;
if (Prop == "array") return EPropertyTypeNew::Array;
if (Prop == "character") return EPropertyTypeNew::AnimationSet;
if (Prop == "mayaspline") return EPropertyTypeNew::Spline;
return EPropertyTypeNew::Invalid;
}
IPropertyNew* CTemplateLoader::LoadProperty(XMLElement* pElem, CScriptTemplate* pScript, CStructPropertyNew* pParent, const TString& rkTemplateName) IPropertyNew* CTemplateLoader::LoadProperty(XMLElement* pElem, CScriptTemplate* pScript, CStructPropertyNew* pParent, const TString& rkTemplateName)
{ {
TString NodeType = TString(pElem->Name()).ToLower(); TString NodeType = TString(pElem->Name()).ToLower();

View File

@ -3,7 +3,7 @@
#include "Core/Resource/Script/CMasterTemplate.h" #include "Core/Resource/Script/CMasterTemplate.h"
#include "Core/Resource/Script/CScriptTemplate.h" #include "Core/Resource/Script/CScriptTemplate.h"
#include "Core/Resource/Script/IPropertyNew.h" #include "Core/Resource/Script/Property/IProperty.h"
#include "Core/Resource/Script/Property/CEnumProperty.h" #include "Core/Resource/Script/Property/CEnumProperty.h"
#include "Core/Resource/Script/Property/CFlagsProperty.h" #include "Core/Resource/Script/Property/CFlagsProperty.h"
#include <tinyxml2.h> #include <tinyxml2.h>

View File

@ -150,7 +150,7 @@ SMessage CMasterTemplate::MessageByIndex(u32 Index)
return SMessage(Iter->first, Iter->second); return SMessage(Iter->first, Iter->second);
} }
IPropertyNew* CMasterTemplate::FindPropertyArchetype(const TString& kTypeName) IProperty* CMasterTemplate::FindPropertyArchetype(const TString& kTypeName)
{ {
auto Iter = mPropertyTemplates.find(kTypeName); auto Iter = mPropertyTemplates.find(kTypeName);
@ -232,7 +232,7 @@ TString CMasterTemplate::PropertyName(u32 PropertyID)
} }
// Removing these functions for now. I'm not sure of the best way to go about implementing them under the new system yet. // Removing these functions for now. I'm not sure of the best way to go about implementing them under the new system yet.
u32 CMasterTemplate::CreatePropertyID(IPropertyNew* pProp) u32 CMasterTemplate::CreatePropertyID(IProperty* pProp)
{ {
// MP1 properties don't have IDs so we can use this function to create one to track instances of a particular property. // MP1 properties don't have IDs so we can use this function to create one to track instances of a particular property.
// To ensure the IDs are unique we'll create a hash using two things: the struct source file and the ID string (relative to the struct). // To ensure the IDs are unique we'll create a hash using two things: the struct source file and the ID string (relative to the struct).
@ -250,7 +250,7 @@ u32 CMasterTemplate::CreatePropertyID(IPropertyNew* pProp)
return Hash.Digest(); return Hash.Digest();
} }
void CMasterTemplate::AddProperty(IPropertyNew* pProp, const TString& rkTemplateName /*= ""*/) void CMasterTemplate::AddProperty(IProperty* pProp, const TString& rkTemplateName /*= ""*/)
{ {
u32 ID; u32 ID;
@ -261,11 +261,11 @@ void CMasterTemplate::AddProperty(IPropertyNew* pProp, const TString& rkTemplate
else else
{ {
// For MP1 we only really need to track properties that come from struct templates. // For MP1 we only really need to track properties that come from struct templates.
IPropertyNew* pArchetype = pProp->Archetype(); IProperty* pArchetype = pProp->Archetype();
if (!pArchetype || if (!pArchetype ||
pArchetype->ScriptTemplate() != nullptr || pArchetype->ScriptTemplate() != nullptr ||
pArchetype->RootParent()->Type() != EPropertyTypeNew::Struct) pArchetype->RootParent()->Type() != EPropertyType::Struct)
return; return;
ID = CreatePropertyID(pProp); ID = CreatePropertyID(pProp);
@ -307,7 +307,7 @@ void CMasterTemplate::AddProperty(IPropertyNew* pProp, const TString& rkTemplate
} }
} }
void CMasterTemplate::RenameProperty(IPropertyNew* pProp, const TString& rkNewName) void CMasterTemplate::RenameProperty(IProperty* pProp, const TString& rkNewName)
{ {
u32 ID = pProp->ID(); u32 ID = pProp->ID();
if (ID <= 0xFF) ID = CreatePropertyID(pProp); if (ID <= 0xFF) ID = CreatePropertyID(pProp);
@ -352,7 +352,7 @@ void CMasterTemplate::XMLsUsingID(u32 ID, std::vector<TString>& rOutList)
} }
} }
const std::vector<IPropertyNew*>* CMasterTemplate::TemplatesWithMatchingID(IPropertyNew* pProp) const std::vector<IProperty*>* CMasterTemplate::TemplatesWithMatchingID(IProperty* pProp)
{ {
u32 ID = pProp->ID(); u32 ID = pProp->ID();
if (ID <= 0xFF) ID = CreatePropertyID(pProp); if (ID <= 0xFF) ID = CreatePropertyID(pProp);

View File

@ -84,15 +84,15 @@ class CMasterTemplate
TString Path; TString Path;
/** Template in memory */ /** Template in memory */
std::shared_ptr<IPropertyNew> pTemplate; std::shared_ptr<IProperty> pTemplate;
/** Constructor */ /** Constructor */
SPropertyTemplatePath() SPropertyTemplatePath()
{} {}
SPropertyTemplatePath(const TString& kInPath, IPropertyNew* pInTemplate) SPropertyTemplatePath(const TString& kInPath, IProperty* pInTemplate)
: Path(kInPath) : Path(kInPath)
, pTemplate( std::shared_ptr<IPropertyNew>(pInTemplate) ) , pTemplate( std::shared_ptr<IProperty>(pInTemplate) )
{} {}
/** Serializer */ /** Serializer */
@ -117,7 +117,7 @@ class CMasterTemplate
struct SPropIDInfo struct SPropIDInfo
{ {
std::vector<TString> XMLList; // List of script/struct templates that use this ID std::vector<TString> XMLList; // List of script/struct templates that use this ID
std::vector<IPropertyNew*> PropertyList; // List of all properties that use this ID std::vector<IProperty*> PropertyList; // List of all properties that use this ID
}; };
static std::map<u32, SPropIDInfo> smIDMap; static std::map<u32, SPropIDInfo> smIDMap;
static std::map<EGame, CMasterTemplate*> smMasterMap; static std::map<EGame, CMasterTemplate*> smMasterMap;
@ -142,7 +142,7 @@ public:
SMessage MessageByID(u32 MessageID); SMessage MessageByID(u32 MessageID);
SMessage MessageByID(const CFourCC& MessageID); SMessage MessageByID(const CFourCC& MessageID);
SMessage MessageByIndex(u32 Index); SMessage MessageByIndex(u32 Index);
IPropertyNew* FindPropertyArchetype(const TString& kTypeName); IProperty* FindPropertyArchetype(const TString& kTypeName);
TString GetGameDirectory(bool Absolute = false) const; TString GetGameDirectory(bool Absolute = false) const;
// Inline Accessors // Inline Accessors
@ -159,12 +159,12 @@ public:
static TString FindGameName(EGame Game); static TString FindGameName(EGame Game);
static EGame FindGameForName(const TString& rkName); static EGame FindGameForName(const TString& rkName);
static TString PropertyName(u32 PropertyID); static TString PropertyName(u32 PropertyID);
static u32 CreatePropertyID(IPropertyNew *pTemp); static u32 CreatePropertyID(IProperty *pTemp);
static void AddProperty(IPropertyNew *pTemp, const TString& rkTemplateName = ""); static void AddProperty(IProperty *pTemp, const TString& rkTemplateName = "");
static void RenameProperty(IPropertyNew *pTemp, const TString& rkNewName); static void RenameProperty(IProperty *pTemp, const TString& rkNewName);
static void RenameProperty(u32 ID, const TString& rkNewName); static void RenameProperty(u32 ID, const TString& rkNewName);
static void XMLsUsingID(u32 ID, std::vector<TString>& rOutList); static void XMLsUsingID(u32 ID, std::vector<TString>& rOutList);
static const std::vector<IPropertyNew*>* TemplatesWithMatchingID(IPropertyNew *pTemp); static const std::vector<IProperty*>* TemplatesWithMatchingID(IProperty *pTemp);
}; };
#endif // CMASTERTEMPLATE_H #endif // CMASTERTEMPLATE_H

View File

@ -15,7 +15,7 @@ CScriptObject::CScriptObject(u32 InstanceID, CGameArea *pArea, CScriptLayer *pLa
mpTemplate->AddObject(this); mpTemplate->AddObject(this);
// Init properties // Init properties
CStructPropertyNew* pProperties = pTemplate->Properties(); CStructProperty* pProperties = pTemplate->Properties();
u32 PropertiesSize = pProperties->DataSize(); u32 PropertiesSize = pProperties->DataSize();
mPropertyData.resize( PropertiesSize ); mPropertyData.resize( PropertiesSize );
@ -82,7 +82,7 @@ void CScriptObject::EvaluateVolume()
mVolumeScale = mpTemplate->VolumeScale(this); mVolumeScale = mpTemplate->VolumeScale(this);
} }
bool CScriptObject::IsEditorProperty(IPropertyNew *pProp) bool CScriptObject::IsEditorProperty(IProperty *pProp)
{ {
return ( (pProp == mInstanceName.Property()) || return ( (pProp == mInstanceName.Property()) ||
(pProp == mPosition.Property()) || (pProp == mPosition.Property()) ||

View File

@ -59,7 +59,7 @@ public:
void EvaluateDisplayAsset(); void EvaluateDisplayAsset();
void EvaluateCollisionModel(); void EvaluateCollisionModel();
void EvaluateVolume(); void EvaluateVolume();
bool IsEditorProperty(IPropertyNew *pProp); bool IsEditorProperty(IProperty *pProp);
void SetLayer(CScriptLayer *pLayer, u32 NewLayerIndex = -1); void SetLayer(CScriptLayer *pLayer, u32 NewLayerIndex = -1);
u32 LayerIndex() const; u32 LayerIndex() const;
bool HasNearVisibleActivation() const; bool HasNearVisibleActivation() const;

View File

@ -86,7 +86,7 @@ void CScriptTemplate::PostLoad()
if (!mRotationIDString.IsEmpty()) mpRotationProperty = TPropCast<CVectorProperty>( mpProperties->ChildByIDString(mRotationIDString) ); if (!mRotationIDString.IsEmpty()) mpRotationProperty = TPropCast<CVectorProperty>( mpProperties->ChildByIDString(mRotationIDString) );
if (!mScaleIDString.IsEmpty()) mpScaleProperty = TPropCast<CVectorProperty>( mpProperties->ChildByIDString(mScaleIDString) ); if (!mScaleIDString.IsEmpty()) mpScaleProperty = TPropCast<CVectorProperty>( mpProperties->ChildByIDString(mScaleIDString) );
if (!mActiveIDString.IsEmpty()) mpActiveProperty = TPropCast<CBoolProperty>( mpProperties->ChildByIDString(mActiveIDString) ); if (!mActiveIDString.IsEmpty()) mpActiveProperty = TPropCast<CBoolProperty>( mpProperties->ChildByIDString(mActiveIDString) );
if (!mLightParametersIDString.IsEmpty()) mpLightParametersProperty = TPropCast<CStructPropertyNew>( mpProperties->ChildByIDString(mLightParametersIDString) ); if (!mLightParametersIDString.IsEmpty()) mpLightParametersProperty = TPropCast<CStructProperty>( mpProperties->ChildByIDString(mLightParametersIDString) );
} }
EGame CScriptTemplate::Game() const EGame CScriptTemplate::Game() const
@ -96,10 +96,10 @@ EGame CScriptTemplate::Game() const
// ************ PROPERTY FETCHING ************ // ************ PROPERTY FETCHING ************
template<class PropType> template<class PropType>
PropType* TFetchProperty(CStructPropertyNew* pProperties, const TIDString& rkID) PropType* TFetchProperty(CStructProperty* pProperties, const TIDString& rkID)
{ {
if (rkID.IsEmpty()) return nullptr; if (rkID.IsEmpty()) return nullptr;
IPropertyNew *pProp = pProperties->ChildByIDString(rkID); IProperty *pProp = pProperties->ChildByIDString(rkID);
if (pProp && (pProp->Type() == PropEnum)) if (pProp && (pProp->Type() == PropEnum))
return static_cast<PropType*>(pProp)->ValuePtr(); return static_cast<PropType*>(pProp)->ValuePtr();
@ -147,7 +147,7 @@ s32 CScriptTemplate::CheckVolumeConditions(CScriptObject *pObj, bool LogErrors)
if (mVolumeShape == eConditionalShape) if (mVolumeShape == eConditionalShape)
{ {
TIDString PropID = mVolumeConditionIDString; TIDString PropID = mVolumeConditionIDString;
IPropertyNew* pProp = pObj->Template()->Properties()->ChildByIDString( PropID ); IProperty* pProp = pObj->Template()->Properties()->ChildByIDString( PropID );
// Get value of the condition test property (only boolean, integral, and enum types supported) // Get value of the condition test property (only boolean, integral, and enum types supported)
void* pData = pObj->PropertyData(); void* pData = pObj->PropertyData();
@ -155,24 +155,24 @@ s32 CScriptTemplate::CheckVolumeConditions(CScriptObject *pObj, bool LogErrors)
switch (pProp->Type()) switch (pProp->Type())
{ {
case EPropertyTypeNew::Bool: case EPropertyType::Bool:
Val = TPropCast<CBoolProperty>(pProp)->Value(pData) ? 1 : 0; Val = TPropCast<CBoolProperty>(pProp)->Value(pData) ? 1 : 0;
break; break;
case EPropertyTypeNew::Byte: case EPropertyType::Byte:
Val = (int) TPropCast<CByteProperty>(pProp)->Value(pData); Val = (int) TPropCast<CByteProperty>(pProp)->Value(pData);
break; break;
case EPropertyTypeNew::Short: case EPropertyType::Short:
Val = (int) TPropCast<CShortProperty>(pProp)->Value(pData); Val = (int) TPropCast<CShortProperty>(pProp)->Value(pData);
break; break;
case EPropertyTypeNew::Int: case EPropertyType::Int:
Val = TPropCast<CIntProperty>(pProp)->Value(pData); Val = TPropCast<CIntProperty>(pProp)->Value(pData);
break; break;
case EPropertyTypeNew::Enum: case EPropertyType::Enum:
case EPropertyTypeNew::Choice: case EPropertyType::Choice:
Val = TPropCast<CEnumProperty>(pProp)->Value(pData); Val = TPropCast<CEnumProperty>(pProp)->Value(pData);
break; break;
} }
@ -209,9 +209,9 @@ CResource* CScriptTemplate::FindDisplayAsset(void* pPropertyData, u32& rOutCharI
// Property // Property
else else
{ {
IPropertyNew* pProp = mpProperties->ChildByIDString(it->AssetLocation); IProperty* pProp = mpProperties->ChildByIDString(it->AssetLocation);
if (it->AssetType == SEditorAsset::eAnimParams && pProp->Type() == EPropertyTypeNew::AnimationSet) if (it->AssetType == SEditorAsset::eAnimParams && pProp->Type() == EPropertyType::AnimationSet)
{ {
CAnimationSetProperty* pAnimSet = TPropCast<CAnimationSetProperty>(pProp); CAnimationSetProperty* pAnimSet = TPropCast<CAnimationSetProperty>(pProp);
CAnimationParameters Params = pAnimSet->Value(pPropertyData); CAnimationParameters Params = pAnimSet->Value(pPropertyData);
@ -227,7 +227,7 @@ CResource* CScriptTemplate::FindDisplayAsset(void* pPropertyData, u32& rOutCharI
else else
{ {
ASSERT(pProp->Type() == EPropertyTypeNew::Asset); ASSERT(pProp->Type() == EPropertyType::Asset);
CAssetProperty* pAsset = TPropCast<CAssetProperty>(pProp); CAssetProperty* pAsset = TPropCast<CAssetProperty>(pProp);
CAssetID ID = pAsset->Value(pPropertyData); CAssetID ID = pAsset->Value(pPropertyData);
CResourceEntry *pEntry = gpResourceStore->FindEntry( ID ); CResourceEntry *pEntry = gpResourceStore->FindEntry( ID );
@ -261,9 +261,9 @@ CCollisionMeshGroup* CScriptTemplate::FindCollision(void* pPropertyData)
// Property // Property
else else
{ {
IPropertyNew* pProp = mpProperties->ChildByIDString(it->AssetLocation); IProperty* pProp = mpProperties->ChildByIDString(it->AssetLocation);
if (pProp->Type() == EPropertyTypeNew::Asset) if (pProp->Type() == EPropertyType::Asset)
{ {
CAssetProperty* pAsset = TPropCast<CAssetProperty>(pProp); CAssetProperty* pAsset = TPropCast<CAssetProperty>(pProp);
pRes = gpResourceStore->LoadResource( pAsset->Value(pPropertyData), eDynamicCollision ); pRes = gpResourceStore->LoadResource( pAsset->Value(pPropertyData), eDynamicCollision );

View File

@ -2,7 +2,6 @@
#define CSCRIPTTEMPLATE_H #define CSCRIPTTEMPLATE_H
#include "Core/Resource/Script/Property/Properties.h" #include "Core/Resource/Script/Property/Properties.h"
#include "EPropertyType.h"
#include "EVolumeShape.h" #include "EVolumeShape.h"
#include "Core/Resource/Model/CModel.h" #include "Core/Resource/Model/CModel.h"
#include "Core/Resource/CCollisionMeshGroup.h" #include "Core/Resource/CCollisionMeshGroup.h"

View File

@ -1,38 +0,0 @@
#ifndef EPROPERTYTYPE
#define EPROPERTYTYPE
#include "IPropertyNew.h"
#if 0
#include <Common/TString.h>
enum EPropertyType
{
eBoolProperty,
eByteProperty,
eShortProperty,
eLongProperty,
eEnumProperty,
eBitfieldProperty,
eFloatProperty,
eStringProperty,
eVector3Property,
eColorProperty,
eSoundProperty,
eAssetProperty,
eStructProperty,
eArrayProperty,
eCharacterProperty,
eMayaSplineProperty,
eUnknownProperty,
eInvalidProperty
};
#endif
// functions defined in IPropertyTemplate.cpp
EPropertyTypeNew PropStringToPropEnum(TString Prop);
TString PropEnumToPropString(EPropertyTypeNew Prop);
const char* HashablePropTypeName(EPropertyTypeNew Prop);
#endif // EPROPERTYTYPE

View File

@ -1,245 +0,0 @@
#include "IProperty.h"
#include "IPropertyTemplate.h"
#if 0
// ************ IProperty ************
bool IProperty::IsInArray() const
{
CPropertyStruct *pParent = mpParent;
while (pParent)
{
if (pParent->Type() == eArrayProperty) return true;
pParent = pParent->Parent();
}
return false;
}
CPropertyStruct* IProperty::RootStruct()
{
return (mpParent ? mpParent->RootStruct() : Type() == eStructProperty ? static_cast<CPropertyStruct*>(this) : nullptr);
}
IPropertyTemplate* IProperty::Template() const
{
return mpTemplate;
}
TString IProperty::Name() const
{
return mpTemplate->Name();
}
u32 IProperty::ID() const
{
if (mpParent && mpParent->Type() == eArrayProperty)
return ArrayIndex();
else
return mpTemplate->PropertyID();
}
TIDString IProperty::IDString(bool FullPath) const
{
TIDString Out;
if (ID() != 0xFFFFFFFF)
{
if (mpParent && FullPath)
{
Out = mpParent->IDString(true);
if (!Out.IsEmpty()) Out += ":";
}
Out += TString::HexString(ID());
}
return Out;
}
u32 IProperty::ArrayIndex() const
{
CArrayProperty *pArray = TPropCast<CArrayProperty>(mpParent);
if (pArray)
{
for (u32 iSub = 0; iSub < pArray->Count(); iSub++)
{
if (pArray->PropertyByIndex(iSub) == this)
return iSub;
}
}
return -1;
}
bool IProperty::ShouldCook()
{
if (mpTemplate->CookPreference() == eNeverCook) return false;
else if (mpTemplate->CookPreference() == eAlwaysCook) return true;
else
{
if (mpTemplate->Game() == eReturns)
return !MatchesDefault();
else
return true;
}
}
bool IProperty::MatchesDefault()
{
const IPropertyValue *pkValue = RawValue();
const IPropertyValue *pkDefault = mpTemplate->RawDefaultValue();
if (!pkValue || !pkDefault) return false;
else return pkValue->Matches(pkDefault);
}
// ************ TAssetProperty ************
TAssetProperty::TAssetProperty(IPropertyTemplate *pTemp, CScriptObject *pInstance, CPropertyStruct *pParent)
: TTypedProperty(pTemp, pInstance, pParent, CAssetID::InvalidID( pTemp->Game() ))
{
}
// ************ CPropertyStruct ************
void CPropertyStruct::Copy(const IProperty *pkProp)
{
const CPropertyStruct *pkSource = static_cast<const CPropertyStruct*>(pkProp);
for (u32 iSub = 0; iSub < mProperties.size(); iSub++)
mProperties[iSub]->Copy(pkSource->mProperties[iSub]);
}
bool CPropertyStruct::ShouldCook()
{
if (mpTemplate->CookPreference() == eNeverCook) return false;
for (u32 iProp = 0; iProp < mProperties.size(); iProp++)
{
if (mProperties[iProp]->ShouldCook())
return true;
}
return false;
}
IProperty* CPropertyStruct::PropertyByIndex(u32 index) const
{
return mProperties[index];
}
IProperty* CPropertyStruct::PropertyByID(u32 ID) const
{
for (auto it = mProperties.begin(); it != mProperties.end(); it++)
{
if ((*it)->ID() == ID)
return *it;
}
return nullptr;
}
IProperty* CPropertyStruct::PropertyByIDString(const TIDString& rkStr) const
{
// Resolve namespace
u32 NSStart = rkStr.IndexOf(":");
// String has namespace; the requested property is within a struct
if (NSStart != -1)
{
TString StrStructID = rkStr.Truncate(NSStart);
if (!StrStructID.IsHexString()) return nullptr;
u32 StructID = StrStructID.ToInt32();
TString PropName = rkStr.ChopFront(NSStart + 1);
CPropertyStruct *pStruct = StructByID(StructID);
if (!pStruct) return nullptr;
else return pStruct->PropertyByIDString(PropName);
}
// No namespace; fetch the property from this struct
else
{
if (rkStr.IsHexString())
return PropertyByID(rkStr.ToInt32());
else
return nullptr;
}
}
CPropertyStruct* CPropertyStruct::StructByIndex(u32 index) const
{
IProperty *pProp = PropertyByIndex(index);
if (pProp->Type() == eStructProperty || pProp->Type() == eArrayProperty)
return static_cast<CPropertyStruct*>(pProp);
else
return nullptr;
}
CPropertyStruct* CPropertyStruct::StructByID(u32 ID) const
{
IProperty *pProp = PropertyByID(ID);
if (pProp->Type() == eStructProperty || pProp->Type() == eArrayProperty)
return static_cast<CPropertyStruct*>(pProp);
else
return nullptr;
}
CPropertyStruct* CPropertyStruct::StructByIDString(const TIDString& rkStr) const
{
IProperty *pProp = PropertyByIDString(rkStr);
if (pProp->Type() == eStructProperty || pProp->Type() == eArrayProperty)
return static_cast<CPropertyStruct*>(pProp);
else
return nullptr;
}
// ************ CArrayProperty ************
void CArrayProperty::Copy(const IProperty *pkProp)
{
const CArrayProperty *pkSource = static_cast<const CArrayProperty*>(pkProp);
Resize(pkSource->Count());
for (u32 iSub = 0; iSub < mProperties.size(); iSub++)
mProperties[iSub]->Copy(pkSource->mProperties[iSub]);
}
bool CArrayProperty::ShouldCook()
{
return (mpTemplate->CookPreference() == eNeverCook ? false : true);
}
void CArrayProperty::Resize(int Size)
{
int OldSize = mProperties.size();
if (OldSize == Size) return;
if (Size < OldSize)
{
for (int iProp = mProperties.size() - 1; iProp >= Size; iProp--)
delete mProperties[iProp];
}
mProperties.resize(Size);
if (Size > OldSize)
{
for (int iProp = OldSize; iProp < Size; iProp++)
mProperties[iProp] = static_cast<CArrayTemplate*>(mpTemplate)->CreateSubStruct(Instance(), this);
}
}
CStructTemplate* CArrayProperty::SubStructTemplate() const
{
// CArrayTemplate inherits from CStructTemplate. The template defines the substruct structure.
return static_cast<CStructTemplate*>(Template());
}
TString CArrayProperty::ElementName() const
{
return static_cast<CArrayTemplate*>(Template())->ElementName();
}
#endif

View File

@ -1,303 +0,0 @@
#ifndef IPROPERTY
#define IPROPERTY
#if 0
#include "EPropertyType.h"
#include "IPropertyValue.h"
#include "Core/Resource/CResource.h"
#include "Core/Resource/TResPtr.h"
#include "Core/Resource/Animation/CAnimationParameters.h"
#include <Common/CColor.h>
#include <Common/TString.h>
#include <Math/CVector3f.h>
#include <list>
class CScriptObject;
class CScriptTemplate;
class CStructTemplate;
class IPropertyTemplate;
typedef TString TIDString;
/*
* IProperty is the base class, containing just some virtual function definitions
*/
class IProperty
{
protected:
class CPropertyStruct *mpParent;
CScriptObject *mpInstance;
IPropertyTemplate *mpTemplate;
public:
IProperty(IPropertyTemplate *pTemp, CScriptObject *pInstance, CPropertyStruct *pParent)
: mpParent(pParent)
, mpInstance(pInstance)
, mpTemplate(pTemp)
{
}
virtual ~IProperty() {}
virtual EPropertyType Type() const = 0;
virtual TString ToString() const { return ""; }
virtual IPropertyValue* RawValue() { return nullptr; }
virtual void Copy(const IProperty *pkProp) = 0;
virtual IProperty* Clone(CScriptObject *pInstance, CPropertyStruct *pParent = 0) const = 0;
virtual bool Matches(const IProperty *pkProp) const = 0;
virtual bool ShouldCook(); // Can't be const because it calls MatchesDefault()
virtual bool MatchesDefault(); // Can't be const because RawValue() isn't const
inline CScriptObject* Instance() const { return mpInstance; }
inline CPropertyStruct* Parent() const { return mpParent; }
inline void SetParent(CPropertyStruct *pParent) { mpParent = pParent; }
bool IsInArray() const;
CPropertyStruct* RootStruct();
// These functions can't be in the header to avoid circular includes with IPropertyTemplate.h
IPropertyTemplate* Template() const;
TString Name() const;
u32 ID() const;
TIDString IDString(bool FullPath) const;
u32 ArrayIndex() const;
};
/*
* TTypedProperty is a template subclass for actual properties.
*/
#define IMPLEMENT_PROPERTY_CLONE(ClassName) \
virtual IProperty* Clone(CScriptObject *pInstance, CPropertyStruct *pParent) const \
{ \
if (!pParent) pParent = mpParent; \
ClassName *pOut = new ClassName(mpTemplate, pInstance, pParent); \
pOut->Copy(this); \
return pOut; \
}
template <typename ValueType, EPropertyType TypeEnum, class ValueClass>
class TTypedProperty : public IProperty
{
ValueClass mValue;
public:
TTypedProperty(IPropertyTemplate *pTemp, CScriptObject *pInstance, CPropertyStruct *pParent)
: IProperty(pTemp, pInstance, pParent) {}
TTypedProperty(IPropertyTemplate *pTemp, CScriptObject *pInstance, CPropertyStruct *pParent, ValueType v)
: IProperty(pTemp, pInstance, pParent), mValue(v) {}
~TTypedProperty() {}
virtual EPropertyType Type() const { return TypeEnum; }
static inline EPropertyType StaticType() { return TypeEnum; }
virtual TString ToString() const { return mValue.ToString(); }
virtual IPropertyValue* RawValue() { return &mValue; }
virtual void Copy(const IProperty *pkProp)
{
const TTypedProperty *pkCast = static_cast<const TTypedProperty*>(pkProp);
mValue.Set(pkCast->mValue.Get());
}
IMPLEMENT_PROPERTY_CLONE(TTypedProperty)
virtual bool Matches(const IProperty *pkProp) const
{
const TTypedProperty *pkTyped = static_cast<const TTypedProperty*>(pkProp);
return ( (Type() == pkTyped->Type()) &&
mValue.Matches(&pkTyped->mValue) );
}
inline ValueType Get() const { return mValue.Get(); }
inline void Set(ValueType v) { mValue.Set(v); }
};
typedef TTypedProperty<bool, eBoolProperty, CBoolValue> TBoolProperty;
typedef TTypedProperty<char, eByteProperty, CByteValue> TByteProperty;
typedef TTypedProperty<short, eShortProperty, CShortValue> TShortProperty;
typedef TTypedProperty<long, eLongProperty, CLongValue> TLongProperty;
typedef TTypedProperty<long, eEnumProperty, CLongValue> TEnumProperty;
typedef TTypedProperty<long, eBitfieldProperty, CHexLongValue> TBitfieldProperty;
typedef TTypedProperty<float, eFloatProperty, CFloatValue> TFloatProperty;
typedef TTypedProperty<CVector3f, eVector3Property, CVector3Value> TVector3Property;
typedef TTypedProperty<CColor, eColorProperty, CColorValue> TColorProperty;
typedef TTypedProperty<std::vector<u8>, eUnknownProperty, CUnknownValue> TUnknownProperty;
/*
* TStringProperty, TSoundProperty, TAssetProperty, and TCharacterProperty get little subclasses in order to override some virtual functions.
*/
#define IMPLEMENT_PROPERTY_CTORS(ClassName, ValueType) \
ClassName(IPropertyTemplate *pTemp, CScriptObject *pInstance, CPropertyStruct *pParent) \
: TTypedProperty(pTemp, pInstance, pParent) {} \
\
ClassName(IPropertyTemplate *pTemp, CScriptObject *pInstance, CPropertyStruct *pParent, ValueType v) \
: TTypedProperty(pTemp, pInstance, pParent, v) {}
class TStringProperty : public TTypedProperty<TString, eStringProperty, CStringValue>
{
public:
IMPLEMENT_PROPERTY_CTORS(TStringProperty, TString)
IMPLEMENT_PROPERTY_CLONE(TStringProperty)
virtual bool MatchesDefault() { return Get().IsEmpty(); }
virtual bool ShouldCook() { return true; }
};
class TSoundProperty : public TTypedProperty<u32, eSoundProperty, CSoundValue>
{
public:
IMPLEMENT_PROPERTY_CTORS(TSoundProperty, u32)
IMPLEMENT_PROPERTY_CLONE(TSoundProperty)
virtual bool MatchesDefault() { return Get() == 0xFFFFFFFF; }
};
class TAssetProperty : public TTypedProperty<CAssetID, eAssetProperty, CAssetValue>
{
public:
TAssetProperty(IPropertyTemplate *pTemp, CScriptObject *pInstance, CPropertyStruct *pParent); // Can't be in the header because needs to check the template to set the correct ID length
TAssetProperty(IPropertyTemplate *pTemp, CScriptObject *pInstance, CPropertyStruct *pParent, CAssetID v)
: TTypedProperty(pTemp, pInstance, pParent, v) {}
IMPLEMENT_PROPERTY_CLONE(TAssetProperty)
virtual bool MatchesDefault() { return !Get().IsValid(); }
virtual bool ShouldCook() { return true; }
};
class TCharacterProperty : public TTypedProperty<CAnimationParameters, eCharacterProperty, CCharacterValue>
{
public:
IMPLEMENT_PROPERTY_CTORS(TCharacterProperty, CAnimationParameters)
IMPLEMENT_PROPERTY_CLONE(TCharacterProperty)
virtual bool MatchesDefault() { return Get().AnimSet() == nullptr; }
virtual bool ShouldCook() { return true; }
};
class TMayaSplineProperty : public TTypedProperty<std::vector<u8>, eMayaSplineProperty, CMayaSplineValue>
{
public:
IMPLEMENT_PROPERTY_CTORS(TMayaSplineProperty, std::vector<u8>)
IMPLEMENT_PROPERTY_CLONE(TMayaSplineProperty)
virtual bool MatchesDefault() { return Get().empty(); }
};
/*
* CPropertyStruct is for defining structs of properties.
*/
class CPropertyStruct : public IProperty
{
friend class CScriptLoader;
protected:
std::vector<IProperty*> mProperties;
public:
CPropertyStruct(IPropertyTemplate *pTemp, CScriptObject *pInstance, CPropertyStruct *pParent)
: IProperty(pTemp, pInstance, pParent) {}
~CPropertyStruct()
{
for (auto it = mProperties.begin(); it != mProperties.end(); it++)
delete *it;
}
EPropertyType Type() const { return eStructProperty; }
static inline EPropertyType StaticType() { return eStructProperty; }
virtual void Copy(const IProperty *pkProp);
virtual IProperty* Clone(CScriptObject *pInstance, CPropertyStruct *pParent) const
{
if (!pParent) pParent = mpParent;
CPropertyStruct *pOut = new CPropertyStruct(mpTemplate, pInstance, pParent);
pOut->Copy(this);
return pOut;
}
virtual bool Matches(const IProperty *pkProp) const
{
const CPropertyStruct *pkStruct = static_cast<const CPropertyStruct*>(pkProp);
if ( (Type() == pkStruct->Type()) &&
(mProperties.size() == pkStruct->mProperties.size()) )
{
for (u32 iProp = 0; iProp < mProperties.size(); iProp++)
{
if (!mProperties[iProp]->Matches(pkStruct->mProperties[iProp]))
return false;
}
return true;
}
return false;
}
virtual bool MatchesDefault()
{
for (u32 iProp = 0; iProp < mProperties.size(); iProp++)
{
if (!mProperties[iProp]->MatchesDefault())
return false;
}
return true;
}
virtual bool ShouldCook();
// Inline
inline u32 Count() const { return mProperties.size(); }
inline void AddSubProperty(IProperty *pProp) { mProperties.push_back(pProp); }
inline IProperty* operator[](u32 index) { return mProperties[index]; }
// Functions
IProperty* PropertyByIndex(u32 index) const;
IProperty* PropertyByID(u32 ID) const;
IProperty* PropertyByIDString(const TIDString& rkStr) const;
CPropertyStruct* StructByIndex(u32 index) const;
CPropertyStruct* StructByID(u32 ID) const;
CPropertyStruct* StructByIDString(const TIDString& rkStr) const;
};
/*
* CArrayProperty stores a repeated property struct.
*/
class CArrayProperty : public CPropertyStruct
{
friend class CScriptLoader;
public:
CArrayProperty(IPropertyTemplate *pTemp, CScriptObject *pInstance, CPropertyStruct *pParent)
: CPropertyStruct(pTemp, pInstance, pParent) {}
EPropertyType Type() const { return eArrayProperty; }
static inline EPropertyType StaticType() { return eArrayProperty; }
virtual void Copy(const IProperty *pkProp);
virtual IProperty* Clone(CScriptObject *pInstance, CPropertyStruct *pParent) const
{
if (!pParent) pParent = mpParent;
CArrayProperty *pOut = new CArrayProperty(mpTemplate, pInstance, pParent);
pOut->Copy(this);
return pOut;
}
virtual bool MatchesDefault() { return mProperties.empty(); }
virtual bool ShouldCook();
// Inline
inline void Reserve(u32 amount) { mProperties.reserve(amount); }
// Functions
void Resize(int Size);
CStructTemplate* SubStructTemplate() const;
TString ElementName() const;
};
/*
* Function for casting properties. Returns null if the property is not actually the requested type.
*/
template <class PropertyClass>
PropertyClass* TPropCast(IProperty *pProp)
{
return (pProp && pProp->Type() == PropertyClass::StaticType() ? static_cast<PropertyClass*>(pProp) : nullptr);
}
#endif
#endif // IPROPERTY

View File

@ -1,346 +0,0 @@
#include "IPropertyTemplate.h"
#include "CMasterTemplate.h"
#include <Common/Hash/CCRC32.h>
#include <iostream>
#if 0
// ************ IPropertyTemplate ************
EGame IPropertyTemplate::Game() const
{
return (mpMasterTemplate ? mpMasterTemplate->Game() : eUnknownGame);
}
bool IPropertyTemplate::IsInVersion(u32 Version) const
{
if (mAllowedVersions.empty())
return true;
for (u32 iVer = 0; iVer < mAllowedVersions.size(); iVer++)
if (mAllowedVersions[iVer] == Version)
return true;
return false;
}
TString IPropertyTemplate::FullName() const
{
return mpParent ? mpParent->FullName() + "::" + Name() : Name();
}
TIDString IPropertyTemplate::IDString(bool FullPath) const
{
if (mID != 0xFFFFFFFF)
{
TIDString Out;
if (mpParent && FullPath)
{
Out = mpParent->IDString(true);
if (!Out.IsEmpty()) Out += ":";
}
Out += TIDString::HexString(mID);
return Out;
}
else return "";
}
bool IPropertyTemplate::IsDescendantOf(const CStructTemplate *pStruct) const
{
CStructTemplate *pParent = mpParent;
while (pParent)
{
if (pParent == pStruct) return true;
pParent = pParent->Parent();
}
return false;
}
bool IPropertyTemplate::IsFromStructTemplate() const
{
const CStructTemplate *pParent = Parent();
while (pParent)
{
if (!pParent->SourceFile().IsEmpty()) return true;
pParent = pParent->Parent();
}
return false;
}
bool IPropertyTemplate::IsNameCorrect() const
{
// Check whether the property name is correct... i.e., if we hash it, does it match the property ID?
// Only valid for Prime 2 and up, since Prime 1 doesn't have real property IDs, so we can't validate names
if (Game() >= eEchoesDemo)
{
// Don't hash for single-property structs
if ( (!Parent() || !Parent()->IsSingleProperty()) &&
// Don't hash for the three properties in EditorProperties that have fourCC property IDs
mID != FOURCC('INAM') &&
mID != FOURCC('XFRM') &&
mID != FOURCC('ACTV') )
{
// Only re-hash if we need to. Save the result (output won't change if function is called multiple times)
if (!mHasCachedNameCheck)
{
// The property ID is just a CRC32 of the property name + the type
CCRC32 Hash;
Hash.Hash(*mName);
Hash.Hash(GetTypeNameString());
mCachedNameIsCorrect = Hash.Digest() == mID;
mHasCachedNameCheck = true;
}
return mCachedNameIsCorrect;
}
}
return true;
}
TString IPropertyTemplate::FindStructSource() const
{
const CStructTemplate *pkStruct = mpParent;
while (pkStruct)
{
if (!pkStruct->SourceFile().IsEmpty()) return pkStruct->SourceFile();
pkStruct = pkStruct->Parent();
}
return "";
}
CStructTemplate* IPropertyTemplate::RootStruct()
{
if (mpParent) return mpParent->RootStruct();
else if (Type() == eStructProperty) return static_cast<CStructTemplate*>(this);
else return nullptr;
}
// ************ CStructTemplate ************
void CStructTemplate::CopyStructData(const CStructTemplate *pkStruct)
{
mVersionPropertyCounts = pkStruct->mVersionPropertyCounts;
mIsSingleProperty = pkStruct->mIsSingleProperty;
mSourceFile = pkStruct->mSourceFile;
mTypeName = pkStruct->mTypeName;
mSubProperties.resize(pkStruct->mSubProperties.size());
for (u32 iSub = 0; iSub < pkStruct->mSubProperties.size(); iSub++)
{
mSubProperties[iSub] = pkStruct->mSubProperties[iSub]->Clone(mpScriptTemplate, this);
CMasterTemplate::AddProperty(mSubProperties[iSub]);
}
}
u32 CStructTemplate::PropertyCountForVersion(u32 Version)
{
if (Version == -1) Version = 0;
return mVersionPropertyCounts[Version];
}
u32 CStructTemplate::VersionForPropertyCount(u32 PropCount)
{
for (u32 iVer = 0; iVer < NumVersions(); iVer++)
if (mVersionPropertyCounts[iVer] == PropCount)
return iVer;
return -1;
}
IPropertyTemplate* CStructTemplate::PropertyByIndex(u32 index)
{
if (mSubProperties.size() > index)
return mSubProperties[index];
else
return nullptr;
}
IPropertyTemplate* CStructTemplate::PropertyByID(u32 ID)
{
for (auto it = mSubProperties.begin(); it != mSubProperties.end(); it++)
{
if ((*it)->PropertyID() == ID)
return *it;
}
return nullptr;
}
IPropertyTemplate* CStructTemplate::PropertyByIDString(const TIDString& str)
{
// Resolve namespace
u32 nsStart = str.IndexOf(":");
u32 propStart = nsStart + 1;
// String has namespace; the requested property is within a struct
if (nsStart != -1)
{
TString strStructID = str.SubString(0, nsStart);
if (!strStructID.IsHexString()) return nullptr;
u32 structID = strStructID.ToInt32();
TString propName = str.SubString(propStart, str.Length() - propStart);
CStructTemplate *pStruct = StructByID(structID);
if (!pStruct) return nullptr;
else return pStruct->PropertyByIDString(propName);
}
// No namespace; fetch the property from this struct
else
{
// ID string lookup
if (str.IsHexString())
return PropertyByID(str.ToInt32());
else
return nullptr;
}
}
CStructTemplate* CStructTemplate::StructByIndex(u32 index)
{
IPropertyTemplate *pProp = PropertyByIndex(index);
if (pProp->Type() == eStructProperty)
return static_cast<CStructTemplate*>(pProp);
else
return nullptr;
}
CStructTemplate* CStructTemplate::StructByID(u32 ID)
{
IPropertyTemplate *pProp = PropertyByID(ID);
if (pProp && pProp->Type() == eStructProperty)
return static_cast<CStructTemplate*>(pProp);
else
return nullptr;
}
CStructTemplate* CStructTemplate::StructByIDString(const TString& str)
{
IPropertyTemplate *pProp = PropertyByIDString(str);
if (pProp && pProp->Type() == eStructProperty)
return static_cast<CStructTemplate*>(pProp);
else
return nullptr;
}
bool CStructTemplate::HasProperty(const TIDString& rkIdString)
{
IPropertyTemplate *pProperty = PropertyByIDString(rkIdString);
return (pProperty != nullptr);
}
void CStructTemplate::DetermineVersionPropertyCounts()
{
for (u32 iVer = 0; iVer < mVersionPropertyCounts.size(); iVer++)
{
mVersionPropertyCounts[iVer] = 0;
for (u32 iProp = 0; iProp < mSubProperties.size(); iProp++)
{
if (mSubProperties[iProp]->IsInVersion(iVer) && mSubProperties[iProp]->CookPreference() != eNeverCook)
mVersionPropertyCounts[iVer]++;
}
}
}
#endif
// ************ GLOBAL FUNCTIONS ************
TString PropEnumToPropString(EPropertyTypeNew Prop)
{
switch (Prop)
{
case EPropertyTypeNew::Bool: return "bool";
case EPropertyTypeNew::Byte: return "byte";
case EPropertyTypeNew::Short: return "short";
case EPropertyTypeNew::Int: return "long";
case EPropertyTypeNew::Enum: return "enum";
case EPropertyTypeNew::Flags: return "bitfield";
case EPropertyTypeNew::Float: return "float";
case EPropertyTypeNew::String: return "string";
case EPropertyTypeNew::Color: return "color";
case EPropertyTypeNew::Vector: return "vector3f";
case EPropertyTypeNew::Sound: return "sound";
case EPropertyTypeNew::Asset: return "asset";
case EPropertyTypeNew::Struct: return "struct";
case EPropertyTypeNew::Array: return "array";
case EPropertyTypeNew::AnimationSet: return "character";
case EPropertyTypeNew::Spline: return "MayaSpline";
default:
return "invalid";
}
}
EPropertyTypeNew PropStringToPropEnum(TString Prop)
{
Prop = Prop.ToLower();
if (Prop == "bool") return EPropertyTypeNew::Bool;
if (Prop == "byte") return EPropertyTypeNew::Byte;
if (Prop == "short") return EPropertyTypeNew::Short;
if (Prop == "long") return EPropertyTypeNew::Int;
if (Prop == "enum") return EPropertyTypeNew::Enum;
if (Prop == "bitfield") return EPropertyTypeNew::Flags;
if (Prop == "float") return EPropertyTypeNew::Float;
if (Prop == "string") return EPropertyTypeNew::String;
if (Prop == "color") return EPropertyTypeNew::Color;
if (Prop == "vector3f") return EPropertyTypeNew::Vector;
if (Prop == "sound") return EPropertyTypeNew::Sound;
if (Prop == "asset") return EPropertyTypeNew::Asset;
if (Prop == "struct") return EPropertyTypeNew::Struct;
if (Prop == "array") return EPropertyTypeNew::Array;
if (Prop == "character") return EPropertyTypeNew::AnimationSet;
if (Prop == "mayaspline") return EPropertyTypeNew::Spline;
return EPropertyTypeNew::Invalid;
}
const char* HashablePropTypeName(EPropertyTypeNew Prop)
{
// Variants that match Retro's internal type names for generating property IDs. case sensitive
switch (Prop)
{
case EPropertyTypeNew::Bool: return "bool";
case EPropertyTypeNew::Int: return "int";
case EPropertyTypeNew::Enum: return "enum";
case EPropertyTypeNew::Flags: return "Flags";
case EPropertyTypeNew::Float: return "float";
case EPropertyTypeNew::String: return "string";
case EPropertyTypeNew::Color: return "Color";
case EPropertyTypeNew::Vector: return "Vector";
case EPropertyTypeNew::Sound: return "sound";
case EPropertyTypeNew::Asset: return "asset";
case EPropertyTypeNew::Spline: return "spline";
// All other types are either invalid or need a custom reimplementation because they can return multiple strings (like struct)
default:
ASSERT(false);
return nullptr;
}
}
#if 0
// ************ DEBUG ************
void CStructTemplate::DebugPrintProperties(TString base)
{
base = base + Name() + "::";
for (auto it = mSubProperties.begin(); it != mSubProperties.end(); it++)
{
IPropertyTemplate *tmp = *it;
if (tmp->Type() == eStructProperty)
{
CStructTemplate *tmp2 = static_cast<CStructTemplate*>(tmp);
tmp2->DebugPrintProperties(base);
}
else
Log::Write(base + tmp->Name());
}
}
#endif

View File

@ -1,804 +0,0 @@
#ifndef IPROPERTYTEMPLATE
#define IPROPERTYTEMPLATE
#if 0
#include "EPropertyType.h"
#include "IProperty.h"
#include "IPropertyValue.h"
#include "Core/Resource/CResTypeFilter.h"
#include "Core/Resource/Animation/CAnimationParameters.h"
#include <Common/CColor.h>
#include <Common/TString.h>
#include <Common/types.h>
#include <Math/CVector3f.h>
#include <vector>
typedef TString TIDString;
class CMasterTemplate;
class CStructTemplate;
class IProperty;
enum ECookPreference
{
eNoCookPreference,
eAlwaysCook,
eNeverCook
};
// IPropertyTemplate - Base class. Contains basic info that every property has,
// plus virtual functions for determining more specific property type.
class IPropertyTemplate
{
friend class CTemplateLoader;
friend class CTemplateWriter;
protected:
CStructTemplate *mpParent;
CScriptTemplate *mpScriptTemplate;
CMasterTemplate *mpMasterTemplate;
TString mName;
TString mDescription;
u32 mID;
ECookPreference mCookPreference;
std::vector<u32> mAllowedVersions;
mutable bool mHasCachedNameCheck;
mutable bool mCachedNameIsCorrect;
public:
IPropertyTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: mID(ID)
, mpParent(pParent)
, mpScriptTemplate(pScript)
, mpMasterTemplate(pMaster)
, mName("UNSET PROPERTY NAME")
, mCookPreference(eNoCookPreference)
, mHasCachedNameCheck(false)
, mCachedNameIsCorrect(false)
{
}
IPropertyTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: mID(ID)
, mpParent(pParent)
, mpScriptTemplate(pScript)
, mpMasterTemplate(pMaster)
, mName(rkName)
, mCookPreference(CookPreference)
, mHasCachedNameCheck(false)
, mCachedNameIsCorrect(false)
{
}
virtual EPropertyType Type() const = 0;
virtual bool CanHaveDefault() const = 0;
virtual bool IsNumerical() const = 0;
virtual IProperty* InstantiateProperty(CScriptObject *pInstance, CPropertyStruct *pParent) = 0;
virtual IPropertyTemplate* Clone(CScriptTemplate *pScript, CStructTemplate *pParent = 0) const = 0;
virtual void Copy(const IPropertyTemplate *pkTemp)
{
mName = pkTemp->mName;
mDescription = pkTemp->mDescription;
mID = pkTemp->mID;
mCookPreference = pkTemp->mCookPreference;
mAllowedVersions = pkTemp->mAllowedVersions;
}
virtual bool Matches(const IPropertyTemplate *pkTemp) const
{
return ( (pkTemp != nullptr) &&
(mName == pkTemp->mName) &&
(mDescription == pkTemp->mDescription) &&
(mID == pkTemp->mID) &&
(mCookPreference == pkTemp->mCookPreference) &&
(mAllowedVersions == pkTemp->mAllowedVersions) &&
(Type() == pkTemp->Type()) );
}
virtual TString DefaultToString() const { return ""; }
virtual const IPropertyValue* RawDefaultValue() const { return nullptr; }
virtual bool HasValidRange() const { return false; }
virtual TString RangeToString() const { return ""; }
virtual TString Suffix() const { return ""; }
virtual const char* GetTypeNameString() const { return HashablePropTypeName(Type()); }
virtual void SetParam(const TString& rkParamName, const TString& rkValue)
{
if (rkParamName == "cook_pref")
{
TString lValue = rkValue.ToLower();
if (lValue == "always")
mCookPreference = eAlwaysCook;
else if (lValue == "never")
mCookPreference = eNeverCook;
else
mCookPreference = eNoCookPreference;
}
else if (rkParamName == "description")
mDescription = rkValue;
}
EGame Game() const;
bool IsInVersion(u32 Version) const;
TString FullName() const;
TIDString IDString(bool FullPath) const;
bool IsDescendantOf(const CStructTemplate *pStruct) const;
bool IsFromStructTemplate() const;
bool IsNameCorrect() const;
TString FindStructSource() const;
CStructTemplate* RootStruct();
// Inline Accessors
inline TString Name() const { return mName; }
inline TString Description() const { return mDescription; }
inline u32 PropertyID() const { return mID; }
inline ECookPreference CookPreference() const { return mCookPreference; }
inline CStructTemplate* Parent() const { return mpParent; }
inline CScriptTemplate* ScriptTemplate() const { return mpScriptTemplate; }
inline CMasterTemplate* MasterTemplate() const { return mpMasterTemplate; }
inline void SetName(const TString& rkName) { mName = rkName; mHasCachedNameCheck = false; }
inline void SetDescription(const TString& rkDesc) { mDescription = rkDesc; }
};
// Macro for defining reimplementations of IPropertyTemplate::Clone(), which are usually identical to each other aside from the class being instantiated
#define IMPLEMENT_TEMPLATE_CLONE(ClassName) \
virtual IPropertyTemplate* Clone(CScriptTemplate *pScript, CStructTemplate *pParent = 0) const \
{ \
if (!pParent) pParent = mpParent; \
if (!pScript) pScript = mpScriptTemplate; \
ClassName *pTemp = new ClassName(mID, pScript, mpMasterTemplate, pParent); \
pTemp->Copy(this); \
return pTemp; \
}
// TTypedPropertyTemplate - Template property class that allows for tracking
// a default value. Typedefs are set up for a bunch of property types.
template<typename PropType, EPropertyType PropTypeEnum, class ValueClass, bool CanHaveDefaultValue>
class TTypedPropertyTemplate : public IPropertyTemplate
{
friend class CTemplateLoader;
friend class CTemplateWriter;
protected:
ValueClass mDefaultValue;
public:
TTypedPropertyTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: IPropertyTemplate(ID, pScript, pMaster, pParent) {}
TTypedPropertyTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: IPropertyTemplate(ID, rkName, CookPreference, pScript, pMaster, pParent) {}
virtual EPropertyType Type() const { return PropTypeEnum; }
virtual bool CanHaveDefault() const { return CanHaveDefaultValue; }
virtual bool IsNumerical() const { return false; }
virtual IProperty* InstantiateProperty(CScriptObject *pInstance, CPropertyStruct *pParent)
{
typedef TTypedProperty<PropType, PropTypeEnum, ValueClass> TPropertyType;
TPropertyType *pOut = new TPropertyType(this, pInstance, pParent, GetDefaultValue());
return pOut;
}
IMPLEMENT_TEMPLATE_CLONE(TTypedPropertyTemplate)
virtual void Copy(const IPropertyTemplate *pkTemp)
{
IPropertyTemplate::Copy(pkTemp);
mDefaultValue.Copy(&static_cast<const TTypedPropertyTemplate*>(pkTemp)->mDefaultValue);
}
virtual bool Matches(const IPropertyTemplate *pkTemp) const
{
const TTypedPropertyTemplate *pkTyped = static_cast<const TTypedPropertyTemplate*>(pkTemp);
return ( (IPropertyTemplate::Matches(pkTemp)) &&
(mDefaultValue.Matches(&pkTyped->mDefaultValue)) );
}
virtual TString DefaultToString() const
{
return mDefaultValue.ToString();
}
virtual const IPropertyValue* RawDefaultValue() const
{
return &mDefaultValue;
}
virtual void SetParam(const TString& rkParamName, const TString& rkValue)
{
IPropertyTemplate::SetParam(rkParamName, rkValue);
if (rkParamName == "default")
mDefaultValue.FromString(rkValue.ToLower());
}
inline PropType GetDefaultValue() const { return mDefaultValue.Get(); }
inline void SetDefaultValue(const PropType& rkIn) { mDefaultValue.Set(rkIn); }
};
// TNumericalPropertyTemplate - Subclass of TTypedPropertyTemplate for numerical
// property types, and allows a min/max value and a suffix to be tracked.
template<typename PropType, EPropertyType PropTypeEnum, class ValueClass>
class TNumericalPropertyTemplate : public TTypedPropertyTemplate<PropType,PropTypeEnum,ValueClass,true>
{
friend class CTemplateLoader;
friend class CTemplateWriter;
ValueClass mMin;
ValueClass mMax;
TString mSuffix;
public:
TNumericalPropertyTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, pScript, pMaster, pParent)
{}
TNumericalPropertyTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, rkName, CookPreference, pScript, pMaster, pParent)
, mMin(0)
, mMax(0)
{}
virtual bool IsNumerical() const { return true; }
virtual bool HasValidRange() const { return (mMin != 0 || mMax != 0); }
IMPLEMENT_TEMPLATE_CLONE(TNumericalPropertyTemplate)
virtual void Copy(const IPropertyTemplate *pkTemp)
{
TTypedPropertyTemplate::Copy(pkTemp);
const TNumericalPropertyTemplate *pkNumerical = static_cast<const TNumericalPropertyTemplate*>(pkTemp);
mMin.Copy(&pkNumerical->mMin);
mMax.Copy(&pkNumerical->mMax);
mSuffix = pkNumerical->mSuffix;
}
virtual bool Matches(const IPropertyTemplate *pkTemp) const
{
const TNumericalPropertyTemplate *pkNumerical = static_cast<const TNumericalPropertyTemplate*>(pkTemp);
return ( (TTypedPropertyTemplate::Matches(pkTemp)) &&
(mMin.Matches(&pkNumerical->mMin)) &&
(mMax.Matches(&pkNumerical->mMax)) &&
(mSuffix == pkNumerical->mSuffix) );
}
virtual TString RangeToString() const
{
return mMin.ToString() + "," + mMax.ToString();
}
virtual void SetParam(const TString& rkParamName, const TString& rkValue)
{
TTypedPropertyTemplate::SetParam(rkParamName, rkValue);
if (rkParamName == "range")
{
TStringList Components = rkValue.ToLower().Split(", ");
if (Components.size() == 2)
{
mMin.FromString(Components.front());
mMax.FromString(Components.back());
}
}
else if (rkParamName == "suffix")
{
mSuffix = rkValue;
}
}
virtual TString Suffix() const { return mSuffix; }
inline PropType GetMin() const { return mMin.Get(); }
inline PropType GetMax() const { return mMax.Get(); }
inline void SetRange(const PropType& rkMin, const PropType& rkMax)
{
mMin.Set(rkMin);
mMax.Set(rkMax);
}
inline void SetSuffix(const TString& rkSuffix)
{
mSuffix = rkSuffix;
}
};
// Typedefs for all property types that don't need further functionality.
typedef TTypedPropertyTemplate<bool, eBoolProperty, CBoolValue, true> TBoolTemplate;
typedef TNumericalPropertyTemplate<s8, eByteProperty, CByteValue> TByteTemplate;
typedef TNumericalPropertyTemplate<s16, eShortProperty, CShortValue> TShortTemplate;
typedef TNumericalPropertyTemplate<s32, eLongProperty, CLongValue> TLongTemplate;
typedef TNumericalPropertyTemplate<float, eFloatProperty, CFloatValue> TFloatTemplate;
typedef TTypedPropertyTemplate<CVector3f, eVector3Property, CVector3Value, true> TVector3Template;
typedef TTypedPropertyTemplate<CColor, eColorProperty, CColorValue, true> TColorTemplate;
// TCharacterTemplate, TSoundTemplate, TStringTemplate, and TMayaSplineTemplate get their own subclasses so they can reimplement a couple functions
class TCharacterTemplate : public TTypedPropertyTemplate<CAnimationParameters, eCharacterProperty, CCharacterValue, false>
{
friend class CTemplateLoader;
friend class CTemplateWriter;
public:
TCharacterTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, pScript, pMaster, pParent) {}
TCharacterTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, rkName, CookPreference, pScript, pMaster, pParent) {}
IProperty* InstantiateProperty(CScriptObject *pInstance, CPropertyStruct *pParent)
{
return new TCharacterProperty(this, pInstance, pParent, CAnimationParameters(Game()));
}
const char* GetTypeNameString() const
{
return (Game() < eCorruptionProto ? "AnimationSet" : "CharacterAnimationSet");
}
IMPLEMENT_TEMPLATE_CLONE(TCharacterTemplate)
};
class TSoundTemplate : public TTypedPropertyTemplate<u32, eSoundProperty, CSoundValue, false>
{
friend class CTemplateLoader;
friend class CTemplateWriter;
public:
TSoundTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, pScript, pMaster, pParent) {}
TSoundTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, rkName, CookPreference, pScript, pMaster, pParent) {}
IProperty* InstantiateProperty(CScriptObject *pInstance, CPropertyStruct *pParent)
{
return new TSoundProperty(this, pInstance, pParent, -1);
}
IMPLEMENT_TEMPLATE_CLONE(TSoundTemplate)
};
class TStringTemplate : public TTypedPropertyTemplate<TString, eStringProperty, CStringValue, false>
{
friend class CTemplateLoader;
friend class CTemplateWriter;
public:
TStringTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, pScript, pMaster, pParent) {}
TStringTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, rkName, CookPreference, pScript, pMaster, pParent) {}
IProperty* InstantiateProperty(CScriptObject *pInstance, CPropertyStruct *pParent)
{
return new TStringProperty(this, pInstance, pParent);
}
IMPLEMENT_TEMPLATE_CLONE(TStringTemplate)
};
class TMayaSplineTemplate : public TTypedPropertyTemplate<std::vector<u8>, eMayaSplineProperty, CMayaSplineValue, false>
{
friend class CTemplateLoader;
friend class CTemplateWriter;
public:
TMayaSplineTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, pScript, pMaster, pParent) {}
TMayaSplineTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, rkName, CookPreference, pScript, pMaster, pParent) {}
IProperty* InstantiateProperty(CScriptObject *pInstance, CPropertyStruct *pParent)
{
return new TMayaSplineProperty(this, pInstance, pParent);
}
IMPLEMENT_TEMPLATE_CLONE(TMayaSplineTemplate)
};
// CAssetTemplate - Property template for assets. Tracks a list of resource types that
// the property is allowed to accept.
class CAssetTemplate : public IPropertyTemplate
{
friend class CTemplateLoader;
friend class CTemplateWriter;
CResTypeFilter mTypeFilter;
public:
CAssetTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: IPropertyTemplate(ID, pScript, pMaster, pParent) {}
CAssetTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: IPropertyTemplate(ID, rkName, CookPreference, pScript, pMaster, pParent) {}
virtual EPropertyType Type() const { return eAssetProperty; }
virtual bool CanHaveDefault() const { return false; }
virtual bool IsNumerical() const { return false; }
IProperty* InstantiateProperty(CScriptObject *pInstance, CPropertyStruct *pParent)
{
return new TAssetProperty(this, pInstance, pParent);
}
IMPLEMENT_TEMPLATE_CLONE(CAssetTemplate)
virtual void Copy(const IPropertyTemplate *pkTemp)
{
IPropertyTemplate::Copy(pkTemp);
mTypeFilter = static_cast<const CAssetTemplate*>(pkTemp)->mTypeFilter;
}
virtual bool Matches(const IPropertyTemplate *pkTemp) const
{
const CAssetTemplate *pkAsset = static_cast<const CAssetTemplate*>(pkTemp);
return ( (IPropertyTemplate::Matches(pkTemp)) &&
(mTypeFilter == pkAsset->mTypeFilter) );
}
void SetTypeFilter(const TStringList& rkExtensions) { mTypeFilter.SetAcceptedTypes(Game(), rkExtensions); }
const CResTypeFilter& TypeFilter() const { return mTypeFilter; }
};
// CEnumTemplate - Property template for enums. Tracks a list of possible values (enumerators).
class CEnumTemplate : public TTypedPropertyTemplate<s32, eEnumProperty, CHexLongValue, true>
{
friend class CTemplateLoader;
friend class CTemplateWriter;
struct SEnumerator
{
TString Name;
u32 ID;
SEnumerator(const TString& rkName, u32 _ID)
: Name(rkName), ID(_ID) {}
bool operator==(const SEnumerator& rkOther) const
{
return ( (Name == rkOther.Name) && (ID == rkOther.ID) );
}
};
std::vector<SEnumerator> mEnumerators;
TString mSourceFile;
bool mUsesHashes;
public:
CEnumTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, pScript, pMaster, pParent)
, mUsesHashes(false)
{
}
CEnumTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, rkName, CookPreference, pScript, pMaster, pParent)
, mUsesHashes(false)
{
}
virtual EPropertyType Type() const { return eEnumProperty; }
virtual bool CanHaveDefault() const { return true; }
virtual bool IsNumerical() const { return false; }
virtual IProperty* InstantiateProperty(CScriptObject *pInstance, CPropertyStruct *pParent)
{
TEnumProperty *pEnum = new TEnumProperty(this, pInstance, pParent);
pEnum->Set(GetDefaultValue());
return pEnum;
}
IMPLEMENT_TEMPLATE_CLONE(CEnumTemplate)
virtual void Copy(const IPropertyTemplate *pkTemp)
{
TTypedPropertyTemplate::Copy(pkTemp);
const CEnumTemplate *pkEnum = static_cast<const CEnumTemplate*>(pkTemp);
mEnumerators = pkEnum->mEnumerators;
mSourceFile = pkEnum->mSourceFile;
mUsesHashes = pkEnum->mUsesHashes;
}
virtual bool Matches(const IPropertyTemplate *pkTemp) const
{
const CEnumTemplate *pkEnum = static_cast<const CEnumTemplate*>(pkTemp);
return ( (TTypedPropertyTemplate::Matches(pkTemp)) &&
(mEnumerators == pkEnum->mEnumerators) &&
(mSourceFile == pkEnum->mSourceFile) &&
(mUsesHashes == pkEnum->mUsesHashes) );
}
virtual const char* GetTypeNameString() const
{
return (mUsesHashes ? "enum" : "choice");
}
inline TString SourceFile() const { return mSourceFile; }
inline u32 NumEnumerators() const { return mEnumerators.size(); }
u32 EnumeratorIndex(u32 enumID) const
{
for (u32 iEnum = 0; iEnum < mEnumerators.size(); iEnum++)
{
if (mEnumerators[iEnum].ID == enumID)
return iEnum;
}
return -1;
}
u32 EnumeratorID(u32 enumIndex) const
{
if (mEnumerators.size() > enumIndex)
return mEnumerators[enumIndex].ID;
else return -1;
}
TString EnumeratorName(u32 enumIndex) const
{
if (mEnumerators.size() > enumIndex)
return mEnumerators[enumIndex].Name;
else return "INVALID ENUM INDEX";
}
};
// CBitfieldTemplate - Property template for bitfields, which can have multiple
// distinct boolean parameters packed into one property.
class CBitfieldTemplate : public TTypedPropertyTemplate<u32, eBitfieldProperty, CHexLongValue, true>
{
friend class CTemplateLoader;
friend class CTemplateWriter;
struct SBitFlag
{
TString Name;
u32 Mask;
SBitFlag(const TString& _name, u32 _mask)
: Name(_name), Mask(_mask) {}
bool operator==(const SBitFlag& rkOther) const
{
return ( (Name == rkOther.Name) && (Mask == rkOther.Mask) );
}
};
std::vector<SBitFlag> mBitFlags;
TString mSourceFile;
public:
CBitfieldTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, pScript, pMaster, pParent)
{
}
CBitfieldTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, rkName, CookPreference, pScript, pMaster, pParent)
{
}
virtual EPropertyType Type() const { return eBitfieldProperty; }
virtual bool CanHaveDefault() const { return true; }
virtual bool IsNumerical() const { return false; }
virtual IProperty* InstantiateProperty(CScriptObject *pInstance, CPropertyStruct *pParent)
{
TBitfieldProperty *pBitfield = new TBitfieldProperty(this, pInstance, pParent);
pBitfield->Set(GetDefaultValue());
return pBitfield;
}
IMPLEMENT_TEMPLATE_CLONE(CBitfieldTemplate)
virtual void Copy(const IPropertyTemplate *pkTemp)
{
TTypedPropertyTemplate::Copy(pkTemp);
const CBitfieldTemplate *pkBitfield = static_cast<const CBitfieldTemplate*>(pkTemp);
mBitFlags = pkBitfield->mBitFlags;
mSourceFile = pkBitfield->mSourceFile;
}
virtual bool Matches(const IPropertyTemplate *pkTemp) const
{
const CBitfieldTemplate *pkBitfield = static_cast<const CBitfieldTemplate*>(pkTemp);
return ( (TTypedPropertyTemplate::Matches(pkTemp)) &&
(mBitFlags == pkBitfield->mBitFlags) &&
(mSourceFile == pkBitfield->mSourceFile) );
}
inline TString SourceFile() const { return mSourceFile; }
inline u32 NumFlags() const { return mBitFlags.size(); }
inline TString FlagName(u32 index) const { return mBitFlags[index].Name; }
inline u32 FlagMask(u32 index) const { return mBitFlags[index].Mask; }
};
// CStructTemplate - Defines structs composed of multiple sub-properties.
class CStructTemplate : public IPropertyTemplate
{
friend class CTemplateLoader;
friend class CTemplateWriter;
protected:
std::vector<IPropertyTemplate*> mSubProperties;
std::vector<u32> mVersionPropertyCounts;
bool mIsSingleProperty;
TString mSourceFile;
TString mTypeName;
void DetermineVersionPropertyCounts();
public:
CStructTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: IPropertyTemplate(ID, pScript, pMaster, pParent)
, mIsSingleProperty(false) {}
CStructTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: IPropertyTemplate(ID, rkName, CookPreference, pScript, pMaster, pParent)
, mIsSingleProperty(false) {}
~CStructTemplate()
{
for (auto it = mSubProperties.begin(); it != mSubProperties.end(); it++)
delete *it;
}
EPropertyType Type() const { return eStructProperty; }
bool CanHaveDefault() const { return false; }
bool IsNumerical() const { return false; }
IProperty* InstantiateProperty(CScriptObject *pInstance, CPropertyStruct *pParent)
{
CPropertyStruct *pStruct = new CPropertyStruct(this, pInstance, pParent);
for (u32 iSub = 0; iSub < mSubProperties.size(); iSub++)
{
IProperty *pSubProp = mSubProperties[iSub]->InstantiateProperty(pInstance, pStruct);
pStruct->AddSubProperty(pSubProp);
}
return pStruct;
}
IMPLEMENT_TEMPLATE_CLONE(CStructTemplate)
virtual void Copy(const IPropertyTemplate *pkTemp)
{
IPropertyTemplate::Copy(pkTemp);
const CStructTemplate *pkStruct = static_cast<const CStructTemplate*>(pkTemp);
CopyStructData(pkStruct);
}
void CopyStructData(const CStructTemplate *pkStruct);
virtual bool Matches(const IPropertyTemplate *pkTemp) const
{
const CStructTemplate *pkStruct = static_cast<const CStructTemplate*>(pkTemp);
if ( (IPropertyTemplate::Matches(pkTemp)) &&
(mVersionPropertyCounts == pkStruct->mVersionPropertyCounts) &&
(mIsSingleProperty == pkStruct->mIsSingleProperty) &&
(mSourceFile == pkStruct->mSourceFile) &&
(mTypeName == pkStruct->mTypeName) )
{
return StructDataMatches(pkStruct);
}
return false;
}
const char* GetTypeNameString() const
{
// hack - currently templates embedded within another XML can't have a type name
return mTypeName.IsEmpty() ? *mName : *mTypeName;
}
bool StructDataMatches(const CStructTemplate *pkStruct) const
{
if ( (mIsSingleProperty == pkStruct->mIsSingleProperty) &&
(mSubProperties.size() == pkStruct->mSubProperties.size()) )
{
for (u32 iSub = 0; iSub < mSubProperties.size(); iSub++)
{
if (!mSubProperties[iSub]->Matches(pkStruct->mSubProperties[iSub]))
return false;
}
return true;
}
return false;
}
inline TString SourceFile() const { return mSourceFile; }
inline bool IsSingleProperty() const { return mIsSingleProperty; }
inline u32 Count() const { return mSubProperties.size(); }
inline u32 NumVersions() const { return mVersionPropertyCounts.size(); }
u32 PropertyCountForVersion(u32 Version);
u32 VersionForPropertyCount(u32 PropCount);
IPropertyTemplate* PropertyByIndex(u32 index);
IPropertyTemplate* PropertyByID(u32 ID);
IPropertyTemplate* PropertyByIDString(const TIDString& str);
CStructTemplate* StructByIndex(u32 index);
CStructTemplate* StructByID(u32 ID);
CStructTemplate* StructByIDString(const TIDString& str);
bool HasProperty(const TIDString& rkIdString);
void DebugPrintProperties(TString base);
};
// CArrayTemplate - Defines a repeating struct composed of multiple sub-properties.
// Similar to CStructTemplate, but with new implementations of Type() and InstantiateProperty().
class CArrayTemplate : public CStructTemplate
{
friend class CTemplateLoader;
friend class CTemplateWriter;
TString mElementName;
public:
CArrayTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: CStructTemplate(ID, pScript, pMaster, pParent)
{
mIsSingleProperty = true;
}
CArrayTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: CStructTemplate(ID, rkName, CookPreference, pScript, pMaster, pParent)
{
mIsSingleProperty = true;
}
EPropertyType Type() const { return eArrayProperty; }
IProperty* InstantiateProperty(CScriptObject *pInstance, CPropertyStruct *pParent)
{
return new CArrayProperty(this, pInstance, pParent);
}
IMPLEMENT_TEMPLATE_CLONE(CArrayTemplate)
virtual void Copy(const IPropertyTemplate *pkTemp)
{
CStructTemplate::Copy(pkTemp);
mElementName = static_cast<const CArrayTemplate*>(pkTemp)->mElementName;
}
virtual bool Matches(const IPropertyTemplate *pkTemp) const
{
const CArrayTemplate *pkArray = static_cast<const CArrayTemplate*>(pkTemp);
return ( (mElementName == pkArray->mElementName) &
(CStructTemplate::Matches(pkTemp)) );
}
void SetParam(const TString& rkParamName, const TString& rkValue)
{
if (rkParamName == "element_name")
mElementName = rkValue;
else
CStructTemplate::SetParam(rkParamName, rkValue);
}
TString ElementName() const { return mElementName; }
void SetElementName(const TString& rkName) { mElementName = rkName; }
CPropertyStruct* CreateSubStruct(CScriptObject *pInstance, CArrayProperty *pArray)
{
return (CPropertyStruct*) CStructTemplate::InstantiateProperty(pInstance, pArray);
}
};
#endif
#endif // IPROPERTYTEMPLATE

View File

@ -1,392 +0,0 @@
#ifndef IPROPERTYVALUE_H
#define IPROPERTYVALUE_H
#if 0
#include "EPropertyType.h"
#include <Common/CAssetID.h>
#include <Common/Log.h>
#include "Core/Resource/Animation/CAnimationParameters.h"
#include "Core/Resource/CResource.h"
#include "Core/Resource/TResPtr.h"
#include <Common/CColor.h>
#include <Common/TString.h>
#include <Math/CVector3f.h>
class IPropertyValue
{
public:
virtual TString ToString() const = 0;
virtual void FromString(const TString& rkString) = 0;
virtual IPropertyValue* Clone() const = 0;
virtual void Copy(const IPropertyValue *pkValue) = 0;
virtual bool Matches(const IPropertyValue *pkValue) const = 0;
};
template<typename PropType>
class TTypedPropertyValue : public IPropertyValue
{
protected:
PropType mValue;
public:
TTypedPropertyValue() {}
TTypedPropertyValue(PropType rkVal)
: mValue(rkVal) {}
virtual void Copy(const IPropertyValue *pkValue)
{
const TTypedPropertyValue *pkOther = static_cast<const TTypedPropertyValue*>(pkValue);
mValue = pkOther->mValue;
}
virtual bool Matches(const IPropertyValue *pkValue) const
{
const TTypedPropertyValue *pkOther = static_cast<const TTypedPropertyValue*>(pkValue);
return ((pkValue != nullptr) && (mValue == pkOther->mValue));
}
PropType Get() const
{
return mValue;
}
void Set(const PropType& rkIn)
{
mValue = rkIn;
}
bool operator==(const TTypedPropertyValue& rkOther) const
{
return (mValue == rkOther.mValue);
}
bool operator==(const PropType& rkOther) const { return (mValue == rkOther); }
bool operator!=(const PropType& rkOther) const { return (mValue != rkOther); }
bool operator< (const PropType& rkOther) const { return (mValue < rkOther); }
bool operator<=(const PropType& rkOther) const { return (mValue <= rkOther); }
bool operator> (const PropType& rkOther) const { return (mValue > rkOther); }
bool operator>=(const PropType& rkOther) const { return (mValue >= rkOther); }
};
class CBoolValue : public TTypedPropertyValue<bool>
{
public:
CBoolValue() { mValue = false; }
CBoolValue(bool Val) { mValue = Val; }
TString ToString() const
{
return (!mValue ? "false" : "true");
}
void FromString(const TString& rkString)
{
mValue = (rkString == "true");
}
IPropertyValue* Clone() const
{
return new CBoolValue(mValue);
}
};
class CByteValue : public TTypedPropertyValue<s8>
{
public:
CByteValue() { mValue = 0; }
CByteValue(s8 Val) { mValue = Val; }
TString ToString() const
{
return TString::FromInt32(mValue, 0, 10);
}
void FromString(const TString& rkString)
{
u32 base = (rkString.StartsWith("0x") ? 16 : 10);
mValue = (s8) rkString.ToInt32(base);
}
IPropertyValue* Clone() const
{
return new CByteValue(mValue);
}
};
class CShortValue : public TTypedPropertyValue<s16>
{
public:
CShortValue() { mValue = 0; }
CShortValue(s16 Val) { mValue = Val; }
TString ToString() const
{
return TString::FromInt32((s32) mValue, 0, 10);
}
void FromString(const TString& rkString)
{
u32 base = (rkString.StartsWith("0x") ? 16 : 10);
mValue = (s16) rkString.ToInt32(base);
}
IPropertyValue* Clone() const
{
return new CShortValue(mValue);
}
};
class CLongValue : public TTypedPropertyValue<s32>
{
public:
CLongValue() { mValue = 0; }
CLongValue(s32 Val) { mValue = Val; }
TString ToString() const
{
return TString::FromInt32(mValue, 0, 10);
}
void FromString(const TString& rkString)
{
u32 base = (rkString.StartsWith("0x") ? 16 : 10);
mValue = (s32) rkString.ToInt32(base);
}
IPropertyValue* Clone() const
{
return new CLongValue(mValue);
}
};
class CHexLongValue : public TTypedPropertyValue<u32>
{
public:
CHexLongValue() { mValue = 0; }
CHexLongValue(u32 Val) { mValue = Val; }
TString ToString() const
{
return TString::HexString(mValue, 8);
}
void FromString(const TString& rkString)
{
u32 Base = (rkString.StartsWith("0x") ? 16 : 10);
mValue = (s32) rkString.ToInt32(Base);
}
IPropertyValue* Clone() const
{
return new CHexLongValue(mValue);
}
};
class CFloatValue : public TTypedPropertyValue<float>
{
public:
CFloatValue() { mValue = 0.0f; }
CFloatValue(float Val) { mValue = Val; }
TString ToString() const
{
return TString::FromFloat(mValue);
}
void FromString(const TString& rkString)
{
mValue = rkString.ToFloat();
}
IPropertyValue* Clone() const
{
return new CFloatValue(mValue);
}
};
class CStringValue : public TTypedPropertyValue<TString>
{
public:
CStringValue() {}
CStringValue(const TString& rkVal) { mValue = rkVal; }
// These functions are extremely complicated, but try to follow along
TString ToString() const
{
return mValue;
}
void FromString(const TString& rkString)
{
mValue = rkString;
}
IPropertyValue* Clone() const
{
return new CStringValue(mValue);
}
};
class CColorValue : public TTypedPropertyValue<CColor>
{
public:
CColorValue() {}
CColorValue(const CColor& rkVal) { mValue = rkVal; }
TString ToString() const
{
TString out;
out += TString::FromFloat(mValue.R) + ", ";
out += TString::FromFloat(mValue.G) + ", ";
out += TString::FromFloat(mValue.B) + ", ";
out += TString::FromFloat(mValue.A);
return out;
}
void FromString(const TString& rkString)
{
TStringList Components = rkString.Split(", ");
if (Components.size() < 3 || Components.size() > 4)
{
Log::Error("CColorValue::FromString was passed a string with an invalid number of components");
mValue = CColor::skTransparentBlack;
return;
}
float *pPtr = &mValue.R;
mValue.A = 1.0f;
for (auto it = Components.begin(); it != Components.end(); it++)
{
*pPtr = it->ToFloat();
pPtr++;
}
}
IPropertyValue* Clone() const
{
return new CColorValue(mValue);
}
};
class CVector3Value : public TTypedPropertyValue<CVector3f>
{
public:
CVector3Value() {}
CVector3Value(const CVector3f& rkVal) { mValue = rkVal; }
TString ToString() const
{
TString out;
out += TString::FromFloat(mValue.X) + ", ";
out += TString::FromFloat(mValue.Y) + ", ";
out += TString::FromFloat(mValue.Z);
return out;
}
void FromString(const TString& rkString)
{
TStringList Components = rkString.Split(", ");
if (Components.size() != 3)
{
Log::Error("CVector3Value::FromString was passed a string with an invalid number of components");
mValue = CVector3f::skInfinite;
return;
}
float *pPtr = &mValue.X;
for (auto it = Components.begin(); it != Components.end(); it++)
{
*pPtr = it->ToFloat();
pPtr++;
}
}
IPropertyValue* Clone() const
{
return new CVector3Value(mValue);
}
};
class CCharacterValue : public TTypedPropertyValue<CAnimationParameters>
{
public:
CCharacterValue() {}
CCharacterValue(const CAnimationParameters& rkParams) { mValue = rkParams; }
TString ToString() const { return ""; }
void FromString(const TString&) { }
IPropertyValue* Clone() const
{
return new CCharacterValue(mValue);
}
};
class CMayaSplineValue : public TTypedPropertyValue<std::vector<u8>>
{
public:
CMayaSplineValue() {}
CMayaSplineValue(const std::vector<u8>& rkData) { mValue = rkData; }
TString ToString() const { return "[MayaSpline]"; }
void FromString(const TString&) {}
IPropertyValue* Clone() const
{
return new CMayaSplineValue(mValue);
}
};
class CSoundValue : public TTypedPropertyValue<u32>
{
public:
CSoundValue() {}
CSoundValue(u32 SoundID) { mValue = SoundID; }
TString ToString() const { return TString::FromInt32(mValue, 0, 10); }
void FromString(const TString& rkString) { mValue = rkString.ToInt32(10); }
IPropertyValue* Clone() const
{
return new CSoundValue(mValue);
}
};
class CAssetValue : public TTypedPropertyValue<CAssetID>
{
public:
CAssetValue() {}
CAssetValue(const CAssetID& rkID) { mValue = rkID; }
TString ToString() const { return ""; }
void FromString(const TString&) {}
IPropertyValue* Clone() const
{
return new CAssetValue(mValue);
}
};
class CUnknownValue : public TTypedPropertyValue<std::vector<u8>>
{
public:
CUnknownValue();
CUnknownValue(const std::vector<u8>& rkVec) { mValue = rkVec; }
TString ToString() const { return ""; }
void FromString(const TString&) {}
IPropertyValue* Clone() const
{
return new CUnknownValue(mValue);
}
};
#endif
#endif // IPROPERTYVALUE_H

View File

@ -1,11 +1,11 @@
#ifndef CANIMATIONPROPERTY_H #ifndef CANIMATIONPROPERTY_H
#define CANIMATIONPROPERTY_H #define CANIMATIONPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CAnimationProperty : public TSerializeableTypedProperty< u32, EPropertyTypeNew::Animation > class CAnimationProperty : public TSerializeableTypedProperty< u32, EPropertyType::Animation >
{ {
friend class IPropertyNew; friend class IProperty;
protected: protected:
CAnimationProperty(EGame Game) CAnimationProperty(EGame Game)

View File

@ -1,11 +1,11 @@
#ifndef CANIMATIONSETPROPERTY_H #ifndef CANIMATIONSETPROPERTY_H
#define CANIMATIONSETPROPERTY_H #define CANIMATIONSETPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CAnimationSetProperty : public TSerializeableTypedProperty< CAnimationParameters, EPropertyTypeNew::AnimationSet > class CAnimationSetProperty : public TSerializeableTypedProperty< CAnimationParameters, EPropertyType::AnimationSet >
{ {
friend class IPropertyNew; friend class IProperty;
protected: protected:
CAnimationSetProperty(EGame Game) CAnimationSetProperty(EGame Game)

View File

@ -1,7 +1,7 @@
#ifndef CARRAYPROPERTY_H #ifndef CARRAYPROPERTY_H
#define CARRAYPROPERTY_H #define CARRAYPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
struct SScriptArray struct SScriptArray
{ {
@ -20,9 +20,9 @@ struct SScriptArray
/** You probably shouldn't use this on intrinsic classes; script only */ /** You probably shouldn't use this on intrinsic classes; script only */
/** @todo proper support of default values for arrays (this would be used for prefabs) */ /** @todo proper support of default values for arrays (this would be used for prefabs) */
class CArrayProperty : public TTypedPropertyNew<u32, EPropertyTypeNew::Array> class CArrayProperty : public TTypedProperty<u32, EPropertyType::Array>
{ {
friend class IPropertyNew; friend class IProperty;
friend class CTemplateLoader; friend class CTemplateLoader;
/** This class inherits from TTypedPropertyNew<int> in order to expose the array /** This class inherits from TTypedPropertyNew<int> in order to expose the array
@ -30,7 +30,7 @@ class CArrayProperty : public TTypedPropertyNew<u32, EPropertyTypeNew::Array>
* value and we respond by updating the allocated space, handling item destruction * value and we respond by updating the allocated space, handling item destruction
* and construction, etc. * and construction, etc.
*/ */
IPropertyNew* mpItemArchetype; IProperty* mpItemArchetype;
/** Internal functions */ /** Internal functions */
SScriptArray& _GetInternalArray(void* pData) const SScriptArray& _GetInternalArray(void* pData) const
@ -46,7 +46,7 @@ class CArrayProperty : public TTypedPropertyNew<u32, EPropertyTypeNew::Array>
protected: protected:
CArrayProperty(EGame Game) CArrayProperty(EGame Game)
: TTypedPropertyNew(Game) : TTypedProperty(Game)
, mpItemArchetype(nullptr) , mpItemArchetype(nullptr)
{} {}
@ -69,7 +69,7 @@ public:
virtual void Destruct(void* pData) const virtual void Destruct(void* pData) const
{ {
RevertToDefault(pData); RevertToDefault(pData);
TTypedPropertyNew::Destruct(pData); TTypedProperty::Destruct(pData);
} }
virtual bool MatchesDefault(void* pData) const virtual bool MatchesDefault(void* pData) const
@ -107,7 +107,7 @@ public:
virtual void Serialize(IArchive& rArc) virtual void Serialize(IArchive& rArc)
{ {
TTypedPropertyNew::Serialize(rArc); TTypedProperty::Serialize(rArc);
rArc << SerialParameter("ItemArchetype", mpItemArchetype); rArc << SerialParameter("ItemArchetype", mpItemArchetype);
if (rArc.IsReader()) if (rArc.IsReader())
@ -135,16 +135,16 @@ public:
} }
} }
virtual void InitFromArchetype(IPropertyNew* pOther) virtual void InitFromArchetype(IProperty* pOther)
{ {
TTypedPropertyNew::InitFromArchetype(pOther); TTypedProperty::InitFromArchetype(pOther);
CArrayProperty* pOtherArray = static_cast<CArrayProperty*>(pOther); CArrayProperty* pOtherArray = static_cast<CArrayProperty*>(pOther);
mpItemArchetype = IPropertyNew::CreateCopy(pOtherArray->mpItemArchetype); mpItemArchetype = IProperty::CreateCopy(pOtherArray->mpItemArchetype);
} }
virtual void PostInitialize() virtual void PostInitialize()
{ {
TTypedPropertyNew::PostInitialize(); TTypedProperty::PostInitialize();
mpItemArchetype->Initialize(this, mpScriptTemplate, 0); mpItemArchetype->Initialize(this, mpScriptTemplate, 0);
} }
@ -204,7 +204,7 @@ public:
} }
/** Accessors */ /** Accessors */
IPropertyNew* ItemArchetype() const { return mpItemArchetype; } IProperty* ItemArchetype() const { return mpItemArchetype; }
}; };
#endif // CARRAYPROPERTY_H #endif // CARRAYPROPERTY_H

View File

@ -1,13 +1,13 @@
#ifndef CASSETPROPERTY_H #ifndef CASSETPROPERTY_H
#define CASSETPROPERTY_H #define CASSETPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
#include "Core/Resource/CResTypeFilter.h" #include "Core/Resource/CResTypeFilter.h"
class CAssetProperty : public TSerializeableTypedProperty<CAssetID, EPropertyTypeNew::Asset> class CAssetProperty : public TSerializeableTypedProperty<CAssetID, EPropertyType::Asset>
{ {
friend class CTemplateLoader; friend class CTemplateLoader;
friend class IPropertyNew; friend class IProperty;
CResTypeFilter mTypeFilter; CResTypeFilter mTypeFilter;
@ -33,9 +33,9 @@ public:
mTypeFilter != pArchetype->mTypeFilter; mTypeFilter != pArchetype->mTypeFilter;
} }
virtual void InitFromArchetype(IPropertyNew* pOther) virtual void InitFromArchetype(IProperty* pOther)
{ {
TTypedPropertyNew::InitFromArchetype(pOther); TTypedProperty::InitFromArchetype(pOther);
mTypeFilter = static_cast<CAssetProperty*>(pOther)->mTypeFilter; mTypeFilter = static_cast<CAssetProperty*>(pOther)->mTypeFilter;
} }

View File

@ -1,11 +1,11 @@
#ifndef CBOOLPROPERTY_H #ifndef CBOOLPROPERTY_H
#define CBOOLPROPERTY_H #define CBOOLPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CBoolProperty : public TSerializeableTypedProperty< bool, EPropertyTypeNew::Bool > class CBoolProperty : public TSerializeableTypedProperty< bool, EPropertyType::Bool >
{ {
friend class IPropertyNew; friend class IProperty;
protected: protected:
CBoolProperty(EGame Game) CBoolProperty(EGame Game)

View File

@ -1,7 +1,7 @@
#ifndef CBYTEPROPERTY_H #ifndef CBYTEPROPERTY_H
#define CBYTEPROPERTY_H #define CBYTEPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CByteProperty : public TNumericalPropertyNew< s8, EPropertyTypeNew::Byte > class CByteProperty : public TNumericalPropertyNew< s8, EPropertyTypeNew::Byte >
{ {

View File

@ -1,7 +1,7 @@
#ifndef CCOLORPROPERTY_H #ifndef CCOLORPROPERTY_H
#define CCOLORPROPERTY_H #define CCOLORPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
#include "CFloatProperty.h" #include "CFloatProperty.h"
class CColorProperty : public TSerializeableTypedProperty< CColor, EPropertyTypeNew::Color > class CColorProperty : public TSerializeableTypedProperty< CColor, EPropertyTypeNew::Color >

View File

@ -1,7 +1,7 @@
#ifndef CENUMPROPERTY_H #ifndef CENUMPROPERTY_H
#define CENUMPROPERTY_H #define CENUMPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
/** There are two types of enum properties in the game data: enum and choice. /** There are two types of enum properties in the game data: enum and choice.
* *

View File

@ -29,7 +29,7 @@ void CFlagsProperty::SerializeValue(void* pData, IArchive& rArc) const
rArc.SerializePrimitive( (u32&) ValueRef(pData), SH_HexDisplay ); rArc.SerializePrimitive( (u32&) ValueRef(pData), SH_HexDisplay );
} }
void CFlagsProperty::InitFromArchetype(IPropertyNew* pOther) void CFlagsProperty::InitFromArchetype(IProperty* pOther)
{ {
TSerializeableTypedProperty::InitFromArchetype(pOther); TSerializeableTypedProperty::InitFromArchetype(pOther);
CFlagsProperty* pOtherFlags = static_cast<CFlagsProperty*>(pOther); CFlagsProperty* pOtherFlags = static_cast<CFlagsProperty*>(pOther);

View File

@ -1,7 +1,7 @@
#ifndef CFLAGSPROPERTY_H #ifndef CFLAGSPROPERTY_H
#define CFLAGSPROPERTY_H #define CFLAGSPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CFlagsProperty : public TSerializeableTypedProperty<u32, EPropertyTypeNew::Flags> class CFlagsProperty : public TSerializeableTypedProperty<u32, EPropertyTypeNew::Flags>
{ {

View File

@ -1,7 +1,7 @@
#ifndef CFLOATPROPERTY_H #ifndef CFLOATPROPERTY_H
#define CFLOATPROPERTY_H #define CFLOATPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CFloatProperty : public TNumericalPropertyNew< float, EPropertyTypeNew::Float > class CFloatProperty : public TNumericalPropertyNew< float, EPropertyTypeNew::Float >
{ {

View File

@ -1,7 +1,7 @@
#ifndef CGUIDPROPERTY_H #ifndef CGUIDPROPERTY_H
#define CGUIDPROPERTY_H #define CGUIDPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CGuidProperty : public TTypedPropertyNew< std::vector<char>, EPropertyTypeNew::Guid > class CGuidProperty : public TTypedPropertyNew< std::vector<char>, EPropertyTypeNew::Guid >
{ {

View File

@ -1,7 +1,7 @@
#ifndef CINTPROPERTY_H #ifndef CINTPROPERTY_H
#define CINTPROPERTY_H #define CINTPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CIntProperty : public TNumericalPropertyNew< s32, EPropertyTypeNew::Int > class CIntProperty : public TNumericalPropertyNew< s32, EPropertyTypeNew::Int >
{ {

View File

@ -1,7 +1,7 @@
#ifndef CPOINTERPROPERTY_H #ifndef CPOINTERPROPERTY_H
#define CPOINTERPROPERTY_H #define CPOINTERPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CPointerProperty : public TTypedPropertyNew<void*, EPropertyTypeNew::Pointer> class CPointerProperty : public TTypedPropertyNew<void*, EPropertyTypeNew::Pointer>
{ {

View File

@ -1,7 +1,7 @@
#ifndef CSEQUENCEPROPERTY_H #ifndef CSEQUENCEPROPERTY_H
#define CSEQUENCEPROPERTY_H #define CSEQUENCEPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CSequenceProperty : public TTypedPropertyNew< s32, EPropertyTypeNew::Sequence > class CSequenceProperty : public TTypedPropertyNew< s32, EPropertyTypeNew::Sequence >
{ {

View File

@ -1,7 +1,7 @@
#ifndef CSHORTPROPERTY_H #ifndef CSHORTPROPERTY_H
#define CSHORTPROPERTY_H #define CSHORTPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CShortProperty : public TNumericalPropertyNew< s16, EPropertyTypeNew::Short > class CShortProperty : public TNumericalPropertyNew< s16, EPropertyTypeNew::Short >
{ {

View File

@ -1,7 +1,7 @@
#ifndef CSOUNDPROPERTY_H #ifndef CSOUNDPROPERTY_H
#define CSOUNDPROPERTY_H #define CSOUNDPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CSoundProperty : public TSerializeableTypedProperty< s32, EPropertyTypeNew::Sound > class CSoundProperty : public TSerializeableTypedProperty< s32, EPropertyTypeNew::Sound >
{ {

View File

@ -1,7 +1,7 @@
#ifndef CSPLINEPROPERTY_H #ifndef CSPLINEPROPERTY_H
#define CSPLINEPROPERTY_H #define CSPLINEPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CSplineProperty : public TTypedPropertyNew< std::vector<char>, EPropertyTypeNew::Spline > class CSplineProperty : public TTypedPropertyNew< std::vector<char>, EPropertyTypeNew::Spline >
{ {

View File

@ -1,7 +1,7 @@
#ifndef CSTRINGPROPERTY_H #ifndef CSTRINGPROPERTY_H
#define CSTRINGPROPERTY_H #define CSTRINGPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CStringProperty : public TSerializeableTypedProperty< TString, EPropertyTypeNew::String > class CStringProperty : public TSerializeableTypedProperty< TString, EPropertyTypeNew::String >
{ {

View File

@ -1,16 +1,16 @@
#include "CStructProperty.h" #include "CStructProperty.h"
#include "Core/Resource/Script/CMasterTemplate.h" #include "Core/Resource/Script/CMasterTemplate.h"
EPropertyTypeNew CStructPropertyNew::Type() const EPropertyType CStructProperty::Type() const
{ {
return EPropertyTypeNew::Struct; return EPropertyType::Struct;
} }
u32 CStructPropertyNew::DataSize() const u32 CStructProperty::DataSize() const
{ {
if (!mChildren.empty()) if (!mChildren.empty())
{ {
IPropertyNew* pLastChild = mChildren.back(); IProperty* pLastChild = mChildren.back();
return (pLastChild->Offset() - Offset()) + pLastChild->DataSize(); return (pLastChild->Offset() - Offset()) + pLastChild->DataSize();
} }
else else
@ -19,13 +19,13 @@ u32 CStructPropertyNew::DataSize() const
} }
} }
u32 CStructPropertyNew::DataAlignment() const u32 CStructProperty::DataAlignment() const
{ {
// Structs are aligned to the first child property. // Structs are aligned to the first child property.
return (mChildren.empty() ? 1 : mChildren[0]->DataAlignment()); return (mChildren.empty() ? 1 : mChildren[0]->DataAlignment());
} }
void CStructPropertyNew::Construct(void* pData) const void CStructProperty::Construct(void* pData) const
{ {
for (int ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++) for (int ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++)
{ {
@ -33,7 +33,7 @@ void CStructPropertyNew::Construct(void* pData) const
} }
} }
void CStructPropertyNew::Destruct(void* pData) const void CStructProperty::Destruct(void* pData) const
{ {
for (int ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++) for (int ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++)
{ {
@ -41,7 +41,7 @@ void CStructPropertyNew::Destruct(void* pData) const
} }
} }
bool CStructPropertyNew::MatchesDefault(void* pData) const bool CStructProperty::MatchesDefault(void* pData) const
{ {
for (int ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++) for (int ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++)
{ {
@ -53,7 +53,7 @@ bool CStructPropertyNew::MatchesDefault(void* pData) const
return true; return true;
} }
void CStructPropertyNew::RevertToDefault(void* pData) const void CStructProperty::RevertToDefault(void* pData) const
{ {
for (int ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++) for (int ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++)
{ {
@ -61,14 +61,14 @@ void CStructPropertyNew::RevertToDefault(void* pData) const
} }
} }
const char* CStructPropertyNew::HashableTypeName() const const char* CStructProperty::HashableTypeName() const
{ {
return mpArchetype ? mpArchetype->HashableTypeName() : *mName; return mpArchetype ? mpArchetype->HashableTypeName() : *mName;
} }
void CStructPropertyNew::Serialize(IArchive& rArc) void CStructProperty::Serialize(IArchive& rArc)
{ {
IPropertyNew::Serialize(rArc); IProperty::Serialize(rArc);
// Serialize atomic flag // Serialize atomic flag
bool Atomic = IsAtomic(); bool Atomic = IsAtomic();
@ -85,7 +85,7 @@ void CStructPropertyNew::Serialize(IArchive& rArc)
// Serialize archetype // Serialize archetype
if (mpArchetype) if (mpArchetype)
{ {
CStructPropertyNew* pArchetype = static_cast<CStructPropertyNew*>(mpArchetype); CStructProperty* pArchetype = static_cast<CStructProperty*>(mpArchetype);
ASSERT(pArchetype != nullptr); ASSERT(pArchetype != nullptr);
if (rArc.IsReader()) if (rArc.IsReader())
@ -103,13 +103,13 @@ void CStructPropertyNew::Serialize(IArchive& rArc)
// Serialize type and ID, then look up the matching property and serialize it. // Serialize type and ID, then look up the matching property and serialize it.
// We don't really need the type, but it's a good sanity check, and it's also good practice // We don't really need the type, but it's a good sanity check, and it's also good practice
// to guarantee that parameters are read in order, as some serializers are order-dependent. // to guarantee that parameters are read in order, as some serializers are order-dependent.
EPropertyTypeNew ChildType; EPropertyType ChildType;
u32 ChildID; u32 ChildID;
rArc << SerialParameter("Type", ChildType, SH_Attribute) rArc << SerialParameter("Type", ChildType, SH_Attribute)
<< SerialParameter("ID", ChildID, SH_Attribute | SH_HexDisplay ); << SerialParameter("ID", ChildID, SH_Attribute | SH_HexDisplay );
IPropertyNew* pChild = ChildByID(ChildID); IProperty* pChild = ChildByID(ChildID);
ASSERT(pChild != nullptr && pChild->Type() == ChildType); ASSERT(pChild != nullptr && pChild->Type() == ChildType);
pChild->Serialize(rArc); pChild->Serialize(rArc);
@ -123,7 +123,7 @@ void CStructPropertyNew::Serialize(IArchive& rArc)
else else
{ {
// Check if any properties need to override parameters from their archetype. // Check if any properties need to override parameters from their archetype.
std::vector<IPropertyNew*> PropertiesToSerialize; std::vector<IProperty*> PropertiesToSerialize;
for (u32 ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++) for (u32 ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++)
{ {
@ -147,7 +147,7 @@ void CStructPropertyNew::Serialize(IArchive& rArc)
} }
} }
void CStructPropertyNew::SerializeValue(void* pData, IArchive& Arc) const void CStructProperty::SerializeValue(void* pData, IArchive& Arc) const
{ {
for (u32 ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++) for (u32 ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++)
{ {
@ -159,9 +159,9 @@ void CStructPropertyNew::SerializeValue(void* pData, IArchive& Arc) const
} }
} }
void CStructPropertyNew::InitFromArchetype(IPropertyNew* pOther) void CStructProperty::InitFromArchetype(IProperty* pOther)
{ {
IPropertyNew::InitFromArchetype(pOther); IProperty::InitFromArchetype(pOther);
// Copy children // Copy children
_ClearChildren(); _ClearChildren();
@ -169,14 +169,14 @@ void CStructPropertyNew::InitFromArchetype(IPropertyNew* pOther)
for (u32 ChildIdx = 0; ChildIdx < pOther->NumChildren(); ChildIdx++) for (u32 ChildIdx = 0; ChildIdx < pOther->NumChildren(); ChildIdx++)
{ {
IPropertyNew* pChild = CreateCopy( pOther->ChildByIndex(ChildIdx) ); IProperty* pChild = CreateCopy( pOther->ChildByIndex(ChildIdx) );
mChildren.push_back( pChild ); mChildren.push_back( pChild );
} }
} }
bool CStructPropertyNew::ShouldSerialize() const bool CStructProperty::ShouldSerialize() const
{ {
if (IPropertyNew::ShouldSerialize()) if (IProperty::ShouldSerialize())
return true; return true;
for (u32 ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++) for (u32 ChildIdx = 0; ChildIdx < mChildren.size(); ChildIdx++)
@ -188,7 +188,7 @@ bool CStructPropertyNew::ShouldSerialize() const
return false; return false;
} }
TString CStructPropertyNew::GetTemplateFileName() TString CStructProperty::GetTemplateFileName()
{ {
ASSERT(IsArchetype() || mpArchetype); ASSERT(IsArchetype() || mpArchetype);
return IsArchetype() ? mTemplateFileName : mpArchetype->GetTemplateFileName(); return IsArchetype() ? mTemplateFileName : mpArchetype->GetTemplateFileName();

View File

@ -1,7 +1,7 @@
#ifndef CSTRUCTPROPERTY_H #ifndef CSTRUCTPROPERTY_H
#define CSTRUCTPROPERTY_H #define CSTRUCTPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CStructPropertyNew : public IPropertyNew class CStructPropertyNew : public IPropertyNew
{ {

View File

@ -1,7 +1,7 @@
#ifndef CVECTORPROPERTY_H #ifndef CVECTORPROPERTY_H
#define CVECTORPROPERTY_H #define CVECTORPROPERTY_H
#include "../IPropertyNew.h" #include "IProperty.h"
class CVectorProperty : public TSerializeableTypedProperty< CVector3f, EPropertyTypeNew::Vector > class CVectorProperty : public TSerializeableTypedProperty< CVector3f, EPropertyTypeNew::Vector >
{ {

View File

@ -1,9 +1,9 @@
#include "IPropertyNew.h" #include "IProperty.h"
#include "Property/CAssetProperty.h" #include "CAssetProperty.h"
#include "Property/CArrayProperty.h" #include "CArrayProperty.h"
#include "Property/CEnumProperty.h" #include "CEnumProperty.h"
#include "Property/CFlagsProperty.h" #include "CFlagsProperty.h"
#include "Property/CPointerProperty.h" #include "CPointerProperty.h"
#include "Core/Resource/Script/CMasterTemplate.h" #include "Core/Resource/Script/CMasterTemplate.h"
#include "Core/Resource/Script/CScriptTemplate.h" #include "Core/Resource/Script/CScriptTemplate.h"

View File

@ -87,7 +87,7 @@ inline const char* PropEnumToHashableTypeName(EPropertyTypeNew Type)
case EPropertyTypeNew::Spline: return "spline"; case EPropertyTypeNew::Spline: return "spline";
case EPropertyTypeNew::Guid: return "guid"; case EPropertyTypeNew::Guid: return "guid";
// unknown hashable types - used in hashes but these names are inaccurate // unknown hashable types - used in hashes but these names are inaccurate
case EPropertyTypeNew::Animation: return "animation"; // hashable but real name unknown case EPropertyTypeNew::Animation: return "animation";
case EPropertyTypeNew::Sequence: return "sequence"; case EPropertyTypeNew::Sequence: return "sequence";
// non hashable types - not used in ID hashes but still displayed on the UI // non hashable types - not used in ID hashes but still displayed on the UI
case EPropertyTypeNew::Byte: return "byte"; case EPropertyTypeNew::Byte: return "byte";

View File

@ -1,7 +1,7 @@
#ifndef PROPERTIES_H #ifndef PROPERTIES_H
#define PROPERTIES_H #define PROPERTIES_H
#include "../IPropertyNew.h" #include "IProperty.h"
#include "CAnimationProperty.h" #include "CAnimationProperty.h"
#include "CAnimationSetProperty.h" #include "CAnimationSetProperty.h"
#include "CArrayProperty.h" #include "CArrayProperty.h"

View File

@ -1,39 +0,0 @@
#ifndef TPROPERTYPROXY_H
#define TPROPERTYPROXY_H
#include <type_traits>
/**
* Lightweight proxy class representing a property instance. Easy to read/modify
* specific properties and efficient to pass around.
*/
template<class PropertyClass>
class TPropertyProxy
{
typedef PropertyClass::ValueType ValueType;
/** Property data buffer */
void* mpDataPtr;
/** Source property */
PropertyClass* mpProperty;
public:
TPropertyProxy()
: mpDataPtr(nullptr)
, mpProperty(nullptr)
{}
TPropertyProxy(void* pDataPtr, PropertyClass* pProperty)
: mpDataPtr(pDataPtr)
, mpProperty(pProperty)
{}
/** Returns whether this proxy points to a valid property instance */
bool IsValid() const
{
return mpDataPtr != nullptr && mpProperty != nullptr;
}
};
#endif // TPROPERTYPROXY_H

View File

@ -130,7 +130,7 @@ CStructRef CLightNode::GetProperties() const
return CStructRef(mpLight, mpLight->GetProperties()); return CStructRef(mpLight, mpLight->GetProperties());
} }
void CLightNode::PropertyModified(IPropertyNew* pProperty) void CLightNode::PropertyModified(IProperty* pProperty)
{ {
CSceneNode::PropertyModified(pProperty); CSceneNode::PropertyModified(pProperty);

View File

@ -16,7 +16,7 @@ public:
void RayAABoxIntersectTest(CRayCollisionTester& Tester, const SViewInfo& ViewInfo); void RayAABoxIntersectTest(CRayCollisionTester& Tester, const SViewInfo& ViewInfo);
SRayIntersection RayNodeIntersectTest(const CRay &Ray, u32 AssetID, const SViewInfo& ViewInfo); SRayIntersection RayNodeIntersectTest(const CRay &Ray, u32 AssetID, const SViewInfo& ViewInfo);
CStructRef GetProperties() const; CStructRef GetProperties() const;
void PropertyModified(IPropertyNew* pProperty); void PropertyModified(IProperty* pProperty);
bool AllowsRotate() const { return false; } bool AllowsRotate() const { return false; }
CLight* Light(); CLight* Light();
CVector2f BillboardScale(); CVector2f BillboardScale();

View File

@ -70,7 +70,7 @@ public:
virtual CColor TintColor(const SViewInfo& rkViewInfo) const; virtual CColor TintColor(const SViewInfo& rkViewInfo) const;
virtual CColor WireframeColor() const; virtual CColor WireframeColor() const;
virtual CStructRef GetProperties() const { return CStructRef(); } virtual CStructRef GetProperties() const { return CStructRef(); }
virtual void PropertyModified(IPropertyNew* pProperty) {} virtual void PropertyModified(IProperty* pProperty) {}
void OnLoadFinished(); void OnLoadFinished();
void Unparent(); void Unparent();

View File

@ -1,7 +1,7 @@
#include "CScriptAttachNode.h" #include "CScriptAttachNode.h"
#include "CScriptNode.h" #include "CScriptNode.h"
#include "Core/Render/CRenderer.h" #include "Core/Render/CRenderer.h"
#include "Core/Resource/Script/IProperty.h" #include "Core/Resource/Script/Property/IProperty.h"
#include <Common/AssertMacro.h> #include <Common/AssertMacro.h>
CScriptAttachNode::CScriptAttachNode(CScene *pScene, const SAttachment& rkAttachment, CScriptNode *pParent) CScriptAttachNode::CScriptAttachNode(CScene *pScene, const SAttachment& rkAttachment, CScriptNode *pParent)

View File

@ -12,7 +12,7 @@ class CScriptAttachNode : public CSceneNode
CScriptNode* mpScriptNode; CScriptNode* mpScriptNode;
TResPtr<CResource> mpAttachAsset; TResPtr<CResource> mpAttachAsset;
IPropertyNew* mpAttachAssetProp; IProperty* mpAttachAssetProp;
CAssetRef mAttachAssetRef; CAssetRef mAttachAssetRef;
CAnimationSetRef mAttachAnimSetRef; CAnimationSetRef mAttachAnimSetRef;
@ -33,7 +33,7 @@ public:
void RayAABoxIntersectTest(CRayCollisionTester& rTester, const SViewInfo& rkViewInfo); void RayAABoxIntersectTest(CRayCollisionTester& rTester, const SViewInfo& rkViewInfo);
SRayIntersection RayNodeIntersectTest(const CRay& rkRay, u32 AssetID, const SViewInfo& rkViewInfo); SRayIntersection RayNodeIntersectTest(const CRay& rkRay, u32 AssetID, const SViewInfo& rkViewInfo);
inline IPropertyNew* AttachProperty() const { return mpAttachAssetProp; } inline IProperty* AttachProperty() const { return mpAttachAssetProp; }
inline TString LocatorName() const { return mLocatorName; } inline TString LocatorName() const { return mLocatorName; }
protected: protected:

View File

@ -459,26 +459,26 @@ CStructRef CScriptNode::GetProperties() const
return CStructRef(mpInstance->PropertyData(), mpInstance->Template()->Properties()); return CStructRef(mpInstance->PropertyData(), mpInstance->Template()->Properties());
} }
void CScriptNode::PropertyModified(IPropertyNew* pProp) void CScriptNode::PropertyModified(IProperty* pProp)
{ {
// Update volume // Update volume
EPropertyTypeNew Type = pProp->Type(); EPropertyType Type = pProp->Type();
if ( Type == EPropertyTypeNew::Bool || Type == EPropertyTypeNew::Byte || Type == EPropertyTypeNew::Short || if ( Type == EPropertyType::Bool || Type == EPropertyType::Byte || Type == EPropertyType::Short ||
Type == EPropertyTypeNew::Int || Type == EPropertyTypeNew::Choice || Type == EPropertyTypeNew::Enum ) Type == EPropertyType::Int || Type == EPropertyType::Choice || Type == EPropertyType::Enum )
{ {
mpInstance->EvaluateVolume(); mpInstance->EvaluateVolume();
UpdatePreviewVolume(); UpdatePreviewVolume();
} }
// Update resources // Update resources
else if (Type == EPropertyTypeNew::AnimationSet) else if (Type == EPropertyType::AnimationSet)
{ {
mpInstance->EvaluateDisplayAsset(); mpInstance->EvaluateDisplayAsset();
SetDisplayAsset(mpInstance->DisplayAsset()); SetDisplayAsset(mpInstance->DisplayAsset());
} }
else if (Type == EPropertyTypeNew::Asset) else if (Type == EPropertyType::Asset)
{ {
CAssetProperty* pAssetProperty = TPropCast<CAssetProperty>(pProp); CAssetProperty* pAssetProperty = TPropCast<CAssetProperty>(pProp);
const CResTypeFilter& rkFilter = pAssetProperty->GetTypeFilter(); const CResTypeFilter& rkFilter = pAssetProperty->GetTypeFilter();

View File

@ -48,7 +48,7 @@ public:
CColor TintColor(const SViewInfo& rkViewInfo) const; CColor TintColor(const SViewInfo& rkViewInfo) const;
CColor WireframeColor() const; CColor WireframeColor() const;
CStructRef GetProperties() const; CStructRef GetProperties() const;
void PropertyModified(IPropertyNew* pProp); void PropertyModified(IProperty* pProp);
void LinksModified(); void LinksModified();
void UpdatePreviewVolume(); void UpdatePreviewVolume();

View File

@ -14,7 +14,7 @@ CDamageableTriggerExtra::CDamageableTriggerExtra(CScriptObject *pInstance, CScen
SetInheritance(true, false, false); SetInheritance(true, false, false);
CreateMaterial(); CreateMaterial();
CStructPropertyNew* pProperties = pInstance->Template()->Properties(); CStructProperty* pProperties = pInstance->Template()->Properties();
// Fetch render side // Fetch render side
mRenderSide = TEnumRef<ERenderSide>(pInstance->PropertyData(), pProperties->ChildByIndex(5)); mRenderSide = TEnumRef<ERenderSide>(pInstance->PropertyData(), pProperties->ChildByIndex(5));
@ -178,7 +178,7 @@ void CDamageableTriggerExtra::OnTransformed()
UpdatePlaneTransform(); UpdatePlaneTransform();
} }
void CDamageableTriggerExtra::PropertyModified(IPropertyNew* pProperty) void CDamageableTriggerExtra::PropertyModified(IProperty* pProperty)
{ {
if (pProperty == mRenderSide || pProperty == mPlaneSize) if (pProperty == mRenderSide || pProperty == mPlaneSize)
{ {

View File

@ -35,7 +35,7 @@ public:
ERenderSide RenderSideForDirection(const CVector3f& rkDir); ERenderSide RenderSideForDirection(const CVector3f& rkDir);
ERenderSide TransformRenderSide(ERenderSide Side); ERenderSide TransformRenderSide(ERenderSide Side);
void OnTransformed(); void OnTransformed();
void PropertyModified(IPropertyNew* pProperty); void PropertyModified(IProperty* pProperty);
bool ShouldDrawNormalAssets(); bool ShouldDrawNormalAssets();
void AddToRenderer(CRenderer *pRenderer, const SViewInfo& rkViewInfo); void AddToRenderer(CRenderer *pRenderer, const SViewInfo& rkViewInfo);
void Draw(FRenderOptions Options, int ComponentIndex, ERenderCommand Command, const SViewInfo& rkViewInfo); void Draw(FRenderOptions Options, int ComponentIndex, ERenderCommand Command, const SViewInfo& rkViewInfo);

View File

@ -4,7 +4,7 @@
CDoorExtra::CDoorExtra(CScriptObject* pInstance, CScene* pScene, CScriptNode* pParent) CDoorExtra::CDoorExtra(CScriptObject* pInstance, CScene* pScene, CScriptNode* pParent)
: CScriptExtra(pInstance, pScene, pParent) : CScriptExtra(pInstance, pScene, pParent)
{ {
CStructPropertyNew* pProperties = pInstance->Template()->Properties(); CStructProperty* pProperties = pInstance->Template()->Properties();
mShieldModelProp = CAssetRef(pInstance->PropertyData(), pProperties->ChildByID(0xB20CC271)); mShieldModelProp = CAssetRef(pInstance->PropertyData(), pProperties->ChildByID(0xB20CC271));
if (mShieldModelProp.IsValid()) PropertyModified(mShieldModelProp.Property()); if (mShieldModelProp.IsValid()) PropertyModified(mShieldModelProp.Property());
@ -22,7 +22,7 @@ CDoorExtra::CDoorExtra(CScriptObject* pInstance, CScene* pScene, CScriptNode* pP
} }
} }
void CDoorExtra::PropertyModified(IPropertyNew* pProperty) void CDoorExtra::PropertyModified(IProperty* pProperty)
{ {
if (pProperty == mShieldModelProp) if (pProperty == mShieldModelProp)
{ {

View File

@ -15,7 +15,7 @@ class CDoorExtra : public CScriptExtra
public: public:
explicit CDoorExtra(CScriptObject* pInstance, CScene* pScene, CScriptNode* pParent = 0); explicit CDoorExtra(CScriptObject* pInstance, CScene* pScene, CScriptNode* pParent = 0);
void PropertyModified(IPropertyNew* pProperty); void PropertyModified(IProperty* pProperty);
void AddToRenderer(CRenderer* pRenderer, const SViewInfo& rkViewInfo); void AddToRenderer(CRenderer* pRenderer, const SViewInfo& rkViewInfo);
void Draw(FRenderOptions Options, int ComponentIndex, ERenderCommand Command, const SViewInfo& rkViewInfo); void Draw(FRenderOptions Options, int ComponentIndex, ERenderCommand Command, const SViewInfo& rkViewInfo);
void DrawSelection(); void DrawSelection();

View File

@ -8,7 +8,7 @@ CPointOfInterestExtra::CPointOfInterestExtra(CScriptObject *pInstance, CScene *p
, mpScanData(nullptr) , mpScanData(nullptr)
{ {
// Fetch scan data property // Fetch scan data property
CStructPropertyNew* pProperties = pInstance->Template()->Properties(); CStructProperty* pProperties = pInstance->Template()->Properties();
if (mGame <= ePrime) mScanProperty = CAssetRef(pInstance->PropertyData(), pProperties->ChildByIDString("0x04:0x00")); if (mGame <= ePrime) mScanProperty = CAssetRef(pInstance->PropertyData(), pProperties->ChildByIDString("0x04:0x00"));
else mScanProperty = CAssetRef(pInstance->PropertyData(), pProperties->ChildByIDString("0xBDBEC295:0xB94E9BE7")); else mScanProperty = CAssetRef(pInstance->PropertyData(), pProperties->ChildByIDString("0xBDBEC295:0xB94E9BE7"));
@ -16,7 +16,7 @@ CPointOfInterestExtra::CPointOfInterestExtra(CScriptObject *pInstance, CScene *p
PropertyModified(mScanProperty.Property()); PropertyModified(mScanProperty.Property());
} }
void CPointOfInterestExtra::PropertyModified(IPropertyNew* pProperty) void CPointOfInterestExtra::PropertyModified(IProperty* pProperty)
{ {
if (mScanProperty.Property() == pProperty) if (mScanProperty.Property() == pProperty)
mpScanData = gpResourceStore->LoadResource<CScan>( mScanProperty.Get() ); mpScanData = gpResourceStore->LoadResource<CScan>( mScanProperty.Get() );

View File

@ -13,7 +13,7 @@ class CPointOfInterestExtra : public CScriptExtra
public: public:
explicit CPointOfInterestExtra(CScriptObject *pInstance, CScene *pScene, CScriptNode *pParent = 0); explicit CPointOfInterestExtra(CScriptObject *pInstance, CScene *pScene, CScriptNode *pParent = 0);
void PropertyModified(IPropertyNew* pProperty); void PropertyModified(IProperty* pProperty);
void ModifyTintColor(CColor& Color); void ModifyTintColor(CColor& Color);
CScan* GetScan() const { return mpScanData; } CScan* GetScan() const { return mpScanData; }

View File

@ -6,7 +6,7 @@ CRadiusSphereExtra::CRadiusSphereExtra(CScriptObject* pInstance, CScene* pScene,
: CScriptExtra(pInstance, pScene, pParent) : CScriptExtra(pInstance, pScene, pParent)
{ {
mObjectType = pInstance->ObjectTypeID(); mObjectType = pInstance->ObjectTypeID();
CStructPropertyNew* pProperties = pInstance->Template()->Properties(); CStructProperty* pProperties = pInstance->Template()->Properties();
switch (mObjectType) switch (mObjectType)
{ {

View File

@ -17,7 +17,7 @@ CSandwormExtra::CSandwormExtra(CScriptObject* pInstance, CScene* pScene, CScript
if (mPincersScale.IsValid()) PropertyModified(mPincersScale.Property()); if (mPincersScale.IsValid()) PropertyModified(mPincersScale.Property());
} }
void CSandwormExtra::PropertyModified(IPropertyNew* pProp) void CSandwormExtra::PropertyModified(IProperty* pProp)
{ {
if (pProp == mPincersScale) if (pProp == mPincersScale)
{ {

View File

@ -10,7 +10,7 @@ class CSandwormExtra : public CScriptExtra
public: public:
explicit CSandwormExtra(CScriptObject* pInstance, CScene* pScene, CScriptNode* pParent); explicit CSandwormExtra(CScriptObject* pInstance, CScene* pScene, CScriptNode* pParent);
void PropertyModified(IPropertyNew* pProp); void PropertyModified(IProperty* pProp);
}; };
#endif // CSANDWORMEXTRA_H #endif // CSANDWORMEXTRA_H

View File

@ -46,7 +46,7 @@ public:
// Virtual CScriptExtra functions // Virtual CScriptExtra functions
virtual void InstanceTransformed() {} virtual void InstanceTransformed() {}
virtual void PropertyModified(IPropertyNew* /*pProperty*/) {} virtual void PropertyModified(IProperty* /*pProperty*/) {}
virtual void DisplayAssetChanged(CResource* /*pNewDisplayAsset*/) {} virtual void DisplayAssetChanged(CResource* /*pNewDisplayAsset*/) {}
virtual void LinksModified() {} virtual void LinksModified() {}
virtual bool ShouldDrawNormalAssets() { return true; } virtual bool ShouldDrawNormalAssets() { return true; }

View File

@ -3,8 +3,8 @@
CSpacePirateExtra::CSpacePirateExtra(CScriptObject* pInstance, CScene* pScene, CScriptNode* pParent) CSpacePirateExtra::CSpacePirateExtra(CScriptObject* pInstance, CScene* pScene, CScriptNode* pParent)
: CScriptExtra(pInstance, pScene ,pParent) : CScriptExtra(pInstance, pScene ,pParent)
{ {
CStructPropertyNew* pBaseStruct = pInstance->Template()->Properties(); CStructProperty* pBaseStruct = pInstance->Template()->Properties();
CStructPropertyNew* pVulnerabilities = TPropCast<CStructPropertyNew>(pBaseStruct->ChildByIDString("0x04:0x10")); CStructProperty* pVulnerabilities = TPropCast<CStructProperty>(pBaseStruct->ChildByIDString("0x04:0x10"));
if (pVulnerabilities) if (pVulnerabilities)
{ {

View File

@ -2,7 +2,7 @@
#define CSPACEPIRATEEXTRA_H #define CSPACEPIRATEEXTRA_H
#include "CScriptExtra.h" #include "CScriptExtra.h"
#include "Core/Resource/Script/IProperty.h" #include "Core/Resource/Script/Property/IProperty.h"
enum class EVulnerabilityTypeMP1 enum class EVulnerabilityTypeMP1
{ {

View File

@ -9,7 +9,7 @@ CSplinePathExtra::CSplinePathExtra(CScriptObject* pInstance, CScene* pScene, CSc
mPathColor = CColorRef(pInstance->PropertyData(), pInstance->Template()->Properties()->ChildByID(0x00DD86E2)); mPathColor = CColorRef(pInstance->PropertyData(), pInstance->Template()->Properties()->ChildByID(0x00DD86E2));
} }
void CSplinePathExtra::PropertyModified(IPropertyNew* pProperty) void CSplinePathExtra::PropertyModified(IProperty* pProperty)
{ {
if (pProperty == mPathColor.Property()) if (pProperty == mPathColor.Property())
{ {

View File

@ -20,7 +20,7 @@ public:
inline CColor PathColor() const { return (mPathColor.IsValid() ? mPathColor.Get() : CColor::skBlack); } inline CColor PathColor() const { return (mPathColor.IsValid() ? mPathColor.Get() : CColor::skBlack); }
void PostLoad(); void PostLoad();
void PropertyModified(IPropertyNew* pProperty); void PropertyModified(IProperty* pProperty);
void FindAttachedWaypoints(std::set<CWaypointExtra*>& rChecked, CWaypointExtra* pWaypoint); void FindAttachedWaypoints(std::set<CWaypointExtra*>& rChecked, CWaypointExtra* pWaypoint);
void AddWaypoints(); void AddWaypoints();

View File

@ -2,7 +2,7 @@
#define CGENERATEPROPERTYNAMESDIALOG_H #define CGENERATEPROPERTYNAMESDIALOG_H
#include "CProgressBarNotifier.h" #include "CProgressBarNotifier.h"
#include <Core/Resource/Script/CPropertyNameGenerator.h> #include <Core/Resource/Script/Property/CPropertyNameGenerator.h>
#include <QDialog> #include <QDialog>
#include <QFuture> #include <QFuture>

View File

@ -6,7 +6,7 @@ CPropertyNameValidator::CPropertyNameValidator(QObject* pParent)
{} {}
/** Set the property to validate against */ /** Set the property to validate against */
void CPropertyNameValidator::SetProperty(IPropertyNew* pProp) void CPropertyNameValidator::SetProperty(IProperty* pProp)
{ {
mpProperty = pProp; mpProperty = pProp;
emit changed(); emit changed();

View File

@ -10,13 +10,13 @@ class CPropertyNameValidator : public QValidator
Q_OBJECT Q_OBJECT
/** The property being validated against */ /** The property being validated against */
IPropertyNew* mpProperty; IProperty* mpProperty;
public: public:
CPropertyNameValidator(QObject* pParent = 0); CPropertyNameValidator(QObject* pParent = 0);
/** Set the property to validate against */ /** Set the property to validate against */
void SetProperty(IPropertyNew* pProp); void SetProperty(IProperty* pProp);
/** Perform validation */ /** Perform validation */
QValidator::State validate(QString& rInput, int& rPos) const; QValidator::State validate(QString& rInput, int& rPos) const;

View File

@ -10,8 +10,7 @@
#include "Editor/Widgets/WIntegralSpinBox.h" #include "Editor/Widgets/WIntegralSpinBox.h"
#include <Core/Resource/Animation/CAnimSet.h> #include <Core/Resource/Animation/CAnimSet.h>
#include <Core/Resource/Script/IProperty.h> #include <Core/Resource/Script/Property/Properties.h>
#include <Core/Resource/Script/IPropertyTemplate.h>
#include <QCheckBox> #include <QCheckBox>
#include <QComboBox> #include <QComboBox>

View File

@ -28,7 +28,7 @@ public:
QWidget* CreateCharacterEditor(QWidget *pParent, const QModelIndex& rkIndex) const; QWidget* CreateCharacterEditor(QWidget *pParent, const QModelIndex& rkIndex) const;
void SetCharacterEditorData(QWidget *pEditor, const QModelIndex& rkIndex) const; void SetCharacterEditorData(QWidget *pEditor, const QModelIndex& rkIndex) const;
void SetCharacterModelData(QWidget *pEditor, const QModelIndex& rkIndex) const; void SetCharacterModelData(QWidget *pEditor, const QModelIndex& rkIndex) const;
EPropertyTypeNew DetermineCharacterPropType(EGame Game, const QModelIndex& rkIndex) const; EPropertyType DetermineCharacterPropType(EGame Game, const QModelIndex& rkIndex) const;
public slots: public slots:
void WidgetEdited(QWidget *pWidget, const QModelIndex& rkIndex); void WidgetEdited(QWidget *pWidget, const QModelIndex& rkIndex);

View File

@ -1,8 +1,7 @@
#include "CPropertyModel.h" #include "CPropertyModel.h"
#include "Editor/UICommon.h" #include "Editor/UICommon.h"
#include <Core/GameProject/CGameProject.h> #include <Core/GameProject/CGameProject.h>
#include <Core/Resource/Script/IProperty.h> #include <Core/Resource/Script/Property/IProperty.h>
#include <Core/Resource/Script/IPropertyTemplate.h>
#include <QFont> #include <QFont>
#include <QSize> #include <QSize>

View File

@ -11,32 +11,32 @@ class CPropertyModel : public QAbstractItemModel
struct SProperty struct SProperty
{ {
IPropertyNew* pProperty; IProperty* pProperty;
QModelIndex Index; QModelIndex Index;
int ParentID; int ParentID;
std::vector<int> ChildIDs; std::vector<int> ChildIDs;
}; };
QVector<SProperty> mProperties; QVector<SProperty> mProperties;
QMap<IPropertyNew*, int> mPropertyToIDMap; QMap<IProperty*, int> mPropertyToIDMap;
int mFirstUnusedID; int mFirstUnusedID;
CGameProject* mpProject; CGameProject* mpProject;
CScriptObject* mpObject; // may be null CScriptObject* mpObject; // may be null
IPropertyNew* mpRootProperty; IProperty* mpRootProperty;
void* mpPropertyData; void* mpPropertyData;
bool mBoldModifiedProperties; bool mBoldModifiedProperties;
bool mShowNameValidity; bool mShowNameValidity;
QFont mFont; QFont mFont;
int RecursiveBuildArrays(IPropertyNew* pProperty, int ParentID); int RecursiveBuildArrays(IProperty* pProperty, int ParentID);
public: public:
CPropertyModel(QObject *pParent = 0); CPropertyModel(QObject *pParent = 0);
void ConfigureIntrinsic(CGameProject* pProject, IPropertyNew* pRootProperty, void* pPropertyData); void ConfigureIntrinsic(CGameProject* pProject, IProperty* pRootProperty, void* pPropertyData);
void ConfigureScript(CGameProject* pProject, IPropertyNew* pRootProperty, CScriptObject* pObject); void ConfigureScript(CGameProject* pProject, IProperty* pRootProperty, CScriptObject* pObject);
IPropertyNew* PropertyForIndex(const QModelIndex& rkIndex, bool HandleFlaggedIndices) const; IProperty* PropertyForIndex(const QModelIndex& rkIndex, bool HandleFlaggedIndices) const;
QModelIndex IndexForProperty(IPropertyNew *pProp) const; QModelIndex IndexForProperty(IProperty *pProp) const;
void* DataPointerForIndex(const QModelIndex& rkIndex) const; void* DataPointerForIndex(const QModelIndex& rkIndex) const;
int columnCount(const QModelIndex& rkParent) const; int columnCount(const QModelIndex& rkParent) const;
@ -59,7 +59,7 @@ public:
inline CScriptObject* GetScriptObject() const { return mpObject; } inline CScriptObject* GetScriptObject() const { return mpObject; }
public slots: public slots:
void NotifyPropertyModified(class CScriptObject *pInst, IPropertyNew *pProp); void NotifyPropertyModified(class CScriptObject *pInst, IProperty *pProp);
void NotifyPropertyModified(const QModelIndex& rkIndex); void NotifyPropertyModified(const QModelIndex& rkIndex);
signals: signals:

View File

@ -1,7 +1,7 @@
#include "CPropertyView.h" #include "CPropertyView.h"
#include "CPropertyDelegate.h" #include "CPropertyDelegate.h"
#include "Editor/WorldEditor/CTemplateEditDialog.h" #include "Editor/WorldEditor/CTemplateEditDialog.h"
#include <Core/Resource/Script/IPropertyTemplate.h> #include <Core/Resource/Script/Property/Properties.h>
#include <QEvent> #include <QEvent>
#include <QMenu> #include <QMenu>

View File

@ -15,7 +15,7 @@ class CPropertyView : public QTreeView
CPropertyDelegate *mpDelegate; CPropertyDelegate *mpDelegate;
CScriptObject *mpObject; CScriptObject *mpObject;
IPropertyNew *mpMenuProperty; IProperty *mpMenuProperty;
QAction *mpShowNameValidityAction; QAction *mpShowNameValidityAction;
QAction *mpEditTemplateAction; QAction *mpEditTemplateAction;

View File

@ -13,7 +13,7 @@ protected:
QModelIndex mIndex; QModelIndex mIndex;
public: public:
CEditScriptPropertyCommand(IPropertyNew* pProperty, CEditScriptPropertyCommand(IProperty* pProperty,
CWorldEditor* pEditor, CWorldEditor* pEditor,
const QVector<CScriptObject*>& rkInstances, const QVector<CScriptObject*>& rkInstances,
QModelIndex Index = QModelIndex(), QModelIndex Index = QModelIndex(),

View File

@ -13,7 +13,7 @@ class CResizeScriptArrayCommand : public CEditScriptPropertyCommand
int mNewRowCount; int mNewRowCount;
public: public:
CResizeScriptArrayCommand(IPropertyNew* pProperty, CResizeScriptArrayCommand(IProperty* pProperty,
CWorldEditor* pEditor, CWorldEditor* pEditor,
const QVector<CScriptObject*>& rkInstances, const QVector<CScriptObject*>& rkInstances,
CPropertyModel* pModel = nullptr, CPropertyModel* pModel = nullptr,

View File

@ -30,7 +30,7 @@ void IEditPropertyCommand::RestoreObjectStateFromArray(std::vector<char>& rArray
} }
IEditPropertyCommand::IEditPropertyCommand( IEditPropertyCommand::IEditPropertyCommand(
IPropertyNew* pProperty, IProperty* pProperty,
const QString& rkCommandName /*= "Edit Property"*/ const QString& rkCommandName /*= "Edit Property"*/
) )
: IUndoCommand(rkCommandName) : IUndoCommand(rkCommandName)

View File

@ -12,7 +12,7 @@ protected:
std::vector<char> mOldData; std::vector<char> mOldData;
std::vector<char> mNewData; std::vector<char> mNewData;
IPropertyNew* mpProperty; IProperty* mpProperty;
bool mCommandEnded; bool mCommandEnded;
bool mSavedOldData; bool mSavedOldData;
bool mSavedNewData; bool mSavedNewData;
@ -25,7 +25,7 @@ protected:
public: public:
IEditPropertyCommand( IEditPropertyCommand(
IPropertyNew* pProperty, IProperty* pProperty,
const QString& rkCommandName = "Edit Property" const QString& rkCommandName = "Edit Property"
); );

View File

@ -44,7 +44,7 @@ CInstancesModel::CInstancesModel(CWorldEditor *pEditor, QObject *pParent)
connect(mpEditor, SIGNAL(NodeSpawned(CSceneNode*)), this, SLOT(NodeCreated(CSceneNode*))); connect(mpEditor, SIGNAL(NodeSpawned(CSceneNode*)), this, SLOT(NodeCreated(CSceneNode*)));
connect(mpEditor, SIGNAL(NodeAboutToBeDeleted(CSceneNode*)), this, SLOT(NodeAboutToBeDeleted(CSceneNode*))); connect(mpEditor, SIGNAL(NodeAboutToBeDeleted(CSceneNode*)), this, SLOT(NodeAboutToBeDeleted(CSceneNode*)));
connect(mpEditor, SIGNAL(NodeDeleted()), this, SLOT(NodeDeleted())); connect(mpEditor, SIGNAL(NodeDeleted()), this, SLOT(NodeDeleted()));
connect(mpEditor, SIGNAL(PropertyModified(CScriptObject*,IPropertyNew*)), this, SLOT(PropertyModified(CScriptObject*,IPropertyNew*))); connect(mpEditor, SIGNAL(PropertyModified(CScriptObject*,IProperty*)), this, SLOT(PropertyModified(CScriptObject*,IProperty*)));
connect(mpEditor, SIGNAL(InstancesLayerAboutToChange()), this, SLOT(InstancesLayerPreChange())); connect(mpEditor, SIGNAL(InstancesLayerAboutToChange()), this, SLOT(InstancesLayerPreChange()));
connect(mpEditor, SIGNAL(InstancesLayerChanged(QList<CScriptNode*>)), this, SLOT(InstancesLayerPostChange(QList<CScriptNode*>))); connect(mpEditor, SIGNAL(InstancesLayerChanged(QList<CScriptNode*>)), this, SLOT(InstancesLayerPostChange(QList<CScriptNode*>)));
} }
@ -474,7 +474,7 @@ void CInstancesModel::NodeDeleted()
} }
} }
void CInstancesModel::PropertyModified(CScriptObject *pInst, IPropertyNew *pProp) void CInstancesModel::PropertyModified(CScriptObject *pInst, IProperty *pProp)
{ {
if (pProp->Name() == "Name") if (pProp->Name() == "Name")
{ {

View File

@ -67,7 +67,7 @@ public slots:
void NodeAboutToBeDeleted(CSceneNode *pNode); void NodeAboutToBeDeleted(CSceneNode *pNode);
void NodeDeleted(); void NodeDeleted();
void PropertyModified(CScriptObject *pInst, IPropertyNew *pProp); void PropertyModified(CScriptObject *pInst, IProperty *pProp);
void InstancesLayerPreChange(); void InstancesLayerPreChange();
void InstancesLayerPostChange(const QList<CScriptNode*>& rkInstanceList); void InstancesLayerPostChange(const QList<CScriptNode*>& rkInstanceList);

View File

@ -6,7 +6,7 @@
#include <Core/Resource/Factory/CTemplateLoader.h> #include <Core/Resource/Factory/CTemplateLoader.h>
#include <Core/Resource/Script/CMasterTemplate.h> #include <Core/Resource/Script/CMasterTemplate.h>
CTemplateEditDialog::CTemplateEditDialog(IPropertyNew *pProperty, QWidget *pParent) CTemplateEditDialog::CTemplateEditDialog(IProperty *pProperty, QWidget *pParent)
: QDialog(pParent) : QDialog(pParent)
, mpUI(new Ui::CTemplateEditDialog) , mpUI(new Ui::CTemplateEditDialog)
, mpValidator(new CPropertyNameValidator(this)) , mpValidator(new CPropertyNameValidator(this))
@ -93,7 +93,7 @@ void CTemplateEditDialog::ApplyChanges()
CMasterTemplate::RenameProperty(mpProperty, NewName); CMasterTemplate::RenameProperty(mpProperty, NewName);
// Add modified templates to pending resave list // Add modified templates to pending resave list
const std::vector<IPropertyNew*> *pList = CMasterTemplate::TemplatesWithMatchingID(mpProperty); const std::vector<IProperty*> *pList = CMasterTemplate::TemplatesWithMatchingID(mpProperty);
if (pList) if (pList)
{ {
@ -126,9 +126,9 @@ void CTemplateEditDialog::ApplyChanges()
} }
// ************ PROTECTED ************ // ************ PROTECTED ************
void CTemplateEditDialog::AddTemplate(IPropertyNew* pProp) void CTemplateEditDialog::AddTemplate(IProperty* pProp)
{ {
IPropertyNew* pArchetype = pProp->Archetype(); IProperty* pArchetype = pProp->Archetype();
if (pArchetype) if (pArchetype)
{ {
@ -137,9 +137,9 @@ void CTemplateEditDialog::AddTemplate(IPropertyNew* pProp)
switch (pArchetype->Type()) switch (pArchetype->Type())
{ {
case EPropertyTypeNew::Struct: case EPropertyType::Struct:
{ {
CStructPropertyNew* pStruct = TPropCast<CStructPropertyNew>(pArchetype); CStructProperty* pStruct = TPropCast<CStructProperty>(pArchetype);
if (!mStructTemplatesToResave.contains(pStruct)) if (!mStructTemplatesToResave.contains(pStruct))
{ {
mStructTemplatesToResave << pStruct; mStructTemplatesToResave << pStruct;
@ -179,13 +179,13 @@ void CTemplateEditDialog::UpdateDescription(const TString& rkNewDesc)
if (!SourceFile.IsEmpty()) if (!SourceFile.IsEmpty())
{ {
const std::vector<IPropertyNew*>* pkTemplates = CMasterTemplate::TemplatesWithMatchingID(mpProperty); const std::vector<IProperty*>* pkTemplates = CMasterTemplate::TemplatesWithMatchingID(mpProperty);
if (pkTemplates) if (pkTemplates)
{ {
for (u32 TemplateIdx = 0; TemplateIdx < pkTemplates->size(); TemplateIdx++) for (u32 TemplateIdx = 0; TemplateIdx < pkTemplates->size(); TemplateIdx++)
{ {
IPropertyNew* pProp = pkTemplates->at(TemplateIdx); IProperty* pProp = pkTemplates->at(TemplateIdx);
if (pProp->GetTemplateFileName() == SourceFile && pProp->Description() == mOriginalDescription) if (pProp->GetTemplateFileName() == SourceFile && pProp->Description() == mOriginalDescription)
pProp->SetDescription(rkNewDesc); pProp->SetDescription(rkNewDesc);
@ -194,14 +194,14 @@ void CTemplateEditDialog::UpdateDescription(const TString& rkNewDesc)
} }
// Update equivalent properties with new description // Update equivalent properties with new description
foreach (IPropertyNew* pProperty, mEquivalentProperties) foreach (IProperty* pProperty, mEquivalentProperties)
{ {
pProperty->SetDescription(rkNewDesc); pProperty->SetDescription(rkNewDesc);
AddTemplate(pProperty); AddTemplate(pProperty);
} }
} }
void CTemplateEditDialog::FindEquivalentProperties(IPropertyNew *pTemp) void CTemplateEditDialog::FindEquivalentProperties(IProperty *pTemp)
{ {
//FIXME //FIXME
/* /*

View File

@ -2,7 +2,7 @@
#define CTEMPLATEEDITDIALOG_H #define CTEMPLATEEDITDIALOG_H
#include "Editor/CPropertyNameValidator.h" #include "Editor/CPropertyNameValidator.h"
#include <Core/Resource/Script/IPropertyTemplate.h> #include <Core/Resource/Script/Property/Properties.h>
#include <Core/Resource/Script/CMasterTemplate.h> #include <Core/Resource/Script/CMasterTemplate.h>
#include <QDialog> #include <QDialog>

View File

@ -569,7 +569,7 @@ void CWorldEditor::OnLinksModified(const QList<CScriptObject*>& rkInstances)
emit InstanceLinksModified(rkInstances); emit InstanceLinksModified(rkInstances);
} }
void CWorldEditor::OnPropertyModified(CScriptObject* pObject, IPropertyNew *pProp) void CWorldEditor::OnPropertyModified(CScriptObject* pObject, IProperty *pProp)
{ {
CScriptNode *pScript = mScene.NodeForInstance(pObject); CScriptNode *pScript = mScene.NodeForInstance(pObject);
@ -592,7 +592,7 @@ void CWorldEditor::OnPropertyModified(CScriptObject* pObject, IPropertyNew *pPro
} }
// If this is a model/character, then we'll treat this as a modified selection. This is to make sure the selection bounds updates. // If this is a model/character, then we'll treat this as a modified selection. This is to make sure the selection bounds updates.
if (pProp->Type() == EPropertyTypeNew::Asset) if (pProp->Type() == EPropertyType::Asset)
{ {
CAssetProperty *pAsset = TPropCast<CAssetProperty>(pProp); CAssetProperty *pAsset = TPropCast<CAssetProperty>(pProp);
const CResTypeFilter& rkFilter = pAsset->GetTypeFilter(); const CResTypeFilter& rkFilter = pAsset->GetTypeFilter();
@ -600,7 +600,7 @@ void CWorldEditor::OnPropertyModified(CScriptObject* pObject, IPropertyNew *pPro
if (rkFilter.Accepts(eModel) || rkFilter.Accepts(eAnimSet) || rkFilter.Accepts(eCharacter)) if (rkFilter.Accepts(eModel) || rkFilter.Accepts(eAnimSet) || rkFilter.Accepts(eCharacter))
SelectionModified(); SelectionModified();
} }
else if (pProp->Type() == EPropertyTypeNew::AnimationSet) else if (pProp->Type() == EPropertyType::AnimationSet)
SelectionModified(); SelectionModified();
// Emit signal so other widgets can react to the property change // Emit signal so other widgets can react to the property change

View File

@ -122,7 +122,7 @@ public slots:
void OnActiveProjectChanged(CGameProject *pProj); void OnActiveProjectChanged(CGameProject *pProj);
void OnLinksModified(const QList<CScriptObject*>& rkInstances); void OnLinksModified(const QList<CScriptObject*>& rkInstances);
void OnPropertyModified(CScriptObject* pObject, IPropertyNew *pProp); void OnPropertyModified(CScriptObject* pObject, IProperty *pProp);
void SetSelectionActive(bool Active); void SetSelectionActive(bool Active);
void SetSelectionInstanceNames(const QString& rkNewName, bool IsDone); void SetSelectionInstanceNames(const QString& rkNewName, bool IsDone);
void SetSelectionLayer(CScriptLayer *pLayer); void SetSelectionLayer(CScriptLayer *pLayer);
@ -187,7 +187,7 @@ signals:
void InstancesLayerAboutToChange(); void InstancesLayerAboutToChange();
void InstancesLayerChanged(const QList<CScriptNode*>& rkInstanceList); void InstancesLayerChanged(const QList<CScriptNode*>& rkInstanceList);
void InstanceLinksModified(const QList<CScriptObject*>& rkInstances); void InstanceLinksModified(const QList<CScriptObject*>& rkInstances);
void PropertyModified(CScriptObject *pInst, IPropertyNew *pProp); void PropertyModified(CScriptObject *pInst, IProperty *pProp);
}; };
#endif // CWORLDEDITOR_H #endif // CWORLDEDITOR_H

View File

@ -65,7 +65,7 @@ void WEditorProperties::SyncToEditor(CWorldEditor *pEditor)
connect(mpEditor, SIGNAL(SelectionModified()), this, SLOT(OnSelectionModified())); connect(mpEditor, SIGNAL(SelectionModified()), this, SLOT(OnSelectionModified()));
connect(mpEditor, SIGNAL(LayersModified()), this, SLOT(OnLayersModified())); connect(mpEditor, SIGNAL(LayersModified()), this, SLOT(OnLayersModified()));
connect(mpEditor, SIGNAL(InstancesLayerChanged(QList<CScriptNode*>)), this, SLOT(OnInstancesLayerChanged(QList<CScriptNode*>))); connect(mpEditor, SIGNAL(InstancesLayerChanged(QList<CScriptNode*>)), this, SLOT(OnInstancesLayerChanged(QList<CScriptNode*>)));
connect(mpEditor, SIGNAL(PropertyModified(CScriptObject*,IPropertyNew*)), this, SLOT(OnPropertyModified(CScriptObject*,IPropertyNew*))); connect(mpEditor, SIGNAL(PropertyModified(CScriptObject*,IProperty*)), this, SLOT(OnPropertyModified(CScriptObject*,IProperty*)));
OnLayersModified(); OnLayersModified();
} }
@ -139,7 +139,7 @@ void WEditorProperties::OnSelectionModified()
SetLayerComboBox(); SetLayerComboBox();
} }
void WEditorProperties::OnPropertyModified(CScriptObject *pInstance, IPropertyNew *pProp) void WEditorProperties::OnPropertyModified(CScriptObject *pInstance, IProperty *pProp)
{ {
if (!mpInstanceNameLineEdit->hasFocus()) if (!mpInstanceNameLineEdit->hasFocus())
{ {

View File

@ -39,7 +39,7 @@ public:
public slots: public slots:
void OnSelectionModified(); void OnSelectionModified();
void OnPropertyModified(CScriptObject *pInst, IPropertyNew *pProp); void OnPropertyModified(CScriptObject *pInst, IProperty *pProp);
void OnInstancesLayerChanged(const QList<CScriptNode*>& rkNodeList); void OnInstancesLayerChanged(const QList<CScriptNode*>& rkNodeList);
void OnLayersModified(); void OnLayersModified();
void UpdatePropertyValues(); void UpdatePropertyValues();