Changed resource selector widgets so they can pop up a panel with a list of acceptable resources

This commit is contained in:
Aruki
2017-07-10 15:19:11 -06:00
parent 2348b8514f
commit 581d5f7267
20 changed files with 507 additions and 82 deletions

View File

@@ -229,7 +229,8 @@ HEADERS += \
Resource/CMapArea.h \
Resource/CSavedStateID.h \
IProgressNotifier.h \
IUIRelay.h
IUIRelay.h \
Resource/CResTypeFilter.h
# Source Files
SOURCES += \

View File

@@ -0,0 +1,87 @@
#ifndef CRESTYPEFILTER_H
#define CRESTYPEFILTER_H
#include "EResType.h"
#include "CResTypeInfo.h"
#include "Core/GameProject/CResourceEntry.h"
class CResTypeFilter
{
EGame mGame;
std::set<EResType> mAcceptedTypes;
public:
CResTypeFilter() { }
CResTypeFilter(EGame Game, const TString& rkTypeList) { FromString(Game, rkTypeList); }
void SetAcceptedTypes(EGame Game, const TStringList& rkTypes)
{
mAcceptedTypes.clear();
mGame = Game;
for (auto Iter = rkTypes.begin(); Iter != rkTypes.end(); Iter++)
{
CResTypeInfo *pTypeInfo = CResTypeInfo::TypeForCookedExtension(mGame, CFourCC(*Iter));
if (pTypeInfo)
mAcceptedTypes.insert(pTypeInfo->Type());
}
}
TString ToString() const
{
TString Out;
for (auto Iter = mAcceptedTypes.begin(); Iter != mAcceptedTypes.end(); Iter++)
{
if (!Out.IsEmpty()) Out += ',';
CResTypeInfo *pTypeInfo = CResTypeInfo::FindTypeInfo(*Iter);
Out += pTypeInfo->CookedExtension(mGame).ToString();
}
return Out;
}
void FromString(EGame Game, const TString& rkString)
{
SetAcceptedTypes(Game, rkString.Split(","));
}
inline bool Accepts(EResType Type) const
{
return mAcceptedTypes.find(Type) != mAcceptedTypes.end();
}
inline bool Accepts(CResTypeInfo *pType) const
{
return pType && Accepts(pType->Type());
}
inline bool Accepts(CResourceEntry *pEntry) const
{
return pEntry && Accepts(pEntry->ResourceType());
}
inline bool Accepts(const CResTypeFilter& rkFilter) const
{
for (auto Iter = mAcceptedTypes.begin(); Iter != mAcceptedTypes.end(); Iter++)
{
if (rkFilter.Accepts(*Iter))
return true;
}
return false;
}
inline bool operator==(const CResTypeFilter& rkOther) const
{
return mAcceptedTypes == rkOther.mAcceptedTypes;
}
inline bool operator!=(const CResTypeFilter& rkOther) const
{
return !(*this == rkOther);
}
};
#endif // CRESTYPEFILTER_H

View File

@@ -93,8 +93,12 @@ CResTypeInfo* CResTypeInfo::TypeForCookedExtension(EGame Game, CFourCC Ext)
}
// Haven't found it; caller gave us an invalid type
Log::Error("Failed to find resource type for cooked extension: " + Ext.ToString());
DEBUG_BREAK;
// Note UNKN is used to indicate unknown asset type
if (Ext != FOURCC('UNKN'))
{
Log::Error("Failed to find resource type for cooked extension: " + Ext.ToString());
DEBUG_BREAK;
}
sCachedTypeMap[Ext] = nullptr;
return nullptr;
}

View File

@@ -624,13 +624,8 @@ void CTemplateWriter::SaveProperties(XMLDocument *pDoc, XMLElement *pParent, CSt
if (pProp->Type() == eAssetProperty)
{
CAssetTemplate *pAsset = static_cast<CAssetTemplate*>(pProp);
const TStringList& rkExtensions = pAsset->AllowedExtensions();
TString ExtensionsString;
for (auto it = rkExtensions.begin(); it != rkExtensions.end(); it++)
ExtensionsString += *it + ",";
ExtensionsString = ExtensionsString.ChopBack(1); // Remove extra comma
const CResTypeFilter& rkFilter = pAsset->TypeFilter();
TString ExtensionsString = rkFilter.ToString();
if (ExtensionsString.IsEmpty()) ExtensionsString = "UNKN";
pElem->SetAttribute("extensions", *ExtensionsString);
}
@@ -796,14 +791,9 @@ void CTemplateWriter::SavePropertyOverrides(XMLDocument *pDoc, XMLElement *pPare
CAssetTemplate *pAsset = static_cast<CAssetTemplate*>(pProp);
CAssetTemplate *pSourceAsset = static_cast<CAssetTemplate*>(pSource);
if (pAsset->AllowedExtensions() != pSourceAsset->AllowedExtensions())
if (pAsset->TypeFilter() != pSourceAsset->TypeFilter())
{
TString ExtensionsString;
for (auto it = pAsset->AllowedExtensions().begin(); it != pAsset->AllowedExtensions().end(); it++)
ExtensionsString += *it + ",";
ExtensionsString = ExtensionsString.ChopBack(1);
TString ExtensionsString = pAsset->TypeFilter().ToString();
if (ExtensionsString.IsEmpty()) ExtensionsString = "UNKN";
pElem->SetAttribute("extensions", *ExtensionsString);
}

View File

@@ -133,21 +133,11 @@ void CScriptLoader::ReadProperty(IProperty *pProp, u32 Size, IInputStream& rSCLY
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;
}
}
const CResTypeFilter& rkFilter = static_cast<CAssetTemplate*>(pTemp)->TypeFilter();
bool Valid = rkFilter.Accepts(pEntry->ResourceType());
if (!Valid)
Log::FileWarning(rSCLY.GetSourceString(), rSCLY.Tell() - ID.Length(), "Asset property \"" + pTemp->FullName() + "\" (" + pTemp->IDString(true) + ") has a reference to an illegal asset type: " + CookedExt);
Log::FileWarning(rSCLY.GetSourceString(), rSCLY.Tell() - ID.Length(), "Asset property \"" + pTemp->FullName() + "\" (" + pTemp->IDString(true) + ") has a reference to an illegal asset type: " + pEntry->CookedExtension());
}
}

View File

@@ -114,7 +114,7 @@ IPropertyTemplate* CTemplateLoader::LoadProperty(XMLElement *pElem, CScriptTempl
{
TStringList ExtensionsList = ExtensionsAttr.Split(", ");
CAssetTemplate *pAsset = static_cast<CAssetTemplate*>(pProp);
pAsset->SetAllowedExtensions(ExtensionsList);
pAsset->SetTypeFilter(ExtensionsList);
}
}
@@ -606,7 +606,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() != eAssetProperty || !static_cast<CAssetTemplate*>(pProp)->AcceptsExtension("CMDL")))
else if (pProp->Type() != eCharacterProperty && (pProp->Type() != eAssetProperty || !static_cast<CAssetTemplate*>(pProp)->TypeFilter().Accepts(eModel)))
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

@@ -4,6 +4,7 @@
#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>
@@ -389,7 +390,7 @@ class CAssetTemplate : public IPropertyTemplate
friend class CTemplateLoader;
friend class CTemplateWriter;
TStringList mAcceptedExtensions;
CResTypeFilter mTypeFilter;
public:
CAssetTemplate(u32 ID, CScriptTemplate *pScript, CMasterTemplate *pMaster, CStructTemplate *pParent = 0)
: IPropertyTemplate(ID, pScript, pMaster, pParent) {}
@@ -411,7 +412,7 @@ public:
virtual void Copy(const IPropertyTemplate *pkTemp)
{
IPropertyTemplate::Copy(pkTemp);
mAcceptedExtensions = static_cast<const CAssetTemplate*>(pkTemp)->mAcceptedExtensions;
mTypeFilter = static_cast<const CAssetTemplate*>(pkTemp)->mTypeFilter;
}
virtual bool Matches(const IPropertyTemplate *pkTemp) const
@@ -419,18 +420,11 @@ public:
const CAssetTemplate *pkAsset = static_cast<const CAssetTemplate*>(pkTemp);
return ( (IPropertyTemplate::Matches(pkTemp)) &&
(mAcceptedExtensions == pkAsset->mAcceptedExtensions) );
(mTypeFilter == pkAsset->mTypeFilter) );
}
bool AcceptsExtension(const TString& rkExtension)
{
for (auto it = mAcceptedExtensions.begin(); it != mAcceptedExtensions.end(); it++)
if (*it == rkExtension) return true;
return false;
}
void SetAllowedExtensions(const TStringList& rkExtensions) { mAcceptedExtensions = rkExtensions; }
const TStringList& AllowedExtensions() const { return mAcceptedExtensions; }
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).

View File

@@ -476,13 +476,14 @@ void CScriptNode::PropertyModified(IProperty *pProp)
else if (pProp->Type() == eAssetProperty)
{
CAssetTemplate *pAssetTemp = static_cast<CAssetTemplate*>(pProp->Template());
const CResTypeFilter& rkFilter = pAssetTemp->TypeFilter();
if (pAssetTemp->AcceptsExtension("CMDL") || pAssetTemp->AcceptsExtension("TXTR") || pAssetTemp->AcceptsExtension("ANCS") || pAssetTemp->AcceptsExtension("CHAR"))
if (rkFilter.Accepts(eModel) || rkFilter.Accepts(eTexture) || rkFilter.Accepts(eAnimSet) || rkFilter.Accepts(eCharacter))
{
mpInstance->EvaluateDisplayAsset();
SetDisplayAsset(mpInstance->DisplayAsset());
}
else if (pAssetTemp->AcceptsExtension("DCLN"))
else if (rkFilter.Accepts(eDynamicCollision))
{
mpInstance->EvaluateCollisionModel();
mpCollisionNode->SetCollision(mpInstance->Collision());