mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-03-10 07:50:44 +00:00
Assetifies MeshRoad, Decal Road, and the material slot of GroundCover
Creates a networked and non-networked variant of DECLARE_MATERIALASSET macro
This commit is contained in:
parent
a0ba345095
commit
bf5b26f734
17 changed files with 301 additions and 117 deletions
|
|
@ -282,8 +282,8 @@ GuiControl* GuiInspectorTypeMaterialAssetPtr::constructEditControl()
|
|||
|
||||
// Change filespec
|
||||
char szBuffer[512];
|
||||
dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.showDialog(\"MaterialAsset\", \"AssetBrowser.changeAsset\", %s, %s);",
|
||||
mInspector->getInspectObject()->getIdString(), mCaption);
|
||||
dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.showDialog(\"MaterialAsset\", \"AssetBrowser.changeAsset\", %s, \"\");",
|
||||
getIdString());
|
||||
mBrowseButton->setField("Command", szBuffer);
|
||||
|
||||
setDataField(StringTable->insert("targetObject"), NULL, mInspector->getInspectObject()->getIdString());
|
||||
|
|
|
|||
|
|
@ -126,23 +126,87 @@ public:
|
|||
|
||||
#define assetText(x,suff) std::string(std::string(#x) + std::string(#suff)).c_str()
|
||||
|
||||
#define initMaterialAsset(name) m##name##Name = StringTable->EmptyString(); m##name##AssetId = StringTable->EmptyString(); m##name##Asset = NULL;
|
||||
#define initMaterialAsset(name) m##name##Name = ""; m##name##AssetId = StringTable->EmptyString(); m##name##Asset = NULL;
|
||||
#define bindMaterialAsset(name) if (m##name##AssetId != StringTable->EmptyString()) m##name##Asset = m##name##AssetId;
|
||||
|
||||
#define scriptBindMaterialAsset(name, consoleClass, docs) addProtectedField(assetText(name, File), TypeMaterialName, Offset(m##name##Name, consoleClass), consoleClass::_set##name##Name, & defaultProtectedGetFn, assetText(name, docs)); \
|
||||
addProtectedField(assetText(name, Asset), TypeMaterialAssetId, Offset(m##name##AssetId, consoleClass), consoleClass::_set##name##Asset, & defaultProtectedGetFn, assetText(name, asset reference.));
|
||||
#define scriptBindMaterialAsset(name, consoleClass, docs)\
|
||||
addProtectedField(assetText(name, File), TypeMaterialName, Offset(m##name##Name, consoleClass), consoleClass::_set##name##Name, & defaultProtectedGetFn, assetText(name, docs), AbstractClassRep::FIELD_HideInInspectors); \
|
||||
addProtectedField(assetText(name, Asset), TypeMaterialAssetId, Offset(m##name##AssetId, consoleClass), consoleClass::_set##name##Asset, & defaultProtectedGetFn, assetText(name, asset reference.));
|
||||
|
||||
#define DECLARE_MATERIALASSET(className,name) protected: \
|
||||
String m##name##Name;\
|
||||
StringTableEntry m##name##AssetId;\
|
||||
AssetPtr<MaterialAsset> m##name##Asset;\
|
||||
public: \
|
||||
const String& get##name() const { return m##name##Name; }\
|
||||
void set##name(FileName _in) { m##name##Name = _in; }\
|
||||
const AssetPtr<MaterialAsset> & get##name##Asset() const { return m##name##Asset; }\
|
||||
void set##name##Asset(AssetPtr<MaterialAsset>_in) { m##name##Asset = _in; }\
|
||||
static bool _set##name##Name(void* obj, const char* index, const char* data)\
|
||||
{\
|
||||
className* shape = static_cast<className*>(obj);\
|
||||
\
|
||||
StringTableEntry assetId = MaterialAsset::getAssetIdByMaterialName(StringTable->insert(data));\
|
||||
if (assetId != StringTable->EmptyString())\
|
||||
{\
|
||||
if (shape->_set##name##Asset(obj, index, assetId))\
|
||||
{\
|
||||
if (assetId == StringTable->insert("Core_Rendering:noMaterial"))\
|
||||
{\
|
||||
shape->m##name##Name = data;\
|
||||
shape->m##name##AssetId = StringTable->EmptyString();\
|
||||
\
|
||||
return true;\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
shape->m##name##AssetId = assetId;\
|
||||
shape->m##name##Name = StringTable->EmptyString();\
|
||||
\
|
||||
return false;\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
else\
|
||||
{\
|
||||
shape->m##name##Asset = StringTable->EmptyString();\
|
||||
}\
|
||||
\
|
||||
return true;\
|
||||
}\
|
||||
\
|
||||
static bool _set##name##Asset(void* obj, const char* index, const char* data)\
|
||||
{\
|
||||
className* shape = static_cast<className*>(obj);\
|
||||
shape->m##name##AssetId = StringTable->insert(data);\
|
||||
if (MaterialAsset::getAssetById(shape->m##name##AssetId, &shape->m##name##Asset))\
|
||||
{\
|
||||
if (shape->m##name##Asset.getAssetId() != StringTable->insert("Core_Rendering:noMaterial"))\
|
||||
shape->m##name##Name = StringTable->EmptyString();\
|
||||
\
|
||||
return true;\
|
||||
}\
|
||||
return false;\
|
||||
}\
|
||||
\
|
||||
static bool set##name##Asset(const char* assetId)\
|
||||
{\
|
||||
m##name##AssetId = StringTable->insert(assetId);\
|
||||
if (m##name##AssetId != StringTable->EmptyString())\
|
||||
m##name##Asset = m##name##AssetId;\
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DECLARE_MATERIALASSET is a utility macro for MaterialAssets. It takes in the name of the class using it, the name of the field for the material, and a networking bitmask
|
||||
/// The first 2 are for setting up/filling out the fields and class member defines
|
||||
/// The bitmask is for when the material is changed, it can automatically kick a network update on the owner object to pass the changed asset to clients
|
||||
/// </summary>
|
||||
#define DECLARE_MATERIALASSET(className,name,bitmask) protected: \
|
||||
StringTableEntry m##name##Name;\
|
||||
#define DECLARE_NET_MATERIALASSET(className,name,bitmask) protected: \
|
||||
String m##name##Name;\
|
||||
StringTableEntry m##name##AssetId;\
|
||||
AssetPtr<MaterialAsset> m##name##Asset;\
|
||||
public: \
|
||||
const StringTableEntry& get##name() const { return m##name##Name; }\
|
||||
const String& get##name() const { return m##name##Name; }\
|
||||
void set##name(FileName _in) { m##name##Name = _in; }\
|
||||
const AssetPtr<MaterialAsset> & get##name##Asset() const { return m##name##Asset; }\
|
||||
void set##name##Asset(AssetPtr<MaterialAsset>_in) { m##name##Asset = _in; }\
|
||||
|
|
@ -189,11 +253,29 @@ static bool _set##name##Asset(void* obj, const char* index, const char* data)\
|
|||
shape->m##name##Name = StringTable->EmptyString();\
|
||||
\
|
||||
shape->setMaskBits(bitmask);\
|
||||
shape->inspectPostApply();\
|
||||
return true;\
|
||||
}\
|
||||
shape->inspectPostApply();\
|
||||
return false;\
|
||||
}\
|
||||
\
|
||||
bool set##name##AssetId(const char* _assetId)\
|
||||
{\
|
||||
m##name##AssetId = StringTable->insert(_assetId);\
|
||||
if (m##name##AssetId != StringTable->EmptyString())\
|
||||
{\
|
||||
m##name##Asset = m##name##AssetId;\
|
||||
\
|
||||
setMaskBits(bitmask);\
|
||||
inspectPostApply();\
|
||||
return true;\
|
||||
}\
|
||||
\
|
||||
return false;\
|
||||
}
|
||||
|
||||
|
||||
#define packMaterialAsset(netconn, name)\
|
||||
if (stream->writeFlag(m##name##Asset.notNull()))\
|
||||
{\
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ class RenderMeshExample : public SceneObject
|
|||
//--------------------------------------------------------------------------
|
||||
// Rendering variables
|
||||
//--------------------------------------------------------------------------
|
||||
DECLARE_MATERIALASSET(RenderMeshExample, Material, UpdateMask);
|
||||
DECLARE_NET_MATERIALASSET(RenderMeshExample, Material, UpdateMask);
|
||||
|
||||
// The actual Material instance
|
||||
BaseMatInstance* mMaterialInst;
|
||||
|
|
|
|||
|
|
@ -458,7 +458,8 @@ GroundCover::GroundCover()
|
|||
|
||||
mRandomSeed = 1;
|
||||
|
||||
mMaterial = NULL;
|
||||
initMaterialAsset(Material);
|
||||
|
||||
mMatInst = NULL;
|
||||
mMatParams = NULL;
|
||||
mTypeRectsParam = NULL;
|
||||
|
|
@ -537,8 +538,8 @@ IMPLEMENT_CO_NETOBJECT_V1(GroundCover);
|
|||
void GroundCover::initPersistFields()
|
||||
{
|
||||
addGroup( "GroundCover General" );
|
||||
|
||||
addField( "material", TypeMaterialName, Offset( mMaterialName, GroundCover ), "Material used by all GroundCover segments." );
|
||||
|
||||
scriptBindMaterialAsset(Material, GroundCover, "Material used by all GroundCover segments.");
|
||||
|
||||
addField( "radius", TypeF32, Offset( mRadius, GroundCover ), "Outer generation radius from the current camera position." );
|
||||
addField( "dissolveRadius",TypeF32, Offset( mFadeRadius, GroundCover ), "This is less than or equal to radius and defines when fading of cover elements begins." );
|
||||
|
|
@ -709,7 +710,7 @@ U32 GroundCover::packUpdate( NetConnection *connection, U32 mask, BitStream *str
|
|||
// TODO: We could probably optimize a few of these
|
||||
// based on reasonable units at some point.
|
||||
|
||||
stream->write( mMaterialName );
|
||||
packMaterialAsset(connection, Material);
|
||||
|
||||
stream->write( mRadius );
|
||||
stream->write( mZOffset );
|
||||
|
|
@ -780,7 +781,7 @@ void GroundCover::unpackUpdate( NetConnection *connection, BitStream *stream )
|
|||
|
||||
if (stream->readFlag())
|
||||
{
|
||||
stream->read( &mMaterialName );
|
||||
unpackMaterialAsset(connection, Material);
|
||||
|
||||
stream->read( &mRadius );
|
||||
stream->read( &mZOffset );
|
||||
|
|
@ -852,17 +853,29 @@ void GroundCover::unpackUpdate( NetConnection *connection, BitStream *stream )
|
|||
}
|
||||
|
||||
void GroundCover::_initMaterial()
|
||||
{
|
||||
SAFE_DELETE( mMatInst );
|
||||
|
||||
if ( mMaterialName.isNotEmpty() )
|
||||
if ( !Sim::findObject( mMaterialName, mMaterial ) )
|
||||
Con::errorf( "GroundCover::_initMaterial - Material %s was not found.", mMaterialName.c_str() );
|
||||
{
|
||||
if (mMaterialAsset.notNull())
|
||||
{
|
||||
if (mMatInst && String(mMaterialAsset->getMaterialDefinitionName()).equal(mMatInst->getMaterial()->getName(), String::NoCase))
|
||||
return;
|
||||
|
||||
if ( mMaterial )
|
||||
mMatInst = mMaterial->createMatInstance();
|
||||
SAFE_DELETE(mMatInst);
|
||||
|
||||
if (!Sim::findObject(mMaterialAsset->getMaterialDefinitionName(), mMaterial))
|
||||
Con::errorf("GroundCover::_initMaterial - Material %s was not found.", mMaterialAsset->getMaterialDefinitionName());
|
||||
|
||||
if (mMaterial)
|
||||
mMatInst = mMaterial->createMatInstance();
|
||||
else
|
||||
mMatInst = MATMGR->createMatInstance("WarningMaterial");
|
||||
|
||||
if (!mMatInst)
|
||||
Con::errorf("GroundCover::_initMaterial - no Material called '%s'", mMaterialAsset->getMaterialDefinitionName());
|
||||
}
|
||||
else
|
||||
mMatInst = MATMGR->createMatInstance( "WarningMaterial" );
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Add our special feature that makes it all work...
|
||||
FeatureSet features = MATMGR->getDefaultFeatures();
|
||||
|
|
@ -1567,6 +1580,8 @@ void GroundCover::_updateCoverGrid( const Frustum &culler )
|
|||
void GroundCover::prepRenderImage( SceneRenderState *state )
|
||||
{
|
||||
// Reset stats each time we hit the diffuse pass.
|
||||
if (mMatInst == nullptr)
|
||||
return;
|
||||
|
||||
if( state->isDiffusePass() )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -45,6 +45,8 @@
|
|||
#include "shaderGen/shaderFeature.h"
|
||||
#endif
|
||||
|
||||
#include "T3D/assets/MaterialAsset.h"
|
||||
|
||||
class TerrainBlock;
|
||||
class GroundCoverCell;
|
||||
class TSShapeInstance;
|
||||
|
|
@ -264,8 +266,8 @@ protected:
|
|||
static F32 smDensityScale;
|
||||
static F32 smFadeScale;
|
||||
|
||||
String mMaterialName;
|
||||
Material *mMaterial;
|
||||
DECLARE_NET_MATERIALASSET(GroundCover, Material, InitialUpdateMask);
|
||||
Material* mMaterial;
|
||||
BaseMatInstance *mMatInst;
|
||||
|
||||
GroundCoverShaderConstData mShaderConstData;
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ private:
|
|||
F32 mScaleV; ///< Scale factor for V texture coordinates.
|
||||
BaseMatInstance* mMaterial; ///< Instantiated material based on given material name.
|
||||
|
||||
DECLARE_MATERIALASSET(GroundPlane, Material, -1);
|
||||
DECLARE_NET_MATERIALASSET(GroundPlane, Material, -1);
|
||||
|
||||
PhysicsBody *mPhysicsRep;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue