diff --git a/Engine/source/forest/forestItem.cpp b/Engine/source/forest/forestItem.cpp index 239919a91..36c12e8a7 100644 --- a/Engine/source/forest/forestItem.cpp +++ b/Engine/source/forest/forestItem.cpp @@ -53,7 +53,8 @@ ForestItemData::ForestItemData() mTightnessCoefficient( 0.4f ), mDampingCoefficient( 0.7f ) { - INIT_ASSET(Shape); + mShape = NULL; + mShapeAsset.registerRefreshNotify(this); } void ForestItemData::initPersistFields() @@ -61,10 +62,8 @@ void ForestItemData::initPersistFields() docsURL; addGroup( "Shapes" ); - INITPERSISTFIELD_SHAPEASSET(Shape, ForestItemData, "Shape asset for this item type"); - - addProtectedField( "shapeFile", TypeShapeFilename, Offset( mShapeName, ForestItemData ), &_setShapeData, &defaultProtectedGetFn, - "Shape file for this item type", AbstractClassRep::FIELD_HideInInspectors ); + INITPERSISTFIELD_SHAPEASSET_REFACTOR(Shape, ForestItemData, "Shape asset for this item type"); + endGroup( "Shapes" ); addGroup("Physics"); @@ -164,7 +163,7 @@ void ForestItemData::packData(BitStream* stream) stream->write( localName ); - PACKDATA_ASSET(Shape); + PACKDATA_ASSET_REFACTOR(Shape); stream->writeFlag( mCollidable ); @@ -190,7 +189,7 @@ void ForestItemData::unpackData(BitStream* stream) stream->read( &localName ); setInternalName( localName ); - UNPACKDATA_ASSET(Shape); + UNPACKDATA_ASSET_REFACTOR(Shape); mCollidable = stream->readFlag(); diff --git a/Engine/source/forest/forestItem.h b/Engine/source/forest/forestItem.h index 28d9f4248..2b7337593 100644 --- a/Engine/source/forest/forestItem.h +++ b/Engine/source/forest/forestItem.h @@ -48,7 +48,7 @@ struct RayInfo; class AbstractPolyList; -class ForestItemData : public SimDataBlock +class ForestItemData : public SimDataBlock, protected AssetPtrCallback { protected: @@ -62,8 +62,7 @@ protected: public: - DECLARE_SHAPEASSET(ForestItemData, Shape, onShapeChanged); - DECLARE_ASSET_SETGET(ForestItemData, Shape); + DECLARE_SHAPEASSET_REFACTOR(ForestItemData, Shape) /// This is the radius used during placement to ensure /// the element isn't crowded up against other trees. @@ -144,7 +143,10 @@ public: return theSignal; } - void onShapeChanged() + Resource mShape; + +protected: + void onAssetRefreshed(AssetPtrBase* pAssetPtrBase) override { reloadOnLocalClient(); } diff --git a/Engine/source/forest/ts/tsForestItemData.cpp b/Engine/source/forest/ts/tsForestItemData.cpp index 5c88cf0ef..292ca564d 100644 --- a/Engine/source/forest/ts/tsForestItemData.cpp +++ b/Engine/source/forest/ts/tsForestItemData.cpp @@ -99,13 +99,13 @@ void TSForestItemData::inspectPostApply() void TSForestItemData::_onResourceChanged( const Torque::Path &path ) { - U32 assetStatus = ShapeAsset::getAssetErrCode(mShapeAsset); + U32 assetStatus = ShapeAsset::getAssetErrCode(_getShapeAssetId()); if (assetStatus != AssetBase::Ok && assetStatus != AssetBase::UsingFallback) { return; } - if ( path != Path(mShapeAsset->getShapeFilePath()) ) + if ( path != Path(getShapeFile()) ) return; SAFE_DELETE( mShapeInstance ); @@ -116,18 +116,18 @@ void TSForestItemData::_onResourceChanged( const Torque::Path &path ) void TSForestItemData::_loadShape() { - U32 assetStatus = ShapeAsset::getAssetErrCode(mShapeAsset); + mShape = getShape(); + U32 assetStatus = ShapeAsset::getAssetErrCode(_getShapeAssetId()); if (assetStatus != AssetBase::Ok && assetStatus != AssetBase::UsingFallback) { return; } - _setShape(mShapeAssetId); if ( !(bool)mShape ) return; if ( mIsClientObject && - !mShape->preloadMaterialList(mShapeAsset->getShapeFilePath()) ) + !mShape->preloadMaterialList(mShape.getPath()) ) return; // Lets add an autobillboard detail if don't have one. @@ -165,7 +165,7 @@ TSShapeInstance* TSForestItemData::_getShapeInstance() const void TSForestItemData::_checkLastDetail() { - U32 assetStatus = ShapeAsset::getAssetErrCode(mShapeAsset); + U32 assetStatus = ShapeAsset::getAssetErrCode(_getShapeAssetId()); if (assetStatus != AssetBase::Ok && assetStatus != AssetBase::UsingFallback) { return; @@ -177,7 +177,7 @@ void TSForestItemData::_checkLastDetail() // TODO: Expose some real parameters to the datablock maybe? if ( detail->subShapeNum != -1 ) { - mShape->addImposter(mShapeAsset->getShapeFilePath(), 10, 4, 0, 0, 256, 0, 0 ); + mShape->addImposter(mShape.getPath(), 10, 4, 0, 0, 256, 0, 0); // HACK: If i don't do this it crashes! while ( mShape->detailCollisionAccelerators.size() < mShape->details.size() )