Renamed file properties to asset properties and modified asset properties to store a CAssetID instead of a CResourceInfo

This commit is contained in:
parax0
2016-09-01 00:24:46 -06:00
parent f6ae1376ac
commit 0929b20ba1
556 changed files with 2992 additions and 3461 deletions

View File

@@ -1,6 +1,5 @@
#include "CAnimationParameters.h"
#include "CAnimSet.h"
#include "CResourceInfo.h"
#include "Core/GameProject/CResourceStore.h"
#include <Common/Log.h>
#include <iostream>
@@ -32,14 +31,14 @@ CAnimationParameters::CAnimationParameters(IInputStream& rSCLY, EGame Game)
{
if (Game <= eEchoes)
{
mCharacter = CResourceInfo(rSCLY.ReadLong(), "ANCS");
mCharacterID = CAssetID(rSCLY, Game);
mCharIndex = rSCLY.ReadLong();
mAnimIndex = rSCLY.ReadLong();
}
else if (Game <= eCorruption)
{
mCharacter = CResourceInfo(rSCLY.ReadLongLong(), "CHAR");
mCharacterID = CAssetID(rSCLY, Game);
mAnimIndex = rSCLY.ReadLong();
}
@@ -56,7 +55,7 @@ CAnimationParameters::CAnimationParameters(IInputStream& rSCLY, EGame Game)
return;
}
mCharacter = CResourceInfo(rSCLY.ReadLongLong(), "CHAR");
mCharacterID = CAssetID(rSCLY, Game);
// 0x20 - Default Anim is present
if (Flags & 0x20)
@@ -82,9 +81,9 @@ void CAnimationParameters::Write(IOutputStream& rSCLY)
{
if (mGame <= eEchoes)
{
if (mCharacter.IsValid())
if (mCharacterID.IsValid())
{
rSCLY.WriteLong(mCharacter.ID().ToLong());
mCharacterID.Write(rSCLY);
rSCLY.WriteLong(mCharIndex);
rSCLY.WriteLong(mAnimIndex);
}
@@ -98,9 +97,9 @@ void CAnimationParameters::Write(IOutputStream& rSCLY)
else if (mGame <= eCorruption)
{
if (mCharacter.IsValid())
if (mCharacterID.IsValid())
{
rSCLY.WriteLongLong(mCharacter.ID().ToLongLong());
mCharacterID.Write(rSCLY);
rSCLY.WriteLong(mAnimIndex);
}
@@ -113,7 +112,7 @@ void CAnimationParameters::Write(IOutputStream& rSCLY)
else
{
if (!mCharacter.IsValid())
if (!mCharacterID.IsValid())
rSCLY.WriteByte((u8) 0x80);
else
@@ -123,7 +122,7 @@ void CAnimationParameters::Write(IOutputStream& rSCLY)
if (mUnknown2 != 0 || mUnknown3 != 0) Flag |= 0x40;
rSCLY.WriteByte(Flag);
rSCLY.WriteLongLong(mCharacter.ID().ToLongLong());
mCharacterID.Write(rSCLY);
if (Flag & 0x20)
rSCLY.WriteLong(mAnimIndex);
@@ -139,9 +138,9 @@ void CAnimationParameters::Write(IOutputStream& rSCLY)
CModel* CAnimationParameters::GetCurrentModel(s32 NodeIndex /*= -1*/)
{
if (!mCharacter.IsValid()) return nullptr;
if (!mCharacterID.IsValid()) return nullptr;
CAnimSet *pSet = (CAnimSet*) mCharacter.Load();
CAnimSet *pSet = AnimSet();
if (!pSet) return nullptr;
if (pSet->Type() != eAnimSet) return nullptr;
if (NodeIndex == -1) NodeIndex = mCharIndex;
@@ -152,9 +151,9 @@ CModel* CAnimationParameters::GetCurrentModel(s32 NodeIndex /*= -1*/)
TString CAnimationParameters::GetCurrentCharacterName(s32 NodeIndex /*= -1*/)
{
if (!mCharacter.IsValid()) return "";
if (!mCharacterID.IsValid()) return "";
CAnimSet *pSet = (CAnimSet*) mCharacter.Load();
CAnimSet *pSet = AnimSet();
if (!pSet) return "";
if (pSet->Type() != eAnimSet) return "";
if (NodeIndex == -1) NodeIndex = mCharIndex;
@@ -177,15 +176,22 @@ u32 CAnimationParameters::Unknown(u32 Index)
}
}
void CAnimationParameters::SetResource(CResourceInfo Res)
void CAnimationParameters::SetResource(const CAssetID& rkID)
{
if (Res.Type() == "ANCS" || Res.Type() == "CHAR")
mCharacterID = rkID;
mCharIndex = 0;
mAnimIndex = 0;
// Validate ID
if (mCharacterID.IsValid())
{
mCharacter = Res;
mCharIndex = 0;
CResourceEntry *pEntry = gpResourceStore->FindEntry(rkID);
if (!pEntry)
Log::Error("Invalid resource ID passed to CAnimationParameters: " + rkID.ToString());
else if (pEntry->ResourceType() != eAnimSet)
Log::Error("Resource with invalid type passed to CAnimationParameters: " + pEntry->CookedAssetPath().GetFileName());
}
else
Log::Error("Resource with invalid type passed to CAnimationParameters: " + Res.ToString());
}
void CAnimationParameters::SetUnknown(u32 Index, u32 Value)

View File

@@ -2,7 +2,6 @@
#define CANIMATIONPARAMETERS_H
#include "CAnimSet.h"
#include "CResourceInfo.h"
#include "TResPtr.h"
#include "Core/Resource/Model/CModel.h"
#include <Common/EGame.h>
@@ -10,7 +9,7 @@
class CAnimationParameters
{
EGame mGame;
CResourceInfo mCharacter;
CAssetID mCharacterID;
u32 mCharIndex;
u32 mAnimIndex;
@@ -28,22 +27,22 @@ public:
// Accessors
inline EGame Version() const { return mGame; }
inline CAssetID ID() const { return mCharacter.ID(); }
inline CAnimSet* AnimSet() const { return (CAnimSet*) mCharacter.Load(); }
inline CAssetID ID() const { return mCharacterID; }
inline CAnimSet* AnimSet() const { return (CAnimSet*) gpResourceStore->LoadResource(mCharacterID, (mGame < eCorruptionProto ? "ANCS" : "CHAR")); }
inline u32 CharacterIndex() const { return mCharIndex; }
inline u32 AnimIndex() const { return mAnimIndex; }
inline void SetCharIndex(u32 Index) { mCharIndex = Index; }
inline void SetAnimIndex(u32 Index) { mAnimIndex = Index; }
u32 Unknown(u32 Index);
void SetResource(CResourceInfo Res);
void SetResource(const CAssetID& rkID);
void SetUnknown(u32 Index, u32 Value);
// Operators
inline bool operator==(const CAnimationParameters& rkOther) const
{
return ( (mGame == rkOther.mGame) &&
(mCharacter == rkOther.mCharacter) &&
(mCharacterID == rkOther.mCharacterID) &&
(mCharIndex == rkOther.mCharIndex) &&
(mAnimIndex == rkOther.mAnimIndex) &&
(mUnknown2 == rkOther.mUnknown2) &&

View File

@@ -1,88 +0,0 @@
#ifndef CRESOURCEINFO
#define CRESOURCEINFO
#include "CResource.h"
#include "Core/GameProject/CResourceStore.h"
#include <Common/CAssetID.h>
#include <Common/CFourCC.h>
#include <Common/FileUtil.h>
class CResourceInfo
{
TString mPath;
bool mIsPath;
bool mIsValidPath;
public:
CResourceInfo()
: mPath("FFFFFFFFFFFFFFFF"), mIsPath(false), mIsValidPath(false) {}
CResourceInfo(const TString& rkPath)
: mPath(rkPath), mIsPath(true)
{
mIsValidPath = FileUtil::Exists(rkPath);
}
CResourceInfo(const CAssetID& rkID, CFourCC Type)
: mIsPath(false), mIsValidPath(false)
{
mPath = rkID.ToString() + "." + Type.ToString();
}
inline CAssetID ID() const
{
TString FileName = mPath.GetFileName(false);
if (!mIsPath)
return CAssetID::FromString(FileName);
else
{
if (FileName.IsHexString() && (FileName.Size() == 8 || FileName.Size() == 16))
return CAssetID::FromString(FileName);
else
return CAssetID::skInvalidID64;
}
}
inline CFourCC Type() const
{
return mPath.GetFileExtension();
}
inline TString ToString() const
{
return mPath;
}
inline CResource* Load() const
{
if (!IsValid())
return nullptr;
if (mIsPath)
return gpResourceStore->LoadResource(mPath);
else
return gpResourceStore->LoadResource(ID(), Type());
}
inline bool IsValid() const
{
if (!mIsPath)
return ID().IsValid();
else
return mIsValidPath;
}
inline bool operator==(const CResourceInfo& rkOther) const
{
return (mPath.GetFileName() == rkOther.mPath.GetFileName());
}
inline bool operator!=(const CResourceInfo& rkOther) const
{
return (!(*this == rkOther));
}
};
#endif // CRESOURCEINFO

View File

@@ -86,13 +86,10 @@ void CScriptCooker::WriteProperty(IProperty *pProp, bool InSingleStruct)
break;
}
case eFileProperty:
case eAssetProperty:
{
TFileProperty *pFileCast = static_cast<TFileProperty*>(pProp);
if (mVersion <= eEchoes)
mpSCLY->WriteLong(pFileCast->Get().ID().ToLong());
else
mpSCLY->WriteLongLong(pFileCast->Get().ID().ToLongLong());
TAssetProperty *pAssetCast = static_cast<TAssetProperty*>(pProp);
pAssetCast->Get().Write(*mpSCLY);
break;
}

View File

@@ -620,11 +620,11 @@ void CTemplateWriter::SaveProperties(XMLDocument *pDoc, XMLElement *pParent, CSt
pElem->LinkEndChild(pCookPref);
}
// File-specific parameters
if (pProp->Type() == eFileProperty)
// Asset-specific parameters
if (pProp->Type() == eAssetProperty)
{
CFileTemplate *pFile = static_cast<CFileTemplate*>(pProp);
const TStringList& rkExtensions = pFile->Extensions();
CAssetTemplate *pAsset = static_cast<CAssetTemplate*>(pProp);
const TStringList& rkExtensions = pAsset->AllowedExtensions();
TString ExtensionsString;
for (auto it = rkExtensions.begin(); it != rkExtensions.end(); it++)
@@ -790,17 +790,17 @@ void CTemplateWriter::SavePropertyOverrides(XMLDocument *pDoc, XMLElement *pPare
pElem->LinkEndChild(pCookPref);
}
// File-specific parameters
if (pProp->Type() == eFileProperty)
// Asset-specific parameters
if (pProp->Type() == eAssetProperty)
{
CFileTemplate *pFile = static_cast<CFileTemplate*>(pProp);
CFileTemplate *pSourceFile = static_cast<CFileTemplate*>(pSource);
CAssetTemplate *pAsset = static_cast<CAssetTemplate*>(pProp);
CAssetTemplate *pSourceAsset = static_cast<CAssetTemplate*>(pSource);
if (pFile->Extensions() != pSourceFile->Extensions())
if (pAsset->AllowedExtensions() != pSourceAsset->AllowedExtensions())
{
TString ExtensionsString;
for (auto it = pFile->Extensions().begin(); it != pFile->Extensions().end(); it++)
for (auto it = pAsset->AllowedExtensions().begin(); it != pAsset->AllowedExtensions().end(); it++)
ExtensionsString += *it + ",";
ExtensionsString = ExtensionsString.ChopBack(1);

View File

@@ -106,22 +106,37 @@ void CScriptLoader::ReadProperty(IProperty *pProp, u32 Size, IInputStream& rSCLY
break;
}
case eFileProperty:
case eAssetProperty:
{
TFileProperty *pFileCast = static_cast<TFileProperty*>(pProp);
TAssetProperty *pAssetCast = static_cast<TAssetProperty*>(pProp);
CAssetID ID(rSCLY, mVersion);
pAssetCast->Set(ID);
CAssetID ResID(rSCLY, mVersion);
const TStringList& rkExtensions = static_cast<CFileTemplate*>(pTemp)->Extensions();
CResourceInfo Info(ResID, CFourCC(!rkExtensions.empty() ? rkExtensions.front() : "UNKN"));
if (ResID.IsValid())
// Verify this is a valid resource type for this property
if (ID.IsValid())
{
CFourCC Type = gpResourceStore->ResourceTypeByID(ResID, rkExtensions);
Info = CResourceInfo(ResID, Type);
CResourceEntry *pEntry = gpResourceStore->FindEntry(ID);
if (pEntry)
{
TString CookedExt = pEntry->CookedExtension().ToString();
const TStringList& rkExtensions = static_cast<CAssetTemplate*>(pTemp)->AllowedExtensions();
bool Valid = false;
for (auto It = rkExtensions.begin(); It != rkExtensions.end(); It++)
{
if (*It == CookedExt)
{
Valid = true;
break;
}
}
if (!Valid)
Log::FileWarning(rSCLY.GetSourceString(), rSCLY.Tell() - ID.Length(), "Asset property " + pTemp->IDString(true) + " in object " + pTemp->ScriptTemplate()->Name() + " has a reference to an illegal asset type: " + CookedExt);
}
}
pFileCast->Set(Info);
break;
}

View File

@@ -106,12 +106,16 @@ IPropertyTemplate* CTemplateLoader::LoadProperty(XMLElement *pElem, CScriptTempl
}
// File-specific parameters
if (Type == eFileProperty)
if (Type == eAssetProperty)
{
CFileTemplate *pFile = static_cast<CFileTemplate*>(pProp);
TString ExtensionsAttr = pElem->Attribute("extensions");
TStringList ExtensionsList = ExtensionsAttr.Split(", ");
pFile->SetAllowedExtensions(ExtensionsList);
if (!ExtensionsAttr.IsEmpty())
{
TStringList ExtensionsList = ExtensionsAttr.Split(", ");
CAssetTemplate *pAsset = static_cast<CAssetTemplate*>(pProp);
pAsset->SetAllowedExtensions(ExtensionsList);
}
}
// Enum-specific parameters
@@ -186,7 +190,7 @@ IPropertyTemplate* CTemplateLoader::CreateProperty(u32 ID, EPropertyType Type, c
case eStringProperty: pOut = CREATE_PROP_TEMP(TStringTemplate); break;
case eVector3Property: pOut = CREATE_PROP_TEMP(TVector3Template); break;
case eColorProperty: pOut = CREATE_PROP_TEMP(TColorTemplate); break;
case eFileProperty: pOut = CREATE_PROP_TEMP(CFileTemplate); break;
case eAssetProperty: pOut = CREATE_PROP_TEMP(CAssetTemplate); break;
case eCharacterProperty: pOut = CREATE_PROP_TEMP(TCharacterTemplate); break;
case eMayaSplineProperty: pOut = CREATE_PROP_TEMP(TMayaSplineTemplate); break;
case eEnumProperty: pOut = CREATE_PROP_TEMP(CEnumTemplate); break;
@@ -601,7 +605,7 @@ CScriptTemplate* CTemplateLoader::LoadScriptTemplate(XMLDocument *pDoc, const TS
if (!pProp)
Log::Error(rkTemplateName + ": Invalid property for attachment " + TString::FromInt32(AttachIdx) + ": " + Attachment.AttachProperty);
else if (pProp->Type() != eCharacterProperty && (pProp->Type() != eFileProperty || !static_cast<CFileTemplate*>(pProp)->AcceptsExtension("CMDL")))
else if (pProp->Type() != eCharacterProperty && (pProp->Type() != eAssetProperty || !static_cast<CAssetTemplate*>(pProp)->AcceptsExtension("CMDL")))
Log::Error(rkTemplateName + ": Property referred to by attachment " + TString::FromInt32(AttachIdx) + " is not an attachable asset! Must be a file property that accepts CMDLs, or a character property.");
else

View File

@@ -185,8 +185,9 @@ CResource* CScriptTemplate::FindDisplayAsset(CPropertyStruct *pProperties, u32&
else
{
TFileProperty *pFile = static_cast<TFileProperty*>(pProp);
pRes = pFile->Get().Load();
TAssetProperty *pAsset = static_cast<TAssetProperty*>(pProp);
CResourceEntry *pEntry = gpResourceStore->FindEntry(pAsset->Get());
if (pEntry) pRes = pEntry->Load();
}
}
@@ -218,10 +219,10 @@ CCollisionMeshGroup* CScriptTemplate::FindCollision(CPropertyStruct *pProperties
{
IProperty *pProp = pProperties->PropertyByIDString(it->AssetLocation);
if (pProp->Type() == eFileProperty)
if (pProp->Type() == eAssetProperty)
{
TFileProperty *pFile = static_cast<TFileProperty*>(pProp);
pRes = pFile->Get().Load();
TAssetProperty *pAsset = static_cast<TAssetProperty*>(pProp);
pRes = gpResourceStore->LoadResource( pAsset->Get(), "DCLN" );
}
}

View File

@@ -15,7 +15,7 @@ enum EPropertyType
eStringProperty,
eVector3Property,
eColorProperty,
eFileProperty,
eAssetProperty,
eStructProperty,
eArrayProperty,
eCharacterProperty,

View File

@@ -124,7 +124,7 @@ typedef TTypedProperty<CColor, eColorProperty, CColorValue>
typedef TTypedProperty<std::vector<u8>, eUnknownProperty, CUnknownValue> TUnknownProperty;
/*
* TStringProperty, TFileProperty, and TCharacterProperty get little subclasses in order to override some virtual functions.
* TStringProperty, 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) \
@@ -142,11 +142,11 @@ public:
virtual bool ShouldCook() { return true; }
};
class TFileProperty : public TTypedProperty<CResourceInfo, eFileProperty, CFileValue>
class TAssetProperty : public TTypedProperty<CAssetID, eAssetProperty, CAssetValue>
{
public:
IMPLEMENT_PROPERTY_CTORS(TFileProperty, CResourceInfo)
IMPLEMENT_PROPERTY_CLONE(TFileProperty)
IMPLEMENT_PROPERTY_CTORS(TAssetProperty, CAssetID)
IMPLEMENT_PROPERTY_CLONE(TAssetProperty)
virtual bool MatchesDefault() { return !Get().IsValid(); }
virtual bool ShouldCook() { return true; }
};

View File

@@ -229,7 +229,7 @@ TString PropEnumToPropString(EPropertyType Prop)
case eStringProperty: return "string";
case eColorProperty: return "color";
case eVector3Property: return "vector3f";
case eFileProperty: return "file";
case eAssetProperty: return "asset";
case eStructProperty: return "struct";
case eArrayProperty: return "array";
case eCharacterProperty: return "character";
@@ -255,7 +255,7 @@ EPropertyType PropStringToPropEnum(TString Prop)
if (Prop == "string") return eStringProperty;
if (Prop == "color") return eColorProperty;
if (Prop == "vector3f") return eVector3Property;
if (Prop == "file") return eFileProperty;
if (Prop == "asset") return eAssetProperty;
if (Prop == "struct") return eStructProperty;
if (Prop == "array") return eArrayProperty;
if (Prop == "character") return eCharacterProperty;

View File

@@ -363,44 +363,44 @@ public:
}
};
// CFileTemplate - Property template for files. Tracks a list of file types that
// CAssetTemplate - Property template for assets. Tracks a list of resource types that
// the property is allowed to accept.
class CFileTemplate : public IPropertyTemplate
class CAssetTemplate : public IPropertyTemplate
{
friend class CTemplateLoader;
friend class CTemplateWriter;
TStringList mAcceptedExtensions;
public:
CFileTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
CAssetTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: IPropertyTemplate(ID, pScript, pMaster, pParent) {}
CFileTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
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 eFileProperty; }
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 TFileProperty(this, pInstance, pParent);
return new TAssetProperty(this, pInstance, pParent);
}
IMPLEMENT_TEMPLATE_CLONE(CFileTemplate)
IMPLEMENT_TEMPLATE_CLONE(CAssetTemplate)
virtual void Copy(const IPropertyTemplate *pkTemp)
{
IPropertyTemplate::Copy(pkTemp);
mAcceptedExtensions = static_cast<const CFileTemplate*>(pkTemp)->mAcceptedExtensions;
mAcceptedExtensions = static_cast<const CAssetTemplate*>(pkTemp)->mAcceptedExtensions;
}
virtual bool Matches(const IPropertyTemplate *pkTemp) const
{
const CFileTemplate *pkFile = static_cast<const CFileTemplate*>(pkTemp);
const CAssetTemplate *pkAsset = static_cast<const CAssetTemplate*>(pkTemp);
return ( (IPropertyTemplate::Matches(pkTemp)) &&
(mAcceptedExtensions == pkFile->mAcceptedExtensions) );
(mAcceptedExtensions == pkAsset->mAcceptedExtensions) );
}
bool AcceptsExtension(const TString& rkExtension)
@@ -411,7 +411,7 @@ public:
}
void SetAllowedExtensions(const TStringList& rkExtensions) { mAcceptedExtensions = rkExtensions; }
const TStringList& Extensions() const { return mAcceptedExtensions; }
const TStringList& AllowedExtensions() const { return mAcceptedExtensions; }
};
// CEnumTemplate - Property template for enums. Tracks a list of possible values (enumerators).

View File

@@ -2,10 +2,10 @@
#define IPROPERTYVALUE_H
#include "EPropertyType.h"
#include <Common/CAssetID.h>
#include <Common/Log.h>
#include "Core/Resource/CAnimationParameters.h"
#include "Core/Resource/CResource.h"
#include "Core/Resource/CResourceInfo.h"
#include "Core/Resource/TResPtr.h"
#include <Common/CColor.h>
@@ -342,18 +342,18 @@ public:
}
};
class CFileValue : public TTypedPropertyValue<CResourceInfo>
class CAssetValue : public TTypedPropertyValue<CAssetID>
{
public:
CFileValue() {}
CFileValue(const CResourceInfo& rkInfo) { mValue = rkInfo; }
CAssetValue() {}
CAssetValue(const CAssetID& rkID) { mValue = rkID; }
TString ToString() const { return ""; }
void FromString(const TString&) {}
IPropertyValue* Clone() const
{
return new CFileValue(mValue);
return new CAssetValue(mValue);
}
};