fixed memory issues in the animation system

This commit is contained in:
Mikulas Florek 2016-11-19 02:24:15 +01:00
parent 2f5ef32696
commit 11d9648ed7
6 changed files with 44 additions and 18 deletions

View file

@ -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;

View file

@ -56,7 +56,6 @@ bool ControllerResource::load(FS::IFile& file)
void ControllerResource::setRoot(Component* component)
{
ASSERT(m_root == nullptr);
m_root = component;
}

View file

@ -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);
}

View file

@ -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; }

View file

@ -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;
}

View file

@ -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; }