瀏覽代碼

Add support to Unit to PackageResource and ResourcePackage

Daniele Bartolini 12 年之前
父節點
當前提交
8e5851c250

+ 37 - 1
engine/compilers/package/PackageCompiler.cpp

@@ -42,10 +42,12 @@ PackageCompiler::PackageCompiler()
 	: m_has_texture(false)
 	, m_has_lua(false)
 	, m_has_sound(false)
+	, m_has_unit(false)
 	, m_texture(default_allocator())
 	, m_script(default_allocator())
 	, m_sound(default_allocator())
 	, m_mesh(default_allocator())
+	, m_unit(default_allocator())
 {
 }
 
@@ -162,11 +164,38 @@ size_t PackageCompiler::compile_impl(Filesystem& fs, const char* resource_path)
 		}
 	}
 
+	// Check for units
+	if (root.has_key("unit"))
+	{
+		JSONElement unit_array = root.key("unit");
+		uint32_t unit_array_size = unit_array.size();
+
+		for (uint32_t i = 0; i < unit_array_size; i++)
+		{
+			TempAllocator256 alloc;
+			DynamicString unit_name(alloc);
+			unit_name += unit_array[i].string_value();
+			unit_name += ".unit";
+
+			if (!fs.is_file(unit_name.c_str()))
+			{
+				Log::e("Unit '%s' does not exist.", unit_name.c_str());
+				return 0;
+			}
+
+			ResourceId id;
+			id.id = hash::murmur2_64(unit_name.c_str(), string::strlen(unit_name.c_str()), 0);
+			m_unit.push_back(id);
+		}
+	}
+
+
 	return sizeof(PackageHeader) +
 			m_texture.size() * sizeof(ResourceId) +
 			m_script.size() * sizeof(ResourceId) +
 			m_sound.size() * sizeof(ResourceId) +
-			m_mesh.size() * sizeof(ResourceId);
+			m_mesh.size() * sizeof(ResourceId) +
+			m_unit.size() * sizeof(ResourceId);
 }
 
 //-----------------------------------------------------------------------------
@@ -177,11 +206,13 @@ void PackageCompiler::write_impl(File* out_file)
 	header.num_scripts = m_script.size();
 	header.num_sounds = m_sound.size();
 	header.num_meshes = m_mesh.size();
+	header.num_units = m_unit.size();
 
 	header.textures_offset = sizeof(PackageHeader);
 	header.scripts_offset  = header.textures_offset + sizeof(ResourceId) * header.num_textures;
 	header.sounds_offset = header.scripts_offset + sizeof(ResourceId) * header.num_scripts;
 	header.meshes_offset = header.sounds_offset + sizeof(ResourceId) * header.num_sounds;
+	header.units_offset = header.meshes_offset + sizeof(ResourceId) * header.num_meshes;
 
 	out_file->write((char*) &header, sizeof(PackageHeader));
 
@@ -201,12 +232,17 @@ void PackageCompiler::write_impl(File* out_file)
 	{
 		out_file->write((char*) m_mesh.begin(), sizeof(ResourceId) * header.num_meshes);
 	}
+	if (m_unit.size() > 0)
+	{
+		out_file->write((char*) m_unit.begin(), sizeof(ResourceId) * header.num_units);	
+	}
 
 	// Cleanup
 	m_texture.clear();
 	m_script.clear();
 	m_sound.clear();
 	m_mesh.clear();
+	m_unit.clear();
 }
 
 } // namespace crown

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

@@ -48,11 +48,13 @@ private:
 	bool m_has_lua;
 	bool m_has_sound;
 	bool m_has_mesh;
+	bool m_has_unit;
 
 	List<ResourceId> m_texture;
 	List<ResourceId> m_script;
 	List<ResourceId> m_sound;
 	List<ResourceId> m_mesh;
+	List<ResourceId> m_unit;
 };
 
 } // namespace crown

+ 19 - 0
engine/resource/PackageResource.h

@@ -46,6 +46,8 @@ struct PackageHeader
 	uint32_t sounds_offset;
 	uint32_t num_meshes;
 	uint32_t meshes_offset;
+	uint32_t num_units;
+	uint32_t units_offset;
 };
 
 class PackageResource
@@ -120,6 +122,14 @@ public:
 		return ((PackageHeader*)m_data)->num_meshes;
 	}
 
+	//-----------------------------------------------------------------------------
+	uint32_t num_units() const
+	{
+		CE_ASSERT_NOT_NULL(m_data);
+
+		return ((PackageHeader*)m_data)->num_units;
+	}
+
 	//-----------------------------------------------------------------------------
 	ResourceId get_texture_id(uint32_t i) const
 	{
@@ -156,6 +166,15 @@ public:
 		return begin[i];
 	}
 
+	//-----------------------------------------------------------------------------
+	ResourceId get_unit_id(uint32_t i) const
+	{
+		CE_ASSERT(i < num_units(), "Index out of bounds");
+
+		ResourceId* begin = (ResourceId*) (m_data + ((PackageHeader*)m_data)->units_offset);
+		return begin[i];
+	}
+
 private:
 
 	char* m_data;

+ 10 - 0
engine/resource/ResourcePackage.h

@@ -72,11 +72,21 @@ public:
 		{
 			m_resource_manager->load(MESH_TYPE, m_package->get_mesh_id(i));
 		}
+
+		for (uint32_t i = 0; i < m_package->num_units(); i++)
+		{
+			m_resource_manager->load(UNIT_TYPE, m_package->get_unit_id(i));
+		}
 	}
 
 	/// Unloads all the resources in the package.
 	void unload()
 	{
+		for (uint32_t i = 0; i < m_package->num_units(); i++)
+		{
+			m_resource_manager->unload(m_package->get_unit_id(i));
+		}
+
 		for (uint32_t i = 0; i < m_package->num_meshes(); i++)
 		{
 			m_resource_manager->unload(m_package->get_mesh_id(i));