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 74e399f31..5f100417a 100644 Binary files a/Templates/BaseGame/game/core/gui/scripts/fonts/Arial 14 (ansi).uft and b/Templates/BaseGame/game/core/gui/scripts/fonts/Arial 14 (ansi).uft differ diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrain.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrain.cs index f5d2c32e6..1fca1943d 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrain.cs +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrain.cs @@ -83,45 +83,4 @@ function GuiInspectorTypeTerrainAssetPtr::onClick( %this, %fieldName ) function GuiInspectorTypeTerrainAssetPtr::onControlDropped( %this, %payload, %position ) { -} - -//AssetDatabase.acquireAsset("pbr:NewTerrain"); -function TerrainAsset::saveAsset(%this) -{ - %matDepIdx = 0; - while(%this.getFieldValue("terrainMaterialAsset", %matDepIdx) !$= "") - { - %this.setFieldValue("terrainMaterialAsset", "", %matDepIdx); - } - - %filePath = AssetDatabase.getAssetFilePath(%this.getAssetId()); - - %mats = ETerrainEditor.getMaterials(); - - %assetQuery = new AssetQuery(); - AssetDatabase.findAssetType(%assetQuery, "TerrainMaterialAsset"); - - %count = %assetQuery.getCount(); - - %matDepIdx = 0; - for( %i = 0; %i < getRecordCount( %mats ); %i++ ) - { - %matInternalName = getRecord( %mats, %i ); - - for(%m=0; %m < %count; %m++) - { - %assetId = %assetQuery.getAsset(%m); - - %terrMatAssetDef = AssetDatabase.acquireAsset(%assetId); - - if(%terrMatAssetDef.materialDefinitionName $= %matInternalName) - { - %this.setFieldValue("terrainMaterialAsset", "@Asset=" @ %assetId, %matDepIdx); - %matDepIdx++; - } - } - } - %assetQuery.delete(); - - TAMLWrite(%this, %filePath); } \ No newline at end of file