Daniele Bartolini 12 лет назад
Родитель
Сommit
21825d0b97
3 измененных файлов с 156 добавлено и 0 удалено
  1. 4 0
      engine/CMakeLists.txt
  2. 102 0
      engine/compilers/lua/LuaCompiler.cpp
  3. 50 0
      engine/compilers/lua/LuaCompiler.h

+ 4 - 0
engine/CMakeLists.txt

@@ -57,6 +57,7 @@ set (CROWN_INCLUDES
 	${CMAKE_SOURCE_DIR}/engine/network
 	${CMAKE_SOURCE_DIR}/engine/lua
 	${CMAKE_SOURCE_DIR}/engine/compilers
+	${CMAKE_SOURCE_DIR}/engine/compilers/lua
 	${CMAKE_SOURCE_DIR}/engine/compilers/tga
 )
 
@@ -290,6 +291,7 @@ set (RESOURCE_HEADERS
 	resource/ResourceManager.h
 	resource/ResourceRegistry.h
 	resource/Bundle.h
+	resource/LuaResource.h
 	resource/TextureResource.h
 	resource/MeshResource.h
 	resource/FontResource.h
@@ -332,12 +334,14 @@ set (LUA_HEADERS
 set (COMPILER_SRC
 	compilers/Compiler.cpp
 	compilers/BundleCompiler.cpp
+	compilers/lua/LuaCompiler.cpp
 	compilers/tga/TGACompiler.cpp
 )
 
 set (COMPILER_HEADER
 	compilers/Compiler.h
 	compilers/BundleCompiler.h
+	compilers/lua/LuaCompiler.h
 	compilers/tga/TGACompiler.h
 )
 

+ 102 - 0
engine/compilers/lua/LuaCompiler.cpp

@@ -0,0 +1,102 @@
+/*
+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.
+*/
+
+#include "LuaCompiler.h"
+#include "LuaResource.h"
+#include "TempAllocator.h"
+#include "DynamicString.h"
+#include "Filesystem.h"
+#include "OS.h"
+
+namespace crown
+{
+
+//-----------------------------------------------------------------------------
+LuaCompiler::LuaCompiler()
+	: m_luajit_blob_size(0), m_luajit_blob(NULL)
+{
+}
+
+//-----------------------------------------------------------------------------
+LuaCompiler::~LuaCompiler()
+{
+}
+
+//-----------------------------------------------------------------------------
+size_t LuaCompiler::compile_impl(Filesystem& fs, const char* resource_path)
+{
+	TempAllocator1024 alloc;
+	DynamicString res_abs_path(alloc);
+	TempAllocator1024 alloc2;
+	DynamicString bc_abs_path(alloc2);
+	fs.get_absolute_path(resource_path, res_abs_path);
+	fs.get_absolute_path("bc.tmp", bc_abs_path);
+
+	const char* luajit[] =
+	{
+		"./luajit",
+		"-b",
+		res_abs_path.c_str(),
+		bc_abs_path.c_str(),
+		NULL
+	};
+
+	os::execute_process(luajit);
+
+	File* bc = fs.open(bc_abs_path.c_str(), FOM_READ);
+	if (bc != NULL)
+	{
+		m_luajit_blob_size = bc->size();
+		m_luajit_blob = (char*) default_allocator().allocate(m_luajit_blob_size);
+		bc->read(m_luajit_blob, m_luajit_blob_size);
+		fs.close(bc);
+		fs.delete_file(bc_abs_path.c_str());
+	}
+	else
+	{
+		Log::e("Error while reading luajit bytecode");
+		return 0;
+	}
+
+	return sizeof(LuaHeader) + m_luajit_blob_size;
+}
+
+//-----------------------------------------------------------------------------
+void LuaCompiler::write_impl(File* out_file)
+{
+	LuaHeader header;
+	header.version = LUA_RESOURCE_VERSION;
+	header.size = m_luajit_blob_size;
+
+	out_file->write((char*)&header, sizeof(LuaHeader));
+	out_file->write((char*)m_luajit_blob, m_luajit_blob_size);
+
+	default_allocator().deallocate(m_luajit_blob);
+	m_luajit_blob_size = 0;
+	m_luajit_blob = NULL;
+}
+
+} // namespace crown

+ 50 - 0
engine/compilers/lua/LuaCompiler.h

@@ -0,0 +1,50 @@
+/*
+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 "Compiler.h"
+
+namespace crown
+{
+
+class LuaCompiler : public Compiler
+{
+public:
+
+					LuaCompiler();
+					~LuaCompiler();
+
+	size_t			compile_impl(Filesystem& fs, const char* resource_path);
+	void			write_impl(File* out_file);
+
+private:
+
+	size_t			m_luajit_blob_size;
+	char*			m_luajit_blob;
+};
+
+} // namespace crown