mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-12-21 10:49:23 +00:00
Changed resource selector widgets so they can pop up a panel with a list of acceptable resources
This commit is contained in:
@@ -229,7 +229,8 @@ HEADERS += \
|
||||
Resource/CMapArea.h \
|
||||
Resource/CSavedStateID.h \
|
||||
IProgressNotifier.h \
|
||||
IUIRelay.h
|
||||
IUIRelay.h \
|
||||
Resource/CResTypeFilter.h
|
||||
|
||||
# Source Files
|
||||
SOURCES += \
|
||||
|
||||
87
src/Core/Resource/CResTypeFilter.h
Normal file
87
src/Core/Resource/CResTypeFilter.h
Normal 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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user