2018-01-28 14:48:02 -06:00
# pragma once
//-----------------------------------------------------------------------------
// 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.
//-----------------------------------------------------------------------------
2021-07-19 01:07:08 -05:00
# pragma once
2018-01-28 14:48:02 -06:00
# ifndef _ASSET_BASE_H_
# include "assets/assetBase.h"
# endif
# ifndef _ASSET_DEFINITION_H_
# include "assets/assetDefinition.h"
# endif
# ifndef _STRINGUNIT_H_
# include "string/stringUnit.h"
# endif
# ifndef _ASSET_FIELD_TYPES_H_
# include "assets/assetFieldTypes.h"
# endif
2020-03-19 09:47:38 -05:00
# ifndef _ASSET_PTR_H_
# include "assets/assetPtr.h"
2024-12-14 01:18:46 +00:00
# endif
2018-01-28 14:48:02 -06:00
# include "gfx/bitmap/gBitmap.h"
# include "gfx/gfxTextureHandle.h"
2021-07-19 01:07:08 -05:00
# include "sim/netConnection.h"
# include <string>
2021-10-03 02:56:26 -05:00
# include "assetMacroHelpers.h"
2022-10-01 12:44:45 -05:00
# include "gfx/gfxDevice.h"
2024-12-14 01:18:46 +00:00
# ifndef _MATTEXTURETARGET_H_
# include "materials/matTextureTarget.h"
# endif
2018-01-28 14:48:02 -06:00
//-----------------------------------------------------------------------------
class ImageAsset : public AssetBase
{
typedef AssetBase Parent ;
2023-10-08 13:19:43 -05:00
typedef AssetPtr < ImageAsset > ConcreteAssetPtr ;
2018-01-28 14:48:02 -06:00
2020-02-17 00:32:50 -06:00
public :
/// The different types of image use cases
enum ImageTypes
{
Albedo = 0 ,
Normal = 1 ,
2020-09-30 13:51:12 -05:00
ORMConfig = 2 ,
2020-02-17 00:32:50 -06:00
GUI = 3 ,
Roughness = 4 ,
AO = 5 ,
Metalness = 6 ,
Glow = 7 ,
Particle = 8 ,
Decal = 9 ,
2020-04-15 12:15:12 -05:00
Cubemap = 10 ,
2024-12-14 01:18:46 +00:00
ImageTypeCount = 11
2020-02-17 00:32:50 -06:00
} ;
2024-12-21 11:16:55 +00:00
class Frame
{
public :
Frame ( const S32 pixelOffsetX , const S32 pixelOffsetY ,
const U32 pixelWidth , const U32 pixelHeight ,
const F32 texelWidthScale , const F32 texelHeightScale ,
StringTableEntry inRegionName = StringTable - > EmptyString ( ) )
: regionName ( inRegionName )
{
pixelOffset . set ( pixelOffsetY , pixelOffsetY ) ;
pixelSize . set ( pixelWidth , pixelHeight ) ;
texelLower . set ( pixelOffsetX * texelWidthScale , pixelOffsetY * texelHeightScale ) ;
texelSize . set ( pixelWidth * texelWidthScale , pixelHeight * texelHeightScale ) ;
texelUpper . set ( texelLower . x + texelSize . x , texelLower . y + texelSize . y ) ;
}
void setFlip ( bool flipX , bool flipY )
{
if ( flipX ) mSwap ( texelLower . x , texelUpper . x ) ;
if ( flipY ) mSwap ( texelLower . y , texelUpper . y ) ;
}
Point2I pixelOffset ;
Point2I pixelSize ;
Point2F texelLower ;
Point2F texelUpper ;
Point2F texelSize ;
StringTableEntry regionName ;
} ;
2021-07-19 01:07:08 -05:00
static StringTableEntry smNoImageAssetFallback ;
2023-10-08 13:19:43 -05:00
enum ImageAssetErrCode
{
TooManyMips = AssetErrCode : : Extended ,
Extended
} ;
static const String mErrCodeStrings [ U32 ( ImageAssetErrCode : : Extended ) - U32 ( Parent : : Extended ) + 1 ] ;
static U32 getAssetErrCode ( ConcreteAssetPtr checkAsset ) { if ( checkAsset ) return checkAsset - > mLoadedState ; else return 0 ; }
static String getAssetErrstrn ( U32 errCode )
{
if ( errCode < Parent : : Extended ) return Parent : : getAssetErrstrn ( errCode ) ;
if ( errCode > ImageAssetErrCode : : Extended ) return " undefined error " ;
return mErrCodeStrings [ errCode - Parent : : Extended ] ;
} ;
2024-12-21 11:16:55 +00:00
private :
2023-10-08 13:19:43 -05:00
2024-12-21 11:16:55 +00:00
StringTableEntry mImageFile ;
bool mUseMips ;
bool mIsHDRImage ;
GFXTexHandle mTextureHandle ;
ImageTypes mImageType ;
2021-07-19 01:07:08 -05:00
HashMap < GFXTextureProfile * , GFXTexHandle > mResourceMap ;
2024-12-21 11:16:55 +00:00
void generateTexture ( void ) ;
2018-01-28 14:48:02 -06:00
public :
ImageAsset ( ) ;
virtual ~ ImageAsset ( ) ;
2021-07-19 01:07:08 -05:00
/// Set up some global script interface stuff.
static void consoleInit ( ) ;
2018-01-28 14:48:02 -06:00
/// Engine.
static void initPersistFields ( ) ;
2024-12-21 11:16:55 +00:00
/// Sim
bool onAdd ( ) override ;
void onRemove ( ) override ;
2024-03-18 18:13:00 +00:00
void copyTo ( SimObject * object ) override ;
2018-01-28 14:48:02 -06:00
/// Declare Console Object.
DECLARE_CONOBJECT ( ImageAsset ) ;
2021-07-19 01:07:08 -05:00
void _onResourceChanged ( const Torque : : Path & path ) ;
2024-12-21 11:16:55 +00:00
// asset Base load
U32 load ( ) override ;
2018-01-28 14:48:02 -06:00
2024-12-21 11:16:55 +00:00
void setImageFile ( StringTableEntry pImageFile ) ;
inline StringTableEntry getImageFile ( void ) const { return mImageFile ; } ;
2020-08-09 01:32:27 -05:00
2024-12-21 11:16:55 +00:00
void setGenMips ( const bool pGenMips ) ;
inline bool getGenMips ( void ) const { return mUseMips ; } ;
2018-01-28 14:48:02 -06:00
2024-12-21 11:16:55 +00:00
void setTextureHDR ( const bool pIsHDR ) ;
inline bool getTextureHDR ( void ) const { return mIsHDRImage ; } ;
2020-03-19 09:47:38 -05:00
2024-12-21 11:16:55 +00:00
inline GFXTexHandle & getTexture ( void ) { load ( ) ; generateTexture ( ) ; return mTextureHandle ; }
GFXTexHandle getTexture ( GFXTextureProfile * requestedProfile ) ;
2018-01-28 14:48:02 -06:00
2021-07-19 01:07:08 -05:00
static StringTableEntry getImageTypeNameFromType ( ImageTypes type ) ;
2024-12-21 11:16:55 +00:00
static ImageTypes getImageTypeFromName ( StringTableEntry name ) ;
2020-05-11 02:30:58 -05:00
2024-12-21 11:16:55 +00:00
void setImageType ( ImageTypes type ) { mImageType = type ; }
ImageTypes getImageType ( ) { return mImageType ; }
inline U32 getTextureWidth ( void ) const { return mTextureHandle - > getWidth ( ) ; }
inline U32 getTextureHeight ( void ) const { return mTextureHandle - > getHeight ( ) ; }
inline U32 getTextureDepth ( void ) const { return mTextureHandle - > getDepth ( ) ; }
inline U32 getTextureBitmapWidth ( void ) const { return mTextureHandle - > getBitmapWidth ( ) ; }
inline U32 getTextureBitmapHeight ( void ) const { return mTextureHandle - > getBitmapHeight ( ) ; }
inline U32 getTextureBitmapDepth ( void ) const { return mTextureHandle - > getBitmapDepth ( ) ; }
bool isAssetValid ( void ) const override { return ! mTextureHandle . isNull ( ) ; }
2020-05-11 02:30:58 -05:00
2021-07-19 01:07:08 -05:00
static U32 getAssetByFilename ( StringTableEntry fileName , AssetPtr < ImageAsset > * imageAsset ) ;
2020-10-10 22:48:13 -05:00
static StringTableEntry getAssetIdByFilename ( StringTableEntry fileName ) ;
2021-07-19 01:07:08 -05:00
static U32 getAssetById ( StringTableEntry assetId , AssetPtr < ImageAsset > * imageAsset ) ;
static U32 getAssetById ( String assetId , AssetPtr < ImageAsset > * imageAsset ) { return getAssetById ( assetId . c_str ( ) , imageAsset ) ; } ;
2020-07-11 16:20:10 -05:00
2024-12-21 11:16:55 +00:00
const char * getImageInfo ( ) ;
2023-11-12 16:33:17 -06:00
2018-01-28 14:48:02 -06:00
protected :
2024-12-21 11:16:55 +00:00
// Asset Base callback
void initializeAsset ( void ) override ;
void onAssetRefresh ( void ) override ;
void _onFileChanged ( const Torque : : Path & path ) ;
/// Taml callbacks.
void onTamlPreWrite ( void ) override ;
void onTamlPostWrite ( void ) override ;
2018-01-28 14:48:02 -06:00
2024-12-21 11:16:55 +00:00
protected :
// Texture file
static bool setImageFile ( void * obj , StringTableEntry index , StringTableEntry data ) { static_cast < ImageAsset * > ( obj ) - > setImageFile ( data ) ; return false ; }
static const char * getImageFile ( void * obj , StringTableEntry data ) { return static_cast < ImageAsset * > ( obj ) - > getImageFile ( ) ; }
static bool writeImageFile ( void * obj , StringTableEntry pFieldName ) { return static_cast < ImageAsset * > ( obj ) - > getImageFile ( ) ! = StringTable - > EmptyString ( ) ; }
// Gen mips?
static bool setGenMips ( void * obj , StringTableEntry index , StringTableEntry data ) { static_cast < ImageAsset * > ( obj ) - > setGenMips ( dAtob ( data ) ) ; return false ; }
static bool writeGenMips ( void * obj , StringTableEntry pFieldName ) { return static_cast < ImageAsset * > ( obj ) - > getGenMips ( ) = = true ; }
// Texture Is Hdr?
static bool setTextureHDR ( void * obj , StringTableEntry index , StringTableEntry data ) { static_cast < ImageAsset * > ( obj ) - > setTextureHDR ( dAtob ( data ) ) ; return false ; }
static bool writeTextureHDR ( void * obj , StringTableEntry pFieldName ) { return static_cast < ImageAsset * > ( obj ) - > getTextureHDR ( ) = = true ; }
2018-01-28 14:48:02 -06:00
} ;
DefineConsoleType ( TypeImageAssetPtr , ImageAsset )
2020-10-10 22:48:13 -05:00
DefineConsoleType ( TypeImageAssetId , String )
2018-01-28 14:48:02 -06:00
2024-12-21 11:16:55 +00:00
DECLARE_STRUCT ( AssetPtr < ImageAsset > )
DefineConsoleType ( TypeImageAssetPtrRefactor , AssetPtr < ImageAsset > )
2020-02-17 00:32:50 -06:00
typedef ImageAsset : : ImageTypes ImageAssetType ;
DefineEnumType ( ImageAssetType ) ;
2021-07-19 01:07:08 -05:00
# pragma region Singular Asset Macros
//Singular assets
/// <Summary>
/// Declares an image asset
/// This establishes the assetId, asset and legacy filepath fields, along with supplemental getter and setter functions
/// </Summary>
# define DECLARE_IMAGEASSET(className, name, changeFunc, profile) public: \
GFXTexHandle m # # name = NULL ; \
StringTableEntry m # # name # # Name ; \
StringTableEntry m # # name # # AssetId ; \
AssetPtr < ImageAsset > m # # name # # Asset ; \
GFXTextureProfile * m # # name # # Profile = & profile ; \
public : \
const StringTableEntry get # # name # # File ( ) const { return m # # name # # Name ; } \
void set # # name # # File ( const FileName & _in ) { m # # name # # Name = StringTable - > insert ( _in . c_str ( ) ) ; } \
const AssetPtr < ImageAsset > & get # # name # # Asset ( ) const { return m # # name # # Asset ; } \
void set # # name # # Asset ( const AssetPtr < ImageAsset > & _in ) { m # # name # # Asset = _in ; } \
\
bool _set # # name ( StringTableEntry _in ) \
{ \
if ( m # # name # # AssetId ! = _in | | m # # name # # Name ! = _in ) \
{ \
2021-08-29 17:41:20 -05:00
if ( _in = = NULL | | _in = = StringTable - > EmptyString ( ) ) \
2021-07-19 01:07:08 -05:00
{ \
m # # name # # Name = StringTable - > EmptyString ( ) ; \
m # # name # # AssetId = StringTable - > EmptyString ( ) ; \
m # # name # # Asset = NULL ; \
m # # name . free ( ) ; \
m # # name = NULL ; \
return true ; \
} \
else if ( _in [ 0 ] = = ' $ ' | | _in [ 0 ] = = ' # ' ) \
{ \
2024-12-13 00:26:39 +00:00
m # # name # # Name = _in ; \
2024-12-14 13:37:23 +00:00
m # # name # # AssetId = StringTable - > EmptyString ( ) ; \
2021-07-19 01:07:08 -05:00
m # # name # # Asset = NULL ; \
m # # name . free ( ) ; \
m # # name = NULL ; \
return true ; \
} \
\
if ( AssetDatabase . isDeclaredAsset ( _in ) ) \
{ \
m # # name # # AssetId = _in ; \
\
U32 assetState = ImageAsset : : getAssetById ( m # # name # # AssetId , & m # # name # # Asset ) ; \
\
if ( ImageAsset : : Ok = = assetState ) \
{ \
m # # name # # Name = StringTable - > EmptyString ( ) ; \
} \
} \
else \
{ \
StringTableEntry assetId = ImageAsset : : getAssetIdByFilename ( _in ) ; \
if ( assetId ! = StringTable - > EmptyString ( ) ) \
{ \
m # # name # # AssetId = assetId ; \
if ( ImageAsset : : getAssetById ( m # # name # # AssetId , & m # # name # # Asset ) = = ImageAsset : : Ok ) \
{ \
m # # name # # Name = StringTable - > EmptyString ( ) ; \
} \
} \
else \
{ \
m # # name # # Name = _in ; \
m # # name # # AssetId = StringTable - > EmptyString ( ) ; \
m # # name # # Asset = NULL ; \
} \
} \
} \
if ( get # # name ( ) ! = StringTable - > EmptyString ( ) & & m # # name # # Name ! = StringTable - > insert ( " texhandle " ) ) \
{ \
\
2024-12-14 13:37:23 +00:00
if ( get # # name ( ) [ 0 ] ! = ' $ ' & & get # # name ( ) [ 0 ] ! = ' # ' ) { \
m # # name . set ( get # # name ( ) , m # # name # # Profile , avar ( " %s() - mTextureObject (line %d) " , __FUNCTION__ , __LINE__ ) ) ; \
2024-12-13 00:26:39 +00:00
} \
2021-07-19 01:07:08 -05:00
} \
else \
{ \
m # # name . free ( ) ; \
m # # name = NULL ; \
} \
\
if ( get # # name ( ) = = StringTable - > EmptyString ( ) ) \
return true ; \
\
if ( m # # name # # Asset . notNull ( ) & & m # # name # # Asset - > getStatus ( ) ! = ImageAsset : : Ok ) \
{ \
Con : : errorf ( " %s(%s)::_set%s() - image asset failure \" %s \" due to [%s] " , macroText ( className ) , getName ( ) , macroText ( name ) , _in , ImageAsset : : getAssetErrstrn ( m # # name # # Asset - > getStatus ( ) ) . c_str ( ) ) ; \
return false ; \
} \
2021-09-09 13:29:31 -05:00
else if ( ! m # # name ) \
2021-07-19 01:07:08 -05:00
{ \
2022-10-01 12:44:45 -05:00
if ( GFX - > getAdapterType ( ) ! = NullDevice ) \
Con : : errorf ( " %s(%s)::_set%s() - Couldn't load image \" %s \" " , macroText ( className ) , getName ( ) , macroText ( name ) , _in ) ; \
2021-07-19 01:07:08 -05:00
return false ; \
} \
return true ; \
} \
\
const StringTableEntry get # # name ( ) const \
{ \
2024-12-21 11:16:55 +00:00
if ( m # # name # # Asset & & ( m # # name # # Asset - > getImageFile ( ) ! = StringTable - > EmptyString ( ) ) ) \
return Platform : : makeRelativePathName ( m # # name # # Asset - > getImageFile ( ) , Platform : : getMainDotCsDir ( ) ) ; \
2021-07-19 01:07:08 -05:00
else if ( m # # name # # AssetId ! = StringTable - > EmptyString ( ) ) \
return m # # name # # AssetId ; \
else if ( m # # name # # Name ! = StringTable - > EmptyString ( ) ) \
return StringTable - > insert ( Platform : : makeRelativePathName ( m # # name # # Name , Platform : : getMainDotCsDir ( ) ) ) ; \
else \
return StringTable - > EmptyString ( ) ; \
} \
GFXTexHandle get # # name # # Resource ( ) \
{ \
2024-12-14 01:18:46 +00:00
if ( m # # name # # Asset & & ( m # # name # # Asset - > getImageFileName ( ) ! = StringTable - > EmptyString ( ) ) ) \
return m # # name # # Asset - > getTexture ( m # # name # # Profile ) ; \
2021-07-19 01:07:08 -05:00
return m # # name ; \
2021-09-28 18:16:14 -05:00
} \
2021-09-28 18:50:35 -05:00
bool name # # Valid ( ) { return ( get # # name ( ) ! = StringTable - > EmptyString ( ) & & m # # name # # Asset - > getStatus ( ) = = AssetBase : : Ok ) ; }
2020-10-10 22:48:13 -05:00
2021-07-19 01:07:08 -05:00
# ifdef TORQUE_SHOW_LEGACY_FILE_FIELDS
2020-10-10 22:48:13 -05:00
2021-07-19 01:07:08 -05:00
# define INITPERSISTFIELD_IMAGEASSET(name, consoleClass, docs) \
addProtectedField ( # name , TypeImageFilename , Offset ( m # # name # # Name , consoleClass ) , _set # # name # # Data , & defaultProtectedGetFn , assetDoc ( name , docs ) ) ; \
addProtectedField ( assetText ( name , Asset ) , TypeImageAssetId , Offset ( m # # name # # AssetId , consoleClass ) , _set # # name # # Data , & defaultProtectedGetFn , assetDoc ( name , asset docs . ) ) ;
2020-10-10 22:48:13 -05:00
2021-07-19 01:07:08 -05:00
# else
# define INITPERSISTFIELD_IMAGEASSET(name, consoleClass, docs) \
addProtectedField ( # name , TypeImageFilename , Offset ( m # # name # # Name , consoleClass ) , _set # # name # # Data , & defaultProtectedGetFn , assetDoc ( name , docs ) , AbstractClassRep : : FIELD_HideInInspectors ) ; \
addProtectedField ( assetText ( name , Asset ) , TypeImageAssetId , Offset ( m # # name # # AssetId , consoleClass ) , _set # # name # # Data , & defaultProtectedGetFn , assetDoc ( name , asset docs . ) ) ;
2020-10-10 22:48:13 -05:00
2021-07-19 01:07:08 -05:00
# endif // SHOW_LEGACY_FILE_FIELDS
# define LOAD_IMAGEASSET(name)\
if ( m # # name # # AssetId ! = StringTable - > EmptyString ( ) ) \
2020-10-12 04:43:47 -05:00
{ \
2021-07-19 01:07:08 -05:00
S32 assetState = ImageAsset : : getAssetById ( m # # name # # AssetId , & m # # name # # Asset ) ; \
if ( assetState = = ImageAsset : : Ok ) \
2020-10-12 04:43:47 -05:00
{ \
2021-07-19 01:07:08 -05:00
m # # name # # Name = StringTable - > EmptyString ( ) ; \
2020-10-12 04:43:47 -05:00
} \
2021-07-19 01:07:08 -05:00
else Con : : warnf ( " Warning: %s::LOAD_IMAGEASSET(%s)-%s " , mClassName , m # # name # # AssetId , ImageAsset : : getAssetErrstrn ( assetState ) . c_str ( ) ) ; \
2020-10-12 04:43:47 -05:00
}
2020-09-30 13:50:23 -05:00
2021-07-19 01:07:08 -05:00
# pragma endregion
# pragma region Arrayed Asset Macros
//Arrayed Assets
2024-12-14 01:18:46 +00:00
# define DECLARE_IMAGEASSET_ARRAY(className, name, max, changeFunc) public: \
2021-07-19 01:07:08 -05:00
static const U32 sm # # name # # Count = max ; \
GFXTexHandle m # # name [ max ] ; \
StringTableEntry m # # name # # Name [ max ] ; \
StringTableEntry m # # name # # AssetId [ max ] ; \
AssetPtr < ImageAsset > m # # name # # Asset [ max ] ; \
2021-11-03 12:30:52 -05:00
GFXTextureProfile * m # # name # # Profile [ max ] ; \
2021-07-19 01:07:08 -05:00
public : \
const StringTableEntry get # # name # # File ( const U32 & index ) const { return m # # name # # Name [ index ] ; } \
void set # # name # # File ( const FileName & _in , const U32 & index ) { m # # name # # Name [ index ] = StringTable - > insert ( _in . c_str ( ) ) ; } \
const AssetPtr < ImageAsset > & get # # name # # Asset ( const U32 & index ) const { return m # # name # # Asset [ index ] ; } \
void set # # name # # Asset ( const AssetPtr < ImageAsset > & _in , const U32 & index ) { m # # name # # Asset [ index ] = _in ; } \
\
bool _set # # name ( StringTableEntry _in , const U32 & index ) \
{ \
if ( m # # name # # AssetId [ index ] ! = _in | | m # # name # # Name [ index ] ! = _in ) \
2020-10-12 04:43:47 -05:00
{ \
2021-07-19 01:07:08 -05:00
if ( index > = sm # # name # # Count | | index < 0 ) \
return false ; \
2021-08-29 17:41:20 -05:00
if ( _in = = NULL | | _in = = StringTable - > EmptyString ( ) ) \
2021-07-19 01:07:08 -05:00
{ \
m # # name # # Name [ index ] = StringTable - > EmptyString ( ) ; \
m # # name # # AssetId [ index ] = StringTable - > EmptyString ( ) ; \
m # # name # # Asset [ index ] = NULL ; \
m # # name [ index ] . free ( ) ; \
m # # name [ index ] = NULL ; \
return true ; \
} \
else if ( _in [ 0 ] = = ' $ ' | | _in [ 0 ] = = ' # ' ) \
{ \
2024-12-13 00:26:39 +00:00
m # # name # # Name [ index ] = _in ; \
2024-12-14 13:37:23 +00:00
m # # name # # AssetId [ index ] = StringTable - > EmptyString ( ) ; \
2021-07-19 01:07:08 -05:00
m # # name # # Asset [ index ] = NULL ; \
m # # name [ index ] . free ( ) ; \
m # # name [ index ] = NULL ; \
return true ; \
} \
\
if ( AssetDatabase . isDeclaredAsset ( _in ) ) \
{ \
m # # name # # AssetId [ index ] = _in ; \
\
U32 assetState = ImageAsset : : getAssetById ( m # # name # # AssetId [ index ] , & m # # name # # Asset [ index ] ) ; \
\
if ( ImageAsset : : Ok = = assetState ) \
{ \
m # # name # # Name [ index ] = StringTable - > EmptyString ( ) ; \
} \
} \
else \
{ \
StringTableEntry assetId = ImageAsset : : getAssetIdByFilename ( _in ) ; \
if ( assetId ! = StringTable - > EmptyString ( ) ) \
{ \
m # # name # # AssetId [ index ] = assetId ; \
if ( ImageAsset : : getAssetById ( m # # name # # AssetId [ index ] , & m # # name # # Asset [ index ] ) = = ImageAsset : : Ok ) \
{ \
m # # name # # Name [ index ] = StringTable - > EmptyString ( ) ; \
} \
} \
else \
{ \
m # # name # # Name [ index ] = _in ; \
m # # name # # AssetId [ index ] = StringTable - > EmptyString ( ) ; \
m # # name # # Asset [ index ] = NULL ; \
} \
} \
} \
if ( get # # name ( index ) ! = StringTable - > EmptyString ( ) & & m # # name # # Name [ index ] ! = StringTable - > insert ( " texhandle " ) ) \
{ \
2024-12-14 14:47:46 +00:00
m # # name # # Asset [ index ] - > getChangedSignal ( ) . notify ( this , & className : : changeFunc ) ; \
if ( get # # name ( index ) [ 0 ] ! = ' $ ' & & get # # name ( index ) [ 0 ] ! = ' # ' ) \
m # # name [ index ] . set ( get # # name ( index ) , m # # name # # Profile [ index ] , avar ( " %s() - mTextureObject (line %d) " , __FUNCTION__ , __LINE__ ) ) ; \
2021-07-19 01:07:08 -05:00
} \
else \
{ \
m # # name [ index ] . free ( ) ; \
m # # name [ index ] = NULL ; \
} \
\
if ( get # # name ( index ) = = StringTable - > EmptyString ( ) ) \
return true ; \
\
if ( m # # name # # Asset [ index ] . notNull ( ) & & m # # name # # Asset [ index ] - > getStatus ( ) ! = ImageAsset : : Ok ) \
{ \
Con : : errorf ( " %s(%s)::_set%s(%i) - image asset failure \" %s \" due to [%s] " , macroText ( className ) , getName ( ) , macroText ( name ) , index , _in , ImageAsset : : getAssetErrstrn ( m # # name # # Asset [ index ] - > getStatus ( ) ) . c_str ( ) ) ; \
return false ; \
} \
2021-09-09 13:29:31 -05:00
else if ( ! m # # name [ index ] ) \
2021-07-19 01:07:08 -05:00
{ \
2022-10-01 12:44:45 -05:00
if ( GFX - > getAdapterType ( ) ! = NullDevice ) \
Con : : errorf ( " %s(%s)::_set%s(%i) - Couldn't load image \" %s \" " , macroText ( className ) , getName ( ) , macroText ( name ) , index , _in ) ; \
2021-07-19 01:07:08 -05:00
return false ; \
2020-10-12 04:43:47 -05:00
} \
return true ; \
} \
2021-07-19 01:07:08 -05:00
\
const StringTableEntry get # # name ( const U32 & index ) const \
{ \
2024-12-21 11:16:55 +00:00
if ( m # # name # # Asset [ index ] & & ( m # # name # # Asset [ index ] - > getImageFile ( ) ! = StringTable - > EmptyString ( ) ) ) \
return Platform : : makeRelativePathName ( m # # name # # Asset [ index ] - > getImageFile ( ) , Platform : : getMainDotCsDir ( ) ) ; \
2021-07-19 01:07:08 -05:00
else if ( m # # name # # AssetId [ index ] ! = StringTable - > EmptyString ( ) ) \
return m # # name # # AssetId [ index ] ; \
else if ( m # # name # # Name [ index ] ! = StringTable - > EmptyString ( ) ) \
2021-11-04 15:44:43 -05:00
{ \
if ( String ( m # # name # # Name [ index ] ) . startsWith ( " # " ) | | String ( m # # name # # Name [ index ] ) . startsWith ( " $ " ) ) \
return StringTable - > insert ( m # # name # # Name [ index ] ) ; \
else \
return StringTable - > insert ( Platform : : makeRelativePathName ( m # # name # # Name [ index ] , Platform : : getMainDotCsDir ( ) ) ) ; \
} \
2021-07-19 01:07:08 -05:00
else \
return StringTable - > EmptyString ( ) ; \
} \
GFXTexHandle get # # name # # Resource ( const U32 & index ) \
{ \
if ( index > = sm # # name # # Count | | index < 0 ) \
return nullptr ; \
2024-12-14 01:18:46 +00:00
if ( m # # name # # Asset [ index ] & & ( m # # name # # Asset [ index ] - > getImageFileName ( ) ! = StringTable - > EmptyString ( ) ) ) \
return m # # name # # Asset [ index ] - > getTexture ( m # # name # # Profile [ index ] ) ; \
2021-07-19 01:07:08 -05:00
return m # # name [ index ] ; \
2021-09-28 18:16:14 -05:00
} \
2021-09-28 18:50:35 -05:00
bool name # # Valid ( const U32 & id ) { return ( get # # name ( id ) ! = StringTable - > EmptyString ( ) & & m # # name # # Asset [ id ] - > getStatus ( ) = = AssetBase : : Ok ) ; }
2021-07-19 01:07:08 -05:00
# define DECLARE_IMAGEASSET_ARRAY_SETGET(className, name)\
static bool _set # # name # # Data ( void * obj , const char * index , const char * data ) \
{ \
if ( ! index ) return false ; \
U32 idx = dAtoi ( index ) ; \
if ( idx > = sm # # name # # Count ) \
return false ; \
bool ret = false ; \
className * object = static_cast < className * > ( obj ) ; \
ret = object - > _set # # name ( StringTable - > insert ( data ) , idx ) ; \
return ret ; \
}
# define DECLARE_IMAGEASSET_ARRAY_NET_SETGET(className, name, bitmask)\
static bool _set # # name # # Data ( void * obj , const char * index , const char * data ) \
{ \
if ( ! index ) return false ; \
U32 idx = dAtoi ( index ) ; \
if ( idx > = sm # # name # # Count ) \
return false ; \
bool ret = false ; \
className * object = static_cast < className * > ( obj ) ; \
ret = object - > _set # # name ( StringTable - > insert ( data ) , idx ) ; \
if ( ret ) \
object - > setMaskBits ( bitmask ) ; \
return ret ; \
}
2021-11-03 12:30:52 -05:00
# define INIT_IMAGEASSET_ARRAY(name, profile, index) \
{ \
m # # name # # Name [ index ] = StringTable - > EmptyString ( ) ; \
m # # name # # AssetId [ index ] = StringTable - > EmptyString ( ) ; \
m # # name # # Asset [ index ] = NULL ; \
m # # name [ index ] = NULL ; \
m # # name # # Profile [ index ] = & profile ; \
}
2021-07-19 01:07:08 -05:00
# define DEF_IMAGEASSET_ARRAY_BINDS(className,name)\
DefineEngineMethod ( className , get # # name , const char * , ( S32 index ) , , " get name " ) \
{ \
return object - > get # # name ( index ) ; \
} \
DefineEngineMethod ( className , get # # name # # Asset , const char * , ( S32 index ) , , assetText ( name , asset reference ) ) \
{ \
if ( index > = className : : sm # # name # # Count | | index < 0 ) \
return " " ; \
return object - > m # # name # # AssetId [ index ] ; \
} \
DefineEngineMethod ( className , set # # name , bool , ( const char * map , S32 index ) , , assetText ( name , assignment . first tries asset then flat file . ) ) \
{ \
return object - > _set # # name ( StringTable - > insert ( map ) , index ) ; \
2020-10-12 04:43:47 -05:00
}
2021-07-19 01:07:08 -05:00
# ifdef TORQUE_SHOW_LEGACY_FILE_FIELDS
# define INITPERSISTFIELD_IMAGEASSET_ARRAY(name, arraySize, consoleClass, docs) \
addProtectedField ( # name , TypeImageFilename , Offset ( m # # name # # Name , consoleClass ) , _set # # name # # Data , & defaultProtectedGetFn , arraySize , assetDoc ( name , docs ) ) ; \
addProtectedField ( assetText ( name , Asset ) , TypeImageAssetId , Offset ( m # # name # # AssetId , consoleClass ) , _set # # name # # Data , & defaultProtectedGetFn , arraySize , assetDoc ( name , asset docs . ) ) ;
# else
# define INITPERSISTFIELD_IMAGEASSET_ARRAY(name, arraySize, consoleClass, docs) \
addProtectedField ( # name , TypeImageFilename , Offset ( m # # name # # Name , consoleClass ) , _set # # name # # Data , & defaultProtectedGetFn , arraySize , assetDoc ( name , docs ) , AbstractClassRep : : FIELD_HideInInspectors ) ; \
addProtectedField ( assetText ( name , Asset ) , TypeImageAssetId , Offset ( m # # name # # AssetId , consoleClass ) , _set # # name # # Data , & defaultProtectedGetFn , arraySize , assetDoc ( name , asset docs . ) ) ;
2018-01-28 14:48:02 -06:00
# endif
2021-07-19 01:07:08 -05:00
# define LOAD_IMAGEASSET_ARRAY(name, index)\
if ( m # # name # # AssetId [ index ] ! = StringTable - > EmptyString ( ) ) \
{ \
S32 assetState = ImageAsset : : getAssetById ( m # # name # # AssetId [ index ] , & m # # name # # Asset [ index ] ) ; \
if ( assetState = = ImageAsset : : Ok ) \
{ \
m # # name # # Name [ index ] = StringTable - > EmptyString ( ) ; \
} \
else Con : : warnf ( " Warning: %s::LOAD_IMAGEASSET(%s)-%s " , mClassName , m # # name # # AssetId [ index ] , ImageAsset : : getAssetErrstrn ( assetState ) . c_str ( ) ) ; \
}
# pragma endregion
2024-12-21 11:16:55 +00:00
# pragma region Refactor Asset Macros
2021-07-19 01:07:08 -05:00
2024-12-21 11:16:55 +00:00
# define DECLARE_IMAGEASSET_REFACTOR(className, name, profile) \
private : \
AssetPtr < ImageAsset > m # # name # # Asset ; \
public : \
2024-12-21 12:23:57 +00:00
void _set # # name ( StringTableEntry _in ) { \
if ( m # # name # # Asset . getAssetId ( ) = = _in ) \
return ; \
\
if ( ! AssetDatabase . isDeclaredAsset ( _in ) ) \
{ \
StringTableEntry imageAssetId = ImageAsset : : smNoImageAssetFallback ; \
AssetQuery query ; \
S32 foundAssetcount = AssetDatabase . findAssetLooseFile ( & query , _in ) ; \
if ( foundAssetcount ! = 0 ) \
{ \
imageAssetId = query . mAssetList [ 0 ] ; \
} \
m # # name # # Asset = imageAssetId ; \
} \
else \
{ \
m # # name # # Asset = _in ; \
} \
} ; \
2024-12-21 17:34:16 +00:00
\
inline StringTableEntry _get # # name ( void ) const { return m # # name # # Asset . getAssetId ( ) ; } \
GFXTexHandle get # # name ( ) { return m # # name # # Asset . notNull ( ) ? m # # name # # Asset - > getTexture ( & profile ) : NULL ; } \
AssetPtr < ImageAsset > get # # name # # Asset ( void ) { return m # # name # # Asset ; } \
static bool _set # # name # # Data ( void * obj , const char * index , const char * data ) { static_cast < className * > ( obj ) - > _set # # name ( _getStringTable ( ) - > insert ( data ) ) ; return false ; }
# define DECLARE_IMAGEASSET_NET_REFACTOR(className, name, profile, mask) \
private : \
AssetPtr < ImageAsset > m # # name # # Asset ; \
public : \
void _set # # name ( StringTableEntry _in ) { \
if ( m # # name # # Asset . getAssetId ( ) = = _in ) \
return ; \
\
if ( ! AssetDatabase . isDeclaredAsset ( _in ) ) \
{ \
StringTableEntry imageAssetId = ImageAsset : : smNoImageAssetFallback ; \
AssetQuery query ; \
S32 foundAssetcount = AssetDatabase . findAssetLooseFile ( & query , _in ) ; \
if ( foundAssetcount ! = 0 ) \
{ \
imageAssetId = query . mAssetList [ 0 ] ; \
} \
m # # name # # Asset = imageAssetId ; \
} \
else \
{ \
m # # name # # Asset = _in ; \
} \
setMaskBits ( mask ) ; \
} ; \
\
2024-12-21 11:16:55 +00:00
inline StringTableEntry _get # # name ( void ) const { return m # # name # # Asset . getAssetId ( ) ; } \
GFXTexHandle get # # name ( ) { return m # # name # # Asset . notNull ( ) ? m # # name # # Asset - > getTexture ( & profile ) : NULL ; } \
AssetPtr < ImageAsset > get # # name # # Asset ( void ) { return m # # name # # Asset ; } \
static bool _set # # name # # Data ( void * obj , const char * index , const char * data ) { static_cast < className * > ( obj ) - > _set # # name ( _getStringTable ( ) - > insert ( data ) ) ; return false ; }
# define INITPERSISTFIELD_IMAGEASSET_REFACTOR(name, consoleClass, docs) \
addProtectedField ( assetText ( name , Asset ) , TypeImageAssetPtrRefactor , Offset ( m # # name # # Asset , consoleClass ) , _set # # name # # Data , & defaultProtectedGetFn , assetDoc ( name , asset docs . ) ) ;
2024-12-22 17:03:44 +00:00
# define DECLARE_IMAGEASSET_ARRAY_REFACTOR(className, name, profile, max) \
private : \
AssetPtr < ImageAsset > m # # name # # Asset [ max ] ; \
public : \
void _set # # name ( StringTableEntry _in , const U32 & index ) { \
if ( m # # name # # Asset [ index ] . getAssetId ( ) = = _in ) \
return ; \
\
if ( ! AssetDatabase . isDeclaredAsset ( _in ) ) \
{ \
StringTableEntry imageAssetId = ImageAsset : : smNoImageAssetFallback ; \
AssetQuery query ; \
S32 foundAssetcount = AssetDatabase . findAssetLooseFile ( & query , _in ) ; \
if ( foundAssetcount ! = 0 ) \
{ \
imageAssetId = query . mAssetList [ 0 ] ; \
} \
m # # name # # Asset [ index ] = imageAssetId ; \
} \
else \
{ \
m # # name # # Asset [ index ] = _in ; \
} \
} ; \
\
inline StringTableEntry _get # # name ( const U32 & index ) const { return m # # name # # Asset [ index ] . getAssetId ( ) ; } \
GFXTexHandle get # # name ( const U32 & index ) { return m # # name # # Asset [ index ] . notNull ( ) ? m # # name # # Asset [ index ] - > getTexture ( & profile ) : NULL ; } \
AssetPtr < ImageAsset > get # # name # # Asset ( const U32 & index ) { return m # # name # # Asset [ index ] ; } \
static bool _set # # name # # Data ( void * obj , const char * index , const char * data ) { static_cast < className * > ( obj ) - > _set # # name ( _getStringTable ( ) - > insert ( data ) , dAtoi ( index ) ) ; return false ; }
# define INITPERSISTFIELD_IMAGEASSET_ARRAY_REFACTOR(name, arraySize, consoleClass, docs) \
addProtectedField ( assetText ( name , Asset ) , TypeImageAssetPtrRefactor , Offset ( m # # name # # Asset , consoleClass ) , _set # # name # # Data , & defaultProtectedGetFn , arraySize , assetDoc ( name , asset docs . ) ) ;
2024-12-21 11:16:55 +00:00
# pragma endregion