From d8cc73f5a1fb557fcc80aa227fc41a190d299c36 Mon Sep 17 00:00:00 2001 From: Areloch Date: Thu, 7 Nov 2019 00:42:55 -0600 Subject: [PATCH] Added utility methods to AssetBase: getAssetDependencyFieldCount clearAssetDependencyFields addAssetDependencyField saveAsset Updated the saveAsset function for terrain block to utilize utility methods to ensure the terrain asset's material dependencies, so they will load properly. --- Engine/source/assets/assetBase.cpp | 72 ++++++++++++++++++ Engine/source/assets/assetBase.h | 6 ++ .../source/assets/assetBase_ScriptBinding.h | 30 +++++++- Engine/source/terrain/terrData.cpp | 71 ++++------------- .../gui/scripts/fonts/Arial 14 (ansi).uft | Bin 5075 -> 5117 bytes .../scripts/assetTypes/terrain.cs | 41 ---------- 6 files changed, 120 insertions(+), 100 deletions(-) diff --git a/Engine/source/assets/assetBase.cpp b/Engine/source/assets/assetBase.cpp index e1bc9bf7a..2eb33a299 100644 --- a/Engine/source/assets/assetBase.cpp +++ b/Engine/source/assets/assetBase.cpp @@ -284,6 +284,78 @@ void AssetBase::refreshAsset(void) //----------------------------------------------------------------------------- +S32 AssetBase::getAssetDependencyFieldCount(const char* pFieldName) +{ + S32 matchedFieldCount = 0; + SimFieldDictionary* fieldDictionary = getFieldDictionary(); + for (SimFieldDictionaryIterator itr(fieldDictionary); *itr; ++itr) + { + SimFieldDictionary::Entry* entry = *itr; + + if (String(entry->slotName).startsWith(pFieldName)) + { + matchedFieldCount++; + } + } + + return matchedFieldCount; +} + +//----------------------------------------------------------------------------- + +void AssetBase::clearAssetDependencyFields(const char* pFieldName) +{ + SimFieldDictionary* fieldDictionary = getFieldDictionary(); + for (SimFieldDictionaryIterator itr(fieldDictionary); *itr; ++itr) + { + SimFieldDictionary::Entry* entry = *itr; + + if (String(entry->slotName).startsWith(pFieldName)) + { + setDataField(entry->slotName, NULL, ""); + } + } +} + +//----------------------------------------------------------------------------- + +void AssetBase::addAssetDependencyField(const char* pFieldName, const char* pAssetId) +{ + U32 existingFieldCount = getAssetDependencyFieldCount(pFieldName); + + //we have a match! + char depSlotName[50]; + dSprintf(depSlotName, sizeof(depSlotName), "%s%d", pFieldName, existingFieldCount); + + char depValue[255]; + dSprintf(depValue, sizeof(depValue), "@Asset=%s", pAssetId); + + setDataField(StringTable->insert(depSlotName), NULL, StringTable->insert(depValue)); +} + +//----------------------------------------------------------------------------- +bool AssetBase::saveAsset() +{ + // Set the format mode. + Taml taml; + + // Yes, so set it. + taml.setFormatMode(Taml::getFormatModeEnum("xml")); + + // Turn-off auto-formatting. + taml.setAutoFormat(false); + + // Read object. + bool success = taml.write(this, AssetDatabase.getAssetFilePath(getAssetId())); + + if (!success) + return false; + + return true; +} + +//----------------------------------------------------------------------------- + void AssetBase::acquireAssetReference(void) { // Acquired the acquired reference count. diff --git a/Engine/source/assets/assetBase.h b/Engine/source/assets/assetBase.h index 73c6df1c0..f127c83cc 100644 --- a/Engine/source/assets/assetBase.h +++ b/Engine/source/assets/assetBase.h @@ -104,6 +104,12 @@ public: void refreshAsset(void); + S32 getAssetDependencyFieldCount(const char* pFieldName); + void clearAssetDependencyFields(const char* pFieldName); + void addAssetDependencyField(const char* pFieldName, const char* pAssetId); + + bool saveAsset(); + /// Declare Console Object. DECLARE_CONOBJECT(AssetBase); diff --git a/Engine/source/assets/assetBase_ScriptBinding.h b/Engine/source/assets/assetBase_ScriptBinding.h index 8ac8f6a0d..6c0b4be66 100644 --- a/Engine/source/assets/assetBase_ScriptBinding.h +++ b/Engine/source/assets/assetBase_ScriptBinding.h @@ -1,4 +1,4 @@ -//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- // Copyright (c) 2013 GarageGames, LLC // // Permission is hereby granted, free of charge, to any person obtaining a copy @@ -39,3 +39,31 @@ DefineEngineMethod(AssetBase, getAssetId, String, (), , { return object->getAssetId(); } + +DefineEngineMethod(AssetBase, getAssetDependencyFieldCount, S32, (const char* pFieldName), (""), + "Gets the assets' Asset Id. This is only available if the asset was acquired from the asset manager.\n" + "@return The assets' Asset Id.\n") +{ + return object->getAssetDependencyFieldCount(pFieldName); +} + +DefineEngineMethod(AssetBase, clearAssetDependencyFields, void, (const char* pFieldName), (""), + "Gets the assets' Asset Id. This is only available if the asset was acquired from the asset manager.\n" + "@return The assets' Asset Id.\n") +{ + object->clearAssetDependencyFields(pFieldName); +} + +DefineEngineMethod(AssetBase, addAssetDependencyField, void, (const char* pFieldName, const char* pAssetId), ("", ""), + "Gets the assets' Asset Id. This is only available if the asset was acquired from the asset manager.\n" + "@return The assets' Asset Id.\n") +{ + object->addAssetDependencyField(pFieldName, pAssetId); +} + +DefineEngineMethod(AssetBase, saveAsset, bool, (), , + "Gets the assets' Asset Id. This is only available if the asset was acquired from the asset manager.\n" + "@return The assets' Asset Id.\n") +{ + return object->saveAsset(); +} diff --git a/Engine/source/terrain/terrData.cpp b/Engine/source/terrain/terrData.cpp index 2193ff66d..a961b260f 100644 --- a/Engine/source/terrain/terrData.cpp +++ b/Engine/source/terrain/terrData.cpp @@ -370,7 +370,7 @@ bool TerrainBlock::setTerrainAsset(const StringTableEntry terrainAssetId) if (!file) return false; - mFile = file; + setFile(file); return true; } @@ -383,25 +383,13 @@ bool TerrainBlock::saveAsset() { if (!mTerrainAsset.isNull() && mTerrainAsset->isAssetValid()) { - //first, clear out our old dependency references - /*SimFieldDictionary* fieldDictionary = mTerrainAsset->getFieldDictionary(); - for (SimFieldDictionaryIterator itr(fieldDictionary); *itr; ++itr) - { - SimFieldDictionary::Entry* entry = *itr; - - if (String(entry->slotName).startsWith("terrainMaterailAsset")) - { - //got one, so clear it's value - setDataField(entry->slotName, NULL, ""); - } - } + mTerrainAsset->clearAssetDependencyFields("terrainMaterailAsset"); AssetQuery* pAssetQuery = new AssetQuery(); AssetDatabase.findAssetType(pAssetQuery, "TerrainMaterialAsset"); TerrainBlock* clientTerr = static_cast(getClientObject()); - U32 terrMatIdx = 0; for (U32 i = 0; i < pAssetQuery->mAssetList.size(); i++) { //Acquire it so we can check it for matches @@ -414,16 +402,7 @@ bool TerrainBlock::saveAsset() StringTableEntry assetMatDefName = terrMatAsset->getMaterialDefinitionName(); if (assetMatDefName == intMatName) { - //we have a match! - char depSlotName[30]; - dSprintf(depSlotName, sizeof(depSlotName), "terrainMaterialAsset%d", terrMatIdx); - - char depValue[255]; - dSprintf(depValue, sizeof(depValue), "@Asset=%s", terrMatAsset.getAssetId()); - - setDataField(depSlotName, NULL, depValue); - - terrMatIdx++; + mTerrainAsset->addAssetDependencyField("terrainMaterailAsset", terrMatAsset.getAssetId()); } } @@ -432,20 +411,10 @@ bool TerrainBlock::saveAsset() pAssetQuery->destroySelf(); - // Set the format mode. - Taml taml; + bool saveAssetSuccess = mTerrainAsset->saveAsset(); - // Yes, so set it. - taml.setFormatMode(Taml::getFormatModeEnum("xml")); - - // Turn-off auto-formatting. - taml.setAutoFormat(false); - - // Read object. - bool success = taml.write(mTerrainAsset, AssetDatabase.getAssetFilePath(mTerrainAsset.getAssetId())); - - if (!success) - return false;*/ + if (!saveAssetSuccess) + return false; return mFile->save(mTerrainAsset->getTerrainFilePath()); } @@ -1251,15 +1220,15 @@ void TerrainBlock::setScale( const VectorF &scale ) void TerrainBlock::initPersistFields() { addGroup( "Media" ); - - addProtectedField( "terrainFile", TypeStringFilename, Offset( mTerrFileName, TerrainBlock ), - &TerrainBlock::_setTerrainFile, &defaultProtectedGetFn, - "The source terrain data file." ); addProtectedField("terrainAsset", TypeTerrainAssetPtr, Offset(mTerrainAsset, TerrainBlock), &TerrainBlock::_setTerrainAsset, &defaultProtectedGetFn, "The source terrain data asset."); + addProtectedField( "terrainFile", TypeStringFilename, Offset( mTerrFileName, TerrainBlock ), + &TerrainBlock::_setTerrainFile, &defaultProtectedGetFn, + "The source terrain data file." ); + endGroup( "Media" ); addGroup( "Misc" ); @@ -1320,7 +1289,6 @@ U32 TerrainBlock::packUpdate(NetConnection* con, U32 mask, BitStream *stream) if ( stream->writeFlag( mask & FileMask ) ) { stream->write( mTerrFileName ); - stream->writeString( mTerrainAssetId ); stream->write( mCRC ); } @@ -1361,25 +1329,12 @@ void TerrainBlock::unpackUpdate(NetConnection* con, BitStream *stream) { FileName terrFile; stream->read( &terrFile ); - char buffer[256]; - stream->readString(buffer); - StringTableEntry terrainAsset = StringTable->insert(buffer); stream->read( &mCRC ); - if (terrainAsset != StringTable->EmptyString()) - { - if (isProperlyAdded()) - setTerrainAsset(StringTable->insert(terrFile.c_str())); - else - mTerrainAssetId = StringTable->insert(terrFile.c_str()); - } + if ( isProperlyAdded() ) + setFile( terrFile ); else - { - if (isProperlyAdded()) - setFile(terrFile); - else - mTerrFileName = terrFile; - } + mTerrFileName = terrFile; } if ( stream->readFlag() ) // SizeMask diff --git a/Templates/BaseGame/game/core/gui/scripts/fonts/Arial 14 (ansi).uft b/Templates/BaseGame/game/core/gui/scripts/fonts/Arial 14 (ansi).uft index 74e399f3185a177abb4ec73d0b64f44f63889d7e..5f100417a46a63b1f563b34004b1650683b1ee14 100644 GIT binary patch delta 2166 zcmV-+2#NR8C;caoA^}~oBg+aK006iE000gE000C4000O800000000O8000G(>k2D> z>`6pHRCt{2*e`VI${NPupNNQvKvW6hs6ZgL*rEcl zMMVXo;)n`F1p-llKp+r^2t)(|fvBj6n6=(30+fCJ+;#3<`>b=;z2BnJFDy`lJYHbxaE3sx*>mJZs z7nWL;>l?*&Xp8Dvo0cT)9Ds0MzKH;-nXby!g-;jN;#_fESqorY;%Xl-J8zW^fh6s3 zaQ=?L-p}&7P5Xn?DLd-IxS#7a07?tu)|PdD6$JT1?mZ9t zh^yTxfc6vp?)_H)HkItCc>^k&(f3ZAF=HKQ{*~?ua<9>>l?|!A7vbwI zX-ITBjo#%J(raNfC9L1C?qf{z~q`1KXQ@GxZf zexGe^nlv{*1~BeJut=gTfb6Jm13p_od8K8!zR50F#N=)Ttosx0KHl$-qbRO+?Q`mt zSPXm5sJu{IrubasbW)JuYL`zVqT>|s&VSrVT|dtQL}~HuyaL!@)OEcz0Pjv{(6Kn_Z38TtI&?8Q5lr2=2a;=OY(BTOD34yLuK|=h z<;!INl|>;OJzm!FV*r;mjt9W~n3o=Rv(xGLUM;-AOSTAq4girxz~JG0($4C!7G;Y5 z3b;y(mz_U7mWuv(+JMIKZ}8kxl$7}2;{2azbo+Gr z^wj$cYx!G$jNRW|fidQv?kWiYws|^RZL{aWt)rNn?=QXM#o=Dm0TjLXT~m_01oX!j zx1twalvmrD=o~(J$G<5gY5LLt8i%~|-f_JKMyF#X^$|q9)v6a|$ACX}PcbPb^^M|& zw^BEV{s3lH7E2TTh_6l6;uHtfke5E)C`t~ho?SOs{aeQPu7W4hH z3(beYSCLjK>F53^F67^UbqnvDXW9mI1;7U>(E(K-lkxTSIC;#TWM1Oq6CB-1cd~2a z4obaKbNBNCD9?cBYZgtQwGhzy&ZK(|0OxV3L%m1PrV2oR2%S2tRjulq)vYfsQ-NzUIdUmScP7oG$It`eOx;4uPy^%I$8$c zym!+!P)#l>NvglT0{Z3t@$jUW6rsGk5zcFWUjB&zG)MGqE~}?`D4y!dem~JF)1d% zqMJP)x&2QJfY;y|E~fzgv;-WdK(+|NV^8~l^Rfq}IJgL4(WH0ZS_qV%`+I%lD6SrV zKXQ=!VDNAeDe%_t&iU5zT!x5SzcZ#Era<-*1fk>muAibiz6EZ!HELTY2=3;mCE&OS zo<8Qbdg@YJewH?EUj)$J)~btbL#L|aVNjfPXM-RbzZN&q4*@jZvX$_26yHyew!as^ zqeaR*6e{;hmk0N!b#Ry#Q$M;J(H{R z$9(!{kNasC|6k)b?-c%>yU(T?{L_&u!GaYPJ6Nz_?+Pl|#oi03y#H&! zN&J^?o#bS8b8iS?v;Idy2q%2j{~>nceDO$yAMUu~JNzcb2k)G5$^v;dXkvgtQY2m| z(o8Q&j(Fmg2i~YgKdiIIJo~h;%m|AtQRA2leH^mOEawa{&I;G;(7`sh+;9=yyNtRJ sbte;~8K$2(dYGo0HMW=`M;C33QKpr4rWhs5DhEtb;+_|t8@SDgKaAZT$^ZZW delta 2135 zcmV-d2&nh{C(|d8A^}{nBg+bt3=1fK-$_J4RCt{2*e`VATpq^puZW0LRZwc+I1x9-~fb6m9`NewUbS? zzDko-y}VS^RMrC6R=7EOEG}D>lP5{XJ6t+sd`uTb-6x}Q;*=eAWm}=C7L}8SfKU1a zw2z89c>`eHg1ZGkF)Fkp0fSM0Au48_b%SN-hs$Kj-Jw4NW?h)iegij)I@I13dM;%V z`V*ZhR8E@?jVG-Gf}Iv!?$(D6{TM$I(I?s`0qqljT;g!wn^^!8KV0nlp5KcX6VF8- z0fZAqQ&7GY5>AoeE+%yh)@A?mi+a_#<5JE6Kz?`_^5yuIaGHIym@R;R#emT~Zwi!F z1p5lWBxHFjsJ=ls$y#`%K7KklJ>D|=1oXcW91F*QY5!*O5=%ZviBF)oLM0Y(Qs{6~ zC3(gqd=3S8ZYQ97s%#Rc)B$ds1rXpT?=^tLKaX9tXj3ii*)))(`#5!_EvwtCa7kj* z1b-+GT{5~3pt2(B?Ag|TK~Ovuz8B#baC0~Z(0yXmfA|c*u9h9OY(Z^zzC===Af*%T zhw)mQT6sn9k;fkE^5(u($xBIm0<}}6?OlU`RC(g5rL>S$(tfV&d_izhUy|bPBJ{$m zIs?fkNZjdd(!35};)M%Vy*(f_@mO~~A!YmKqH7u>PY0%s> z_sK+J!Pe9AGyM$|UV}v^8&dZu{MUODpWu8NQ&(6?ucgTxzxl8kE<*1vp8`I9!r&BU z0r((>8fPc}&_VEj{$l{YzXAwPA>sFjY-`u1z56kM=?J`49Ap7xM|~Od(E_R)t*gyl zcEKWM!ws+<%^1Faf5=Bs-Wgn zSp*1@^4nz*^a&DfRN*{2ag!9!#UYqCf#zQaP*H_SS^`9WU6NGiSfFssn-0Ii$aV86 zkp0m17O3pI)K`$-aH%>l&wH;9<(kfZ^hNI=%<@5%)Ny^uqKfh~JuWq!db`HsJfnXWr1spFkvKeVr z5#Y~D>wP2p8+2F2)?ZKQvYHQ3lB&_VNb(6_nf_@2^iRoe!A}L??F&F*?{$tkw$Dq& zXgY5}EB_n3^c2Ju{%-`Kj>;deH^!D0k&x3nM zIlkOqrj8efdr=Qi@RA3xv@O(9A1mln`E6W!?pJ1Hd~8!3otL zg!>}D@J#V`DpeV+LM{wzE3 zz4!a8$9ST>c0EWdV5WI?^PGn~bJ_M&AzpRRGz8 zm7fZf1o)zQj4GG?^|c4gCu*{Hr%ICVWpUU2GsJNm;KaPGbwmt$bn&mNE5@fQZbtM?4oQ-Jim1msg7TLj^8prglS*@H^t zT?MdeGkEB%1S&4m2fY_4Zyw(ZPzuT1&l*F;EpSsEaY5vv+=tYWpNJ`(T=OrL}ckxkMNl!Nm zMb(cl8tab*3VM6Z?iQB-YFot*PsK%&ycXxzuWW#~7A{TQ)sVmbMF5hdYzfF-0CbO+ zn*Nq<#lLWc#y6Lb#pGv?`?dc9zuX_*Df~0TkER;`-A87Vu@Y>Ppb{g0{Ga&;xL-T& z>oO|S00000NkvXXu0mjfxBvhE4gdfE000000{{R3eEb%7c-pnj$4&xJ6a>&` z#V#rquwXBUy?_;aFDMF@|Njm=iEruFNls>SGr1vzjrt!6A)HXH|3mCH^T`u6zPaa` zukf2D-g)DUQx++(P6GpC43eUqLmKHN$uZBo@<@e`_`@2z%(F)e%Z#u@F5Z