Optimize asset references to support direct registration to reduce Delegate memory allocations and overhead
This commit is contained in:
@@ -27,16 +27,13 @@ AnimatedModel::AnimatedModel(const SpawnParams& params)
|
||||
, _counter(0)
|
||||
, _lastMinDstSqr(MAX_Real)
|
||||
, _lastUpdateFrame(0)
|
||||
, SkinnedModel(this)
|
||||
, AnimationGraph(this)
|
||||
{
|
||||
_drawCategory = SceneRendering::SceneDrawAsync;
|
||||
GraphInstance.Object = this;
|
||||
_box = BoundingBox(Vector3::Zero);
|
||||
_sphere = BoundingSphere(Vector3::Zero, 0.0f);
|
||||
|
||||
SkinnedModel.Changed.Bind<AnimatedModel, &AnimatedModel::OnSkinnedModelChanged>(this);
|
||||
SkinnedModel.Loaded.Bind<AnimatedModel, &AnimatedModel::OnSkinnedModelLoaded>(this);
|
||||
AnimationGraph.Changed.Bind<AnimatedModel, &AnimatedModel::OnGraphChanged>(this);
|
||||
AnimationGraph.Loaded.Bind<AnimatedModel, &AnimatedModel::OnGraphLoaded>(this);
|
||||
}
|
||||
|
||||
AnimatedModel::~AnimatedModel()
|
||||
@@ -889,6 +886,26 @@ void AnimatedModel::OnGraphLoaded()
|
||||
SyncParameters();
|
||||
}
|
||||
|
||||
void AnimatedModel::OnAssetChanged(Asset* asset, void* caller)
|
||||
{
|
||||
if (caller == &SkinnedModel)
|
||||
OnSkinnedModelChanged();
|
||||
else if (caller == &AnimationGraph)
|
||||
OnGraphChanged();
|
||||
}
|
||||
|
||||
void AnimatedModel::OnAssetLoaded(Asset* asset, void* caller)
|
||||
{
|
||||
if (caller == &SkinnedModel)
|
||||
OnSkinnedModelLoaded();
|
||||
else if (caller == &AnimationGraph)
|
||||
OnGraphLoaded();
|
||||
}
|
||||
|
||||
void AnimatedModel::OnAssetUnloaded(Asset* asset, void* caller)
|
||||
{
|
||||
}
|
||||
|
||||
bool AnimatedModel::HasContentLoaded() const
|
||||
{
|
||||
return (SkinnedModel == nullptr || SkinnedModel->IsLoaded()) && Entries.HasContentLoaded();
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
/// Performs an animation and renders a skinned model.
|
||||
/// </summary>
|
||||
API_CLASS(Attributes="ActorContextMenu(\"New/Animation/Animated Model\"), ActorToolbox(\"Visuals\")")
|
||||
class FLAXENGINE_API AnimatedModel : public ModelInstanceActor
|
||||
class FLAXENGINE_API AnimatedModel : public ModelInstanceActor, IAssetReference
|
||||
{
|
||||
DECLARE_SCENE_OBJECT(AnimatedModel);
|
||||
friend class AnimationsSystem;
|
||||
@@ -422,6 +422,11 @@ private:
|
||||
void OnGraphChanged();
|
||||
void OnGraphLoaded();
|
||||
|
||||
// [IAssetReference]
|
||||
void OnAssetChanged(Asset* asset, void* caller) override;
|
||||
void OnAssetLoaded(Asset* asset, void* caller) override;
|
||||
void OnAssetUnloaded(Asset* asset, void* caller) override;
|
||||
|
||||
public:
|
||||
// [ModelInstanceActor]
|
||||
bool HasContentLoaded() const override;
|
||||
|
||||
@@ -30,7 +30,6 @@ GPU_CB_STRUCT(Data {
|
||||
|
||||
Sky::Sky(const SpawnParams& params)
|
||||
: Actor(params)
|
||||
, _shader(nullptr)
|
||||
, _psSky(nullptr)
|
||||
, _psFog(nullptr)
|
||||
{
|
||||
|
||||
@@ -29,10 +29,9 @@ StaticModel::StaticModel(const SpawnParams& params)
|
||||
, _vertexColorsDirty(false)
|
||||
, _vertexColorsCount(0)
|
||||
, _sortOrder(0)
|
||||
, Model(this)
|
||||
{
|
||||
_drawCategory = SceneRendering::SceneDrawAsync;
|
||||
Model.Changed.Bind<StaticModel, &StaticModel::OnModelChanged>(this);
|
||||
Model.Loaded.Bind<StaticModel, &StaticModel::OnModelLoaded>(this);
|
||||
}
|
||||
|
||||
StaticModel::~StaticModel()
|
||||
@@ -224,7 +223,7 @@ void StaticModel::RemoveVertexColors()
|
||||
_vertexColorsDirty = false;
|
||||
}
|
||||
|
||||
void StaticModel::OnModelChanged()
|
||||
void StaticModel::OnAssetChanged(Asset* asset, void* caller)
|
||||
{
|
||||
if (_residencyChangedModel)
|
||||
{
|
||||
@@ -241,7 +240,7 @@ void StaticModel::OnModelChanged()
|
||||
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
|
||||
}
|
||||
|
||||
void StaticModel::OnModelLoaded()
|
||||
void StaticModel::OnAssetLoaded(Asset* asset, void* caller)
|
||||
{
|
||||
Entries.SetupIfInvalid(Model);
|
||||
UpdateBounds();
|
||||
@@ -316,6 +315,10 @@ void StaticModel::FlushVertexColors()
|
||||
RenderContext::GPULocker.Unlock();
|
||||
}
|
||||
|
||||
void StaticModel::OnAssetUnloaded(Asset* asset, void* caller)
|
||||
{
|
||||
}
|
||||
|
||||
bool StaticModel::HasContentLoaded() const
|
||||
{
|
||||
return (Model == nullptr || Model->IsLoaded()) && Entries.HasContentLoaded();
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
/// Renders model on the screen.
|
||||
/// </summary>
|
||||
API_CLASS(Attributes="ActorContextMenu(\"New/Model\"), ActorToolbox(\"Visuals\")")
|
||||
class FLAXENGINE_API StaticModel : public ModelInstanceActor
|
||||
class FLAXENGINE_API StaticModel : public ModelInstanceActor, IAssetReference
|
||||
{
|
||||
DECLARE_SCENE_OBJECT(StaticModel);
|
||||
private:
|
||||
@@ -154,11 +154,14 @@ public:
|
||||
API_FUNCTION() void RemoveVertexColors();
|
||||
|
||||
private:
|
||||
void OnModelChanged();
|
||||
void OnModelLoaded();
|
||||
void OnModelResidencyChanged();
|
||||
void FlushVertexColors();
|
||||
|
||||
// [IAssetReference]
|
||||
void OnAssetChanged(Asset* asset, void* caller) override;
|
||||
void OnAssetLoaded(Asset* asset, void* caller) override;
|
||||
void OnAssetUnloaded(Asset* asset, void* caller) override;
|
||||
|
||||
public:
|
||||
// [ModelInstanceActor]
|
||||
bool HasContentLoaded() const override;
|
||||
|
||||
Reference in New Issue
Block a user