Просмотр исходного кода

Add support to .physics to ResourcePackage

Daniele Bartolini 12 лет назад
Родитель
Сommit
f4eccc177d

+ 33 - 0
engine/compilers/package/PackageCompiler.cpp

@@ -45,6 +45,7 @@ PackageCompiler::PackageCompiler()
 	, m_mesh(default_allocator())
 	, m_mesh(default_allocator())
 	, m_unit(default_allocator())
 	, m_unit(default_allocator())
 	, m_sprite(default_allocator())
 	, m_sprite(default_allocator())
+	, m_physics(default_allocator())
 {
 {
 }
 }
 
 
@@ -210,6 +211,31 @@ size_t PackageCompiler::compile_impl(Filesystem& fs, const char* resource_path)
 		}
 		}
 	}
 	}
 
 
+	// Check for physics
+	if (root.has_key("physics"))
+	{
+		JSONElement physics_array = root.key("physics");
+		uint32_t physics_array_size = physics_array.size();
+
+		for (uint32_t i = 0; i < physics_array_size; i++)
+		{
+			TempAllocator256 alloc;
+			DynamicString physics_name(alloc);
+			physics_name += physics_array[i].string_value();
+			physics_name += ".physics";
+
+			if (!fs.is_file(physics_name.c_str()))
+			{
+				Log::e("Physics '%s' does not exist.", physics_name.c_str());
+				return 0;
+			}
+
+			ResourceId id;
+			id.id = hash::murmur2_64(physics_name.c_str(), string::strlen(physics_name.c_str()), 0);
+			m_physics.push_back(id);
+		}	
+	}
+
 	return 1;
 	return 1;
 }
 }
 
 
@@ -223,6 +249,7 @@ void PackageCompiler::write_impl(File* out_file)
 	header.num_meshes = m_mesh.size();
 	header.num_meshes = m_mesh.size();
 	header.num_units = m_unit.size();
 	header.num_units = m_unit.size();
 	header.num_sprites = m_sprite.size();
 	header.num_sprites = m_sprite.size();
+	header.num_physics = m_physics.size();
 
 
 	header.textures_offset = sizeof(PackageHeader);
 	header.textures_offset = sizeof(PackageHeader);
 	header.scripts_offset  = header.textures_offset + sizeof(ResourceId) * header.num_textures;
 	header.scripts_offset  = header.textures_offset + sizeof(ResourceId) * header.num_textures;
@@ -230,6 +257,7 @@ void PackageCompiler::write_impl(File* out_file)
 	header.meshes_offset = header.sounds_offset + sizeof(ResourceId) * header.num_sounds;
 	header.meshes_offset = header.sounds_offset + sizeof(ResourceId) * header.num_sounds;
 	header.units_offset = header.meshes_offset + sizeof(ResourceId) * header.num_meshes;
 	header.units_offset = header.meshes_offset + sizeof(ResourceId) * header.num_meshes;
 	header.sprites_offset = header.units_offset + sizeof(ResourceId) * header.num_units;
 	header.sprites_offset = header.units_offset + sizeof(ResourceId) * header.num_units;
+	header.physics_offset = header.sprites_offset + sizeof(ResourceId) * header.num_sprites;
 
 
 	out_file->write((char*) &header, sizeof(PackageHeader));
 	out_file->write((char*) &header, sizeof(PackageHeader));
 
 
@@ -257,6 +285,10 @@ void PackageCompiler::write_impl(File* out_file)
 	{
 	{
 		out_file->write((char*) m_sprite.begin(), sizeof(ResourceId) * header.num_sprites);
 		out_file->write((char*) m_sprite.begin(), sizeof(ResourceId) * header.num_sprites);
 	}
 	}
+	if (m_physics.size() > 0)
+	{
+		out_file->write((char*) m_physics.begin(), sizeof(ResourceId) * header.num_physics);
+	}
 
 
 	// Cleanup
 	// Cleanup
 	m_texture.clear();
 	m_texture.clear();
@@ -265,6 +297,7 @@ void PackageCompiler::write_impl(File* out_file)
 	m_mesh.clear();
 	m_mesh.clear();
 	m_unit.clear();
 	m_unit.clear();
 	m_sprite.clear();
 	m_sprite.clear();
+	m_physics.clear();
 }
 }
 
 
 } // namespace crown
 } // namespace crown

+ 1 - 0
engine/compilers/package/PackageCompiler.h

@@ -50,6 +50,7 @@ private:
 	List<ResourceId> m_mesh;
 	List<ResourceId> m_mesh;
 	List<ResourceId> m_unit;
 	List<ResourceId> m_unit;
 	List<ResourceId> m_sprite;
 	List<ResourceId> m_sprite;
+	List<ResourceId> m_physics;
 };
 };
 
 
 } // namespace crown
 } // namespace crown

+ 17 - 0
engine/resource/PackageResource.h

@@ -50,6 +50,8 @@ struct PackageHeader
 	uint32_t units_offset;
 	uint32_t units_offset;
 	uint32_t num_sprites;
 	uint32_t num_sprites;
 	uint32_t sprites_offset;
 	uint32_t sprites_offset;
+	uint32_t num_physics;
+	uint32_t physics_offset;
 };
 };
 
 
 struct PackageResource
 struct PackageResource
@@ -121,6 +123,12 @@ struct PackageResource
 		return ((PackageHeader*) this)->num_sprites;
 		return ((PackageHeader*) this)->num_sprites;
 	}
 	}
 
 
+	//-----------------------------------------------------------------------------
+	uint32_t num_physics() const
+	{
+		return ((PackageHeader*) this)->num_physics;
+	}
+
 	//-----------------------------------------------------------------------------
 	//-----------------------------------------------------------------------------
 	ResourceId get_texture_id(uint32_t i) const
 	ResourceId get_texture_id(uint32_t i) const
 	{
 	{
@@ -175,6 +183,15 @@ struct PackageResource
 		return begin[i];
 		return begin[i];
 	}
 	}
 
 
+	//-----------------------------------------------------------------------------
+	ResourceId get_physics_id(uint32_t i) const
+	{
+		CE_ASSERT(i < num_physics(), "Index out of bounds");
+
+		ResourceId* begin = (ResourceId*) ((char*) this + ((PackageHeader*) this)->physics_offset);
+		return begin[i];
+	}	
+
 private:
 private:
 
 
 	// Disable construction
 	// Disable construction

+ 10 - 0
engine/resource/ResourcePackage.h

@@ -82,11 +82,21 @@ public:
 		{
 		{
 			m_resource_manager->load(SPRITE_TYPE, m_package->get_sprite_id(i));
 			m_resource_manager->load(SPRITE_TYPE, m_package->get_sprite_id(i));
 		}
 		}
+
+		for (uint32_t i = 0; i < m_package->num_physics(); i++)
+		{
+			m_resource_manager->load(PHYSICS_TYPE, m_package->get_physics_id(i));
+		}
 	}
 	}
 
 
 	/// Unloads all the resources in the package.
 	/// Unloads all the resources in the package.
 	void unload()
 	void unload()
 	{
 	{
+		for (uint32_t i = 0; i < m_package->num_physics(); i++)
+		{
+			m_resource_manager->unload(m_package->get_physics_id(i));
+		}
+
 		for (uint32_t i = 0; i < m_package->num_sprites(); i++)
 		for (uint32_t i = 0; i < m_package->num_sprites(); i++)
 		{
 		{
 			m_resource_manager->unload(m_package->get_sprite_id(i));
 			m_resource_manager->unload(m_package->get_sprite_id(i));