瀏覽代碼

Fixing cleanup bug

Panagiotis Christopoulos Charitos 10 年之前
父節點
當前提交
9fb689282b
共有 2 個文件被更改,包括 16 次插入12 次删除
  1. 3 7
      include/anki/event/EventManager.h
  2. 13 5
      src/event/EventManager.cpp

+ 3 - 7
include/anki/event/EventManager.h

@@ -3,8 +3,7 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#ifndef ANKI_EVENT_MANAGER_H
-#define ANKI_EVENT_MANAGER_H
+#pragma once
 
 #include "anki/event/Event.h"
 #include "anki/util/List.h"
@@ -24,8 +23,6 @@ class SceneGraph;
 class EventManager
 {
 public:
-	using EventsContainer = List<Event*>;
-
 	EventManager();
 	~EventManager();
 
@@ -94,7 +91,7 @@ public:
 
 private:
 	SceneGraph* m_scene = nullptr;
-	EventsContainer m_events;
+	List<Event*> m_events;
 	U32 m_markedForDeletionCount = 0;
 	F32 m_prevUpdateTime;
 	F32 m_crntTime;
@@ -103,10 +100,9 @@ private:
 	void registerEvent(Event* event);
 
 	/// Remove an event from the container
-	void unregisterEvent(EventsContainer::Iterator it);
+	void unregisterEvent(List<Event*>::Iterator it);
 };
 /// @}
 
 } // end namespace anki
 
-#endif

+ 13 - 5
src/event/EventManager.cpp

@@ -14,7 +14,15 @@ EventManager::EventManager()
 
 //==============================================================================
 EventManager::~EventManager()
-{}
+{
+	iterateEvents([&](Event& event) -> Error
+	{
+		event.setMarkedForDeletion();
+		return ErrorCode::NONE;
+	});
+
+	deleteEventsMarkedForDeletion();
+}
 
 //==============================================================================
 Error EventManager::create(SceneGraph* scene)
@@ -44,8 +52,8 @@ void EventManager::registerEvent(Event* event)
 }
 
 //==============================================================================
-void EventManager::unregisterEvent(EventsContainer::Iterator it)
-{	
+void EventManager::unregisterEvent(List<Event*>::Iterator it)
+{
 	ANKI_ASSERT(it != m_events.getEnd());
 	m_events.erase(getSceneAllocator(), it);
 }
@@ -63,14 +71,14 @@ Error EventManager::updateAllEvents(F32 prevUpdateTime, F32 crntTime)
 	{
 		Event* event = *it;
 
-		// If event or the node's event is marked for deletion then dont 
+		// If event or the node's event is marked for deletion then dont
 		// do anything else for that event
 		if(event->getMarkedForDeletion())
 		{
 			continue;
 		}
 
-		if(event->getSceneNode() != nullptr 
+		if(event->getSceneNode() != nullptr
 			&& event->getSceneNode()->getMarkedForDeletion())
 		{
 			event->setMarkedForDeletion();