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) switch (mGame)
{ {
case ePrime: 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 eEchoesDemo:
case eEchoes: case eEchoes:
case eCorruptionProto: case eCorruptionProto:
case eCorruption: case eCorruption:
return (CModel*) static_cast<TFileProperty*>(pBaseStruct->PropertyByID(0xD208C9FA))->Get().RawPointer(); return (CModel*) static_cast<TFileProperty*>(pBaseStruct->PropertyByID(0xD208C9FA))->Get().Load();
default: default:
return nullptr; return nullptr;
} }

View File

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

View File

@ -13,6 +13,7 @@
#include <Common/TString.h> #include <Common/TString.h>
#include <FileIO/FileIO.h> #include <FileIO/FileIO.h>
#include <iostream> #include <iostream>
#include <boost/filesystem.hpp>
CResCache::CResCache() CResCache::CResCache()
{ {
@ -208,6 +209,41 @@ CResource* CResCache::GetResource(const TString& ResPath)
return Res; 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) void CResCache::CacheResource(CResource *pRes)
{ {
u64 ID = pRes->ResID().ToLongLong(); u64 ID = pRes->ResID().ToLongLong();

View File

@ -32,6 +32,7 @@ public:
TString GetSourcePath(); TString GetSourcePath();
CResource* GetResource(CUniqueID ResID, CFourCC type); CResource* GetResource(CUniqueID ResID, CFourCC type);
CResource* GetResource(const TString& ResPath); CResource* GetResource(const TString& ResPath);
CFourCC FindResourceType(CUniqueID ResID, const TStringList& rkPossibleTypes);
void CacheResource(CResource *pRes); void CacheResource(CResource *pRes);
void DeleteResource(CUniqueID ResID); 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); TFileProperty *pFileCast = static_cast<TFileProperty*>(pProp);
CUniqueID ResID = (mVersion < eCorruptionProto ? SCLY.ReadLong() : SCLY.ReadLongLong()); 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; CResourceInfo Info(ResID, "UNKN");
// 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;
if (ResID.IsValid()) if (ResID.IsValid())
{ {
for (auto it = Extensions.begin(); it != Extensions.end(); it++) CFourCC Type = gResCache.FindResourceType(ResID, rkExtensions);
{ Info = CResourceInfo(ResID, Type);
const TString& ext = *it;
if ((ext != "MREA") && (ext != "MLVL")) {
pRes = gResCache.GetResource(ResID, ext);
if (pRes) break;
}
else
hasIgnoredExt = true;
}
} }
// Property may have an incorrect extension listed - print error pFileCast->Set(Info);
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);
break; break;
} }

View File

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

View File

@ -228,7 +228,7 @@ CModel* CScriptTemplate::FindDisplayModel(CPropertyStruct *pProperties)
if (pProp->Type() == eFileProperty) if (pProp->Type() == eFileProperty)
{ {
TFileProperty *pFile = static_cast<TFileProperty*>(pProp); TFileProperty *pFile = static_cast<TFileProperty*>(pProp);
pRes = pFile->Get(); pRes = pFile->Get().Load();
} }
else if (pProp->Type() == eCharacterProperty) else if (pProp->Type() == eCharacterProperty)
@ -268,7 +268,7 @@ CTexture* CScriptTemplate::FindBillboardTexture(CPropertyStruct *pProperties)
if (pProp->Type() == eFileProperty) if (pProp->Type() == eFileProperty)
{ {
TFileProperty *pFile = static_cast<TFileProperty*>(pProp); 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) if (pProp->Type() == eFileProperty)
{ {
TFileProperty *pFile = static_cast<TFileProperty*>(pProp); 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) if (pProp->Type() == eFileProperty)
{ {
TFileProperty *pFile = static_cast<TFileProperty*>(pProp); TFileProperty *pFile = static_cast<TFileProperty*>(pProp);
pRes = pFile->Get(); pRes = pFile->Get().Load();
} }
else if (pProp->Type() == eCharacterProperty) else if (pProp->Type() == eCharacterProperty)

View File

@ -67,7 +67,7 @@ typedef TTypedProperty<float, eFloatProperty, CFloatValue>
typedef TTypedProperty<TString, eStringProperty, CStringValue> TStringProperty; typedef TTypedProperty<TString, eStringProperty, CStringValue> TStringProperty;
typedef TTypedProperty<CVector3f, eVector3Property, CVector3Value> TVector3Property; typedef TTypedProperty<CVector3f, eVector3Property, CVector3Value> TVector3Property;
typedef TTypedProperty<CColor, eColorProperty, CColorValue> TColorProperty; 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<CAnimationParameters, eCharacterProperty, CCharacterValue> TAnimParamsProperty;
typedef TTypedProperty<std::vector<u8>, eUnknownProperty, CUnknownValue> TUnknownProperty; typedef TTypedProperty<std::vector<u8>, eUnknownProperty, CUnknownValue> TUnknownProperty;

View File

@ -5,6 +5,7 @@
#include "Core/Log.h" #include "Core/Log.h"
#include "Core/Resource/CAnimationParameters.h" #include "Core/Resource/CAnimationParameters.h"
#include "Core/Resource/CResource.h" #include "Core/Resource/CResource.h"
#include "Core/Resource/CResourceInfo.h"
#include "Core/Resource/TResPtr.h" #include "Core/Resource/TResPtr.h"
#include <Common/CColor.h> #include <Common/CColor.h>
@ -253,11 +254,11 @@ public:
void FromString(const TString&) { } void FromString(const TString&) { }
}; };
class CFileValue : public TTypedPropertyValue<TResPtr<CResource>> class CFileValue : public TTypedPropertyValue<CResourceInfo>
{ {
public: public:
CFileValue() {} CFileValue() {}
CFileValue(CResource *pRes) { mValue = pRes; } CFileValue(const CResourceInfo& rkInfo) { mValue = rkInfo; }
TString ToString() const { return ""; } TString ToString() const { return ""; }
void FromString(const TString&) { } void FromString(const TString&) { }

View File

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

View File

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

View File

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

View File

@ -24,7 +24,6 @@ WResourceSelector::WResourceSelector(QWidget *parent) : QWidget(parent)
mAdjustPreviewToParent = false; mAdjustPreviewToParent = false;
// Initialize Resource Members // Initialize Resource Members
mpResource = nullptr;
mResourceValid = false; mResourceValid = false;
// Create Widgets // Create Widgets
@ -102,9 +101,9 @@ bool WResourceSelector::IsSupportedExtension(const QString& extension)
return false; 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 ************ // ************ GETTERS ************
@ -132,12 +131,20 @@ bool WResourceSelector::IsPreviewPanelEnabled()
// ************ SETTERS ************ // ************ SETTERS ************
void WResourceSelector::SetResource(CResource *pRes) void WResourceSelector::SetResource(CResource *pRes)
{ {
mpResource = pRes;
if (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); mResourceValid = HasSupportedExtension(rkRes);
mUI.LineEdit->setText(TO_QSTRING(pRes->FullSource())); mUI.LineEdit->setText(TO_QSTRING(mResource.ToString()));
} }
else else
@ -248,31 +255,27 @@ void WResourceSelector::OnExportButtonClicked()
// or delegate it entirely to the signals? // or delegate it entirely to the signals?
void WResourceSelector::Edit() void WResourceSelector::Edit()
{ {
emit EditResource(mpResource); emit EditResource(mResource);
} }
void WResourceSelector::Export() void WResourceSelector::Export()
{ {
emit ExportResource(mpResource); emit ExportResource(mResource);
} }
void WResourceSelector::LoadResource(const QString& ResPath) void WResourceSelector::LoadResource(const QString& ResPath)
{ {
mpResource = nullptr; mResource = CResourceInfo();
TString pathStr = ResPath.toStdString(); TString PathStr = ResPath.toStdString();
TString ext = pathStr.GetFileExtension(); TString Ext = PathStr.GetFileExtension();
if (IsSupportedExtension(TO_QSTRING(ext))) if (IsSupportedExtension(TO_QSTRING(Ext)))
{ {
if ((ext != "MREA") && (ext != "MLVL")) mResource = CResourceInfo(TO_TSTRING(ResPath));
{ mResourceValid = mResource.IsValid();
mpResource = gResCache.GetResource(pathStr);
mResourceValid = (mpResource != nullptr);
if (mPreviewPanelValid) mpPreviewPanel->SetResource(mpResource); if (mPreviewPanelValid) mpPreviewPanel->SetResource(mResource.Load());
}
else mResourceValid = false;
} }
else mResourceValid = false; else mResourceValid = false;
@ -287,7 +290,7 @@ void WResourceSelector::CreatePreviewPanel()
mpPreviewPanel = nullptr; mpPreviewPanel = nullptr;
if (mResourceValid) if (mResourceValid)
mpPreviewPanel = IPreviewPanel::CreatePanel(mpResource->Type(), this); mpPreviewPanel = IPreviewPanel::CreatePanel(CResource::ResTypeForExtension(mResource.Type()), this);
if (!mpPreviewPanel) mPreviewPanelValid = false; if (!mpPreviewPanel) mPreviewPanelValid = false;
@ -295,7 +298,7 @@ void WResourceSelector::CreatePreviewPanel()
{ {
mPreviewPanelValid = true; mPreviewPanelValid = true;
mpPreviewPanel->setWindowFlags(Qt::ToolTip); 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" // Basically this function sets whether the "Export" and "Edit"
// buttons are present based on the resource type. // buttons are present based on the resource type.
if (!mpResource) if (!mResource.IsValid())
{ {
SetEditButtonEnabled(false); SetEditButtonEnabled(false);
SetExportButtonEnabled(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 // 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. // 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 "IPreviewPanel.h"
#include <Common/CFourCC.h> #include <Common/CFourCC.h>
#include <Core/Resource/TResPtr.h> #include <Core/Resource/CResourceInfo.h>
#include <Core/Resource/EResType.h> #include <Core/Resource/EResType.h>
#include <QLabel> #include <QLabel>
@ -29,7 +29,7 @@ class WResourceSelector : public QWidget
bool mAdjustPreviewToParent; bool mAdjustPreviewToParent;
// Resource // Resource
TResPtr<CResource> mpResource; CResourceInfo mResource;
bool mResourceValid; bool mResourceValid;
// UI // UI
@ -44,8 +44,8 @@ class WResourceSelector : public QWidget
// Functions // Functions
signals: signals:
void ResourceChanged(const QString& NewResPath); void ResourceChanged(const QString& NewResPath);
void EditResource(CResource *pRes); void EditResource(const CResourceInfo& rkRes);
void ExportResource(CResource *pRes); void ExportResource(const CResourceInfo& rkRes);
public: public:
explicit WResourceSelector(QWidget *parent = 0); explicit WResourceSelector(QWidget *parent = 0);
@ -53,7 +53,7 @@ public:
bool event(QEvent *); bool event(QEvent *);
bool eventFilter(QObject *, QEvent *); bool eventFilter(QObject *, QEvent *);
bool IsSupportedExtension(const QString& extension); bool IsSupportedExtension(const QString& extension);
bool HasSupportedExtension(CResource* pRes); bool HasSupportedExtension(const CResourceInfo& rkRes);
// Getters // Getters
QString GetText(); QString GetText();
@ -63,6 +63,7 @@ public:
// Setters // Setters
void SetResource(CResource *pRes); void SetResource(CResource *pRes);
void SetResource(const CResourceInfo& rkRes);
void SetAllowedExtensions(const QString& extension); void SetAllowedExtensions(const QString& extension);
void SetAllowedExtensions(const QStringList& extensions); void SetAllowedExtensions(const QStringList& extensions);
void SetAllowedExtensions(const TStringList& extensions); void SetAllowedExtensions(const TStringList& extensions);