mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-02-13 19:53:48 +00:00
Merge pull request #415 from Areloch/GroundPlaneAssetify
Converts GroundPlane to utilize assets
This commit is contained in:
commit
7dc6fc8abf
22 changed files with 278 additions and 129 deletions
|
|
@ -85,6 +85,35 @@ ConsoleSetType(TypeMaterialAssetPtr)
|
|||
Con::warnf("(TypeMaterialAssetPtr) - Cannot set multiple args to a single asset.");
|
||||
}
|
||||
|
||||
|
||||
ConsoleType(assetIdString, TypeMaterialAssetId, String, ASSET_ID_FIELD_PREFIX)
|
||||
|
||||
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.");
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
MaterialAsset::MaterialAsset()
|
||||
|
|
@ -180,6 +209,51 @@ DefineEngineMethod(MaterialAsset, compileShader, void, (), , "Compiles the mater
|
|||
object->compileShader();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
StringTableEntry MaterialAsset::getAssetIdByMaterialName(StringTableEntry matName)
|
||||
{
|
||||
StringTableEntry materialAssetId = StringTable->EmptyString();
|
||||
|
||||
AssetQuery* query = new AssetQuery();
|
||||
U32 foundCount = AssetDatabase.findAssetType(query, "MaterialAsset");
|
||||
if (foundCount == 0)
|
||||
{
|
||||
//Didn't work, so have us fall back to a placeholder asset
|
||||
materialAssetId = StringTable->insert("Core_Rendering:noMaterial");
|
||||
}
|
||||
else
|
||||
{
|
||||
for (U32 i = 0; i < foundCount; i++)
|
||||
{
|
||||
MaterialAsset* matAsset = AssetDatabase.acquireAsset<MaterialAsset>(query->mAssetList[i]);
|
||||
if (matAsset && matAsset->getMaterialDefinitionName() == matName)
|
||||
{
|
||||
materialAssetId = matAsset->getAssetId();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return materialAssetId;
|
||||
}
|
||||
|
||||
bool MaterialAsset::getAssetById(StringTableEntry assetId, AssetPtr<MaterialAsset>* materialAsset)
|
||||
{
|
||||
(*materialAsset) = assetId;
|
||||
|
||||
if (!materialAsset->isNull())
|
||||
return true;
|
||||
|
||||
//Didn't work, so have us fall back to a placeholder asset
|
||||
StringTableEntry noImageId = StringTable->insert("Core_Rendering:noMaterial");
|
||||
materialAsset->setAssetId(noImageId);
|
||||
|
||||
if (!materialAsset->isNull())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// GuiInspectorTypeAssetId
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -187,7 +261,7 @@ DefineEngineMethod(MaterialAsset, compileShader, void, (), , "Compiles the mater
|
|||
IMPLEMENT_CONOBJECT(GuiInspectorTypeMaterialAssetPtr);
|
||||
|
||||
ConsoleDocClass(GuiInspectorTypeMaterialAssetPtr,
|
||||
"@brief Inspector field type for Material Asset Objects\n\n"
|
||||
"@brief Inspector field type for Shapes\n\n"
|
||||
"Editor use only.\n\n"
|
||||
"@internal"
|
||||
);
|
||||
|
|
@ -202,70 +276,36 @@ void GuiInspectorTypeMaterialAssetPtr::consoleInit()
|
|||
GuiControl* GuiInspectorTypeMaterialAssetPtr::constructEditControl()
|
||||
{
|
||||
// Create base filename edit controls
|
||||
mUseHeightOverride = true;
|
||||
mHeightOverride = 100;
|
||||
|
||||
mMatEdContainer = new GuiControl();
|
||||
mMatEdContainer->registerObject();
|
||||
|
||||
addObject(mMatEdContainer);
|
||||
|
||||
// Create "Open in ShapeEditor" button
|
||||
mMatPreviewButton = new GuiBitmapButtonCtrl();
|
||||
|
||||
const char* matAssetId = getData();
|
||||
|
||||
MaterialAsset* matAsset = AssetDatabase.acquireAsset< MaterialAsset>(matAssetId);
|
||||
|
||||
Material* materialDef = nullptr;
|
||||
|
||||
char bitmapName[512] = "tools/worldEditor/images/toolbar/shape-editor";
|
||||
|
||||
StringTableEntry matDefName = matAsset ? matAsset->getMaterialDefinitionName() : matAssetId;
|
||||
|
||||
if (!Sim::findObject(matDefName, materialDef))
|
||||
{
|
||||
Con::errorf("GuiInspectorTypeMaterialAssetPtr::constructEditControl() - unable to find material in asset");
|
||||
}
|
||||
else
|
||||
{
|
||||
mMatPreviewButton->setBitmap(materialDef->mDiffuseMapFilename[0]);
|
||||
}
|
||||
|
||||
mMatPreviewButton->setPosition(0, 0);
|
||||
mMatPreviewButton->setExtent(100,100);
|
||||
GuiControl* retCtrl = Parent::constructEditControl();
|
||||
if (retCtrl == NULL)
|
||||
return retCtrl;
|
||||
|
||||
// Change filespec
|
||||
char szBuffer[512];
|
||||
dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.showDialog(\"MaterialAsset\", \"AssetBrowser.changeAsset\", %d, %s);",
|
||||
mInspector->getComponentGroupTargetId(), mCaption);
|
||||
mMatPreviewButton->setField("Command", szBuffer);
|
||||
dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.showDialog(\"MaterialAsset\", \"AssetBrowser.changeAsset\", %s, %s);",
|
||||
mInspector->getInspectObject()->getIdString(), mCaption);
|
||||
mBrowseButton->setField("Command", szBuffer);
|
||||
|
||||
mMatPreviewButton->setDataField(StringTable->insert("Profile"), NULL, "GuiButtonProfile");
|
||||
mMatPreviewButton->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile");
|
||||
mMatPreviewButton->setDataField(StringTable->insert("hovertime"), NULL, "1000");
|
||||
setDataField(StringTable->insert("targetObject"), NULL, mInspector->getInspectObject()->getIdString());
|
||||
|
||||
StringBuilder strbld;
|
||||
strbld.append(matDefName);
|
||||
strbld.append("\n");
|
||||
strbld.append("Open this file in the Material Editor");
|
||||
// Create "Open in Editor" button
|
||||
mEditButton = new GuiBitmapButtonCtrl();
|
||||
|
||||
mMatPreviewButton->setDataField(StringTable->insert("tooltip"), NULL, strbld.data());
|
||||
dSprintf(szBuffer, sizeof(szBuffer), "AssetBrowser.editAsset(%d.getText());", retCtrl->getId());
|
||||
mEditButton->setField("Command", szBuffer);
|
||||
|
||||
_registerEditControl(mMatPreviewButton);
|
||||
//mMatPreviewButton->registerObject();
|
||||
mMatEdContainer->addObject(mMatPreviewButton);
|
||||
char bitmapName[512] = "tools/worldEditor/images/toolbar/material-editor";
|
||||
mEditButton->setBitmap(bitmapName);
|
||||
|
||||
mMatAssetIdTxt = new GuiTextEditCtrl();
|
||||
mMatAssetIdTxt->registerObject();
|
||||
mMatAssetIdTxt->setActive(false);
|
||||
mEditButton->setDataField(StringTable->insert("Profile"), NULL, "GuiButtonProfile");
|
||||
mEditButton->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile");
|
||||
mEditButton->setDataField(StringTable->insert("hovertime"), NULL, "1000");
|
||||
mEditButton->setDataField(StringTable->insert("tooltip"), NULL, "Open this file in the Material Editor");
|
||||
|
||||
mMatAssetIdTxt->setText(matAssetId);
|
||||
mEditButton->registerObject();
|
||||
addObject(mEditButton);
|
||||
|
||||
mMatAssetIdTxt->setBounds(100, 0, 150, 18);
|
||||
mMatEdContainer->addObject(mMatAssetIdTxt);
|
||||
|
||||
return mMatEdContainer;
|
||||
return retCtrl;
|
||||
}
|
||||
|
||||
bool GuiInspectorTypeMaterialAssetPtr::updateRects()
|
||||
|
|
@ -279,54 +319,32 @@ bool GuiInspectorTypeMaterialAssetPtr::updateRects()
|
|||
mEditCtrlRect.set(fieldExtent.x - dividerPos + dividerMargin, 1, dividerPos - dividerMargin - 34, fieldExtent.y);
|
||||
|
||||
bool resized = mEdit->resize(mEditCtrlRect.point, mEditCtrlRect.extent);
|
||||
|
||||
if (mMatEdContainer != nullptr && mMatPreviewButton != nullptr)
|
||||
if (mBrowseButton != NULL)
|
||||
{
|
||||
mMatPreviewButton->resize(mEditCtrlRect.point, mEditCtrlRect.extent);
|
||||
mBrowseRect.set(fieldExtent.x - 32, 2, 14, fieldExtent.y - 4);
|
||||
resized |= mBrowseButton->resize(mBrowseRect.point, mBrowseRect.extent);
|
||||
}
|
||||
|
||||
if (mMatPreviewButton != nullptr)
|
||||
if (mEditButton != NULL)
|
||||
{
|
||||
mMatPreviewButton->resize(Point2I::Zero, Point2I(100, 100));
|
||||
}
|
||||
|
||||
if (mMatAssetIdTxt != nullptr)
|
||||
{
|
||||
mMatAssetIdTxt->resize(Point2I(100, 0), Point2I(mEditCtrlRect.extent.x - 100, 18));
|
||||
RectI shapeEdRect(fieldExtent.x - 16, 2, 14, fieldExtent.y - 4);
|
||||
resized |= mEditButton->resize(shapeEdRect.point, shapeEdRect.extent);
|
||||
}
|
||||
|
||||
return resized;
|
||||
}
|
||||
|
||||
bool GuiInspectorTypeMaterialAssetPtr::resize(const Point2I& newPosition, const Point2I& newExtent)
|
||||
IMPLEMENT_CONOBJECT(GuiInspectorTypeMaterialAssetId);
|
||||
|
||||
ConsoleDocClass(GuiInspectorTypeMaterialAssetId,
|
||||
"@brief Inspector field type for Material Assets\n\n"
|
||||
"Editor use only.\n\n"
|
||||
"@internal"
|
||||
);
|
||||
|
||||
void GuiInspectorTypeMaterialAssetId::consoleInit()
|
||||
{
|
||||
if (!Parent::resize(newPosition, newExtent))
|
||||
return false;
|
||||
Parent::consoleInit();
|
||||
|
||||
if (mMatEdContainer != NULL)
|
||||
{
|
||||
return updateRects();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void GuiInspectorTypeMaterialAssetPtr::setMaterialAsset(String assetId)
|
||||
{
|
||||
mTargetObject->setDataField(mCaption, "", assetId);
|
||||
|
||||
//force a refresh
|
||||
SimObject* obj = mInspector->getInspectObject();
|
||||
mInspector->inspectObject(obj);
|
||||
}
|
||||
|
||||
DefineEngineMethod(GuiInspectorTypeMaterialAssetPtr, 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);
|
||||
ConsoleBaseType::getType(TypeMaterialAssetId)->setInspectorFieldType("GuiInspectorTypeMaterialAssetId");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,9 +42,7 @@
|
|||
#include "gfx/gfxDevice.h"
|
||||
#endif
|
||||
|
||||
#ifndef _GUI_INSPECTOR_TYPES_H_
|
||||
#include "gui/editor/guiInspectorTypes.h"
|
||||
#endif
|
||||
|
||||
#include "materials/matTextureTarget.h"
|
||||
#include "materials/materialDefinition.h"
|
||||
|
|
@ -77,6 +75,9 @@ public:
|
|||
|
||||
inline StringTableEntry getScriptPath(void) const { return mScriptPath; };
|
||||
|
||||
static StringTableEntry getAssetIdByMaterialName(StringTableEntry fileName);
|
||||
static bool getAssetById(StringTableEntry assetId, AssetPtr<MaterialAsset>* materialAsset);
|
||||
|
||||
/// Declare Console Object.
|
||||
DECLARE_CONOBJECT(MaterialAsset);
|
||||
|
||||
|
|
@ -89,26 +90,32 @@ protected:
|
|||
};
|
||||
|
||||
DefineConsoleType(TypeMaterialAssetPtr, MaterialAsset)
|
||||
DefineConsoleType(TypeMaterialAssetId, String)
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// TypeAssetId GuiInspectorField Class
|
||||
//-----------------------------------------------------------------------------
|
||||
class GuiInspectorTypeMaterialAssetPtr : public GuiInspectorField
|
||||
class GuiInspectorTypeMaterialAssetPtr : public GuiInspectorTypeFileName
|
||||
{
|
||||
typedef GuiInspectorField Parent;
|
||||
typedef GuiInspectorTypeFileName Parent;
|
||||
public:
|
||||
|
||||
GuiControl* mMatEdContainer;
|
||||
GuiBitmapButtonCtrl *mMatPreviewButton;
|
||||
GuiTextEditCtrl *mMatAssetIdTxt;
|
||||
GuiBitmapButtonCtrl* mEditButton;
|
||||
|
||||
DECLARE_CONOBJECT(GuiInspectorTypeMaterialAssetPtr);
|
||||
static void consoleInit();
|
||||
|
||||
virtual GuiControl* constructEditControl();
|
||||
virtual bool updateRects();
|
||||
virtual bool resize(const Point2I& newPosition, const Point2I& newExtent);
|
||||
void setMaterialAsset(String assetId);
|
||||
};
|
||||
|
||||
class GuiInspectorTypeMaterialAssetId : public GuiInspectorTypeMaterialAssetPtr
|
||||
{
|
||||
typedef GuiInspectorTypeMaterialAssetPtr Parent;
|
||||
public:
|
||||
|
||||
DECLARE_CONOBJECT(GuiInspectorTypeMaterialAssetId);
|
||||
static void consoleInit();
|
||||
};
|
||||
|
||||
#endif // _ASSET_BASE_H_
|
||||
|
|
|
|||
|
|
@ -2636,6 +2636,8 @@ Torque::Path AssetImporter::importMaterialAsset(AssetImportObject* assetItem)
|
|||
newAsset->setAssetName(assetName);
|
||||
newAsset->setScriptFile(scriptName.c_str());
|
||||
newAsset->setDataField(StringTable->insert("originalFilePath"), nullptr, qualifiedFromFile);
|
||||
newAsset->setDataField(StringTable->insert("materialDefinitionName"), nullptr, assetName);
|
||||
|
||||
|
||||
//iterate through and write out the material maps dependencies
|
||||
S32 dependencySlotId = 0;
|
||||
|
|
|
|||
|
|
@ -85,6 +85,9 @@ GroundPlane::GroundPlane()
|
|||
|
||||
mConvexList = new Convex;
|
||||
mTypeMask |= TerrainLikeObjectType;
|
||||
|
||||
mMaterialAsset = StringTable->EmptyString();
|
||||
mMaterialAssetId = StringTable->EmptyString();
|
||||
}
|
||||
|
||||
GroundPlane::~GroundPlane()
|
||||
|
|
@ -103,7 +106,14 @@ void GroundPlane::initPersistFields()
|
|||
addField( "squareSize", TypeF32, Offset( mSquareSize, GroundPlane ), "Square size in meters to which %GroundPlane subdivides its geometry." );
|
||||
addField( "scaleU", TypeF32, Offset( mScaleU, GroundPlane ), "Scale of texture repeat in the U direction." );
|
||||
addField( "scaleV", TypeF32, Offset( mScaleV, GroundPlane ), "Scale of texture repeat in the V direction." );
|
||||
addField( "material", TypeMaterialName, Offset( mMaterialName, GroundPlane ), "Name of Material used to render %GroundPlane's surface." );
|
||||
|
||||
addProtectedField("materialAsset", TypeMaterialAssetId, Offset(mMaterialAssetId, GroundPlane),
|
||||
&GroundPlane::_setMaterialAsset, &defaultProtectedGetFn,
|
||||
"The material asset.");
|
||||
|
||||
addProtectedField("material", TypeMaterialName, Offset(mMaterialName, GroundPlane),
|
||||
&GroundPlane::_setMaterialName, &defaultProtectedGetFn,
|
||||
"The material name.");
|
||||
|
||||
endGroup( "Plane" );
|
||||
|
||||
|
|
@ -114,6 +124,72 @@ void GroundPlane::initPersistFields()
|
|||
removeField( "rotation" );
|
||||
}
|
||||
|
||||
bool GroundPlane::_setMaterialAsset(void* obj, const char* index, const char* data)
|
||||
{
|
||||
GroundPlane* gp = static_cast<GroundPlane*>(obj);// ->setFile(FileName(data));
|
||||
|
||||
gp->mMaterialAssetId = StringTable->insert(data);
|
||||
|
||||
return gp->setMaterialAsset(gp->mMaterialAssetId);
|
||||
}
|
||||
|
||||
bool GroundPlane::_setMaterialName(void* obj, const char* index, const char* data)
|
||||
{
|
||||
GroundPlane* gp = static_cast<GroundPlane*>(obj);// ->setFile(FileName(data));
|
||||
|
||||
StringTableEntry assetId = MaterialAsset::getAssetIdByMaterialName(StringTable->insert(data));
|
||||
if (assetId != StringTable->EmptyString())
|
||||
{
|
||||
//Special exception case. If we've defaulted to the 'no shape' mesh, don't save it out, we'll retain the original ids/paths so it doesn't break
|
||||
//the TSStatic
|
||||
if (gp->setMaterialAsset(assetId))
|
||||
{
|
||||
if (assetId == StringTable->insert("Core_Rendering:NoMaterial"))
|
||||
{
|
||||
gp->mMaterialName = data;
|
||||
gp->mMaterialAssetId = StringTable->EmptyString();
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
gp->mMaterialAssetId = assetId;
|
||||
gp->mMaterialName = StringTable->EmptyString();
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gp->mMaterialAsset = StringTable->EmptyString();
|
||||
gp->mMaterialName = data;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GroundPlane::setMaterialAsset(const StringTableEntry materialAssetId)
|
||||
{
|
||||
if (MaterialAsset::getAssetById(materialAssetId, &mMaterialAsset))
|
||||
{
|
||||
//Special exception case. If we've defaulted to the 'no shape' mesh, don't save it out, we'll retain the original ids/paths so it doesn't break
|
||||
//the TSStatic
|
||||
if (mMaterialAsset.getAssetId() != StringTable->insert("Core_Rendering:noMaterial"))
|
||||
{
|
||||
mMaterialName = StringTable->EmptyString();
|
||||
}
|
||||
|
||||
_updateMaterial();
|
||||
|
||||
setMaskBits(-1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GroundPlane::onAdd()
|
||||
{
|
||||
if( !Parent::onAdd() )
|
||||
|
|
@ -187,6 +263,7 @@ U32 GroundPlane::packUpdate( NetConnection* connection, U32 mask, BitStream* str
|
|||
stream->write( mSquareSize );
|
||||
stream->write( mScaleU );
|
||||
stream->write( mScaleV );
|
||||
stream->writeString( mMaterialAsset.getAssetId() );
|
||||
stream->write( mMaterialName );
|
||||
|
||||
return retMask;
|
||||
|
|
@ -199,6 +276,11 @@ void GroundPlane::unpackUpdate( NetConnection* connection, BitStream* stream )
|
|||
stream->read( &mSquareSize );
|
||||
stream->read( &mScaleU );
|
||||
stream->read( &mScaleV );
|
||||
|
||||
char buffer[256];
|
||||
stream->readString(buffer);
|
||||
setMaterialAsset(StringTable->insert(buffer));
|
||||
|
||||
stream->read( &mMaterialName );
|
||||
|
||||
// If we're added then something possibly changed in
|
||||
|
|
@ -213,23 +295,14 @@ void GroundPlane::unpackUpdate( NetConnection* connection, BitStream* stream )
|
|||
|
||||
void GroundPlane::_updateMaterial()
|
||||
{
|
||||
if( mMaterialName.isEmpty() )
|
||||
if (!mMaterialAsset.isNull())
|
||||
{
|
||||
Con::warnf( "GroundPlane::_updateMaterial - no material set; defaulting to 'WarningMaterial'" );
|
||||
mMaterialName = "WarningMaterial";
|
||||
String matName = mMaterialAsset->getMaterialDefinitionName();
|
||||
|
||||
mMaterial = MATMGR->createMatInstance(matName, getGFXVertexFormat< VertexType >());
|
||||
if (!mMaterial)
|
||||
Con::errorf("GroundPlane::_updateMaterial - no material called '%s'", matName.c_str());
|
||||
}
|
||||
|
||||
// If the material name matches then don't
|
||||
// bother updating it.
|
||||
if ( mMaterial &&
|
||||
mMaterialName.compare( mMaterial->getMaterial()->getName() ) == 0 )
|
||||
return;
|
||||
|
||||
SAFE_DELETE( mMaterial );
|
||||
|
||||
mMaterial = MATMGR->createMatInstance( mMaterialName, getGFXVertexFormat< VertexType >() );
|
||||
if ( !mMaterial )
|
||||
Con::errorf( "GroundPlane::_updateMaterial - no material called '%s'", mMaterialName.c_str() );
|
||||
}
|
||||
|
||||
bool GroundPlane::castRay( const Point3F& start, const Point3F& end, RayInfo* info )
|
||||
|
|
@ -582,6 +655,13 @@ void GroundPlane::generateGrid( U32 width, U32 height, F32 squareSize,
|
|||
outPrimitives.unlock();
|
||||
}
|
||||
|
||||
void GroundPlane::getUtilizedAssets(Vector<StringTableEntry>* usedAssetsList)
|
||||
{
|
||||
if (!mMaterialAsset.isNull() && mMaterialAsset->getAssetId() != StringTable->insert("Core_Rendering:noMaterial"))
|
||||
usedAssetsList->push_back_unique(mMaterialAsset->getAssetId());
|
||||
|
||||
}
|
||||
|
||||
DefineEngineMethod( GroundPlane, postApply, void, (),,
|
||||
"Intended as a helper to developers and editor scripts.\n"
|
||||
"Force trigger an inspectPostApply. This will transmit "
|
||||
|
|
@ -589,4 +669,4 @@ DefineEngineMethod( GroundPlane, postApply, void, (),,
|
|||
)
|
||||
{
|
||||
object->inspectPostApply();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,8 @@
|
|||
#include "gfx/gfxPrimitiveBuffer.h"
|
||||
#endif
|
||||
|
||||
#include "T3D/assets/MaterialAsset.h"
|
||||
|
||||
class PhysicsBody;
|
||||
class BaseMatInstance;
|
||||
|
||||
|
|
@ -62,6 +64,9 @@ public:
|
|||
GroundPlane();
|
||||
virtual ~GroundPlane();
|
||||
|
||||
static bool _setMaterialAsset(void* obj, const char* index, const char* data);
|
||||
static bool _setMaterialName(void* obj, const char* index, const char* data);
|
||||
|
||||
virtual bool onAdd();
|
||||
virtual void onRemove();
|
||||
virtual U32 packUpdate( NetConnection* connection, U32 mask, BitStream* stream );
|
||||
|
|
@ -76,6 +81,10 @@ public:
|
|||
|
||||
static void initPersistFields();
|
||||
|
||||
bool setMaterialAsset(const StringTableEntry materialAssetId);
|
||||
|
||||
virtual void getUtilizedAssets(Vector<StringTableEntry>* usedAssetsList);
|
||||
|
||||
protected:
|
||||
|
||||
typedef GFXVertexPNTBT VertexType;
|
||||
|
|
@ -103,6 +112,9 @@ private:
|
|||
String mMaterialName; ///< Object name of material to use.
|
||||
BaseMatInstance* mMaterial; ///< Instantiated material based on given material name.
|
||||
|
||||
AssetPtr<MaterialAsset> mMaterialAsset;
|
||||
StringTableEntry mMaterialAssetId;
|
||||
|
||||
PhysicsBody *mPhysicsRep;
|
||||
|
||||
/// @name Rendering State
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue