Selaa lähdekoodia

Remove WorldManager

Daniele Bartolini 11 vuotta sitten
vanhempi
sitoutus
6f5fa2439a

+ 18 - 13
engine/device.cpp

@@ -14,7 +14,6 @@
 #include "resource_package.h"
 #include "types.h"
 #include "world.h"
-#include "world_manager.h"
 #include "memory.h"
 #include "os.h"
 
@@ -40,7 +39,7 @@ Device::Device(Filesystem& fs, StringId64 boot_package, StringId64 boot_script)
 	, _boot_package(NULL)
 	, _lua_environment(NULL)
 	, _resource_manager(NULL)
-	, _world_manager(NULL)
+	, _worlds(default_allocator())
 {
 }
 
@@ -53,10 +52,6 @@ void Device::init()
 	CE_LOGD("Creating resource manager...");
 	_resource_manager = CE_NEW(_allocator, ResourceManager)(_fs);
 
-	// Create world manager
-	CE_LOGD("Creating world manager...");
-	_world_manager = CE_NEW(_allocator, WorldManager)();
-
 	CE_LOGD("Creating material manager...");
 	material_manager::init();
 	debug_line::init();
@@ -94,9 +89,6 @@ void Device::shutdown()
 	debug_line::shutdown();
 	material_manager::shutdown();
 
-	CE_LOGD("Releasing world manager...");
-	CE_DELETE(_allocator, _world_manager);
-
 	CE_LOGD("Releasing resource manager...");
 	CE_DELETE(_allocator, _resource_manager);
 
@@ -175,14 +167,27 @@ void Device::render_world(World* world, Camera* camera)
 	world->render(camera);
 }
 
-WorldId Device::create_world()
+World* Device::create_world()
 {
-	return _world_manager->create_world();
+	World* w = CE_NEW(default_allocator(), World)();
+	array::push_back(_worlds, w);
+	return w;
 }
 
-void Device::destroy_world(WorldId world)
+void Device::destroy_world(World& w)
 {
-	_world_manager->destroy_world(world);
+	for (uint32_t i = 0, n = array::size(_worlds); i < n; ++i)
+	{
+		if (&w == _worlds[i])
+		{
+			CE_DELETE(default_allocator(), &w);
+			_worlds[i] = _worlds[n - 1];
+			array::pop_back(_worlds);
+			return;
+		}
+	}
+
+	CE_ASSERT(false, "Bad world");
 }
 
 ResourcePackage* Device::create_resource_package(const char* name)

+ 5 - 4
engine/device.h

@@ -12,6 +12,7 @@
 #include "resource_types.h"
 #include "lua_types.h"
 #include "filesystem_types.h"
+#include "array.h"
 
 namespace crown
 {
@@ -83,10 +84,10 @@ struct Device
 	void render_world(World* world, Camera* camera);
 
 	/// Creates a new world.
-	WorldId create_world();
+	World* create_world();
 
 	/// Destroys the given @a world.
-	void destroy_world(WorldId world);
+	void destroy_world(World& w);
 
 	/// Returns the resource package with the given @a package_name name.
 	ResourcePackage* create_resource_package(const char* name);
@@ -102,7 +103,6 @@ struct Device
 
 	ResourceManager* resource_manager();
 	LuaEnvironment* lua_environment();
-	WorldManager* world_manager() { return _world_manager; }
 
 private:
 
@@ -129,7 +129,8 @@ private:
 
 	LuaEnvironment* _lua_environment;
 	ResourceManager* _resource_manager;
-	WorldManager* _world_manager;
+
+	Array<World*> _worlds;
 
 private:
 

+ 2 - 4
engine/lua/lua_device.cpp

@@ -6,7 +6,6 @@
 #include "device.h"
 #include "resource_package.h"
 #include "world.h"
-#include "world_manager.h"
 #include "lua_environment.h"
 #include "lua_stack.h"
 #include "temp_allocator.h"
@@ -65,15 +64,14 @@ static int device_resolution(lua_State* L)
 static int device_create_world(lua_State* L)
 {
 	LuaStack stack(L);
-	const WorldId world_id = device()->create_world();
-	stack.push_world(device()->world_manager()->lookup_world(world_id));
+	stack.push_world(device()->create_world());
 	return 1;
 }
 
 static int device_destroy_world(lua_State* L)
 {
 	LuaStack stack(L);
-	device()->destroy_world(stack.get_world(1)->id());
+	device()->destroy_world(*stack.get_world(1));
 	return 0;
 }
 

+ 4 - 4
engine/world/unit.cpp

@@ -200,10 +200,10 @@ void Unit::create_physics_objects()
 		{
 			const JointResource* jr = physics_resource::joint(pr, i);
 
-			Actor* a1 = actor_by_index(jr->actor_0);
-			Actor* a2 = actor_by_index(jr->actor_1);
+			Actor* a1 = jr->actor_0 ? actor_by_index(jr->actor_0) : NULL;
+			Actor* a2 = jr->actor_1 ? actor_by_index(jr->actor_1) : NULL;
 
-			m_world.physics_world()->create_joint(jr, *a1, *a2);
+			m_world.physics_world()->create_joint(jr, a1, a2);
 		}
 	}
 }
@@ -442,7 +442,7 @@ Actor* Unit::actor_by_index(StringId32 name)
 {
 	ActorId actor = find_component_by_name(name, m_num_actors, m_actors);
 
-	// CE_ASSERT(actor.id != INVALID_ID, "Unit does not have actor with name '%d'", name);
+	CE_ASSERT(actor.id != INVALID_ID, "Unit does not have actor with name '%d'", name);
 
 	return m_world.physics_world()->get_actor(actor);
 }

+ 0 - 10
engine/world/world.cpp

@@ -47,16 +47,6 @@ World::~World()
 	SoundWorld::destroy(default_allocator(), m_sound_world);
 }
 
-WorldId World::id() const
-{
-	return m_id;
-}
-
-void World::set_id(WorldId id)
-{
-	m_id = id;
-}
-
 UnitId World::spawn_unit(const char* name, const Vector3& pos, const Quaternion& rot)
 {
 	const ResourceId id(UNIT_EXTENSION, name);

+ 0 - 3
engine/world/world.h

@@ -39,9 +39,6 @@ public:
 	World();
 	~World();
 
-	WorldId id() const;
-	void set_id(WorldId id);
-
 	/// Spawns a new instance of the unit @a name at the given @a position and @a rotation.
 	UnitId spawn_unit(const char* name, const Vector3& position = vector3::ZERO, const Quaternion& rotation = quaternion::IDENTITY);
 	UnitId spawn_unit(StringId64 name, const Vector3& pos, const Quaternion& rot);

+ 0 - 46
engine/world/world_manager.cpp

@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#include "world_manager.h"
-#include "world.h"
-#include "memory.h"
-
-namespace crown
-{
-
-WorldManager::WorldManager()
-	: m_allocator("world-manager", default_allocator())
-{
-}
-
-WorldManager::~WorldManager()
-{
-}
-
-WorldId WorldManager::create_world()
-{
-	World* w = CE_NEW(m_allocator, World)();
-	const WorldId w_id = id_array::create(m_worlds, w);
-	w->set_id(w_id);
-	return w_id;
-}
-
-void WorldManager::destroy_world(WorldId id)
-{
-	CE_DELETE(m_allocator, id_array::get(m_worlds, id));
-	id_array::destroy(m_worlds, id);
-}
-
-World* WorldManager::lookup_world(WorldId id)
-{
-	return id_array::get(m_worlds, id);
-}
-
-IdArray<CE_MAX_WORLDS, World*>& WorldManager::worlds()
-{
-	return m_worlds;
-}
-
-} // namespace crown

+ 0 - 41
engine/world/world_manager.h

@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
-
-#include "id_array.h"
-#include "proxy_allocator.h"
-
-#pragma once
-
-namespace crown
-{
-
-typedef Id WorldId;
-class World;
-
-/// Manages a number of worlds.
-///
-/// @ingroup World
-class WorldManager
-{
-public:
-
-					WorldManager();
-					~WorldManager();
-
-	WorldId			create_world();
-	void			destroy_world(WorldId id);
-
-	World*			lookup_world(WorldId id);
-
-	/// Return the array of worlds.
-	IdArray<CE_MAX_WORLDS, World*>& worlds();
-
-private:
-
-	ProxyAllocator m_allocator;
-	IdArray<CE_MAX_WORLDS, World*> m_worlds;
-};
-
-} // namespace crown