2
0
Daniele Bartolini 12 жил өмнө
parent
commit
2321dcfe06

+ 98 - 0
engine/resource/LuaResource.h

@@ -0,0 +1,98 @@
+/*
+Copyright (c) 2013 Daniele Bartolini, Michele Rossi
+Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#pragma once
+
+#include "Types.h"
+#include "Resource.h"
+#include "Bundle.h"
+#include "Allocator.h"
+#include "File.h"
+#include "Log.h"
+
+namespace crown
+{
+
+// Bump the version whenever a change in the header is made
+const uint32_t LUA_RESOURCE_VERSION = 1;
+
+struct LuaHeader
+{
+	uint32_t	version;	// Lua resource version
+	uint32_t	size;		// Size of lua code
+};
+
+class LuaResource
+{
+public:
+
+	//-----------------------------------------------------------------------------
+	static void* load(Allocator& allocator, Bundle& bundle, ResourceId id)
+	{
+		File* file = bundle.open(id);
+		CE_ASSERT(file != NULL, "Resource does not exist: %.8X%.8X", id.name, id.type);
+
+		const size_t file_size = file->size() - 12;
+		LuaResource* res = (LuaResource*) allocator.allocate(sizeof(LuaResource));
+		res->m_data = (uint8_t*) allocator.allocate(file_size);
+		file->read(res->m_data, file_size);
+
+		return res;
+	}
+
+	//-----------------------------------------------------------------------------
+	static void online(void* /*resource*/) {}
+
+	//-----------------------------------------------------------------------------
+	static void unload(Allocator& allocator, void* resource)
+	{
+		CE_ASSERT_NOT_NULL(resource);
+
+		allocator.deallocate(((LuaResource*)resource)->m_data);
+		allocator.deallocate(resource);
+	}
+
+	//-----------------------------------------------------------------------------
+	static void offline(void* /*resource*/) {}
+
+public:
+
+	uint32_t size() const
+	{
+		return ((LuaHeader*) m_data)->size;
+	}
+
+	const uint8_t* code() const
+	{
+		return m_data + sizeof(LuaHeader);
+	}
+
+private:
+
+	uint8_t* m_data;
+};
+
+} // namespace crown

+ 2 - 2
engine/resource/Resource.h

@@ -36,14 +36,14 @@ namespace crown
 /// Hashed values for supported resource types
 const char* const TEXTURE_EXTENSION			= "tga";
 const char* const MESH_EXTENSION			= "dae";
-const char* const SCRIPT_EXTENSION			= "lua";
+const char* const LUA_EXTENSION				= "lua";
 const char* const TEXT_EXTENSION			= "txt";
 const char* const MATERIAL_EXTENSION		= "material";
 const char* const SOUND_EXTENSION			= "wav";
 
 const uint32_t TEXTURE_TYPE					= 0x1410A16A;
 const uint32_t MESH_TYPE					= 0xE8239EEC;
-const uint32_t SCRIPT_TYPE					= 0xD96E7C37;
+const uint32_t LUA_TYPE						= 0xD96E7C37;
 const uint32_t TEXT_TYPE					= 0x9000BF0B;
 const uint32_t MATERIAL_TYPE				= 0x46807A92;
 const uint32_t SOUND_TYPE					= 0x8E128AA1;

+ 2 - 0
engine/resource/ResourceRegistry.cpp

@@ -25,6 +25,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 */
 
 #include "ResourceRegistry.h"
+#include "LuaResource.h"
 #include "TextureResource.h"
 #include "MeshResource.h"
 #include "SoundResource.h"
@@ -34,6 +35,7 @@ namespace crown
 
 static const ResourceCallback RESOURCE_CALLBACK_REGISTRY[] =
 {
+	{ LUA_TYPE, LuaResource::load, LuaResource::unload, LuaResource::online, LuaResource::offline },
 	{ TEXTURE_TYPE, TextureResource::load, TextureResource::unload, TextureResource::online, TextureResource::offline },
 	{ MESH_TYPE, MeshResource::load, MeshResource::unload, MeshResource::online, MeshResource::offline },
 	{ SOUND_TYPE, SoundResource::load, SoundResource::unload, SoundResource::online, SoundResource::offline },