WIP of updating terrain editor to work with assets

Fix minor UI issues for asset browser
included folder 'asset type' script
This commit is contained in:
Areloch 2019-11-06 00:23:07 -06:00
parent 9d37aed74f
commit fa9f920755
25 changed files with 2203 additions and 1256 deletions

View file

@ -40,6 +40,8 @@
#include "assets/assetPtr.h"
#endif
#include "T3D/assets/TerrainMaterialAsset.h"
//-----------------------------------------------------------------------------
IMPLEMENT_CONOBJECT(TerrainAsset);
@ -89,7 +91,7 @@ ConsoleSetType(TypeTerrainAssetPtr)
TerrainAsset::TerrainAsset()
{
mTerrainFile = StringTable->EmptyString();
mTerrainFilePath = StringTable->EmptyString();
}
//-----------------------------------------------------------------------------
@ -106,8 +108,22 @@ void TerrainAsset::initPersistFields()
Parent::initPersistFields();
//addField("shaderGraph", TypeRealString, Offset(mShaderGraphFile, TerrainAsset), "");
addProtectedField("terrainFile", TypeAssetLooseFilePath, Offset(mTerrainFile, TerrainAsset),
&setTerrainFile, &getTerrainFile, "Path to the file containing the terrain data.");
addProtectedField("terrainFile", TypeAssetLooseFilePath, Offset(mTerrainFilePath, TerrainAsset),
&setTerrainFilePath, &getTerrainFilePath, "Path to the file containing the terrain data.");
}
void TerrainAsset::setDataField(StringTableEntry slotName, const char* array, const char* value)
{
Parent::setDataField(slotName, array, value);
//Now, if it's a material slot of some fashion, set it up
StringTableEntry matSlotName = StringTable->insert("terrainMaterialAsset");
if (String(slotName).startsWith(matSlotName))
{
StringTableEntry matId = StringTable->insert(value);
mTerrMaterialAssetIds.push_back(matId);
}
}
void TerrainAsset::initializeAsset()
@ -115,22 +131,20 @@ void TerrainAsset::initializeAsset()
// Call parent.
Parent::initializeAsset();
if (!Platform::isFullPath(mTerrainFile))
mTerrainFile = getOwned() ? expandAssetFilePath(mTerrainFile) : mTerrainFile;
if (!Platform::isFullPath(mTerrainFilePath))
mTerrainFilePath = getOwned() ? expandAssetFilePath(mTerrainFilePath) : mTerrainFilePath;
//if (Platform::isFile(mTerrainFile))
// Con::executeFile(mScriptFile, false, false);
loadTerrain();
}
void TerrainAsset::onAssetRefresh()
{
mTerrainFile = expandAssetFilePath(mTerrainFile);
mTerrainFilePath = expandAssetFilePath(mTerrainFilePath);
//if (Platform::isFile(mScriptFile))
// Con::executeFile(mScriptFile, false, false);
loadTerrain();
}
void TerrainAsset::setTerrainFile(const char* pScriptFile)
void TerrainAsset::setTerrainFilePath(const char* pScriptFile)
{
// Sanity!
AssertFatal(pScriptFile != NULL, "Cannot use a NULL script file.");
@ -139,12 +153,52 @@ void TerrainAsset::setTerrainFile(const char* pScriptFile)
pScriptFile = StringTable->insert(pScriptFile);
// Update.
mTerrainFile = getOwned() ? expandAssetFilePath(pScriptFile) : pScriptFile;
mTerrainFilePath = getOwned() ? expandAssetFilePath(pScriptFile) : pScriptFile;
// Refresh the asset.
refreshAsset();
}
bool TerrainAsset::loadTerrain()
{
mTerrMaterialAssets.clear();
mTerrMaterialAssetIds.clear();
//First, load any material, animation, etc assets we may be referencing in our asset
// Find any asset dependencies.
AssetManager::typeAssetDependsOnHash::Iterator assetDependenciesItr = mpOwningAssetManager->getDependedOnAssets()->find(mpAssetDefinition->mAssetId);
// Does the asset have any dependencies?
if (assetDependenciesItr != mpOwningAssetManager->getDependedOnAssets()->end())
{
// Iterate all dependencies.
while (assetDependenciesItr != mpOwningAssetManager->getDependedOnAssets()->end() && assetDependenciesItr->key == mpAssetDefinition->mAssetId)
{
StringTableEntry assetType = mpOwningAssetManager->getAssetType(assetDependenciesItr->value);
if (assetType == StringTable->insert("TerrainMaterialAsset"))
{
mTerrMaterialAssetIds.push_front(assetDependenciesItr->value);
//Force the asset to become initialized if it hasn't been already
AssetPtr<TerrainMaterialAsset> matAsset = assetDependenciesItr->value;
mTerrMaterialAssets.push_front(matAsset);
}
// Next dependency.
assetDependenciesItr++;
}
}
mTerrainFile = ResourceManager::get().load(mTerrainFilePath);
if (mTerrainFile)
return true;
return false;
}
//------------------------------------------------------------------------------
void TerrainAsset::copyTo(SimObject* object)
@ -190,7 +244,7 @@ GuiControl* GuiInspectorTypeTerrainAssetPtr::constructEditControl()
TerrainAsset* matAsset = AssetDatabase.acquireAsset< TerrainAsset>(matAssetId);
TerrainMaterial* materialDef = nullptr;
//TerrainMaterial* materialDef = nullptr;
char bitmapName[512] = "tools/worldEditor/images/toolbar/shape-editor";
@ -268,23 +322,3 @@ bool GuiInspectorTypeTerrainAssetPtr::updateRects()
return resized;
}
void GuiInspectorTypeTerrainAssetPtr::setMaterialAsset(String assetId)
{
mTargetObject->setDataField(mCaption, "", assetId);
//force a refresh
SimObject* obj = mInspector->getInspectObject();
mInspector->inspectObject(obj);
}
DefineEngineMethod(GuiInspectorTypeTerrainAssetPtr, setMaterialAsset, void, (String assetId), (""),
"Gets a particular shape animation asset for this shape.\n"
"@param animation asset index.\n"
"@return Shape Animation Asset.\n")
{
if (assetId == String::EmptyString)
return;
return object->setMaterialAsset(assetId);
}

View file

@ -19,6 +19,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//-----------------------------------------------------------------------------
#pragma once
#ifndef TERRAINASSET_H
#define TERRAINASSET_H
@ -46,14 +47,23 @@
#include "gui/editor/guiInspectorTypes.h"
#endif
#include "terrain/terrData.h"
//#include "terrain/terrData.h"
#include "assets/assetPtr.h"
#include "terrain/terrFile.h"
class TerrainMaterialAsset;
//-----------------------------------------------------------------------------
class TerrainAsset : public AssetBase
{
typedef AssetBase Parent;
StringTableEntry mTerrainFile;
StringTableEntry mTerrainFilePath;
Resource<TerrainFile> mTerrainFile;
//Material assets we're dependent on and use
Vector<StringTableEntry> mTerrMaterialAssetIds;
Vector<AssetPtr<TerrainMaterialAsset>> mTerrMaterialAssets;
public:
TerrainAsset();
@ -63,8 +73,14 @@ public:
static void initPersistFields();
virtual void copyTo(SimObject* object);
void setTerrainFile(const char* pTerrainFile);
inline StringTableEntry getTerrainFile(void) const { return mTerrainFile; };
virtual void setDataField(StringTableEntry slotName, const char* array, const char* value);
void setTerrainFilePath(const char* pTerrainFile);
inline StringTableEntry getTerrainFilePath(void) const { return mTerrainFilePath; };
inline Resource<TerrainFile> getTerrainResource(void) const { return mTerrainFile; };
bool loadTerrain();
/// Declare Console Object.
DECLARE_CONOBJECT(TerrainAsset);
@ -73,8 +89,8 @@ protected:
virtual void initializeAsset();
virtual void onAssetRefresh(void);
static bool setTerrainFile(void *obj, const char *index, const char *data) { static_cast<TerrainAsset*>(obj)->setTerrainFile(data); return false; }
static const char* getTerrainFile(void* obj, const char* data) { return static_cast<TerrainAsset*>(obj)->getTerrainFile(); }
static bool setTerrainFilePath(void *obj, const char *index, const char *data) { static_cast<TerrainAsset*>(obj)->setTerrainFilePath(data); return false; }
static const char* getTerrainFilePath(void* obj, const char* data) { return static_cast<TerrainAsset*>(obj)->getTerrainFilePath(); }
};
DefineConsoleType(TypeTerrainAssetPtr, TerrainAsset)
@ -96,7 +112,6 @@ public:
virtual GuiControl* constructEditControl();
virtual bool updateRects();
void setMaterialAsset(String assetId);
};
#endif // _ASSET_BASE_H_

View file

@ -19,6 +19,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//-----------------------------------------------------------------------------
#pragma once
#ifndef TERRAINMATERIALASSET_H
#define TERRAINMATERIALASSET_H

View file

@ -184,7 +184,7 @@ Material::Material()
dMemset(mCellLayout, 0, sizeof(mCellLayout));
dMemset(mCellSize, 0, sizeof(mCellSize));
dMemset(mNormalMapAtlas, 0, sizeof(mNormalMapAtlas));
dMemset(mUseAnisotropic, 0, sizeof(mUseAnisotropic));
dMemset(mUseAnisotropic, 1, sizeof(mUseAnisotropic));
// Deferred Shading : Metalness
dMemset(mUseMetalness, 0, sizeof(mUseMetalness));

View file

@ -53,7 +53,7 @@
#include "T3D/physics/physicsCollision.h"
#include "console/engineAPI.h"
#include "console/engineAPI.h"
#include "T3D/assets/TerrainMaterialAsset.h"
using namespace Torque;
IMPLEMENT_CO_NETOBJECT_V1(TerrainBlock);
@ -207,6 +207,9 @@ TerrainBlock::TerrainBlock()
mNetFlags.set(Ghostable | ScopeAlways);
mIgnoreZodiacs = false;
zode_primBuffer = 0;
mTerrainAsset = StringTable->EmptyString();
mTerrainAssetId = StringTable->EmptyString();
}
@ -352,17 +355,121 @@ void TerrainBlock::setFile(const Resource<TerrainFile>& terr)
mTerrFileName = terr.getPath();
}
bool TerrainBlock::setTerrainAsset(const StringTableEntry terrainAssetId)
{
mTerrainAssetId = terrainAssetId;
mTerrainAsset = mTerrainAssetId;
if (mTerrainAsset.isNull())
{
Con::errorf("[TerrainBlock] Failed to load terrain asset.");
return false;
}
Resource<TerrainFile> file = mTerrainAsset->getTerrainResource();
if (!file)
return false;
mFile = file;
return true;
}
bool TerrainBlock::save(const char *filename)
{
return mFile->save(filename);
}
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, "");
}
}
AssetQuery* pAssetQuery = new AssetQuery();
AssetDatabase.findAssetType(pAssetQuery, "TerrainMaterialAsset");
TerrainBlock* clientTerr = static_cast<TerrainBlock*>(getClientObject());
U32 terrMatIdx = 0;
for (U32 i = 0; i < pAssetQuery->mAssetList.size(); i++)
{
//Acquire it so we can check it for matches
AssetPtr<TerrainMaterialAsset> terrMatAsset = pAssetQuery->mAssetList[i];
for (U32 m = 0; m < clientTerr->mFile->mMaterials.size(); m++)
{
StringTableEntry intMatName = clientTerr->mFile->mMaterials[m]->getInternalName();
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++;
}
}
terrMatAsset.clear();
}
pAssetQuery->destroySelf();
// 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(mTerrainAsset, AssetDatabase.getAssetFilePath(mTerrainAsset.getAssetId()));
if (!success)
return false;*/
return mFile->save(mTerrainAsset->getTerrainFilePath());
}
return false;
}
bool TerrainBlock::_setTerrainFile( void *obj, const char *index, const char *data )
{
static_cast<TerrainBlock*>( obj )->setFile( FileName( data ) );
return false;
}
bool TerrainBlock::_setTerrainAsset(void* obj, const char* index, const char* data)
{
TerrainBlock* terr = static_cast<TerrainBlock*>(obj);// ->setFile(FileName(data));
terr->setTerrainAsset(StringTable->insert(data));
terr->setMaskBits(FileMask | HeightMapChangeMask);
return false;
}
void TerrainBlock::_updateBounds()
{
if ( !mFile )
@ -901,31 +1008,50 @@ bool TerrainBlock::onAdd()
if(!Parent::onAdd())
return false;
if ( mTerrFileName.isEmpty() )
Resource<TerrainFile> terr;
if (!mTerrainAsset.isNull())
{
mTerrFileName = Con::getVariable( "$Client::MissionFile" );
String terrainDirectory( Con::getVariable( "$pref::Directories::Terrain" ) );
if ( terrainDirectory.isEmpty() )
terr = mTerrainAsset->getTerrainResource();
if (terr == NULL)
{
terrainDirectory = "art/terrains/";
if (isClientObject())
NetConnection::setLastError("Unable to load terrain asset: %s", mTerrainAsset.getAssetId());
return false;
}
mTerrFileName.replace("tools/levels/", terrainDirectory);
mTerrFileName.replace("levels/", terrainDirectory);
Vector<String> materials;
materials.push_back( "warning_material" );
TerrainFile::create( &mTerrFileName, 256, materials );
mFile = terr;
}
Resource<TerrainFile> terr = ResourceManager::get().load( mTerrFileName );
if(terr == NULL)
else
{
if(isClientObject())
NetConnection::setLastError("You are missing a file needed to play this mission: %s", mTerrFileName.c_str());
return false;
}
if (mTerrFileName.isEmpty())
{
mTerrFileName = Con::getVariable("$Client::MissionFile");
String terrainDirectory(Con::getVariable("$pref::Directories::Terrain"));
if (terrainDirectory.isEmpty())
{
terrainDirectory = "art/terrains/";
}
mTerrFileName.replace("tools/levels/", terrainDirectory);
mTerrFileName.replace("levels/", terrainDirectory);
setFile( terr );
Vector<String> materials;
materials.push_back("warning_material");
TerrainFile::create(&mTerrFileName, 256, materials);
}
terr = ResourceManager::get().load(mTerrFileName);
if (terr == NULL)
{
if (isClientObject())
NetConnection::setLastError("You are missing a file needed to play this mission: %s", mTerrFileName.c_str());
return false;
}
setFile(terr);
}
if ( terr->mNeedsResaving )
{
@ -1130,6 +1256,10 @@ void TerrainBlock::initPersistFields()
&TerrainBlock::_setTerrainFile, &defaultProtectedGetFn,
"The source terrain data file." );
addProtectedField("terrainAsset", TypeTerrainAssetPtr, Offset(mTerrainAsset, TerrainBlock),
&TerrainBlock::_setTerrainAsset, &defaultProtectedGetFn,
"The source terrain data asset.");
endGroup( "Media" );
addGroup( "Misc" );
@ -1190,6 +1320,7 @@ U32 TerrainBlock::packUpdate(NetConnection* con, U32 mask, BitStream *stream)
if ( stream->writeFlag( mask & FileMask ) )
{
stream->write( mTerrFileName );
stream->writeString( mTerrainAssetId );
stream->write( mCRC );
}
@ -1230,12 +1361,25 @@ 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 ( isProperlyAdded() )
setFile( terrFile );
if (terrainAsset != StringTable->EmptyString())
{
if (isProperlyAdded())
setTerrainAsset(StringTable->insert(terrFile.c_str()));
else
mTerrainAssetId = StringTable->insert(terrFile.c_str());
}
else
mTerrFileName = terrFile;
{
if (isProperlyAdded())
setFile(terrFile);
else
mTerrFileName = terrFile;
}
}
if ( stream->readFlag() ) // SizeMask
@ -1310,6 +1454,16 @@ DefineEngineMethod( TerrainBlock, save, bool, ( const char* fileName),,
return static_cast<TerrainBlock*>(object)->save(filename);
}
DefineEngineMethod(TerrainBlock, saveAsset, bool, (), ,
"@brief Saves the terrain block's terrain file to the specified file name.\n\n"
"@param fileName Name and path of file to save terrain data to.\n\n"
"@return True if file save was successful, false otherwise")
{
return static_cast<TerrainBlock*>(object)->saveAsset();
}
//ConsoleMethod(TerrainBlock, save, bool, 3, 3, "(string fileName) - saves the terrain block's terrain file to the specified file name.")
//{
// char filename[256];

View file

@ -50,7 +50,12 @@
#include "gfx/gfxPrimitiveBuffer.h"
#endif
#ifndef _ASSET_PTR_H_
#include "assets/assetPtr.h"
#endif
#ifndef TERRAINASSET_H
#include "T3D/assets/TerrainAsset.h"
#endif
class GBitmap;
class TerrainBlock;
@ -120,6 +125,9 @@ protected:
///
FileName mTerrFileName;
AssetPtr<TerrainAsset> mTerrainAsset;
StringTableEntry mTerrainAssetId;
/// The maximum detail distance found in the material list.
F32 mMaxDetailDistance;
@ -241,6 +249,7 @@ protected:
// Protected fields
static bool _setTerrainFile( void *obj, const char *index, const char *data );
static bool _setTerrainAsset(void* obj, const char* index, const char* data);
static bool _setSquareSize( void *obj, const char *index, const char *data );
static bool _setBaseTexSize(void *obj, const char *index, const char *data);
static bool _setBaseTexFormat(void *obj, const char *index, const char *data);
@ -418,7 +427,10 @@ public:
void setFile(const Resource<TerrainFile>& file);
bool setTerrainAsset(const StringTableEntry terrainAssetId);
bool save(const char* filename);
bool saveAsset();
F32 getSquareSize() const { return mSquareSize; }

View file

@ -97,7 +97,7 @@ void TerrainMaterial::initPersistFields()
addField( "parallaxScale", TypeF32, Offset( mParallaxScale, TerrainMaterial ), "Used to scale the height from the normal map to give some self "
"occlusion effect (aka parallax) to the terrain material" );
addField("compositeMap", TypeStringFilename, Offset(mCompositeMap, TerrainMaterial), "Composite map for the material");
addField("pbrConfigMap", TypeStringFilename, Offset(mCompositeMap, TerrainMaterial), "Composite map for the material");
Parent::initPersistFields();
// Gotta call this at least once or it won't get created!