Separated ShapeAsset's fileName for the loose file name and the fully processed file path to avoid potential save-out problems

Fixed autoAssetImport so it properly cleared any prior import session objects
Added beginning and ending comment line signfiers to make import logging easier to spot in console
Fixed variable used when doing the actual import on assets where it would use the top-level asset import objects and not the children array, causing a crash
Fixed the Make Selected A Mesh logic to work with the creation of a new shapeAsset
Added secondary handling to generate a prefab of the original selection for preservation purposes
Added optional input for makeSelectedPrefab to not delete the original selection(useful for the preservational prefab mentioned above)
Adjusted font color for NA text edit fields to make it more legible
Changed the non-working reloadDatabase button in assetBrowser to instead open the Asset Editing editor settings page.
This commit is contained in:
Areloch 2020-08-07 00:24:26 -05:00
parent 2b686bf713
commit 813762c722
10 changed files with 106 additions and 50 deletions

View file

@ -117,6 +117,8 @@ ShapeAsset::ShapeAsset()
{
mFileName = StringTable->EmptyString();
mConstructorFileName = StringTable->EmptyString();
mFilePath = StringTable->EmptyString();
mConstructorFilePath = StringTable->EmptyString();
}
//-----------------------------------------------------------------------------
@ -163,10 +165,10 @@ void ShapeAsset::initializeAsset()
ResourceManager::get().getChangedSignal().notify(this, &ShapeAsset::_onResourceChanged);
//Ensure our path is expando'd if it isn't already
if (!Platform::isFullPath(mFileName))
mFileName = getOwned() ? expandAssetFilePath(mFileName) : mFileName;
if (!Platform::isFullPath(mFilePath))
mFilePath = getOwned() ? expandAssetFilePath(mFileName) : mFilePath;
mConstructorFileName = expandAssetFilePath(mConstructorFileName);
mConstructorFilePath = expandAssetFilePath(mConstructorFilePath);
loadShape();
}
@ -258,7 +260,7 @@ bool ShapeAsset::loadShape()
}
}
mShape = ResourceManager::get().load(mFileName);
mShape = ResourceManager::get().load(mFilePath);
if (!mShape)
{
@ -439,7 +441,7 @@ void ShapeAsset::onAssetRefresh(void)
// Update.
if(!Platform::isFullPath(mFileName))
mFileName = getOwned() ? expandAssetFilePath(mFileName) : mFileName;
mFilePath = getOwned() ? expandAssetFilePath(mFileName) : mFilePath;
loadShape();
}

View file

@ -64,6 +64,8 @@ class ShapeAsset : public AssetBase
protected:
StringTableEntry mFileName;
StringTableEntry mConstructorFileName;
StringTableEntry mFilePath;
StringTableEntry mConstructorFilePath;
Resource<TSShape> mShape;
//Material assets we're dependent on and use
@ -96,9 +98,9 @@ public:
Resource<TSShape> getShapeResource() { return mShape; }
void SplitSequencePathAndName(String& srcPath, String& srcName);
StringTableEntry getShapeFilename() { return mFileName; }
StringTableEntry getShapeFilename() { return mFilePath; }
U32 getShapeFilenameHash() { return _StringTable::hashString(mFileName); }
U32 getShapeFilenameHash() { return _StringTable::hashString(mFilePath); }
Vector<AssetPtr<MaterialAsset>> getMaterialAssets() { return mMaterialAssets; }
@ -128,6 +130,9 @@ public:
void setShapeConstructorFile(const char* pScriptFile);
inline StringTableEntry getShapeConstructorFile(void) const { return mConstructorFileName; };
inline StringTableEntry getShapeFilePath(void) const { return mFilePath; };
inline StringTableEntry getShapeConstructorFilePath(void) const { return mConstructorFilePath; };
static bool getAssetByFilename(StringTableEntry fileName, AssetPtr<ShapeAsset>* shapeAsset);
static StringTableEntry getAssetIdByFilename(StringTableEntry fileName);
static bool getAssetById(StringTableEntry assetId, AssetPtr<ShapeAsset>* shapeAsset);

View file

@ -1833,6 +1833,9 @@ void AssetImporter::resolveAssetItemIssues(AssetImportObject* assetItem)
//
StringTableEntry AssetImporter::autoImportFile(Torque::Path filePath)
{
//Just in case we're reusing the same importer object from another import session, nuke any existing files
resetImportSession(true);
String assetType = getAssetTypeByFile(filePath);
if (assetType == String("Folder") || assetType == String("Zip"))
@ -1902,10 +1905,12 @@ StringTableEntry AssetImporter::autoImportFile(Torque::Path filePath)
}
#if TORQUE_DEBUG
Con::printf("/***************/");
for (U32 i = 0; i < activityLog.size(); i++)
{
Con::printf(activityLog[i].c_str());
}
Con::printf("/***************/");
#endif
if (hasIssues)
@ -2045,7 +2050,7 @@ void AssetImporter::importAssets(AssetImportObject* assetItem)
}
}
if (assetPath.isEmpty() && importingAssets[i]->assetType != String("MaterialAsset"))
if (assetPath.isEmpty() && childItem->assetType != String("MaterialAsset"))
{
dSprintf(importLogBuffer, sizeof(importLogBuffer), "AssetImporter::importAssets - Import attempt of %s failed, so skipping asset.", childItem->assetName.c_str());
activityLog.push_back(importLogBuffer);

View file

@ -3668,7 +3668,7 @@ DefineEngineMethod( WorldEditor, colladaExportSelection, void, ( const char* pat
object->colladaExportSelection( path );
}
void WorldEditor::makeSelectionPrefab( const char *filename )
void WorldEditor::makeSelectionPrefab( const char *filename, bool dontReplaceOriginals )
{
if ( mSelected->size() == 0 )
{
@ -3761,25 +3761,28 @@ void WorldEditor::makeSelectionPrefab( const char *filename )
}
// Save out .prefab file.
group->save( filename, false, "$ThisPrefab = " );
group->save( filename, false, "$ThisPrefab = " );
// Allocate Prefab object and add to level.
Prefab *fab = new Prefab();
fab->setFile( filename );
fabMat.inverse();
fab->setTransform( fabMat );
fab->registerObject();
scene->addObject( fab );
if (!dontReplaceOriginals)
{
// Allocate Prefab object and add to level.
Prefab* fab = new Prefab();
fab->setFile(filename);
fabMat.inverse();
fab->setTransform(fabMat);
fab->registerObject();
scene->addObject(fab);
// Select it, mark level as dirty.
clearSelection();
selectObject( fab );
setDirty();
// Select it, mark level as dirty.
clearSelection();
selectObject(fab);
setDirty();
// Delete original objects and temporary SimGroup.
group->deleteObject();
for ( S32 i = 0; i < cleanup.size(); i++ )
cleanup[i]->deleteObject();
// Delete original objects and temporary SimGroup.
group->deleteObject();
for (S32 i = 0; i < cleanup.size(); i++)
cleanup[i]->deleteObject();
}
}
void WorldEditor::explodeSelectedPrefab()
@ -3827,19 +3830,19 @@ void WorldEditor::explodeSelectedPrefab()
setDirty();
}
void WorldEditor::makeSelectionAMesh(const char *filename)
bool WorldEditor::makeSelectionAMesh(const char *filename)
{
if (mSelected->size() == 0)
{
Con::errorf("WorldEditor::makeSelectionAMesh - Nothing selected.");
return;
return false;
}
Scene* scene = Scene::getRootScene();
if (!scene)
{
Con::errorf("WorldEditor::makeSelectionAMesh - Could not find root Scene.");
return;
return false;
}
Vector< SimObject* > stack;
@ -3887,7 +3890,7 @@ void WorldEditor::makeSelectionAMesh(const char *filename)
if (found.empty())
{
Con::warnf("WorldEditor::makeSelectionPrefab - No valid objects selected.");
return;
return false;
}
// SimGroup we collect prefab objects into.
@ -3911,7 +3914,7 @@ void WorldEditor::makeSelectionAMesh(const char *filename)
}
if ( objectList.empty() )
return;
return false;
//
Point3F centroid;
@ -3982,6 +3985,11 @@ void WorldEditor::makeSelectionAMesh(const char *filename)
ColladaUtils::exportToCollada(filename, exportData);
//
if (Platform::isFile(filename))
return true;
else
return false;
// Allocate TSStatic object and add to level.
TSStatic *ts = new TSStatic();
ts->setShapeFileName(StringTable->insert(filename));
@ -4000,11 +4008,11 @@ void WorldEditor::makeSelectionAMesh(const char *filename)
objectList[i]->deleteObject();
}
DefineEngineMethod( WorldEditor, makeSelectionPrefab, void, ( const char* filename ),,
DefineEngineMethod( WorldEditor, makeSelectionPrefab, void, ( const char* filename, bool dontDeleteOriginals ), (false),
"Save selected objects to a .prefab file and replace them in the level with a Prefab object."
"@param filename Prefab file to save the selected objects to.")
{
object->makeSelectionPrefab( filename );
object->makeSelectionPrefab( filename, dontDeleteOriginals);
}
DefineEngineMethod( WorldEditor, explodeSelectedPrefab, void, (),,
@ -4013,11 +4021,11 @@ DefineEngineMethod( WorldEditor, explodeSelectedPrefab, void, (),,
object->explodeSelectedPrefab();
}
DefineEngineMethod(WorldEditor, makeSelectionAMesh, void, (const char* filename), ,
DefineEngineMethod(WorldEditor, makeSelectionAMesh, bool, (const char* filename), ,
"Save selected objects to a .dae collada file and replace them in the level with a TSStatic object."
"@param filename collada file to save the selected objects to.")
{
object->makeSelectionAMesh(filename);
return object->makeSelectionAMesh(filename);
}
DefineEngineMethod( WorldEditor, mountRelative, void, ( SceneObject *objA, SceneObject *objB ),,

View file

@ -114,10 +114,10 @@ class WorldEditor : public EditTSCtrl
void colladaExportSelection( const String &path );
void makeSelectionPrefab( const char *filename );
void makeSelectionPrefab( const char *filename, bool dontReplaceOriginals = false);
void explodeSelectedPrefab();
void makeSelectionAMesh(const char *filename);
bool makeSelectionAMesh(const char *filename);
//
static SceneObject* getClientObj(SceneObject *);

View file

@ -310,7 +310,7 @@
};
new GuiIconButtonCtrl() {
buttonMargin = "4 4";
iconBitmap = "tools/gui/images/stencilIcons/return.png";
iconBitmap = "tools/gui/images/stencilIcons/gear.png";
iconLocation = "Left";
sizeIconToButton = "1";
makeIconSquare = "1";
@ -328,12 +328,12 @@
profile = "ToolsGuiDefaultProfile";
visible = "1";
active = "1";
command = "AssetBrowser.refreshDatabases();";
command = "AssetBrowser.openAssetSettings();";
tooltipProfile = "GuiToolTipProfile";
tooltip = "Refresh Asset and Module databases.";
tooltip = "Edit the editor settings for Assets.";
hovertime = "1000";
isContainer = "0";
internalName = "refreshDatabasesButton";
internalName = "editAssetSettingsButton";
canSave = "1";
canSaveDynamicFields = "0";
};

View file

@ -1218,11 +1218,11 @@ function AssetBrowserFilterTree::onRightMouseDown(%this, %itemId)
//
//
//
function AssetBrowser::refreshDatabases(%this)
function AssetBrowser::openAssetSettings(%this)
{
//ModuleDatabase.scanModules( "data", false );
//ModuleDatabase.unloadGroup( "Game" );
//ModuleDatabase.LoadGroup( "Game" );
ESettingsWindow.toggleEditorSettings();
%assetEditIndex = ESettingsWindowList.findTextIndex("Asset Editing");
ESettingsWindowList.setSelectedRow( %assetEditIndex );
}
function AssetBrowser::showVisibiltyOptions(%this)

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View file

@ -246,7 +246,7 @@
<Setting name="dividerDarkColor">17 16 15 255</Setting>
<Setting name="fieldBGColor">59 58 57 255</Setting>
<Setting name="tabsHLColor">50 49 48 255</Setting>
<Setting name="fieldTextNAColor">77 77 77 255</Setting>
<Setting name="fieldTextNAColor">120 120 120 255</Setting>
<Setting name="tooltipBGColor">43 43 43 255</Setting>
<Setting name="tooltipDividerColor">72 70 68 255</Setting>
<Setting name="fieldTextColor">178 175 172 255</Setting>

View file

@ -573,10 +573,10 @@ function EditorExplodePrefab()
EditorTree.buildVisibleTree( true );
}
function makeSelectedAMesh()
function makeSelectedAMesh(%assetId)
{
%dlg = new SaveFileDialog()
/*%dlg = new SaveFileDialog()
{
Filters = "Collada file (*.dae)|*.dae|";
DefaultPath = $Pref::WorldEditor::LastPath;
@ -598,9 +598,45 @@ function makeSelectedAMesh()
%dlg.delete();
if ( !%ret )
return;
return;*/
%assetDef = AssetDatabase.acquireAsset(%assetId);
EWorldEditor.makeSelectionAMesh( %saveFile );
%assetPath = AssetDatabase.getAssetPath(%assetId);
%filePath = %assetPath @ "/" @ %assetDef.AssetName @ ".dae";
%fileName = fileName(%filePath);
%assetDef.fileName = %fileName;
%assetDef.saveAsset();
%success = EWorldEditor.makeSelectionAMesh( %filePath );
AssetDatabase.refreshAsset(%assetId);
if(%success)
{
//ok, cool it worked, so clear out the old
//First, get our center of the currently selected objects
%selectionCenter = EWorldEditor.getSelectionCentroid();
//Next, for safety purposes(and convenience!) we'll make them a prefab aping off the filepath/name provided
//TODO: Make this an editor option
%prefabPath = %assetPath @ "/" @ %assetDef.AssetName @ ".prefab";
EWorldEditor.makeSelectionPrefab(%prefabPath, true);
//Next, nuke 'em
EditorMenuEditDelete();
//now make a new static
%newStatic = new TSStatic()
{
shapeAsset = %assetId;
position = %selectionCenter;
};
getRootScene().add(%newStatic);
}
EditorTree.buildVisibleTree( true );
}