2018-01-28 20:48:02 +00:00
//-----------------------------------------------------------------------------
// Copyright (c) 2013 GarageGames, LLC
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//-----------------------------------------------------------------------------
# ifndef MATERIALASSET_H
# include "MaterialAsset.h"
# endif
# ifndef _ASSET_MANAGER_H_
# include "assets/assetManager.h"
# endif
# ifndef _CONSOLETYPES_H_
# include "console/consoleTypes.h"
# endif
# ifndef _TAML_
# include "persistence/taml/taml.h"
# endif
# ifndef _ASSET_PTR_H_
# include "assets/assetPtr.h"
# endif
2021-01-15 00:00:56 +00:00
# include "T3D/assets/assetImporter.h"
2021-01-05 06:58:18 +00:00
2021-08-22 00:48:26 +00:00
StringTableEntry MaterialAsset : : smNoMaterialAssetFallback = NULL ;
2021-07-19 06:07:08 +00:00
2018-01-28 20:48:02 +00:00
//-----------------------------------------------------------------------------
IMPLEMENT_CONOBJECT ( MaterialAsset ) ;
ConsoleType ( MaterialAssetPtr , TypeMaterialAssetPtr , MaterialAsset , ASSET_ID_FIELD_PREFIX )
//-----------------------------------------------------------------------------
ConsoleGetType ( TypeMaterialAssetPtr )
{
// Fetch asset Id.
return ( * ( ( AssetPtr < MaterialAsset > * ) dptr ) ) . getAssetId ( ) ;
}
//-----------------------------------------------------------------------------
ConsoleSetType ( TypeMaterialAssetPtr )
{
// Was a single argument specified?
if ( argc = = 1 )
{
// Yes, so fetch field value.
const char * pFieldValue = argv [ 0 ] ;
// Fetch asset pointer.
AssetPtr < MaterialAsset > * pAssetPtr = dynamic_cast < AssetPtr < MaterialAsset > * > ( ( AssetPtrBase * ) ( dptr ) ) ;
// Is the asset pointer the correct type?
if ( pAssetPtr = = NULL )
{
// No, so fail.
//Con::warnf("(TypeMaterialAssetPtr) - Failed to set asset Id '%d'.", pFieldValue);
return ;
}
// Set asset.
pAssetPtr - > setAssetId ( pFieldValue ) ;
return ;
}
// Warn.
Con : : warnf ( " (TypeMaterialAssetPtr) - Cannot set multiple args to a single asset. " ) ;
}
2020-11-02 05:32:34 +00:00
2021-07-19 06:07:08 +00:00
ConsoleType ( assetIdString , TypeMaterialAssetId , const char * , ASSET_ID_FIELD_PREFIX )
2020-11-02 05:32:34 +00:00
ConsoleGetType ( TypeMaterialAssetId )
{
// Fetch asset Id.
return * ( ( const char * * ) ( dptr ) ) ;
}
ConsoleSetType ( TypeMaterialAssetId )
{
// Was a single argument specified?
if ( argc = = 1 )
{
// Yes, so fetch field value.
const char * pFieldValue = argv [ 0 ] ;
// Fetch asset Id.
StringTableEntry * assetId = ( StringTableEntry * ) ( dptr ) ;
// Update asset value.
* assetId = StringTable - > insert ( pFieldValue ) ;
return ;
}
// Warn.
Con : : warnf ( " (TypeMaterialAssetId) - Cannot set multiple args to a single asset. " ) ;
}
2018-01-28 20:48:02 +00:00
//-----------------------------------------------------------------------------
MaterialAsset : : MaterialAsset ( )
{
mShaderGraphFile = " " ;
2019-05-06 06:49:58 +00:00
mScriptFile = StringTable - > EmptyString ( ) ;
2020-08-09 06:32:27 +00:00
mScriptPath = StringTable - > EmptyString ( ) ;
2019-05-06 06:49:58 +00:00
mMatDefinitionName = StringTable - > EmptyString ( ) ;
2021-07-19 06:07:08 +00:00
mMaterialDefinition = nullptr ;
2018-01-28 20:48:02 +00:00
}
//-----------------------------------------------------------------------------
MaterialAsset : : ~ MaterialAsset ( )
{
2021-07-19 06:07:08 +00:00
//SAFE_DELETE(mMaterialDefinition);
2018-01-28 20:48:02 +00:00
}
//-----------------------------------------------------------------------------
2021-07-19 06:07:08 +00:00
void MaterialAsset : : consoleInit ( )
{
Parent : : consoleInit ( ) ;
Con : : addVariable ( " $Core::NoMaterialAssetFallback " , TypeString , & smNoMaterialAssetFallback ,
" The assetId of the material to display when the requested material asset is missing. \n "
" @ingroup GFX \n " ) ;
2021-08-22 00:48:26 +00:00
smNoMaterialAssetFallback = StringTable - > insert ( Con : : getVariable ( " $Core::NoMaterialAssetFallback " ) ) ;
2021-07-19 06:07:08 +00:00
}
2018-01-28 20:48:02 +00:00
void MaterialAsset : : initPersistFields ( )
{
// Call parent.
Parent : : initPersistFields ( ) ;
//addField("shaderGraph", TypeRealString, Offset(mShaderGraphFile, MaterialAsset), "");
2022-01-30 17:50:16 +00:00
//addProtectedField("scriptFile", TypeAssetLooseFilePath, Offset(mScriptFile, MaterialAsset),
// &setScriptFile, &getScriptFile, "Path to the file containing the material definition.");
addField ( " scriptFile " , TypeAssetLooseFilePath , Offset ( mScriptFile , MaterialAsset ) , " " ) ;
2019-05-04 16:49:42 +00:00
2019-05-06 06:49:58 +00:00
addField ( " materialDefinitionName " , TypeString , Offset ( mMatDefinitionName , MaterialAsset ) , " Name of the material definition this asset is for. " ) ;
2018-01-28 20:48:02 +00:00
}
void MaterialAsset : : initializeAsset ( )
{
// Call parent.
Parent : : initializeAsset ( ) ;
2020-08-09 06:32:27 +00:00
mScriptPath = getOwned ( ) ? expandAssetFilePath ( mScriptFile ) : mScriptPath ;
2019-05-28 22:24:29 +00:00
2021-10-09 05:07:01 +00:00
if ( mMatDefinitionName = = StringTable - > EmptyString ( ) )
{
mLoadedState = Failed ;
return ;
}
2022-01-30 17:50:16 +00:00
if ( size ( ) ! = 0 & & mScriptPath = = StringTable - > EmptyString ( ) )
{
mLoadedState = EmbeddedDefinition ;
}
else if ( Torque : : FS : : IsScriptFile ( mScriptPath ) )
2021-09-19 06:01:47 +00:00
{
if ( ! Sim : : findObject ( mMatDefinitionName ) )
2021-10-05 00:04:21 +00:00
{
if ( Con : : executeFile ( mScriptPath , false , false ) )
{
mLoadedState = ScriptLoaded ;
}
else
{
mLoadedState = Failed ;
}
}
2021-10-09 05:07:01 +00:00
else
{
mLoadedState = DefinitionAlreadyExists ;
}
2021-09-19 06:01:47 +00:00
}
2021-07-19 06:07:08 +00:00
loadMaterial ( ) ;
2018-01-28 20:48:02 +00:00
}
void MaterialAsset : : onAssetRefresh ( )
{
2020-08-09 06:32:27 +00:00
mScriptPath = getOwned ( ) ? expandAssetFilePath ( mScriptFile ) : mScriptPath ;
2019-05-28 22:24:29 +00:00
2021-10-09 05:07:01 +00:00
if ( mMatDefinitionName = = StringTable - > EmptyString ( ) )
{
mLoadedState = Failed ;
return ;
}
2021-07-23 01:55:46 +00:00
if ( Torque : : FS : : IsScriptFile ( mScriptPath ) )
2021-09-19 06:01:47 +00:00
{
//Since we're refreshing, we can assume that the file we're executing WILL have an existing definition.
//But that definition, whatever it is, is the 'correct' one, so we enable the Replace Existing behavior
//when the engine encounters a named object conflict.
String redefineBehaviorPrev = Con : : getVariable ( " $Con::redefineBehavior " ) ;
Con : : setVariable ( " $Con::redefineBehavior " , " replaceExisting " ) ;
if ( Con : : executeFile ( mScriptPath , false , false ) )
mLoadedState = ScriptLoaded ;
else
mLoadedState = Failed ;
//And now that we've executed, switch back to the prior behavior
Con : : setVariable ( " $Con::redefineBehavior " , redefineBehaviorPrev . c_str ( ) ) ;
}
2018-01-28 20:48:02 +00:00
2021-07-19 06:07:08 +00:00
loadMaterial ( ) ;
2018-01-28 20:48:02 +00:00
}
2019-05-04 16:49:42 +00:00
void MaterialAsset : : setScriptFile ( const char * pScriptFile )
{
// Sanity!
AssertFatal ( pScriptFile ! = NULL , " Cannot use a NULL script file. " ) ;
2021-08-22 04:12:37 +00:00
pScriptFile = StringTable - > insert ( pScriptFile , true ) ;
2019-05-04 16:49:42 +00:00
// Update.
2019-05-28 22:24:29 +00:00
mScriptFile = getOwned ( ) ? expandAssetFilePath ( pScriptFile ) : pScriptFile ;
2019-05-04 16:49:42 +00:00
// Refresh the asset.
refreshAsset ( ) ;
}
2018-01-28 20:48:02 +00:00
//------------------------------------------------------------------------------
2021-07-19 06:07:08 +00:00
void MaterialAsset : : loadMaterial ( )
2018-01-28 20:48:02 +00:00
{
2021-07-19 06:07:08 +00:00
if ( mMaterialDefinition )
2022-01-30 17:50:16 +00:00
{
mMaterialDefinition - > safeDeleteObject ( ) ;
}
2021-07-19 06:07:08 +00:00
2022-01-30 17:50:16 +00:00
if ( mLoadedState = = EmbeddedDefinition )
{
if ( size ( ) ! = 0 )
{
for ( U32 i = 0 ; i < size ( ) ; i + + )
{
mMaterialDefinition = dynamic_cast < Material * > ( getObject ( i ) ) ;
if ( mMaterialDefinition )
{
mLoadedState = Ok ;
mMaterialDefinition - > setInternalName ( getAssetId ( ) ) ;
mMaterialDefinition - > reload ( ) ;
return ;
}
}
}
}
else if ( ( mLoadedState = = ScriptLoaded | | mLoadedState = = DefinitionAlreadyExists ) & & mMatDefinitionName ! = StringTable - > EmptyString ( ) )
2021-07-19 06:07:08 +00:00
{
Material * matDef ;
if ( ! Sim : : findObject ( mMatDefinitionName , matDef ) )
{
Con : : errorf ( " MaterialAsset: Unable to find the Material %s " , mMatDefinitionName ) ;
mLoadedState = BadFileReference ;
return ;
}
mMaterialDefinition = matDef ;
mLoadedState = Ok ;
2022-01-30 17:50:16 +00:00
mMaterialDefinition - > setInternalName ( getAssetId ( ) ) ;
2021-07-19 06:07:08 +00:00
mMaterialDefinition - > reload ( ) ;
return ;
}
mLoadedState = Failed ;
2018-01-28 20:48:02 +00:00
}
2021-07-19 06:07:08 +00:00
//------------------------------------------------------------------------------
2018-01-28 20:48:02 +00:00
void MaterialAsset : : copyTo ( SimObject * object )
{
// Call to parent.
Parent : : copyTo ( object ) ;
}
2020-11-02 05:32:34 +00:00
//------------------------------------------------------------------------------
2021-07-19 06:07:08 +00:00
U32 MaterialAsset : : getAssetByMaterialName ( StringTableEntry matName , AssetPtr < MaterialAsset > * matAsset )
2020-11-02 05:32:34 +00:00
{
2021-07-19 06:07:08 +00:00
AssetQuery query ;
U32 foundAssetcount = AssetDatabase . findAssetType ( & query , " MaterialAsset " ) ;
if ( foundAssetcount = = 0 )
2020-11-02 05:32:34 +00:00
{
//Didn't work, so have us fall back to a placeholder asset
2021-07-19 06:07:08 +00:00
matAsset - > setAssetId ( MaterialAsset : : smNoMaterialAssetFallback ) ;
if ( matAsset - > isNull ( ) )
2020-11-02 05:32:34 +00:00
{
2021-07-19 06:07:08 +00:00
//Well that's bad, loading the fallback failed.
Con : : warnf ( " MaterialAsset::getAssetByMaterialName - Finding of asset associated with material name %s failed with no fallback asset " , matName ) ;
return AssetErrCode : : Failed ;
2021-01-05 06:58:18 +00:00
}
2021-07-19 06:07:08 +00:00
//handle noshape not being loaded itself
if ( ( * matAsset ) - > mLoadedState = = BadFileReference )
2021-01-05 06:58:18 +00:00
{
2022-01-30 17:50:16 +00:00
Con : : warnf ( " MaterialAsset::getAssetByMaterialName - Finding of associated with aterial name %s failed, and fallback asset reported error of Bad File Reference. " , matName ) ;
2021-07-19 06:07:08 +00:00
return AssetErrCode : : BadFileReference ;
}
2021-01-05 06:58:18 +00:00
2022-01-30 17:50:16 +00:00
Con : : warnf ( " MaterialAsset::getAssetByMaterialName - Finding of associated with aterial name %s failed, utilizing fallback asset " , matName ) ;
2021-01-05 06:58:18 +00:00
2021-07-19 06:07:08 +00:00
( * matAsset ) - > mLoadedState = AssetErrCode : : UsingFallback ;
return AssetErrCode : : UsingFallback ;
}
else
{
for ( U32 i = 0 ; i < foundAssetcount ; i + + )
{
MaterialAsset * tMatAsset = AssetDatabase . acquireAsset < MaterialAsset > ( query . mAssetList [ i ] ) ;
if ( tMatAsset & & tMatAsset - > getMaterialDefinitionName ( ) = = matName )
2021-01-05 06:58:18 +00:00
{
2021-07-19 06:07:08 +00:00
matAsset - > setAssetId ( query . mAssetList [ i ] ) ;
AssetDatabase . releaseAsset ( query . mAssetList [ i ] ) ;
return ( * matAsset ) - > mLoadedState ;
2021-01-05 06:58:18 +00:00
}
2021-07-19 06:07:08 +00:00
AssetDatabase . releaseAsset ( query . mAssetList [ i ] ) ; //cleanup if that's not the one we needed
}
}
2021-10-29 04:52:58 +00:00
//Somehow we failed to bind an asset, so just use the fallback and mark the failure
matAsset - > setAssetId ( MaterialAsset : : smNoMaterialAssetFallback ) ;
( * matAsset ) - > mLoadedState = AssetErrCode : : UsingFallback ;
return AssetErrCode : : UsingFallback ;
2021-07-19 06:07:08 +00:00
}
2021-01-05 06:58:18 +00:00
2021-07-19 06:07:08 +00:00
StringTableEntry MaterialAsset : : getAssetIdByMaterialName ( StringTableEntry matName )
{
if ( matName = = StringTable - > EmptyString ( ) )
return StringTable - > EmptyString ( ) ;
2021-01-05 06:58:18 +00:00
2021-07-19 06:07:08 +00:00
StringTableEntry materialAssetId = MaterialAsset : : smNoMaterialAssetFallback ;
2021-01-05 06:58:18 +00:00
2021-07-19 06:07:08 +00:00
AssetQuery query ;
U32 foundCount = AssetDatabase . findAssetType ( & query , " MaterialAsset " ) ;
if ( foundCount ! = 0 )
{
for ( U32 i = 0 ; i < foundCount ; i + + )
{
MaterialAsset * matAsset = AssetDatabase . acquireAsset < MaterialAsset > ( query . mAssetList [ i ] ) ;
if ( matAsset & & matAsset - > getMaterialDefinitionName ( ) = = matName )
2021-01-05 06:58:18 +00:00
{
2021-07-19 06:07:08 +00:00
materialAssetId = matAsset - > getAssetId ( ) ;
AssetDatabase . releaseAsset ( query . mAssetList [ i ] ) ;
break ;
2021-01-05 06:58:18 +00:00
}
2021-07-19 06:07:08 +00:00
AssetDatabase . releaseAsset ( query . mAssetList [ i ] ) ;
2020-11-02 05:32:34 +00:00
}
}
return materialAssetId ;
}
2021-07-19 06:07:08 +00:00
U32 MaterialAsset : : getAssetById ( StringTableEntry assetId , AssetPtr < MaterialAsset > * materialAsset )
2020-11-02 05:32:34 +00:00
{
( * materialAsset ) = assetId ;
2021-07-19 06:07:08 +00:00
if ( materialAsset - > notNull ( ) )
{
return ( * materialAsset ) - > mLoadedState ;
}
else
{
//Didn't work, so have us fall back to a placeholder asset
materialAsset - > setAssetId ( MaterialAsset : : smNoMaterialAssetFallback ) ;
if ( materialAsset - > isNull ( ) )
{
//Well that's bad, loading the fallback failed.
Con : : warnf ( " MaterialAsset::getAssetById - Finding of asset with id %s failed with no fallback asset " , assetId ) ;
return AssetErrCode : : Failed ;
}
//handle noshape not being loaded itself
if ( ( * materialAsset ) - > mLoadedState = = BadFileReference )
{
Con : : warnf ( " MaterialAsset::getAssetById - Finding of asset with id %s failed, and fallback asset reported error of Bad File Reference. " , assetId ) ;
return AssetErrCode : : BadFileReference ;
}
2020-11-02 05:32:34 +00:00
2021-07-19 06:07:08 +00:00
Con : : warnf ( " MaterialAsset::getAssetById - Finding of asset with id %s failed, utilizing fallback asset " , assetId ) ;
2020-11-02 05:32:34 +00:00
2021-07-19 06:07:08 +00:00
( * materialAsset ) - > mLoadedState = AssetErrCode : : UsingFallback ;
return AssetErrCode : : UsingFallback ;
}
}
2020-11-02 05:32:34 +00:00
2022-01-30 17:50:16 +00:00
SimObjectPtr < Material > MaterialAsset : : findMaterialDefinitionByAssetId ( StringTableEntry assetId )
{
SimSet * matSet = MATMGR - > getMaterialSet ( ) ;
if ( matSet )
{
SimObjectPtr < Material > matDef = dynamic_cast < Material * > ( matSet - > findObjectByInternalName ( assetId ) ) ;
return matDef ;
}
return nullptr ;
}
2021-07-19 06:07:08 +00:00
# ifdef TORQUE_TOOLS
DefineEngineStaticMethod ( MaterialAsset , getAssetIdByMaterialName , const char * , ( const char * materialName ) , ( " " ) ,
" Queries the Asset Database to see if any asset exists that is associated with the provided material name. \n "
" @return The AssetId of the associated asset, if any. " )
{
return MaterialAsset : : getAssetIdByMaterialName ( StringTable - > insert ( materialName ) ) ;
2020-11-02 05:32:34 +00:00
}
2021-08-08 21:20:58 +00:00
2022-01-30 17:50:16 +00:00
//MaterialAsset::findMaterialDefinitionByAssetId("Prototyping:Detail")
DefineEngineStaticMethod ( MaterialAsset , findMaterialDefinitionByAssetId , S32 , ( const char * assetId ) , ( " " ) ,
" Queries the MaterialSet to see if any MaterialDefinition exists that is associated to the provided assetId. \n "
" @return The MaterialDefinition Id associated to the assetId, if any " )
{
SimObjectPtr < Material > matDef = MaterialAsset : : findMaterialDefinitionByAssetId ( StringTable - > insert ( assetId ) ) ;
if ( matDef . isNull ( ) )
return SimObjectId ( 0 ) ;
else
return matDef - > getId ( ) ;
}
2021-08-08 21:20:58 +00:00
DefineEngineMethod ( MaterialAsset , getScriptPath , const char * , ( ) , ,
2022-04-04 01:00:30 +00:00
" Gets the script file path for the asset. " )
2021-08-08 21:20:58 +00:00
{
return object - > getScriptPath ( ) ;
}
2021-07-19 06:07:08 +00:00
# endif
2020-11-02 05:32:34 +00:00
2022-06-13 17:38:08 +00:00
# ifdef TORQUE_TOOLS
2018-01-28 20:48:02 +00:00
//-----------------------------------------------------------------------------
// GuiInspectorTypeAssetId
//-----------------------------------------------------------------------------
IMPLEMENT_CONOBJECT ( GuiInspectorTypeMaterialAssetPtr ) ;
ConsoleDocClass ( GuiInspectorTypeMaterialAssetPtr ,
2020-11-02 05:32:34 +00:00
" @brief Inspector field type for Shapes \n \n "
2018-01-28 20:48:02 +00:00
" Editor use only. \n \n "
" @internal "
) ;
void GuiInspectorTypeMaterialAssetPtr : : consoleInit ( )
{
Parent : : consoleInit ( ) ;
ConsoleBaseType : : getType ( TypeMaterialAssetPtr ) - > setInspectorFieldType ( " GuiInspectorTypeMaterialAssetPtr " ) ;
}
GuiControl * GuiInspectorTypeMaterialAssetPtr : : constructEditControl ( )
{
// Create base filename edit controls
2020-11-02 05:32:34 +00:00
GuiControl * retCtrl = Parent : : constructEditControl ( ) ;
if ( retCtrl = = NULL )
return retCtrl ;
2018-01-28 20:48:02 +00:00
// Change filespec
char szBuffer [ 512 ] ;
2022-12-09 02:00:55 +00:00
const char * previewImage ;
2022-08-26 20:25:17 +00:00
if ( mInspector - > getInspectObject ( ) ! = nullptr )
{
dSprintf ( szBuffer , sizeof ( szBuffer ) , " AssetBrowser.showDialog( \" MaterialAsset \" , \" AssetBrowser.changeAsset \" , %s, %s); " ,
mInspector - > getIdString ( ) , mCaption ) ;
mBrowseButton - > setField ( " Command " , szBuffer ) ;
setDataField ( StringTable - > insert ( " targetObject " ) , NULL , mInspector - > getInspectObject ( ) - > getIdString ( ) ) ;
2022-12-09 02:00:55 +00:00
previewImage = mInspector - > getInspectObject ( ) - > getDataField ( mCaption , NULL ) ;
2022-08-26 20:25:17 +00:00
}
else
{
//if we don't have a target object, we'll be manipulating the desination value directly
2022-08-30 06:29:39 +00:00
dSprintf ( szBuffer , sizeof ( szBuffer ) , " AssetBrowser.showDialog( \" MaterialAsset \" , \" AssetBrowser.changeAsset \" , %s, \" %s \" ); " ,
2022-08-26 20:25:17 +00:00
mInspector - > getIdString ( ) , mVariableName ) ;
mBrowseButton - > setField ( " Command " , szBuffer ) ;
2022-12-09 02:00:55 +00:00
previewImage = Con : : getVariable ( mVariableName ) ;
2022-08-26 20:25:17 +00:00
}
2018-01-28 20:48:02 +00:00
2022-12-09 02:00:55 +00:00
mLabel = new GuiTextCtrl ( ) ;
mLabel - > registerObject ( ) ;
mLabel - > setControlProfile ( mProfile ) ;
mLabel - > setText ( mCaption ) ;
addObject ( mLabel ) ;
//
GuiTextEditCtrl * editTextCtrl = static_cast < GuiTextEditCtrl * > ( retCtrl ) ;
GuiControlProfile * toolEditProfile ;
if ( Sim : : findObject ( " ToolsGuiTextEditProfile " , toolEditProfile ) )
editTextCtrl - > setControlProfile ( toolEditProfile ) ;
GuiControlProfile * toolDefaultProfile = nullptr ;
Sim : : findObject ( " ToolsGuiDefaultProfile " , toolDefaultProfile ) ;
//
mPreviewImage = new GuiBitmapCtrl ( ) ;
mPreviewImage - > registerObject ( ) ;
if ( toolDefaultProfile )
mPreviewImage - > setControlProfile ( toolDefaultProfile ) ;
updatePreviewImage ( ) ;
addObject ( mPreviewImage ) ;
//
mPreviewBorderButton = new GuiBitmapButtonCtrl ( ) ;
mPreviewBorderButton - > registerObject ( ) ;
if ( toolDefaultProfile )
mPreviewBorderButton - > setControlProfile ( toolDefaultProfile ) ;
mPreviewBorderButton - > _setBitmap ( StringTable - > insert ( " ToolsModule:cubemapBtnBorder_n_image " ) ) ;
mPreviewBorderButton - > setField ( " Command " , szBuffer ) ; //clicking the preview does the same thing as the edit button, for simplicity
addObject ( mPreviewBorderButton ) ;
//
2020-11-02 05:32:34 +00:00
// Create "Open in Editor" button
mEditButton = new GuiBitmapButtonCtrl ( ) ;
2019-05-04 16:49:42 +00:00
2020-11-02 05:32:34 +00:00
dSprintf ( szBuffer , sizeof ( szBuffer ) , " AssetBrowser.editAsset(%d.getText()); " , retCtrl - > getId ( ) ) ;
mEditButton - > setField ( " Command " , szBuffer ) ;
2018-01-28 20:48:02 +00:00
2022-12-09 02:00:55 +00:00
mEditButton - > setText ( " Edit " ) ;
mEditButton - > setSizing ( horizResizeLeft , vertResizeAspectTop ) ;
2018-01-28 20:48:02 +00:00
2022-12-09 02:00:55 +00:00
mEditButton - > setDataField ( StringTable - > insert ( " Profile " ) , NULL , " ToolsGuiButtonProfile " ) ;
2020-11-02 05:32:34 +00:00
mEditButton - > setDataField ( StringTable - > insert ( " tooltipprofile " ) , NULL , " GuiToolTipProfile " ) ;
mEditButton - > setDataField ( StringTable - > insert ( " hovertime " ) , NULL , " 1000 " ) ;
2021-08-06 06:06:36 +00:00
mEditButton - > setDataField ( StringTable - > insert ( " tooltip " ) , NULL , " Open this asset in the Material Editor " ) ;
2018-01-28 20:48:02 +00:00
2020-11-02 05:32:34 +00:00
mEditButton - > registerObject ( ) ;
addObject ( mEditButton ) ;
2019-05-04 16:49:42 +00:00
2022-12-09 02:00:55 +00:00
//
mUseHeightOverride = true ;
mHeightOverride = 72 ;
2020-11-02 05:32:34 +00:00
return retCtrl ;
2018-01-28 20:48:02 +00:00
}
bool GuiInspectorTypeMaterialAssetPtr : : updateRects ( )
{
2022-12-09 02:00:55 +00:00
S32 rowSize = 18 ;
2018-01-28 20:48:02 +00:00
S32 dividerPos , dividerMargin ;
mInspector - > getDivider ( dividerPos , dividerMargin ) ;
Point2I fieldExtent = getExtent ( ) ;
Point2I fieldPos = getPosition ( ) ;
2022-12-09 02:00:55 +00:00
mEditCtrlRect . set ( 0 , 0 , fieldExtent . x , fieldExtent . y ) ;
mLabel - > resize ( Point2I ( mProfile - > mTextOffset . x , 0 ) , Point2I ( fieldExtent . x , rowSize ) ) ;
RectI previewRect = RectI ( Point2I ( mProfile - > mTextOffset . x , rowSize ) , Point2I ( 50 , 50 ) ) ;
mPreviewBorderButton - > resize ( previewRect . point , previewRect . extent ) ;
mPreviewImage - > resize ( previewRect . point , previewRect . extent ) ;
mEdit - > resize ( Point2I ( previewRect . point . x + previewRect . extent . x + 10 , rowSize * 1.5 ) , Point2I ( 200 , rowSize ) ) ;
mEditButton - > resize ( Point2I ( fieldExtent . x - 100 , fieldExtent . y - rowSize ) , Point2I ( 100 , rowSize ) ) ;
mBrowseButton - > setHidden ( true ) ;
return true ;
}
void GuiInspectorTypeMaterialAssetPtr : : updateValue ( )
{
Parent : : updateValue ( ) ;
updatePreviewImage ( ) ;
}
void GuiInspectorTypeMaterialAssetPtr : : updatePreviewImage ( )
{
const char * previewImage ;
if ( mInspector - > getInspectObject ( ) ! = nullptr )
previewImage = mInspector - > getInspectObject ( ) - > getDataField ( mCaption , NULL ) ;
else
previewImage = Con : : getVariable ( mVariableName ) ;
2018-01-28 20:48:02 +00:00
2022-12-09 02:00:55 +00:00
String matPreviewAssetId = String ( previewImage ) + " _PreviewImage " ;
matPreviewAssetId . replace ( " : " , " _ " ) ;
matPreviewAssetId = " ToolsModule: " + matPreviewAssetId ;
if ( AssetDatabase . isDeclaredAsset ( matPreviewAssetId . c_str ( ) ) )
2019-05-04 16:49:42 +00:00
{
2022-12-09 02:00:55 +00:00
mPreviewImage - > setBitmap ( StringTable - > insert ( matPreviewAssetId . c_str ( ) ) ) ;
2019-05-04 16:49:42 +00:00
}
2022-12-09 02:00:55 +00:00
else
{
if ( AssetDatabase . isDeclaredAsset ( previewImage ) )
{
MaterialAsset * matAsset = AssetDatabase . acquireAsset < MaterialAsset > ( previewImage ) ;
if ( matAsset & & matAsset - > getMaterialDefinition ( ) )
{
mPreviewImage - > _setBitmap ( matAsset - > getMaterialDefinition ( ) - > mDiffuseMapAssetId [ 0 ] ) ;
}
}
}
if ( mPreviewImage - > getBitmapAsset ( ) . isNull ( ) )
mPreviewImage - > _setBitmap ( StringTable - > insert ( " ToolsModule:genericAssetIcon_image " ) ) ;
}
2019-05-04 16:49:42 +00:00
2022-12-09 02:00:55 +00:00
void GuiInspectorTypeMaterialAssetPtr : : setPreviewImage ( StringTableEntry assetId )
{
String matPreviewAssetId = String ( assetId ) + " _PreviewImage " ;
matPreviewAssetId . replace ( " : " , " _ " ) ;
matPreviewAssetId = " ToolsModule: " + matPreviewAssetId ;
if ( AssetDatabase . isDeclaredAsset ( matPreviewAssetId . c_str ( ) ) )
2018-01-28 20:48:02 +00:00
{
2022-12-09 02:00:55 +00:00
mPreviewImage - > setBitmap ( StringTable - > insert ( matPreviewAssetId . c_str ( ) ) ) ;
}
else
{
if ( AssetDatabase . isDeclaredAsset ( assetId ) )
{
MaterialAsset * matAsset = AssetDatabase . acquireAsset < MaterialAsset > ( assetId ) ;
if ( matAsset & & matAsset - > getMaterialDefinition ( ) )
{
mPreviewImage - > _setBitmap ( matAsset - > getMaterialDefinition ( ) - > mDiffuseMapAssetId [ 0 ] ) ;
}
}
2018-01-28 20:48:02 +00:00
}
2022-12-09 02:00:55 +00:00
if ( mPreviewImage - > getBitmapAsset ( ) . isNull ( ) )
mPreviewImage - > _setBitmap ( StringTable - > insert ( " ToolsModule:genericAssetIcon_image " ) ) ;
2019-05-04 16:49:42 +00:00
}
2020-11-02 05:32:34 +00:00
IMPLEMENT_CONOBJECT ( GuiInspectorTypeMaterialAssetId ) ;
2020-07-11 21:20:10 +00:00
2020-11-02 05:32:34 +00:00
ConsoleDocClass ( GuiInspectorTypeMaterialAssetId ,
" @brief Inspector field type for Material Assets \n \n "
" Editor use only. \n \n "
" @internal "
) ;
2019-05-04 16:49:42 +00:00
2020-11-02 05:32:34 +00:00
void GuiInspectorTypeMaterialAssetId : : consoleInit ( )
2019-05-04 16:49:42 +00:00
{
2020-11-02 05:32:34 +00:00
Parent : : consoleInit ( ) ;
2019-05-04 16:49:42 +00:00
2020-11-02 05:32:34 +00:00
ConsoleBaseType : : getType ( TypeMaterialAssetId ) - > setInspectorFieldType ( " GuiInspectorTypeMaterialAssetId " ) ;
2019-05-04 16:49:42 +00:00
}
2022-06-13 17:38:08 +00:00
# endif