fixed memory issues in the animation system
This commit is contained in:
parent
2f5ef32696
commit
11d9648ed7
6 changed files with 44 additions and 18 deletions
|
@ -611,7 +611,7 @@ struct AnimationSceneImpl LUMIX_FINAL : public AnimationScene
|
|||
rc.allocator = &m_anim_system.m_allocator;
|
||||
rc.input = &controller.input[0];
|
||||
rc.anim_set = &controller.resource->getAnimSet();
|
||||
controller.root->update(rc);
|
||||
controller.root = controller.root->update(rc, true);
|
||||
|
||||
ComponentHandle model_instance = m_render_scene->getModelInstanceComponent(controller.entity);
|
||||
if (model_instance == INVALID_COMPONENT) return;
|
||||
|
|
|
@ -56,7 +56,6 @@ bool ControllerResource::load(FS::IFile& file)
|
|||
|
||||
void ControllerResource::setRoot(Component* component)
|
||||
{
|
||||
ASSERT(m_root == nullptr);
|
||||
m_root = component;
|
||||
}
|
||||
|
||||
|
|
|
@ -66,7 +66,6 @@ Component::~Component()
|
|||
{
|
||||
getParent()->removeChild(this);
|
||||
}
|
||||
LUMIX_DELETE(m_controller.getEngineResource()->getAllocator(), engine_cmp);
|
||||
}
|
||||
|
||||
|
||||
|
@ -165,6 +164,15 @@ Container::Container(Anim::Component* engine_cmp, Container* parent, ControllerR
|
|||
}
|
||||
|
||||
|
||||
Container::~Container()
|
||||
{
|
||||
while (!m_editor_cmps.empty())
|
||||
{
|
||||
LUMIX_DELETE(m_controller.getAllocator(), m_editor_cmps.back());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Container::removeChild(Component* component)
|
||||
{
|
||||
auto* engine_container = ((Anim::Container*)engine_cmp);
|
||||
|
@ -572,7 +580,6 @@ ControllerResource::ControllerResource(AnimationEditor& editor, ResourceManagerB
|
|||
ControllerResource::~ControllerResource()
|
||||
{
|
||||
LUMIX_DELETE(m_allocator, m_engine_resource);
|
||||
m_root->engine_cmp = nullptr;
|
||||
LUMIX_DELETE(m_allocator, m_root);
|
||||
}
|
||||
|
||||
|
|
|
@ -95,6 +95,7 @@ class Container : public Node
|
|||
{
|
||||
public:
|
||||
Container(Lumix::Anim::Component* engine_cmp, Container* parent, ControllerResource& controller);
|
||||
~Container();
|
||||
Component* childrenHitTest(const ImVec2& pos);
|
||||
Component* getChildByUID(int uid);
|
||||
Component* getSelectedComponent() const { return m_selected_component; }
|
||||
|
|
|
@ -20,8 +20,19 @@ namespace Anim
|
|||
|
||||
struct EdgeInstance : public ComponentInstance
|
||||
{
|
||||
EdgeInstance(Edge& _edge) : ComponentInstance(_edge), edge(_edge) {}
|
||||
|
||||
EdgeInstance(Edge& _edge, IAllocator& _allocator)
|
||||
: ComponentInstance(_edge)
|
||||
, edge(_edge)
|
||||
, allocator(_allocator)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
~EdgeInstance()
|
||||
{
|
||||
LUMIX_DELETE(allocator, from);
|
||||
LUMIX_DELETE(allocator, to);
|
||||
}
|
||||
|
||||
float getTime() const override { return time; }
|
||||
float getLength() const override { return edge.length; }
|
||||
|
@ -33,15 +44,15 @@ struct EdgeInstance : public ComponentInstance
|
|||
}
|
||||
|
||||
|
||||
ComponentInstance* update(RunningContext& rc) override
|
||||
ComponentInstance* update(RunningContext& rc, bool check_edges) override
|
||||
{
|
||||
from = from->update(rc);
|
||||
to->update(rc);
|
||||
from = from->update(rc, false);
|
||||
to = to->update(rc, check_edges);
|
||||
time += rc.time_delta;
|
||||
if (time > edge.length)
|
||||
{
|
||||
ComponentInstance* ret = to;
|
||||
LUMIX_DELETE(*rc.allocator, from);
|
||||
to = nullptr;
|
||||
LUMIX_DELETE(*rc.allocator, this);
|
||||
return ret;
|
||||
}
|
||||
|
@ -69,6 +80,7 @@ struct EdgeInstance : public ComponentInstance
|
|||
float time;
|
||||
ComponentInstance* from;
|
||||
ComponentInstance* to;
|
||||
IAllocator& allocator;
|
||||
};
|
||||
|
||||
|
||||
|
@ -87,7 +99,7 @@ Edge::~Edge()
|
|||
|
||||
ComponentInstance* Edge::createInstance(IAllocator& allocator)
|
||||
{
|
||||
return LUMIX_NEW(allocator, EdgeInstance)(*this);
|
||||
return LUMIX_NEW(allocator, EdgeInstance)(*this, allocator);
|
||||
}
|
||||
|
||||
|
||||
|
@ -184,7 +196,7 @@ struct SimpleAnimationNodeInstance : public NodeInstance
|
|||
}
|
||||
|
||||
|
||||
ComponentInstance* update(RunningContext& rc) override
|
||||
ComponentInstance* update(RunningContext& rc, bool check_edges) override
|
||||
{
|
||||
float old_time = time;
|
||||
time += rc.time_delta;
|
||||
|
@ -214,7 +226,7 @@ struct SimpleAnimationNodeInstance : public NodeInstance
|
|||
{
|
||||
root_motion = { {0, 0, 0}, {0, 0, 0, 1} };
|
||||
}
|
||||
return checkOutEdges(node, rc);
|
||||
return check_edges ? checkOutEdges(node, rc) : this;
|
||||
}
|
||||
|
||||
|
||||
|
@ -247,10 +259,16 @@ StateMachineInstance::StateMachineInstance(StateMachine& _source, IAllocator& _a
|
|||
}
|
||||
|
||||
|
||||
ComponentInstance* StateMachineInstance::update(RunningContext& rc)
|
||||
StateMachineInstance::~StateMachineInstance()
|
||||
{
|
||||
current = current->update(rc);
|
||||
return checkOutEdges(source, rc);
|
||||
LUMIX_DELETE(allocator, current);
|
||||
}
|
||||
|
||||
|
||||
ComponentInstance* StateMachineInstance::update(RunningContext& rc, bool check_edges)
|
||||
{
|
||||
current = current->update(rc, true);
|
||||
return check_edges ? checkOutEdges(source, rc) : this;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ struct ComponentInstance
|
|||
ComponentInstance(Component& _source) : source(_source) {}
|
||||
|
||||
virtual ~ComponentInstance() {}
|
||||
virtual ComponentInstance* update(RunningContext& rc) = 0;
|
||||
virtual ComponentInstance* update(RunningContext& rc, bool check_edges) = 0;
|
||||
virtual Transform getRootMotion() const = 0;
|
||||
virtual void fillPose(Engine& engine, Pose& pose, Model& model, float weight) = 0;
|
||||
virtual void enter(RunningContext& rc, ComponentInstance* from) = 0;
|
||||
|
@ -171,8 +171,9 @@ struct SimpleAnimationNode : public Node
|
|||
struct StateMachineInstance : public NodeInstance
|
||||
{
|
||||
StateMachineInstance(StateMachine& _source, IAllocator& _allocator);
|
||||
~StateMachineInstance();
|
||||
|
||||
ComponentInstance* update(RunningContext& rc) override;
|
||||
ComponentInstance* update(RunningContext& rc, bool check_edges) override;
|
||||
void fillPose(Engine& engine, Pose& pose, Model& model, float weight) override;
|
||||
void enter(RunningContext& rc, ComponentInstance* from) override;
|
||||
float getTime() const override { return 0; }
|
||||
|
|
Loading…
Reference in a new issue