Loading SCLY file properties into a new class CResourceInfo instead of loading it as a CResource

This commit is contained in:
parax0 2016-01-10 08:57:21 -07:00
parent b768473b44
commit 29bf0234ec
15 changed files with 163 additions and 73 deletions

View File

@ -46,12 +46,12 @@ CModel* CAreaAttributes::SkyModel() const
switch (mGame)
{
case ePrime:
return (CModel*) static_cast<TFileProperty*>(pBaseStruct->PropertyByIndex(7))->Get().RawPointer();
return (CModel*) static_cast<TFileProperty*>(pBaseStruct->PropertyByIndex(7))->Get().Load();
case eEchoesDemo:
case eEchoes:
case eCorruptionProto:
case eCorruption:
return (CModel*) static_cast<TFileProperty*>(pBaseStruct->PropertyByID(0xD208C9FA))->Get().RawPointer();
return (CModel*) static_cast<TFileProperty*>(pBaseStruct->PropertyByID(0xD208C9FA))->Get().Load();
default:
return nullptr;
}

View File

@ -181,7 +181,8 @@ HEADERS += \
Render/FRenderOptions.h \
Scene/FShowFlags.h \
Scene/CScene.h \
Scene/CSceneIterator.h
Scene/CSceneIterator.h \
Resource/CResourceInfo.h
# Source Files
SOURCES += \

View File

@ -13,6 +13,7 @@
#include <Common/TString.h>
#include <FileIO/FileIO.h>
#include <iostream>
#include <boost/filesystem.hpp>
CResCache::CResCache()
{
@ -208,6 +209,41 @@ CResource* CResCache::GetResource(const TString& ResPath)
return Res;
}
CFourCC CResCache::FindResourceType(CUniqueID ResID, const TStringList& rkPossibleTypes)
{
// If we only have one type then there's only one possibility.
if (rkPossibleTypes.size() == 1)
return CFourCC(rkPossibleTypes.front());
// Determine extension from pak
if (mResSource.Source == SResSource::PakFile)
{
for (auto it = rkPossibleTypes.begin(); it != rkPossibleTypes.end(); it++)
{
SResInfo ResInfo = mpPak->getResourceInfo(ResID.ToLongLong(), CFourCC(*it));
if (ResInfo.resType != "NULL")
return CFourCC(*it);
}
}
// Determine extension from filesystem - try every extension until we find one that works
else
{
TString PathBase = mResSource.Path + ResID.ToString() + ".";
for (auto it = rkPossibleTypes.begin(); it != rkPossibleTypes.end(); it++)
{
TString NewPath = PathBase + *it;
if (boost::filesystem::exists(NewPath.ToStdString()))
return CFourCC(*it);
}
}
return "UNKN";
}
void CResCache::CacheResource(CResource *pRes)
{
u64 ID = pRes->ResID().ToLongLong();

View File

@ -32,6 +32,7 @@ public:
TString GetSourcePath();
CResource* GetResource(CUniqueID ResID, CFourCC type);
CResource* GetResource(const TString& ResPath);
CFourCC FindResourceType(CUniqueID ResID, const TStringList& rkPossibleTypes);
void CacheResource(CResource *pRes);
void DeleteResource(CUniqueID ResID);
};

View File

@ -0,0 +1,70 @@
#ifndef CRESOURCEINFO
#define CRESOURCEINFO
#include "CResource.h"
#include "CResCache.h"
#include <Common/CUniqueID.h>
#include <Common/CFourCC.h>
#include <boost/filesystem.hpp>
class CResourceInfo
{
TString mPath;
bool mIsPath;
bool mIsValidPath;
public:
CResourceInfo()
: mPath(""), mIsPath(false), mIsValidPath(false) {}
CResourceInfo(const TString& rkPath)
: mPath(rkPath), mIsPath(true)
{
mIsValidPath = boost::filesystem::exists(rkPath.ToStdString());
}
CResourceInfo(const CUniqueID& rkID, CFourCC Type)
: mIsPath(false), mIsValidPath(false)
{
mPath = rkID.ToString() + "." + Type.ToString();
}
inline CUniqueID ID() const
{
if (!mIsPath)
return CUniqueID::FromString(mPath.GetFileName());
else
return CUniqueID::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 gResCache.GetResource(mPath);
else
return gResCache.GetResource(ID(), Type());
}
inline bool IsValid() const
{
if (!mIsPath)
return ID().IsValid();
else
return mIsValidPath;
}
};
#endif // CRESOURCEINFO

View File

@ -97,43 +97,17 @@ void CScriptLoader::ReadProperty(IProperty *pProp, u32 Size, IInputStream& SCLY)
TFileProperty *pFileCast = static_cast<TFileProperty*>(pProp);
CUniqueID ResID = (mVersion < eCorruptionProto ? SCLY.ReadLong() : SCLY.ReadLongLong());
const TStringList& Extensions = static_cast<CFileTemplate*>(pTemp)->Extensions();
const TStringList& rkExtensions = static_cast<CFileTemplate*>(pTemp)->Extensions();
CResource *pRes = nullptr;
// Check for each extension individually until we find a match
// This could be done better with a function to fetch the extension given the resource ID
// and a "does resource exist" function, but this will do for now
bool hasIgnoredExt = false;
CResourceInfo Info(ResID, "UNKN");
if (ResID.IsValid())
{
for (auto it = Extensions.begin(); it != Extensions.end(); it++)
{
const TString& ext = *it;
if ((ext != "MREA") && (ext != "MLVL")) {
pRes = gResCache.GetResource(ResID, ext);
if (pRes) break;
}
else
hasIgnoredExt = true;
}
CFourCC Type = gResCache.FindResourceType(ResID, rkExtensions);
Info = CResourceInfo(ResID, Type);
}
// Property may have an incorrect extension listed - print error
if ((!pRes) && (CUniqueID(ResID).IsValid()) && (!hasIgnoredExt))
{
TString ExtList;
for (auto it = Extensions.begin(); it != Extensions.end(); it++)
{
if (it != Extensions.begin()) ExtList += "/";
ExtList += *it;
}
}
pFileCast->Set(pRes);
pFileCast->Set(Info);
break;
}

View File

@ -11,6 +11,9 @@ struct SResInfo
u64 resID;
u32 offset;
u32 size;
SResInfo()
: compressed(false), resType("NULL"), resID(0), offset(0), size(0) {}
};
#endif // SRESINFO_H

View File

@ -228,7 +228,7 @@ CModel* CScriptTemplate::FindDisplayModel(CPropertyStruct *pProperties)
if (pProp->Type() == eFileProperty)
{
TFileProperty *pFile = static_cast<TFileProperty*>(pProp);
pRes = pFile->Get();
pRes = pFile->Get().Load();
}
else if (pProp->Type() == eCharacterProperty)
@ -268,7 +268,7 @@ CTexture* CScriptTemplate::FindBillboardTexture(CPropertyStruct *pProperties)
if (pProp->Type() == eFileProperty)
{
TFileProperty *pFile = static_cast<TFileProperty*>(pProp);
pRes = pFile->Get();
pRes = pFile->Get().Load();
}
}
@ -302,7 +302,7 @@ CCollisionMeshGroup* CScriptTemplate::FindCollision(CPropertyStruct *pProperties
if (pProp->Type() == eFileProperty)
{
TFileProperty *pFile = static_cast<TFileProperty*>(pProp);
pRes = pFile->Get();
pRes = pFile->Get().Load();
}
}
@ -327,7 +327,7 @@ bool CScriptTemplate::HasInGameModel(CPropertyStruct *pProperties)
if (pProp->Type() == eFileProperty)
{
TFileProperty *pFile = static_cast<TFileProperty*>(pProp);
pRes = pFile->Get();
pRes = pFile->Get().Load();
}
else if (pProp->Type() == eCharacterProperty)

View File

@ -67,7 +67,7 @@ typedef TTypedProperty<float, eFloatProperty, CFloatValue>
typedef TTypedProperty<TString, eStringProperty, CStringValue> TStringProperty;
typedef TTypedProperty<CVector3f, eVector3Property, CVector3Value> TVector3Property;
typedef TTypedProperty<CColor, eColorProperty, CColorValue> TColorProperty;
typedef TTypedProperty<TResPtr<CResource>, eFileProperty, CFileValue> TFileProperty;
typedef TTypedProperty<CResourceInfo, eFileProperty, CFileValue> TFileProperty;
typedef TTypedProperty<CAnimationParameters, eCharacterProperty, CCharacterValue> TAnimParamsProperty;
typedef TTypedProperty<std::vector<u8>, eUnknownProperty, CUnknownValue> TUnknownProperty;

View File

@ -5,6 +5,7 @@
#include "Core/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>
@ -253,11 +254,11 @@ public:
void FromString(const TString&) { }
};
class CFileValue : public TTypedPropertyValue<TResPtr<CResource>>
class CFileValue : public TTypedPropertyValue<CResourceInfo>
{
public:
CFileValue() {}
CFileValue(CResource *pRes) { mValue = pRes; }
CFileValue(const CResourceInfo& rkInfo) { mValue = rkInfo; }
TString ToString() const { return ""; }
void FromString(const TString&) { }

View File

@ -167,7 +167,7 @@ void CDamageableTriggerExtra::PropertyModified(IProperty *pProperty)
{
if (pProperty == mpTextureProps[iTex])
{
mpTextures[iTex] = mpTextureProps[iTex]->Get();
mpTextures[iTex] = mpTextureProps[iTex]->Get().Load();
if (mpTextures[iTex] && mpTextures[iTex]->Type() != eTexture)
mpTextures[iTex] = nullptr;

View File

@ -41,7 +41,7 @@ void CDoorExtra::PropertyModified(IProperty *pProperty)
{
if (pProperty == mpShieldModelProp)
{
mpShieldModel = mpShieldModelProp->Get();
mpShieldModel = mpShieldModelProp->Get().Load();
if (mpShieldModel)
mLocalAABox = mpShieldModel->AABox();

View File

@ -42,7 +42,7 @@ CPointOfInterestExtra::CPointOfInterestExtra(CScriptObject *pInstance, CScene *p
void CPointOfInterestExtra::PropertyModified(IProperty* pProperty)
{
if (mpScanProperty == pProperty)
mpScanData = mpScanProperty->Get();
mpScanData = mpScanProperty->Get().Load();
}
void CPointOfInterestExtra::ModifyTintColor(CColor& Color)

View File

@ -24,7 +24,6 @@ WResourceSelector::WResourceSelector(QWidget *parent) : QWidget(parent)
mAdjustPreviewToParent = false;
// Initialize Resource Members
mpResource = nullptr;
mResourceValid = false;
// Create Widgets
@ -102,9 +101,9 @@ bool WResourceSelector::IsSupportedExtension(const QString& extension)
return false;
}
bool WResourceSelector::HasSupportedExtension(CResource* pRes)
bool WResourceSelector::HasSupportedExtension(const CResourceInfo& rkRes)
{
return IsSupportedExtension(TO_QSTRING(pRes->FullSource().GetFileExtension()));
return IsSupportedExtension(TO_QSTRING(rkRes.Type().ToString()));
}
// ************ GETTERS ************
@ -132,12 +131,20 @@ bool WResourceSelector::IsPreviewPanelEnabled()
// ************ SETTERS ************
void WResourceSelector::SetResource(CResource *pRes)
{
mpResource = pRes;
if (pRes)
SetResource(CResourceInfo(pRes->ResID(), CFourCC(pRes->Source().GetFileExtension())));
else
SetResource(CResourceInfo());
}
void WResourceSelector::SetResource(const CResourceInfo& rkRes)
{
mResource = rkRes;
if (mResource.IsValid())
{
mResourceValid = HasSupportedExtension(pRes);
mUI.LineEdit->setText(TO_QSTRING(pRes->FullSource()));
mResourceValid = HasSupportedExtension(rkRes);
mUI.LineEdit->setText(TO_QSTRING(mResource.ToString()));
}
else
@ -248,31 +255,27 @@ void WResourceSelector::OnExportButtonClicked()
// or delegate it entirely to the signals?
void WResourceSelector::Edit()
{
emit EditResource(mpResource);
emit EditResource(mResource);
}
void WResourceSelector::Export()
{
emit ExportResource(mpResource);
emit ExportResource(mResource);
}
void WResourceSelector::LoadResource(const QString& ResPath)
{
mpResource = nullptr;
mResource = CResourceInfo();
TString pathStr = ResPath.toStdString();
TString ext = pathStr.GetFileExtension();
TString PathStr = ResPath.toStdString();
TString Ext = PathStr.GetFileExtension();
if (IsSupportedExtension(TO_QSTRING(ext)))
if (IsSupportedExtension(TO_QSTRING(Ext)))
{
if ((ext != "MREA") && (ext != "MLVL"))
{
mpResource = gResCache.GetResource(pathStr);
mResourceValid = (mpResource != nullptr);
mResource = CResourceInfo(TO_TSTRING(ResPath));
mResourceValid = mResource.IsValid();
if (mPreviewPanelValid) mpPreviewPanel->SetResource(mpResource);
}
else mResourceValid = false;
if (mPreviewPanelValid) mpPreviewPanel->SetResource(mResource.Load());
}
else mResourceValid = false;
@ -287,7 +290,7 @@ void WResourceSelector::CreatePreviewPanel()
mpPreviewPanel = nullptr;
if (mResourceValid)
mpPreviewPanel = IPreviewPanel::CreatePanel(mpResource->Type(), this);
mpPreviewPanel = IPreviewPanel::CreatePanel(CResource::ResTypeForExtension(mResource.Type()), this);
if (!mpPreviewPanel) mPreviewPanelValid = false;
@ -295,7 +298,7 @@ void WResourceSelector::CreatePreviewPanel()
{
mPreviewPanelValid = true;
mpPreviewPanel->setWindowFlags(Qt::ToolTip);
if (mpResource) mpPreviewPanel->SetResource(mpResource);
if (mResourceValid) mpPreviewPanel->SetResource(mResource.Load());
}
}
@ -345,13 +348,13 @@ void WResourceSelector::SetButtonsBasedOnResType()
{
// Basically this function sets whether the "Export" and "Edit"
// buttons are present based on the resource type.
if (!mpResource)
if (!mResource.IsValid())
{
SetEditButtonEnabled(false);
SetExportButtonEnabled(false);
}
else switch (mpResource->Type())
else switch (CResource::ResTypeForExtension(mResource.Type()))
{
// Export button should be enabled here because CTexture already has a DDS export function
// However, need to figure out what sort of interface to create to do it. Disabling until then.

View File

@ -3,7 +3,7 @@
#include "IPreviewPanel.h"
#include <Common/CFourCC.h>
#include <Core/Resource/TResPtr.h>
#include <Core/Resource/CResourceInfo.h>
#include <Core/Resource/EResType.h>
#include <QLabel>
@ -29,7 +29,7 @@ class WResourceSelector : public QWidget
bool mAdjustPreviewToParent;
// Resource
TResPtr<CResource> mpResource;
CResourceInfo mResource;
bool mResourceValid;
// UI
@ -44,8 +44,8 @@ class WResourceSelector : public QWidget
// Functions
signals:
void ResourceChanged(const QString& NewResPath);
void EditResource(CResource *pRes);
void ExportResource(CResource *pRes);
void EditResource(const CResourceInfo& rkRes);
void ExportResource(const CResourceInfo& rkRes);
public:
explicit WResourceSelector(QWidget *parent = 0);
@ -53,7 +53,7 @@ public:
bool event(QEvent *);
bool eventFilter(QObject *, QEvent *);
bool IsSupportedExtension(const QString& extension);
bool HasSupportedExtension(CResource* pRes);
bool HasSupportedExtension(const CResourceInfo& rkRes);
// Getters
QString GetText();
@ -63,6 +63,7 @@ public:
// Setters
void SetResource(CResource *pRes);
void SetResource(const CResourceInfo& rkRes);
void SetAllowedExtensions(const QString& extension);
void SetAllowedExtensions(const QStringList& extensions);
void SetAllowedExtensions(const TStringList& extensions);