summaryrefslogtreecommitdiff
path: root/source/libs
diff options
context:
space:
mode:
Diffstat (limited to 'source/libs')
-rw-r--r--source/libs/asura-lib-core/application.cpp59
-rw-r--r--source/libs/asura-lib-core/application.h93
-rw-r--r--source/libs/asura-lib-core/asura.h15
-rw-r--r--source/libs/asura-lib-core/client/client.h18
-rw-r--r--source/libs/asura-lib-core/client/sdl/sdl_application.cpp0
-rw-r--r--source/libs/asura-lib-core/client/sdl/sdl_application.h28
-rw-r--r--source/libs/asura-lib-core/client/sdl/sdl_cursor.cpp0
-rw-r--r--source/libs/asura-lib-core/client/sdl/sdl_cursor.h0
-rw-r--r--source/libs/asura-lib-core/client/sdl/sdl_window.cpp0
-rw-r--r--source/libs/asura-lib-core/client/sdl/sdl_window.h14
-rw-r--r--source/libs/asura-lib-core/config.h4
-rw-r--r--source/libs/asura-lib-core/core_module.cpp0
-rw-r--r--source/libs/asura-lib-core/core_module.h11
-rw-r--r--source/libs/asura-lib-core/font/glyph.cpp0
-rw-r--r--source/libs/asura-lib-core/font/glyph.h0
-rw-r--r--source/libs/asura-lib-core/font/string.cpp376
-rw-r--r--source/libs/asura-lib-core/font/string.hpp594
-rw-r--r--source/libs/asura-lib-core/font/string.inl29
-rw-r--r--source/libs/asura-lib-core/font/ttf.cpp0
-rw-r--r--source/libs/asura-lib-core/font/ttf.h17
-rw-r--r--source/libs/asura-lib-core/font/utf.hpp720
-rw-r--r--source/libs/asura-lib-core/font/utf.inl752
-rw-r--r--source/libs/asura-lib-core/graphics/binding/canvas.binding.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/binding/color.binding.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/binding/gif.binding.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/binding/image.binding.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/binding/image_data.binding.cpp30
-rw-r--r--source/libs/asura-lib-core/graphics/binding/mesh2d.binding.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/binding/mesh2d_data.binding.cpp9
-rw-r--r--source/libs/asura-lib-core/graphics/binding/shader.binding.cpp114
-rw-r--r--source/libs/asura-lib-core/graphics/binding/sprite_batch.binding.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/binding/window.binding.cpp11
-rw-r--r--source/libs/asura-lib-core/graphics/blend_mode.h17
-rw-r--r--source/libs/asura-lib-core/graphics/canvas.cpp41
-rw-r--r--source/libs/asura-lib-core/graphics/canvas.h81
-rw-r--r--source/libs/asura-lib-core/graphics/color.cpp132
-rw-r--r--source/libs/asura-lib-core/graphics/color.h95
-rw-r--r--source/libs/asura-lib-core/graphics/color_palette.h0
-rw-r--r--source/libs/asura-lib-core/graphics/gif.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/gif.h20
-rw-r--r--source/libs/asura-lib-core/graphics/gl.cpp25
-rw-r--r--source/libs/asura-lib-core/graphics/gl.h41
-rw-r--r--source/libs/asura-lib-core/graphics/image.cpp32
-rw-r--r--source/libs/asura-lib-core/graphics/image.h76
-rw-r--r--source/libs/asura-lib-core/graphics/image_data.cpp50
-rw-r--r--source/libs/asura-lib-core/graphics/image_data.h62
-rw-r--r--source/libs/asura-lib-core/graphics/image_decoder.h35
-rw-r--r--source/libs/asura-lib-core/graphics/mesh2d.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/mesh2d.h30
-rw-r--r--source/libs/asura-lib-core/graphics/mesh2d_data.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/mesh2d_data.h0
-rw-r--r--source/libs/asura-lib-core/graphics/pixel_format.h91
-rw-r--r--source/libs/asura-lib-core/graphics/png_decoder.cpp19
-rw-r--r--source/libs/asura-lib-core/graphics/png_decoder.h27
-rw-r--r--source/libs/asura-lib-core/graphics/quad.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/quad.h1
-rw-r--r--source/libs/asura-lib-core/graphics/render_state.h50
-rw-r--r--source/libs/asura-lib-core/graphics/render_target.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/render_target.h54
-rw-r--r--source/libs/asura-lib-core/graphics/shader.cpp81
-rw-r--r--source/libs/asura-lib-core/graphics/shader.h125
-rw-r--r--source/libs/asura-lib-core/graphics/shape.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/shape.h0
-rw-r--r--source/libs/asura-lib-core/graphics/sprite_batch.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/sprite_batch.h28
-rw-r--r--source/libs/asura-lib-core/graphics/stb_decoder.cpp65
-rw-r--r--source/libs/asura-lib-core/graphics/stb_decoder.h28
-rw-r--r--source/libs/asura-lib-core/graphics/texture.cpp26
-rw-r--r--source/libs/asura-lib-core/graphics/texture.h66
-rw-r--r--source/libs/asura-lib-core/graphics/window.cpp50
-rw-r--r--source/libs/asura-lib-core/graphics/window.h68
-rw-r--r--source/libs/asura-lib-core/input/clipboard.cpp0
-rw-r--r--source/libs/asura-lib-core/input/clipboard.h37
-rw-r--r--source/libs/asura-lib-core/input/cursor.cpp0
-rw-r--r--source/libs/asura-lib-core/input/cursor.defs25
-rw-r--r--source/libs/asura-lib-core/input/cursor.h55
-rw-r--r--source/libs/asura-lib-core/input/input_device.hpp30
-rw-r--r--source/libs/asura-lib-core/input/keyboard.cpp0
-rw-r--r--source/libs/asura-lib-core/input/keyboard.defs482
-rw-r--r--source/libs/asura-lib-core/input/keyboard.h73
-rw-r--r--source/libs/asura-lib-core/input/mouse.cpp0
-rw-r--r--source/libs/asura-lib-core/input/mouse.h56
-rw-r--r--source/libs/asura-lib-core/manager.hpp14
-rw-r--r--source/libs/asura-lib-core/profiler/stats.cpp0
-rw-r--r--source/libs/asura-lib-core/profiler/stats.h0
-rw-r--r--source/libs/asura-lib-core/singleton.hpp59
-rw-r--r--source/libs/asura-lib-core/stringmap.cpp0
-rw-r--r--source/libs/asura-lib-core/stringmap.hpp29
-rw-r--r--source/libs/asura-lib-core/time/timer.cpp0
-rw-r--r--source/libs/asura-lib-core/time/timer.h0
-rw-r--r--source/libs/asura-lib-core/type.h11
-rw-r--r--source/libs/asura-lib-framework/compile.bat0
-rw-r--r--source/libs/asura-lib-framework/compile.sh0
-rw-r--r--source/libs/asura-lib-framework/main.cpp0
-rw-r--r--source/libs/asura-lib-framework/scripts/ai/behavior_tree.lua0
-rw-r--r--source/libs/asura-lib-framework/scripts/ai/state_graph.lua11
-rw-r--r--source/libs/asura-lib-framework/scripts/ai/state_machine.lua6
-rw-r--r--source/libs/asura-lib-framework/scripts/audio/sound.lua9
-rw-r--r--source/libs/asura-lib-framework/scripts/audio/source.lua22
-rw-r--r--source/libs/asura-lib-framework/scripts/class.lua17
-rw-r--r--source/libs/asura-lib-framework/scripts/component.lua30
-rw-r--r--source/libs/asura-lib-framework/scripts/filesystem/animation_loader.lua10
-rw-r--r--source/libs/asura-lib-framework/scripts/filesystem/asset.lua20
-rw-r--r--source/libs/asura-lib-framework/scripts/filesystem/entity_loader.lua5
-rw-r--r--source/libs/asura-lib-framework/scripts/filesystem/image_loader.lua13
-rw-r--r--source/libs/asura-lib-framework/scripts/filesystem/loader.lua12
-rw-r--r--source/libs/asura-lib-framework/scripts/filesystem/material_loader.lua7
-rw-r--r--source/libs/asura-lib-framework/scripts/filesystem/path_loader.lua9
-rw-r--r--source/libs/asura-lib-framework/scripts/filesystem/scene_loader.lua7
-rw-r--r--source/libs/asura-lib-framework/scripts/filesystem/script_loader.lua5
-rw-r--r--source/libs/asura-lib-framework/scripts/filesystem/shader_loader.lua5
-rw-r--r--source/libs/asura-lib-framework/scripts/filesystem/statemap_loader.lua7
-rw-r--r--source/libs/asura-lib-framework/scripts/framework.lua21
-rw-r--r--source/libs/asura-lib-framework/scripts/gameobject.lua115
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/animation.lua15
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/animator.lua33
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/camera.lua21
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/canvas.lua34
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/default_shaders.lua5
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/image.lua40
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/material.lua48
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/material_manager.lua3
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/mesh2d.lua9
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/mesh2d_renderer.lua13
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/particle_system.lua20
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/renderer.lua19
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/shader.lua75
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/shaderHelper.lua14
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/shape.lua12
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/shape_renderer.lua13
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/sprite.lua10
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/sprite_batch_renderer.lua9
-rw-r--r--source/libs/asura-lib-framework/scripts/graphics/sprite_renderer.lua14
-rw-r--r--source/libs/asura-lib-framework/scripts/gui/button.lua21
-rw-r--r--source/libs/asura-lib-framework/scripts/gui/text.lua0
-rw-r--r--source/libs/asura-lib-framework/scripts/gui/widget.lua14
-rw-r--r--source/libs/asura-lib-framework/scripts/managers/scene_manager.lua16
-rw-r--r--source/libs/asura-lib-framework/scripts/managers/sprite_manager.lua0
-rw-r--r--source/libs/asura-lib-framework/scripts/math/curve.lua0
-rw-r--r--source/libs/asura-lib-framework/scripts/path/path.lua13
-rw-r--r--source/libs/asura-lib-framework/scripts/path/path_calculator.lua12
-rw-r--r--source/libs/asura-lib-framework/scripts/path/path_manager.lua0
-rw-r--r--source/libs/asura-lib-framework/scripts/scene.lua22
-rw-r--r--source/libs/asura-lib-framework/scripts/transform.lua13
-rw-r--r--source/libs/asura-lib-json/json.cpp0
-rw-r--r--source/libs/asura-lib-json/json.h14
-rw-r--r--source/libs/asura-lib-json/json_module.cpp0
-rw-r--r--source/libs/asura-lib-json/json_module.h0
-rw-r--r--source/libs/asura-lib-openal/sound.cpp0
-rw-r--r--source/libs/asura-lib-openal/sound.h27
-rw-r--r--source/libs/asura-lib-openal/sound_decoder.h29
-rw-r--r--source/libs/asura-lib-utils/exceptions/exception.cpp47
-rw-r--r--source/libs/asura-lib-utils/exceptions/exception.h43
-rw-r--r--source/libs/asura-lib-utils/filesystem/binding/data_buffer.binding.cpp68
-rw-r--r--source/libs/asura-lib-utils/filesystem/data_buffer.cpp29
-rw-r--r--source/libs/asura-lib-utils/filesystem/data_buffer.h45
-rw-r--r--source/libs/asura-lib-utils/filesystem/decoded_data.cpp20
-rw-r--r--source/libs/asura-lib-utils/filesystem/decoded_data.h42
-rw-r--r--source/libs/asura-lib-utils/filesystem/reloadable.h27
-rw-r--r--source/libs/asura-lib-utils/filesystem/resource_manager.cpp0
-rw-r--r--source/libs/asura-lib-utils/filesystem/resource_manager.h44
-rw-r--r--source/libs/asura-lib-utils/math/curve.cpp0
-rw-r--r--source/libs/asura-lib-utils/math/curve.h0
-rw-r--r--source/libs/asura-lib-utils/math/functions.cpp0
-rw-r--r--source/libs/asura-lib-utils/math/functions.h0
-rw-r--r--source/libs/asura-lib-utils/math/matrix44.cpp0
-rw-r--r--source/libs/asura-lib-utils/math/matrix44.h24
-rw-r--r--source/libs/asura-lib-utils/math/ranged_value.cpp0
-rw-r--r--source/libs/asura-lib-utils/math/ranged_value.h0
-rw-r--r--source/libs/asura-lib-utils/math/rect.hpp32
-rw-r--r--source/libs/asura-lib-utils/math/rect.inl19
-rw-r--r--source/libs/asura-lib-utils/math/transform.cpp0
-rw-r--r--source/libs/asura-lib-utils/math/transform.h30
-rw-r--r--source/libs/asura-lib-utils/math/vector2.hpp70
-rw-r--r--source/libs/asura-lib-utils/math/vector2.inl114
-rw-r--r--source/libs/asura-lib-utils/math/vector3.hpp233
-rw-r--r--source/libs/asura-lib-utils/math/vector3.inl145
-rw-r--r--source/libs/asura-lib-utils/math/vector4.h234
-rw-r--r--source/libs/asura-lib-utils/math/vector4.inl152
-rw-r--r--source/libs/asura-lib-utils/module.h32
-rw-r--r--source/libs/asura-lib-utils/scripting/luax.hpp13
-rw-r--r--source/libs/asura-lib-utils/scripting/portable.hpp22
-rw-r--r--source/libs/asura-lib-utils/scripting/portable.inl0
-rw-r--r--source/libs/asura-lib-utils/type.h70
-rw-r--r--source/libs/asura-lib-utils/utils.h0
-rw-r--r--source/libs/asura-lib-utils/utils_module.cpp20
-rw-r--r--source/libs/asura-lib-utils/utils_module.h24
187 files changed, 7799 insertions, 0 deletions
diff --git a/source/libs/asura-lib-core/application.cpp b/source/libs/asura-lib-core/application.cpp
new file mode 100644
index 0000000..598bca8
--- /dev/null
+++ b/source/libs/asura-lib-core/application.cpp
@@ -0,0 +1,59 @@
+#include "Sdl2/SDL.h"
+#include "Exceptions/Exception.h"
+#include "Scripting/Luax.hpp"
+#include "Application.h"
+
+using namespace Luax;
+
+namespace AsuraEngine
+{
+
+ Application::Application()
+ {
+
+ }
+
+ Application::~Application()
+ {
+
+ }
+
+ bool Application::InitSubModules(uint flag)
+ {
+ // ʼģ
+ #define TryInitSubModule(module_name, func_name) \
+ if((flag&ASURA_MODULE_##module_name) && !Application::Init##func_name()) \
+ throw Exception("Asura init submodule %s failed.", #module_name);
+
+ TryInitSubModule(GRAPHICS, Graphics);
+ TryInitSubModule(AUDIO, Audio);
+ TryInitSubModule(FONT, Font);
+ TryInitSubModule(INPUT, Input);
+ TryInitSubModule(MATH, Math);
+ TryInitSubModule(PHYSICS, Physics);
+ TryInitSubModule(TIME, Time);
+ TryInitSubModule(WINDOW, Window);
+
+ }
+
+ void Application::PortToLua()
+ {
+ LuaxState state(mLuaState);
+
+#define RegisterLuaFactory(T) state.RegisterFactory<T>();
+
+ state.SetToGlobalNamespace();
+ state.PushNamespace("AsuraEngine");
+
+ RegisterLuaFactory(AEGraphics::Image>);
+
+#ifdef ASURA_AUTHOR
+ state.PushNamespace("Version");
+
+ state.PopNamespace(); // AsuraEngine.Version
+#endif
+
+ state.PopNamespace(); // AsuraEngine
+ }
+
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/application.h b/source/libs/asura-lib-core/application.h
new file mode 100644
index 0000000..6ae3218
--- /dev/null
+++ b/source/libs/asura-lib-core/application.h
@@ -0,0 +1,93 @@
+#ifndef __ASURA_ENGINE_APPLICATION_H__
+#define __ASURA_ENGINE_APPLICATION_H__
+
+#include <asura-lib-utils/scripting/portable.hpp>
+#include <asura-lib-utils/module.h>
+#include <queue>
+
+#include "config.h"
+
+namespace AsuraEngine
+{
+
+ ///
+ /// ģ
+ ///
+ enum SubModules
+ {
+ ASURA_MODULE_NONE = 0X00000000U,
+
+ ASURA_MODULE_GRAPHICS = 1 << 1,
+ ASURA_MODULE_AUDIO = 1 << 2,
+ ASURA_MODULE_FONT = 1 << 3,
+ ASURA_MODULE_INPUT = 1 << 4,
+ ASURA_MODULE_MATH = 1 << 5,
+ ASURA_MODULE_PHYSICS = 1 << 6,
+ ASURA_MODULE_TIME = 1 << 7,
+ ASURA_MODULE_WINDOW = 1 << 8,
+
+ ASURA_MODULE_ALL = 0XFFFFFFFFU
+ };
+
+ ///
+ /// ѭ
+ ///
+ ASURA_ABSTRACT class Application
+ {
+ public:
+
+ Application();
+
+ virtual ~Application();
+
+ ///
+ /// ʼǰϵͳ
+ ///
+ bool InitSubModules(uint flag = ASURA_MODULE_ALL);
+
+ ///
+ ///
+ ///
+ virtual void Run(int argc, char* args[]);
+
+ ///
+ /// ˳runʱĴ
+ ///
+ virtual void OnExit();
+
+ protected:
+
+ ///
+ /// moduleapplicationӵmoduleȨ
+ ///
+ void EnqueueModule(Module* module);
+
+ private:
+
+ ///
+ /// ģʼڸģļʵ֡
+ ///
+ bool InitGraphics();
+ bool InitAudio();
+ bool InitFont();
+ bool InitInput();
+ bool InitMath();
+ bool InitPhysics();
+ bool InitTime();
+ bool InitWindow();
+
+ ///
+ /// Lua state.
+ ///
+ lua_State* mLuaState;
+
+ ///
+ /// Asura libsᰴն˳ʼ˳ʱִ˳
+ ///
+ std::queue<Module*> mModules;
+
+ };
+
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/asura.h b/source/libs/asura-lib-core/asura.h
new file mode 100644
index 0000000..5ca56f3
--- /dev/null
+++ b/source/libs/asura-lib-core/asura.h
@@ -0,0 +1,15 @@
+#ifndef __ASURA_ENGINE_H__
+#define __ASURA_ENGINE_H__
+
+#include "Application.h"
+
+#include "Graphics/Shader.h"
+
+//namespace AEGraphics = AsuraEngine::Graphics;
+//namespace AEMath = AsuraEngine::Math;
+//namespace AETime = AsuraEngine::Time;
+//namespace AEInput = AsuraEngine::Input;
+//namespace AEProfiler = AsuraEngine::Profiler;
+//namespace AEFont = AsuraEngine::Font;
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/client/client.h b/source/libs/asura-lib-core/client/client.h
new file mode 100644
index 0000000..f2464a5
--- /dev/null
+++ b/source/libs/asura-lib-core/client/client.h
@@ -0,0 +1,18 @@
+#ifndef __ASURA_ENGINE_HOST_H__
+#define __ASURA_ENGINE_HOST_H__
+
+/**
+* ʹڿйص
+*/
+
+namespace AsuraEngine
+{
+ namespace Host
+ {
+
+
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/client/sdl/sdl_application.cpp b/source/libs/asura-lib-core/client/sdl/sdl_application.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/client/sdl/sdl_application.cpp
diff --git a/source/libs/asura-lib-core/client/sdl/sdl_application.h b/source/libs/asura-lib-core/client/sdl/sdl_application.h
new file mode 100644
index 0000000..f6f23a8
--- /dev/null
+++ b/source/libs/asura-lib-core/client/sdl/sdl_application.h
@@ -0,0 +1,28 @@
+#ifndef __ASURA_SDL_APPLICATION_H__
+#define __ASURA_SDL_APPLICATION_H__
+
+#include "sdl_config.h"
+
+namespace AsuraEngine
+{
+ namespace SDL
+ {
+
+ class SDLApplication : public Application
+ {
+
+ };
+
+/*
+
+Application* editor = nullpt;
+#ifdef ASURA_SDL
+ editor = SDLApplication();
+#endif
+
+*/
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/client/sdl/sdl_cursor.cpp b/source/libs/asura-lib-core/client/sdl/sdl_cursor.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/client/sdl/sdl_cursor.cpp
diff --git a/source/libs/asura-lib-core/client/sdl/sdl_cursor.h b/source/libs/asura-lib-core/client/sdl/sdl_cursor.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/client/sdl/sdl_cursor.h
diff --git a/source/libs/asura-lib-core/client/sdl/sdl_window.cpp b/source/libs/asura-lib-core/client/sdl/sdl_window.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/client/sdl/sdl_window.cpp
diff --git a/source/libs/asura-lib-core/client/sdl/sdl_window.h b/source/libs/asura-lib-core/client/sdl/sdl_window.h
new file mode 100644
index 0000000..1fdef1e
--- /dev/null
+++ b/source/libs/asura-lib-core/client/sdl/sdl_window.h
@@ -0,0 +1,14 @@
+#ifndef __ASURA_SDL_WINDOW_H__
+#define __ASURA_SDL_WINDOW_H__
+
+namespace AsuraEngine
+{
+ namespace SDL
+ {
+
+
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/config.h b/source/libs/asura-lib-core/config.h
new file mode 100644
index 0000000..df7ad99
--- /dev/null
+++ b/source/libs/asura-lib-core/config.h
@@ -0,0 +1,4 @@
+#ifndef __ASURA_CORE_CONFIG_H__
+#define __ASURA_CORE_CONFIG_H__
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/core_module.cpp b/source/libs/asura-lib-core/core_module.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/core_module.cpp
diff --git a/source/libs/asura-lib-core/core_module.h b/source/libs/asura-lib-core/core_module.h
new file mode 100644
index 0000000..2cded93
--- /dev/null
+++ b/source/libs/asura-lib-core/core_module.h
@@ -0,0 +1,11 @@
+#ifndef __ASURA_CORE_MODULE_H__
+#define __ASURA_CORE_MODULE_H__
+
+namespace AsuraEngine
+{
+
+
+
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/font/glyph.cpp b/source/libs/asura-lib-core/font/glyph.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/font/glyph.cpp
diff --git a/source/libs/asura-lib-core/font/glyph.h b/source/libs/asura-lib-core/font/glyph.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/font/glyph.h
diff --git a/source/libs/asura-lib-core/font/string.cpp b/source/libs/asura-lib-core/font/string.cpp
new file mode 100644
index 0000000..8c9c55a
--- /dev/null
+++ b/source/libs/asura-lib-core/font/string.cpp
@@ -0,0 +1,376 @@
+#include "String.hpp"
+#include "Utf.hpp"
+
+namespace AsuraEngine
+{
+ namespace Text
+ {
+
+
+ ////////////////////////////////////////////////////////////
+ const std::size_t String::InvalidPos = std::basic_string<uint32>::npos;
+
+
+ ////////////////////////////////////////////////////////////
+ String::String()
+ {
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::String(char ansiChar, const std::locale& locale)
+ {
+ mString += Utf32::DecodeAnsi(ansiChar, locale);
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::String(wchar_t wideChar)
+ {
+ mString += Utf32::DecodeWide(wideChar);
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::String(uint32 utf32Char)
+ {
+ mString += utf32Char;
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::String(const char* ansiString, const std::locale& locale)
+ {
+ if (ansiString)
+ {
+ std::size_t length = strlen(ansiString);
+ if (length > 0)
+ {
+ mString.reserve(length + 1);
+ Utf32::FromAnsi(ansiString, ansiString + length, std::back_inserter(mString), locale);
+ }
+ }
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::String(const std::string& ansiString, const std::locale& locale)
+ {
+ mString.reserve(ansiString.length() + 1);
+ Utf32::FromAnsi(ansiString.begin(), ansiString.end(), std::back_inserter(mString), locale);
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::String(const wchar_t* wideString)
+ {
+ if (wideString)
+ {
+ std::size_t length = std::wcslen(wideString);
+ if (length > 0)
+ {
+ mString.reserve(length + 1);
+ Utf32::FromWide(wideString, wideString + length, std::back_inserter(mString));
+ }
+ }
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::String(const std::wstring& wideString)
+ {
+ mString.reserve(wideString.length() + 1);
+ Utf32::FromWide(wideString.begin(), wideString.end(), std::back_inserter(mString));
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::String(const uint32* utf32String)
+ {
+ if (utf32String)
+ mString = utf32String;
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::String(const std::basic_string<uint32>& utf32String) :
+ mString(utf32String)
+ {
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::String(const String& copy) :
+ mString(copy.mString)
+ {
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::operator std::string() const
+ {
+ return ToAnsiString();
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::operator std::wstring() const
+ {
+ return ToWideString();
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ std::string String::ToAnsiString(const std::locale& locale) const
+ {
+ // Prepare the output string
+ std::string output;
+ output.reserve(mString.length() + 1);
+
+ // Convert
+ Utf32::ToAnsi(mString.begin(), mString.end(), std::back_inserter(output), 0, locale);
+
+ return output;
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ std::wstring String::ToWideString() const
+ {
+ // Prepare the output string
+ std::wstring output;
+ output.reserve(mString.length() + 1);
+
+ // Convert
+ Utf32::ToWide(mString.begin(), mString.end(), std::back_inserter(output), 0);
+
+ return output;
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ std::basic_string<uint8> String::ToUtf8() const
+ {
+ // Prepare the output string
+ std::basic_string<uint8> output;
+ output.reserve(mString.length());
+
+ // Convert
+ Utf32::ToUtf8(mString.begin(), mString.end(), std::back_inserter(output));
+
+ return output;
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ std::basic_string<uint16> String::ToUtf16() const
+ {
+ // Prepare the output string
+ std::basic_string<uint16> output;
+ output.reserve(mString.length());
+
+ // Convert
+ Utf32::ToUtf16(mString.begin(), mString.end(), std::back_inserter(output));
+
+ return output;
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ std::basic_string<uint32> String::ToUtf32() const
+ {
+ return mString;
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String& String::operator =(const String& right)
+ {
+ mString = right.mString;
+ return *this;
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String& String::operator +=(const String& right)
+ {
+ mString += right.mString;
+ return *this;
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ uint32 String::operator [](std::size_t index) const
+ {
+ return mString[index];
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ uint32& String::operator [](std::size_t index)
+ {
+ return mString[index];
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ void String::Clear()
+ {
+ mString.clear();
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ std::size_t String::GetSize() const
+ {
+ return mString.size();
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ bool String::IsEmpty() const
+ {
+ return mString.empty();
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ void String::Erase(std::size_t position, std::size_t count)
+ {
+ mString.erase(position, count);
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ void String::Insert(std::size_t position, const String& str)
+ {
+ mString.insert(position, str.mString);
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ std::size_t String::Find(const String& str, std::size_t start) const
+ {
+ return mString.find(str.mString, start);
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ void String::Replace(std::size_t position, std::size_t length, const String& replaceWith)
+ {
+ mString.replace(position, length, replaceWith.mString);
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ void String::Replace(const String& searchFor, const String& replaceWith)
+ {
+ std::size_t step = replaceWith.GetSize();
+ std::size_t len = searchFor.GetSize();
+ std::size_t pos = Find(searchFor);
+
+ // Replace each occurrence of search
+ while (pos != InvalidPos)
+ {
+ Replace(pos, len, replaceWith);
+ pos = Find(searchFor, pos + step);
+ }
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String String::Substring(std::size_t position, std::size_t length) const
+ {
+ return mString.substr(position, length);
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ const uint32* String::GetData() const
+ {
+ return mString.c_str();
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::Iterator String::Begin()
+ {
+ return mString.begin();
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::ConstIterator String::Begin() const
+ {
+ return mString.begin();
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::Iterator String::End()
+ {
+ return mString.end();
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String::ConstIterator String::End() const
+ {
+ return mString.end();
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ bool operator ==(const String& left, const String& right)
+ {
+ return left.mString == right.mString;
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ bool operator !=(const String& left, const String& right)
+ {
+ return !(left == right);
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ bool operator <(const String& left, const String& right)
+ {
+ return left.mString < right.mString;
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ bool operator >(const String& left, const String& right)
+ {
+ return right < left;
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ bool operator <=(const String& left, const String& right)
+ {
+ return !(right < left);
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ bool operator >=(const String& left, const String& right)
+ {
+ return !(left < right);
+ }
+
+
+ ////////////////////////////////////////////////////////////
+ String operator +(const String& left, const String& right)
+ {
+ String string = left;
+ string += right;
+
+ return string;
+ }
+
+
+ }
+}
diff --git a/source/libs/asura-lib-core/font/string.hpp b/source/libs/asura-lib-core/font/string.hpp
new file mode 100644
index 0000000..226735b
--- /dev/null
+++ b/source/libs/asura-lib-core/font/string.hpp
@@ -0,0 +1,594 @@
+#ifndef __ASURA_ENGINE_STRING_H__
+#define __ASURA_ENGINE_STRING_H__
+
+#include "Config.h"
+#include <iterator>
+#include <locale>
+#include <string>
+
+namespace AsuraEngine
+{
+ namespace Text
+ {
+
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Utility string class that automatically handles
+ /// conversions between types and encodings
+ ///
+ ////////////////////////////////////////////////////////////
+ class String
+ {
+ public:
+
+ ////////////////////////////////////////////////////////////
+ // Types
+ ////////////////////////////////////////////////////////////
+ typedef std::basic_string<uint32>::iterator Iterator; ///< Iterator type
+ typedef std::basic_string<uint32>::const_iterator ConstIterator; ///< Read-only iterator type
+
+ ////////////////////////////////////////////////////////////
+ // Static member data
+ ////////////////////////////////////////////////////////////
+ static const std::size_t InvalidPos; ///< Represents an invalid position in the string
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Default constructor
+ ///
+ /// This constructor creates an empty string.
+ ///
+ ////////////////////////////////////////////////////////////
+ String();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct from a single ANSI character and a locale
+ ///
+ /// The source character is converted to UTF-32 according
+ /// to the given locale.
+ ///
+ /// \param ansiChar ANSI character to convert
+ /// \param locale Locale to use for conversion
+ ///
+ ////////////////////////////////////////////////////////////
+ String(char ansiChar, const std::locale& locale = std::locale());
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct from single wide character
+ ///
+ /// \param wideChar Wide character to convert
+ ///
+ ////////////////////////////////////////////////////////////
+ String(wchar_t wideChar);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct from single UTF-32 character
+ ///
+ /// \param utf32Char UTF-32 character to convert
+ ///
+ ////////////////////////////////////////////////////////////
+ String(uint utf32Char);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct from a null-terminated C-style ANSI string and a locale
+ ///
+ /// The source string is converted to UTF-32 according
+ /// to the given locale.
+ ///
+ /// \param ansiString ANSI string to convert
+ /// \param locale Locale to use for conversion
+ ///
+ ////////////////////////////////////////////////////////////
+ String(const char* ansiString, const std::locale& locale = std::locale());
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct from an ANSI string and a locale
+ ///
+ /// The source string is converted to UTF-32 according
+ /// to the given locale.
+ ///
+ /// \param ansiString ANSI string to convert
+ /// \param locale Locale to use for conversion
+ ///
+ ////////////////////////////////////////////////////////////
+ String(const std::string& ansiString, const std::locale& locale = std::locale());
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct from null-terminated C-style wide string
+ ///
+ /// \param wideString Wide string to convert
+ ///
+ ////////////////////////////////////////////////////////////
+ String(const wchar_t* wideString);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct from a wide string
+ ///
+ /// \param wideString Wide string to convert
+ ///
+ ////////////////////////////////////////////////////////////
+ String(const std::wstring& wideString);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct from a null-terminated C-style UTF-32 string
+ ///
+ /// \param utf32String UTF-32 string to assign
+ ///
+ ////////////////////////////////////////////////////////////
+ String(const uint* utf32String);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct from an UTF-32 string
+ ///
+ /// \param utf32String UTF-32 string to assign
+ ///
+ ////////////////////////////////////////////////////////////
+ String(const std::basic_string<uint>& utf32String);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Copy constructor
+ ///
+ /// \param copy Instance to copy
+ ///
+ ////////////////////////////////////////////////////////////
+ String(const String& copy);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a new sf::String from a UTF-8 encoded string
+ ///
+ /// \param begin Forward iterator to the beginning of the UTF-8 sequence
+ /// \param end Forward iterator to the end of the UTF-8 sequence
+ ///
+ /// \return A sf::String containing the source string
+ ///
+ /// \see fromUtf16, fromUtf32
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ static String FromUtf8(T begin, T end);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a new sf::String from a UTF-16 encoded string
+ ///
+ /// \param begin Forward iterator to the beginning of the UTF-16 sequence
+ /// \param end Forward iterator to the end of the UTF-16 sequence
+ ///
+ /// \return A sf::String containing the source string
+ ///
+ /// \see fromUtf8, fromUtf32
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ static String FromUtf16(T begin, T end);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Create a new sf::String from a UTF-32 encoded string
+ ///
+ /// This function is provided for consistency, it is equivalent to
+ /// using the constructors that takes a const sf::uint* or
+ /// a std::basic_string<sf::uint>.
+ ///
+ /// \param begin Forward iterator to the beginning of the UTF-32 sequence
+ /// \param end Forward iterator to the end of the UTF-32 sequence
+ ///
+ /// \return A sf::String containing the source string
+ ///
+ /// \see fromUtf8, fromUtf16
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ static String FromUtf32(T begin, T end);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Implicit conversion operator to std::string (ANSI string)
+ ///
+ /// The current global locale is used for conversion. If you
+ /// want to explicitly specify a locale, see toAnsiString.
+ /// Characters that do not fit in the target encoding are
+ /// discarded from the returned string.
+ /// This operator is defined for convenience, and is equivalent
+ /// to calling toAnsiString().
+ ///
+ /// \return Converted ANSI string
+ ///
+ /// \see toAnsiString, operator std::wstring
+ ///
+ ////////////////////////////////////////////////////////////
+ operator std::string() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Implicit conversion operator to std::wstring (wide string)
+ ///
+ /// Characters that do not fit in the target encoding are
+ /// discarded from the returned string.
+ /// This operator is defined for convenience, and is equivalent
+ /// to calling toWideString().
+ ///
+ /// \return Converted wide string
+ ///
+ /// \see toWideString, operator std::string
+ ///
+ ////////////////////////////////////////////////////////////
+ operator std::wstring() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert the Unicode string to an ANSI string
+ ///
+ /// The UTF-32 string is converted to an ANSI string in
+ /// the encoding defined by \a locale.
+ /// Characters that do not fit in the target encoding are
+ /// discarded from the returned string.
+ ///
+ /// \param locale Locale to use for conversion
+ ///
+ /// \return Converted ANSI string
+ ///
+ /// \see toWideString, operator std::string
+ ///
+ ////////////////////////////////////////////////////////////
+ std::string ToAnsiString(const std::locale& locale = std::locale()) const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert the Unicode string to a wide string
+ ///
+ /// Characters that do not fit in the target encoding are
+ /// discarded from the returned string.
+ ///
+ /// \return Converted wide string
+ ///
+ /// \see toAnsiString, operator std::wstring
+ ///
+ ////////////////////////////////////////////////////////////
+ std::wstring ToWideString() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert the Unicode string to a UTF-8 string
+ ///
+ /// \return Converted UTF-8 string
+ ///
+ /// \see toUtf16, toUtf32
+ ///
+ ////////////////////////////////////////////////////////////
+ std::basic_string<uint8> ToUtf8() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert the Unicode string to a UTF-16 string
+ ///
+ /// \return Converted UTF-16 string
+ ///
+ /// \see toUtf8, toUtf32
+ ///
+ ////////////////////////////////////////////////////////////
+ std::basic_string<uint16> ToUtf16() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert the Unicode string to a UTF-32 string
+ ///
+ /// This function doesn't perform any conversion, since the
+ /// string is already stored as UTF-32 internally.
+ ///
+ /// \return Converted UTF-32 string
+ ///
+ /// \see toUtf8, toUtf16
+ ///
+ ////////////////////////////////////////////////////////////
+ std::basic_string<uint> ToUtf32() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Overload of assignment operator
+ ///
+ /// \param right Instance to assign
+ ///
+ /// \return Reference to self
+ ///
+ ////////////////////////////////////////////////////////////
+ String& operator =(const String& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Overload of += operator to append an UTF-32 string
+ ///
+ /// \param right String to append
+ ///
+ /// \return Reference to self
+ ///
+ ////////////////////////////////////////////////////////////
+ String& operator +=(const String& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Overload of [] operator to access a character by its position
+ ///
+ /// This function provides read-only access to characters.
+ /// Note: the behavior is undefined if \a index is out of range.
+ ///
+ /// \param index Index of the character to get
+ ///
+ /// \return Character at position \a index
+ ///
+ ////////////////////////////////////////////////////////////
+ uint operator [](std::size_t index) const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Overload of [] operator to access a character by its position
+ ///
+ /// This function provides read and write access to characters.
+ /// Note: the behavior is undefined if \a index is out of range.
+ ///
+ /// \param index Index of the character to get
+ ///
+ /// \return Reference to the character at position \a index
+ ///
+ ////////////////////////////////////////////////////////////
+ uint& operator [](std::size_t index);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Clear the string
+ ///
+ /// This function removes all the characters from the string.
+ ///
+ /// \see isEmpty, erase
+ ///
+ ////////////////////////////////////////////////////////////
+ void Clear();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get the size of the string
+ ///
+ /// \return Number of characters in the string
+ ///
+ /// \see isEmpty
+ ///
+ ////////////////////////////////////////////////////////////
+ std::size_t GetSize() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Check whether the string is empty or not
+ ///
+ /// \return True if the string is empty (i.e. contains no character)
+ ///
+ /// \see clear, getSize
+ ///
+ ////////////////////////////////////////////////////////////
+ bool IsEmpty() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Erase one or more characters from the string
+ ///
+ /// This function removes a sequence of \a count characters
+ /// starting from \a position.
+ ///
+ /// \param position Position of the first character to erase
+ /// \param count Number of characters to erase
+ ///
+ ////////////////////////////////////////////////////////////
+ void Erase(std::size_t position, std::size_t count = 1);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Insert one or more characters into the string
+ ///
+ /// This function inserts the characters of \a str
+ /// into the string, starting from \a position.
+ ///
+ /// \param position Position of insertion
+ /// \param str Characters to insert
+ ///
+ ////////////////////////////////////////////////////////////
+ void Insert(std::size_t position, const String& str);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Find a sequence of one or more characters in the string
+ ///
+ /// This function searches for the characters of \a str
+ /// in the string, starting from \a start.
+ ///
+ /// \param str Characters to find
+ /// \param start Where to begin searching
+ ///
+ /// \return Position of \a str in the string, or String::InvalidPos if not found
+ ///
+ ////////////////////////////////////////////////////////////
+ std::size_t Find(const String& str, std::size_t start = 0) const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Replace a substring with another string
+ ///
+ /// This function replaces the substring that starts at index \a position
+ /// and spans \a length characters with the string \a replaceWith.
+ ///
+ /// \param position Index of the first character to be replaced
+ /// \param length Number of characters to replace. You can pass InvalidPos to
+ /// replace all characters until the end of the string.
+ /// \param replaceWith String that replaces the given substring.
+ ///
+ ////////////////////////////////////////////////////////////
+ void Replace(std::size_t position, std::size_t length, const String& replaceWith);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Replace all occurrences of a substring with a replacement string
+ ///
+ /// This function replaces all occurrences of \a searchFor in this string
+ /// with the string \a replaceWith.
+ ///
+ /// \param searchFor The value being searched for
+ /// \param replaceWith The value that replaces found \a searchFor values
+ ///
+ ////////////////////////////////////////////////////////////
+ void Replace(const String& searchFor, const String& replaceWith);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Return a part of the string
+ ///
+ /// This function returns the substring that starts at index \a position
+ /// and spans \a length characters.
+ ///
+ /// \param position Index of the first character
+ /// \param length Number of characters to include in the substring (if
+ /// the string is shorter, as many characters as possible
+ /// are included). \ref InvalidPos can be used to include all
+ /// characters until the end of the string.
+ ///
+ /// \return String object containing a substring of this object
+ ///
+ ////////////////////////////////////////////////////////////
+ String Substring(std::size_t position, std::size_t length = InvalidPos) const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Get a pointer to the C-style array of characters
+ ///
+ /// This functions provides a read-only access to a
+ /// null-terminated C-style representation of the string.
+ /// The returned pointer is temporary and is meant only for
+ /// immediate use, thus it is not recommended to store it.
+ ///
+ /// \return Read-only pointer to the array of characters
+ ///
+ ////////////////////////////////////////////////////////////
+ const uint* GetData() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Return an iterator to the beginning of the string
+ ///
+ /// \return Read-write iterator to the beginning of the string characters
+ ///
+ /// \see end
+ ///
+ ////////////////////////////////////////////////////////////
+ Iterator Begin();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Return an iterator to the beginning of the string
+ ///
+ /// \return Read-only iterator to the beginning of the string characters
+ ///
+ /// \see end
+ ///
+ ////////////////////////////////////////////////////////////
+ ConstIterator Begin() const;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Return an iterator to the end of the string
+ ///
+ /// The end iterator refers to 1 position past the last character;
+ /// thus it represents an invalid character and should never be
+ /// accessed.
+ ///
+ /// \return Read-write iterator to the end of the string characters
+ ///
+ /// \see begin
+ ///
+ ////////////////////////////////////////////////////////////
+ Iterator End();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Return an iterator to the end of the string
+ ///
+ /// The end iterator refers to 1 position past the last character;
+ /// thus it represents an invalid character and should never be
+ /// accessed.
+ ///
+ /// \return Read-only iterator to the end of the string characters
+ ///
+ /// \see begin
+ ///
+ ////////////////////////////////////////////////////////////
+ ConstIterator End() const;
+
+ private:
+
+ friend bool operator ==(const String& left, const String& right);
+ friend bool operator <(const String& left, const String& right);
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ std::basic_string<uint> mString; ///< Internal string of UTF-32 characters
+ };
+
+ ////////////////////////////////////////////////////////////
+ /// \relates String
+ /// \brief Overload of == operator to compare two UTF-32 strings
+ ///
+ /// \param left Left operand (a string)
+ /// \param right Right operand (a string)
+ ///
+ /// \return True if both strings are equal
+ ///
+ ////////////////////////////////////////////////////////////
+ bool operator ==(const String& left, const String& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates String
+ /// \brief Overload of != operator to compare two UTF-32 strings
+ ///
+ /// \param left Left operand (a string)
+ /// \param right Right operand (a string)
+ ///
+ /// \return True if both strings are different
+ ///
+ ////////////////////////////////////////////////////////////
+ bool operator !=(const String& left, const String& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates String
+ /// \brief Overload of < operator to compare two UTF-32 strings
+ ///
+ /// \param left Left operand (a string)
+ /// \param right Right operand (a string)
+ ///
+ /// \return True if \a left is lexicographically before \a right
+ ///
+ ////////////////////////////////////////////////////////////
+ bool operator <(const String& left, const String& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates String
+ /// \brief Overload of > operator to compare two UTF-32 strings
+ ///
+ /// \param left Left operand (a string)
+ /// \param right Right operand (a string)
+ ///
+ /// \return True if \a left is lexicographically after \a right
+ ///
+ ////////////////////////////////////////////////////////////
+ bool operator >(const String& left, const String& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates String
+ /// \brief Overload of <= operator to compare two UTF-32 strings
+ ///
+ /// \param left Left operand (a string)
+ /// \param right Right operand (a string)
+ ///
+ /// \return True if \a left is lexicographically before or equivalent to \a right
+ ///
+ ////////////////////////////////////////////////////////////
+ bool operator <=(const String& left, const String& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates String
+ /// \brief Overload of >= operator to compare two UTF-32 strings
+ ///
+ /// \param left Left operand (a string)
+ /// \param right Right operand (a string)
+ ///
+ /// \return True if \a left is lexicographically after or equivalent to \a right
+ ///
+ ////////////////////////////////////////////////////////////
+ bool operator >=(const String& left, const String& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates String
+ /// \brief Overload of binary + operator to concatenate two strings
+ ///
+ /// \param left Left operand (a string)
+ /// \param right Right operand (a string)
+ ///
+ /// \return Concatenated string
+ ///
+ ////////////////////////////////////////////////////////////
+ String operator +(const String& left, const String& right);
+
+ #include "String.inl"
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/font/string.inl b/source/libs/asura-lib-core/font/string.inl
new file mode 100644
index 0000000..ef18228
--- /dev/null
+++ b/source/libs/asura-lib-core/font/string.inl
@@ -0,0 +1,29 @@
+
+////////////////////////////////////////////////////////////
+template <typename T>
+String String::fromUtf8(T begin, T end)
+{
+ String string;
+ Utf8::toUtf32(begin, end, std::back_inserter(string.m_string));
+ return string;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+String String::fromUtf16(T begin, T end)
+{
+ String string;
+ Utf16::toUtf32(begin, end, std::back_inserter(string.m_string));
+ return string;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+String String::fromUtf32(T begin, T end)
+{
+ String string;
+ string.m_string.assign(begin, end);
+ return string;
+}
diff --git a/source/libs/asura-lib-core/font/ttf.cpp b/source/libs/asura-lib-core/font/ttf.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/font/ttf.cpp
diff --git a/source/libs/asura-lib-core/font/ttf.h b/source/libs/asura-lib-core/font/ttf.h
new file mode 100644
index 0000000..840b63e
--- /dev/null
+++ b/source/libs/asura-lib-core/font/ttf.h
@@ -0,0 +1,17 @@
+#ifndef __ASURA_TTF_H__
+#define __ASURA_TTF_H__
+
+namespace AsuraEngine
+{
+ namespace Text
+ {
+
+ class TTF
+ {
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/font/utf.hpp b/source/libs/asura-lib-core/font/utf.hpp
new file mode 100644
index 0000000..2e04ee4
--- /dev/null
+++ b/source/libs/asura-lib-core/font/utf.hpp
@@ -0,0 +1,720 @@
+#ifndef __ASURA_UTF_HPP__
+#define __ASURA_UTF_HPP__
+
+////////////////////////////////////////////////////////////
+// Headers
+////////////////////////////////////////////////////////////
+#include <algorithm>
+#include <locale>
+#include <string>
+#include <cstdlib>
+
+namespace AsuraEngine
+{
+ namespace Text
+ {
+
+ template <unsigned int N>
+ class Utf;
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Specialization of the Utf template for UTF-8
+ ///
+ ////////////////////////////////////////////////////////////
+ template <>
+ class Utf<8>
+ {
+ public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Decode a single UTF-8 character
+ ///
+ /// Decoding a character means finding its unique 32-bits
+ /// code (called the codepoint) in the Unicode standard.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Codepoint of the decoded UTF-8 character
+ /// \param replacement Replacement character to use in case the UTF-8 sequence is invalid
+ ///
+ /// \return Iterator pointing to one past the last read element of the input sequence
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In>
+ static In Decode(In begin, In end, Uint32& output, Uint32 replacement = 0);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Encode a single UTF-8 character
+ ///
+ /// Encoding a character means converting a unique 32-bits
+ /// code (called the codepoint) in the target encoding, UTF-8.
+ ///
+ /// \param input Codepoint to encode as UTF-8
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement for characters not convertible to UTF-8 (use 0 to skip them)
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename Out>
+ static Out Encode(Uint32 input, Out output, Uint8 replacement = 0);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Advance to the next UTF-8 character
+ ///
+ /// This function is necessary for multi-elements encodings, as
+ /// a single character may use more than 1 storage element.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ ///
+ /// \return Iterator pointing to one past the last read element of the input sequence
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In>
+ static In Next(In begin, In end);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Count the number of characters of a UTF-8 sequence
+ ///
+ /// This function is necessary for multi-elements encodings, as
+ /// a single character may use more than 1 storage element, thus the
+ /// total size can be different from (begin - end).
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ ///
+ /// \return Iterator pointing to one past the last read element of the input sequence
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In>
+ static std::size_t Count(In begin, In end);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert an ANSI characters range to UTF-8
+ ///
+ /// The current global locale will be used by default, unless you
+ /// pass a custom one in the \a locale parameter.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param locale Locale to use for conversion
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out FromAnsi(In begin, In end, Out output, const std::locale& locale = std::locale());
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a wide characters range to UTF-8
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out FromWide(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a latin-1 (ISO-5589-1) characters range to UTF-8
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out FromLatin1(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert an UTF-8 characters range to ANSI characters
+ ///
+ /// The current global locale will be used by default, unless you
+ /// pass a custom one in the \a locale parameter.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement for characters not convertible to ANSI (use 0 to skip them)
+ /// \param locale Locale to use for conversion
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToAnsi(In begin, In end, Out output, char replacement = 0, const std::locale& locale = std::locale());
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert an UTF-8 characters range to wide characters
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them)
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToWide(In begin, In end, Out output, wchar_t replacement = 0);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert an UTF-8 characters range to latin-1 (ISO-5589-1) characters
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them)
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToLatin1(In begin, In end, Out output, char replacement = 0);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a UTF-8 characters range to UTF-8
+ ///
+ /// This functions does nothing more than a direct copy;
+ /// it is defined only to provide the same interface as other
+ /// specializations of the sf::Utf<> template, and allow
+ /// generic code to be written on top of it.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToUtf8(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a UTF-8 characters range to UTF-16
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToUtf16(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a UTF-8 characters range to UTF-32
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToUtf32(In begin, In end, Out output);
+ };
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Specialization of the Utf template for UTF-16
+ ///
+ ////////////////////////////////////////////////////////////
+ template <>
+ class Utf<16>
+ {
+ public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Decode a single UTF-16 character
+ ///
+ /// Decoding a character means finding its unique 32-bits
+ /// code (called the codepoint) in the Unicode standard.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Codepoint of the decoded UTF-16 character
+ /// \param replacement Replacement character to use in case the UTF-8 sequence is invalid
+ ///
+ /// \return Iterator pointing to one past the last read element of the input sequence
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In>
+ static In Decode(In begin, In end, Uint32& output, Uint32 replacement = 0);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Encode a single UTF-16 character
+ ///
+ /// Encoding a character means converting a unique 32-bits
+ /// code (called the codepoint) in the target encoding, UTF-16.
+ ///
+ /// \param input Codepoint to encode as UTF-16
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement for characters not convertible to UTF-16 (use 0 to skip them)
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename Out>
+ static Out Encode(Uint32 input, Out output, Uint16 replacement = 0);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Advance to the next UTF-16 character
+ ///
+ /// This function is necessary for multi-elements encodings, as
+ /// a single character may use more than 1 storage element.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ ///
+ /// \return Iterator pointing to one past the last read element of the input sequence
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In>
+ static In Next(In begin, In end);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Count the number of characters of a UTF-16 sequence
+ ///
+ /// This function is necessary for multi-elements encodings, as
+ /// a single character may use more than 1 storage element, thus the
+ /// total size can be different from (begin - end).
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ ///
+ /// \return Iterator pointing to one past the last read element of the input sequence
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In>
+ static std::size_t Count(In begin, In end);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert an ANSI characters range to UTF-16
+ ///
+ /// The current global locale will be used by default, unless you
+ /// pass a custom one in the \a locale parameter.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param locale Locale to use for conversion
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out FromAnsi(In begin, In end, Out output, const std::locale& locale = std::locale());
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a wide characters range to UTF-16
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out FromWide(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a latin-1 (ISO-5589-1) characters range to UTF-16
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out FromLatin1(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert an UTF-16 characters range to ANSI characters
+ ///
+ /// The current global locale will be used by default, unless you
+ /// pass a custom one in the \a locale parameter.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement for characters not convertible to ANSI (use 0 to skip them)
+ /// \param locale Locale to use for conversion
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToAnsi(In begin, In end, Out output, char replacement = 0, const std::locale& locale = std::locale());
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert an UTF-16 characters range to wide characters
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them)
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToWide(In begin, In end, Out output, wchar_t replacement = 0);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert an UTF-16 characters range to latin-1 (ISO-5589-1) characters
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them)
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToLatin1(In begin, In end, Out output, char replacement = 0);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a UTF-16 characters range to UTF-8
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToUtf8(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a UTF-16 characters range to UTF-16
+ ///
+ /// This functions does nothing more than a direct copy;
+ /// it is defined only to provide the same interface as other
+ /// specializations of the sf::Utf<> template, and allow
+ /// generic code to be written on top of it.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToUtf16(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a UTF-16 characters range to UTF-32
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToUtf32(In begin, In end, Out output);
+ };
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Specialization of the Utf template for UTF-32
+ ///
+ ////////////////////////////////////////////////////////////
+ template <>
+ class Utf<32>
+ {
+ public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Decode a single UTF-32 character
+ ///
+ /// Decoding a character means finding its unique 32-bits
+ /// code (called the codepoint) in the Unicode standard.
+ /// For UTF-32, the character value is the same as the codepoint.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Codepoint of the decoded UTF-32 character
+ /// \param replacement Replacement character to use in case the UTF-8 sequence is invalid
+ ///
+ /// \return Iterator pointing to one past the last read element of the input sequence
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In>
+ static In Decode(In begin, In end, Uint32& output, Uint32 replacement = 0);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Encode a single UTF-32 character
+ ///
+ /// Encoding a character means converting a unique 32-bits
+ /// code (called the codepoint) in the target encoding, UTF-32.
+ /// For UTF-32, the codepoint is the same as the character value.
+ ///
+ /// \param input Codepoint to encode as UTF-32
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement for characters not convertible to UTF-32 (use 0 to skip them)
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename Out>
+ static Out Encode(Uint32 input, Out output, Uint32 replacement = 0);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Advance to the next UTF-32 character
+ ///
+ /// This function is trivial for UTF-32, which can store
+ /// every character in a single storage element.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ ///
+ /// \return Iterator pointing to one past the last read element of the input sequence
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In>
+ static In Next(In begin, In end);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Count the number of characters of a UTF-32 sequence
+ ///
+ /// This function is trivial for UTF-32, which can store
+ /// every character in a single storage element.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ ///
+ /// \return Iterator pointing to one past the last read element of the input sequence
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In>
+ static std::size_t Count(In begin, In end);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert an ANSI characters range to UTF-32
+ ///
+ /// The current global locale will be used by default, unless you
+ /// pass a custom one in the \a locale parameter.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param locale Locale to use for conversion
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out FromAnsi(In begin, In end, Out output, const std::locale& locale = std::locale());
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a wide characters range to UTF-32
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out FromWide(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a latin-1 (ISO-5589-1) characters range to UTF-32
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out FromLatin1(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert an UTF-32 characters range to ANSI characters
+ ///
+ /// The current global locale will be used by default, unless you
+ /// pass a custom one in the \a locale parameter.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement for characters not convertible to ANSI (use 0 to skip them)
+ /// \param locale Locale to use for conversion
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToAnsi(In begin, In end, Out output, char replacement = 0, const std::locale& locale = std::locale());
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert an UTF-32 characters range to wide characters
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them)
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToWide(In begin, In end, Out output, wchar_t replacement = 0);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert an UTF-16 characters range to latin-1 (ISO-5589-1) characters
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement for characters not convertible to wide (use 0 to skip them)
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToLatin1(In begin, In end, Out output, char replacement = 0);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a UTF-32 characters range to UTF-8
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToUtf8(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a UTF-32 characters range to UTF-16
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToUtf16(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Convert a UTF-32 characters range to UTF-32
+ ///
+ /// This functions does nothing more than a direct copy;
+ /// it is defined only to provide the same interface as other
+ /// specializations of the sf::Utf<> template, and allow
+ /// generic code to be written on top of it.
+ ///
+ /// \param begin Iterator pointing to the beginning of the input sequence
+ /// \param end Iterator pointing to the end of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In, typename Out>
+ static Out ToUtf32(In begin, In end, Out output);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Decode a single ANSI character to UTF-32
+ ///
+ /// This function does not exist in other specializations
+ /// of sf::Utf<>, it is defined for convenience (it is used by
+ /// several other conversion functions).
+ ///
+ /// \param input Input ANSI character
+ /// \param locale Locale to use for conversion
+ ///
+ /// \return Converted character
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In>
+ static Uint32 DecodeAnsi(In input, const std::locale& locale = std::locale());
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Decode a single wide character to UTF-32
+ ///
+ /// This function does not exist in other specializations
+ /// of sf::Utf<>, it is defined for convenience (it is used by
+ /// several other conversion functions).
+ ///
+ /// \param input Input wide character
+ ///
+ /// \return Converted character
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename In>
+ static Uint32 DecodeWide(In input);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Encode a single UTF-32 character to ANSI
+ ///
+ /// This function does not exist in other specializations
+ /// of sf::Utf<>, it is defined for convenience (it is used by
+ /// several other conversion functions).
+ ///
+ /// \param codepoint Iterator pointing to the beginning of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement if the input character is not convertible to ANSI (use 0 to skip it)
+ /// \param locale Locale to use for conversion
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename Out>
+ static Out EncodeAnsi(Uint32 codepoint, Out output, char replacement = 0, const std::locale& locale = std::locale());
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Encode a single UTF-32 character to wide
+ ///
+ /// This function does not exist in other specializations
+ /// of sf::Utf<>, it is defined for convenience (it is used by
+ /// several other conversion functions).
+ ///
+ /// \param codepoint Iterator pointing to the beginning of the input sequence
+ /// \param output Iterator pointing to the beginning of the output sequence
+ /// \param replacement Replacement if the input character is not convertible to wide (use 0 to skip it)
+ ///
+ /// \return Iterator to the end of the output sequence which has been written
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename Out>
+ static Out EncodeWide(Uint32 codepoint, Out output, wchar_t replacement = 0);
+ };
+
+#include "Utf.inl"
+
+ // Make typedefs to get rid of the template syntax
+ typedef Utf<8> Utf8;
+ typedef Utf<16> Utf16;
+ typedef Utf<32> Utf32;
+
+ } // namespace sf
+
+}
+
+
+#endif // SFML_UTF_HPP
diff --git a/source/libs/asura-lib-core/font/utf.inl b/source/libs/asura-lib-core/font/utf.inl
new file mode 100644
index 0000000..69a523b
--- /dev/null
+++ b/source/libs/asura-lib-core/font/utf.inl
@@ -0,0 +1,752 @@
+////////////////////////////////////////////////////////////
+//
+// SFML - Simple and Fast Multimedia Library
+// Copyright (C) 2007-2019 Laurent Gomila (laurent@sfml-dev.org)
+//
+// This software is provided 'as-is', without any express or implied warranty.
+// In no event will the authors be held liable for any damages arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it freely,
+// subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented;
+// you must not claim that you wrote the original software.
+// If you use this software in a product, an acknowledgment
+// in the product documentation would be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such,
+// and must not be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source distribution.
+//
+////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////
+// References:
+//
+// https://www.unicode.org/
+// https://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.c
+// https://www.unicode.org/Public/PROGRAMS/CVTUTF/ConvertUTF.h
+// https://people.w3.org/rishida/scripts/uniview/conversion
+//
+////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////
+template <typename In>
+In Utf<8>::Decode(In begin, In end, Uint32& output, Uint32 replacement)
+{
+ // Some useful precomputed data
+ static const int trailing[256] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5
+ };
+ static const Uint32 offsets[6] =
+ {
+ 0x00000000, 0x00003080, 0x000E2080, 0x03C82080, 0xFA082080, 0x82082080
+ };
+
+ // decode the character
+ int trailingBytes = trailing[static_cast<Uint8>(*begin)];
+ if (begin + trailingBytes < end)
+ {
+ output = 0;
+ switch (trailingBytes)
+ {
+ case 5: output += static_cast<Uint8>(*begin++); output <<= 6;
+ case 4: output += static_cast<Uint8>(*begin++); output <<= 6;
+ case 3: output += static_cast<Uint8>(*begin++); output <<= 6;
+ case 2: output += static_cast<Uint8>(*begin++); output <<= 6;
+ case 1: output += static_cast<Uint8>(*begin++); output <<= 6;
+ case 0: output += static_cast<Uint8>(*begin++);
+ }
+ output -= offsets[trailingBytes];
+ }
+ else
+ {
+ // Incomplete character
+ begin = end;
+ output = replacement;
+ }
+
+ return begin;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename Out>
+Out Utf<8>::Encode(Uint32 input, Out output, Uint8 replacement)
+{
+ // Some useful precomputed data
+ static const Uint8 firstBytes[7] =
+ {
+ 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC
+ };
+
+ // encode the character
+ if ((input > 0x0010FFFF) || ((input >= 0xD800) && (input <= 0xDBFF)))
+ {
+ // Invalid character
+ if (replacement)
+ *output++ = replacement;
+ }
+ else
+ {
+ // Valid character
+
+ // Get the number of bytes to write
+ std::size_t bytestoWrite = 1;
+ if (input < 0x80) bytestoWrite = 1;
+ else if (input < 0x800) bytestoWrite = 2;
+ else if (input < 0x10000) bytestoWrite = 3;
+ else if (input <= 0x0010FFFF) bytestoWrite = 4;
+
+ // Extract the bytes to write
+ Uint8 bytes[4];
+ switch (bytestoWrite)
+ {
+ case 4: bytes[3] = static_cast<Uint8>((input | 0x80) & 0xBF); input >>= 6;
+ case 3: bytes[2] = static_cast<Uint8>((input | 0x80) & 0xBF); input >>= 6;
+ case 2: bytes[1] = static_cast<Uint8>((input | 0x80) & 0xBF); input >>= 6;
+ case 1: bytes[0] = static_cast<Uint8> (input | firstBytes[bytestoWrite]);
+ }
+
+ // Add them to the output
+ output = std::copy(bytes, bytes + bytestoWrite, output);
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In>
+In Utf<8>::Next(In begin, In end)
+{
+ Uint32 codepoint;
+ return Decode(begin, end, codepoint);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In>
+std::size_t Utf<8>::Count(In begin, In end)
+{
+ std::size_t length = 0;
+ while (begin < end)
+ {
+ begin = Next(begin, end);
+ ++length;
+ }
+
+ return length;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<8>::FromAnsi(In begin, In end, Out output, const std::locale& locale)
+{
+ while (begin < end)
+ {
+ Uint32 codepoint = Utf<32>::DecodeAnsi(*begin++, locale);
+ output = Encode(codepoint, output);
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<8>::FromWide(In begin, In end, Out output)
+{
+ while (begin < end)
+ {
+ Uint32 codepoint = Utf<32>::DecodeWide(*begin++);
+ output = Encode(codepoint, output);
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<8>::FromLatin1(In begin, In end, Out output)
+{
+ // Latin-1 is directly compatible with Unicode encodings,
+ // and can thus be treated as (a sub-range of) UTF-32
+ while (begin < end)
+ output = Encode(*begin++, output);
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<8>::ToAnsi(In begin, In end, Out output, char replacement, const std::locale& locale)
+{
+ while (begin < end)
+ {
+ Uint32 codepoint;
+ begin = Decode(begin, end, codepoint);
+ output = Utf<32>::EncodeAnsi(codepoint, output, replacement, locale);
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<8>::ToWide(In begin, In end, Out output, wchar_t replacement)
+{
+ while (begin < end)
+ {
+ Uint32 codepoint;
+ begin = Decode(begin, end, codepoint);
+ output = Utf<32>::EncodeWide(codepoint, output, replacement);
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<8>::ToLatin1(In begin, In end, Out output, char replacement)
+{
+ // Latin-1 is directly compatible with Unicode encodings,
+ // and can thus be treated as (a sub-range of) UTF-32
+ while (begin < end)
+ {
+ Uint32 codepoint;
+ begin = Decode(begin, end, codepoint);
+ *output++ = codepoint < 256 ? static_cast<char>(codepoint) : replacement;
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<8>::ToUtf8(In begin, In end, Out output)
+{
+ return std::copy(begin, end, output);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<8>::ToUtf16(In begin, In end, Out output)
+{
+ while (begin < end)
+ {
+ Uint32 codepoint;
+ begin = Decode(begin, end, codepoint);
+ output = Utf<16>::Encode(codepoint, output);
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<8>::ToUtf32(In begin, In end, Out output)
+{
+ while (begin < end)
+ {
+ Uint32 codepoint;
+ begin = Decode(begin, end, codepoint);
+ *output++ = codepoint;
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In>
+In Utf<16>::Decode(In begin, In end, Uint32& output, Uint32 replacement)
+{
+ Uint16 first = *begin++;
+
+ // If it's a surrogate pair, first convert to a single UTF-32 character
+ if ((first >= 0xD800) && (first <= 0xDBFF))
+ {
+ if (begin < end)
+ {
+ Uint32 second = *begin++;
+ if ((second >= 0xDC00) && (second <= 0xDFFF))
+ {
+ // The second element is valid: convert the two elements to a UTF-32 character
+ output = ((first - 0xD800) << 10) + (second - 0xDC00) + 0x0010000;
+ }
+ else
+ {
+ // Invalid character
+ output = replacement;
+ }
+ }
+ else
+ {
+ // Invalid character
+ begin = end;
+ output = replacement;
+ }
+ }
+ else
+ {
+ // We can make a direct copy
+ output = first;
+ }
+
+ return begin;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename Out>
+Out Utf<16>::Encode(Uint32 input, Out output, Uint16 replacement)
+{
+ if (input <= 0xFFFF)
+ {
+ // The character can be copied directly, we just need to check if it's in the valid range
+ if ((input >= 0xD800) && (input <= 0xDFFF))
+ {
+ // Invalid character (this range is reserved)
+ if (replacement)
+ *output++ = replacement;
+ }
+ else
+ {
+ // Valid character directly convertible to a single UTF-16 character
+ *output++ = static_cast<Uint16>(input);
+ }
+ }
+ else if (input > 0x0010FFFF)
+ {
+ // Invalid character (greater than the maximum Unicode value)
+ if (replacement)
+ *output++ = replacement;
+ }
+ else
+ {
+ // The input character will be converted to two UTF-16 elements
+ input -= 0x0010000;
+ *output++ = static_cast<Uint16>((input >> 10) + 0xD800);
+ *output++ = static_cast<Uint16>((input & 0x3FFUL) + 0xDC00);
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In>
+In Utf<16>::Next(In begin, In end)
+{
+ Uint32 codepoint;
+ return Decode(begin, end, codepoint);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In>
+std::size_t Utf<16>::Count(In begin, In end)
+{
+ std::size_t length = 0;
+ while (begin < end)
+ {
+ begin = Next(begin, end);
+ ++length;
+ }
+
+ return length;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<16>::FromAnsi(In begin, In end, Out output, const std::locale& locale)
+{
+ while (begin < end)
+ {
+ Uint32 codepoint = Utf<32>::DecodeAnsi(*begin++, locale);
+ output = Encode(codepoint, output);
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<16>::FromWide(In begin, In end, Out output)
+{
+ while (begin < end)
+ {
+ Uint32 codepoint = Utf<32>::DecodeWide(*begin++);
+ output = Encode(codepoint, output);
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<16>::FromLatin1(In begin, In end, Out output)
+{
+ // Latin-1 is directly compatible with Unicode encodings,
+ // and can thus be treated as (a sub-range of) UTF-32
+ return std::copy(begin, end, output);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<16>::ToAnsi(In begin, In end, Out output, char replacement, const std::locale& locale)
+{
+ while (begin < end)
+ {
+ Uint32 codepoint;
+ begin = Decode(begin, end, codepoint);
+ output = Utf<32>::EncodeAnsi(codepoint, output, replacement, locale);
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<16>::ToWide(In begin, In end, Out output, wchar_t replacement)
+{
+ while (begin < end)
+ {
+ Uint32 codepoint;
+ begin = Decode(begin, end, codepoint);
+ output = Utf<32>::EncodeWide(codepoint, output, replacement);
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<16>::ToLatin1(In begin, In end, Out output, char replacement)
+{
+ // Latin-1 is directly compatible with Unicode encodings,
+ // and can thus be treated as (a sub-range of) UTF-32
+ while (begin < end)
+ {
+ *output++ = *begin < 256 ? static_cast<char>(*begin) : replacement;
+ begin++;
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<16>::ToUtf8(In begin, In end, Out output)
+{
+ while (begin < end)
+ {
+ Uint32 codepoint;
+ begin = Decode(begin, end, codepoint);
+ output = Utf<8>::Encode(codepoint, output);
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<16>::ToUtf16(In begin, In end, Out output)
+{
+ return std::copy(begin, end, output);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<16>::ToUtf32(In begin, In end, Out output)
+{
+ while (begin < end)
+ {
+ Uint32 codepoint;
+ begin = Decode(begin, end, codepoint);
+ *output++ = codepoint;
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In>
+In Utf<32>::Decode(In begin, In /*end*/, Uint32& output, Uint32 /*replacement*/)
+{
+ output = *begin++;
+ return begin;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename Out>
+Out Utf<32>::Encode(Uint32 input, Out output, Uint32 /*replacement*/)
+{
+ *output++ = input;
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In>
+In Utf<32>::Next(In begin, In /*end*/)
+{
+ return ++begin;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In>
+std::size_t Utf<32>::Count(In begin, In end)
+{
+ return begin - end;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<32>::FromAnsi(In begin, In end, Out output, const std::locale& locale)
+{
+ while (begin < end)
+ *output++ = DecodeAnsi(*begin++, locale);
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<32>::FromWide(In begin, In end, Out output)
+{
+ while (begin < end)
+ *output++ = DecodeWide(*begin++);
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<32>::FromLatin1(In begin, In end, Out output)
+{
+ // Latin-1 is directly compatible with Unicode encodings,
+ // and can thus be treated as (a sub-range of) UTF-32
+ return std::copy(begin, end, output);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<32>::ToAnsi(In begin, In end, Out output, char replacement, const std::locale& locale)
+{
+ while (begin < end)
+ output = EncodeAnsi(*begin++, output, replacement, locale);
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<32>::ToWide(In begin, In end, Out output, wchar_t replacement)
+{
+ while (begin < end)
+ output = EncodeWide(*begin++, output, replacement);
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<32>::ToLatin1(In begin, In end, Out output, char replacement)
+{
+ // Latin-1 is directly compatible with Unicode encodings,
+ // and can thus be treated as (a sub-range of) UTF-32
+ while (begin < end)
+ {
+ *output++ = *begin < 256 ? static_cast<char>(*begin) : replacement;
+ begin++;
+ }
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<32>::ToUtf8(In begin, In end, Out output)
+{
+ while (begin < end)
+ output = Utf<8>::Encode(*begin++, output);
+
+ return output;
+}
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<32>::ToUtf16(In begin, In end, Out output)
+{
+ while (begin < end)
+ output = Utf<16>::Encode(*begin++, output);
+
+ return output;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In, typename Out>
+Out Utf<32>::ToUtf32(In begin, In end, Out output)
+{
+ return std::copy(begin, end, output);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In>
+Uint32 Utf<32>::DecodeAnsi(In input, const std::locale& locale)
+{
+ // On Windows, GCC's standard library (glibc++) has almost
+ // no support for Unicode stuff. As a consequence, in this
+ // context we can only use the default locale and ignore
+ // the one passed as parameter.
+
+ #if defined(SFML_SYSTEM_WINDOWS) && /* if Windows ... */ \
+ (defined(__GLIBCPP__) || defined (__GLIBCXX__)) && /* ... and standard library is glibc++ ... */ \
+ !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) /* ... and STLPort is not used on top of it */
+
+ (void)locale; // to avoid warnings
+
+ wchar_t character = 0;
+ mbtowc(&character, &input, 1);
+ return static_cast<Uint32>(character);
+
+ #else
+
+ // Get the facet of the locale which deals with character conversion
+ const std::ctype<wchar_t>& facet = std::use_facet< std::ctype<wchar_t> >(locale);
+
+ // Use the facet to convert each character of the input string
+ return static_cast<Uint32>(facet.widen(input));
+
+ #endif
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename In>
+Uint32 Utf<32>::DecodeWide(In input)
+{
+ // The encoding of wide characters is not well defined and is left to the system;
+ // however we can safely assume that it is UCS-2 on Windows and
+ // UCS-4 on Unix systems.
+ // In both cases, a simple copy is enough (UCS-2 is a subset of UCS-4,
+ // and UCS-4 *is* UTF-32).
+
+ return input;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename Out>
+Out Utf<32>::EncodeAnsi(Uint32 codepoint, Out output, char replacement, const std::locale& locale)
+{
+ // On Windows, gcc's standard library (glibc++) has almost
+ // no support for Unicode stuff. As a consequence, in this
+ // context we can only use the default locale and ignore
+ // the one passed as parameter.
+
+ #if defined(SFML_SYSTEM_WINDOWS) && /* if Windows ... */ \
+ (defined(__GLIBCPP__) || defined (__GLIBCXX__)) && /* ... and standard library is glibc++ ... */ \
+ !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) /* ... and STLPort is not used on top of it */
+
+ (void)locale; // to avoid warnings
+
+ char character = 0;
+ if (wctomb(&character, static_cast<wchar_t>(codepoint)) >= 0)
+ *output++ = character;
+ else if (replacement)
+ *output++ = replacement;
+
+ return output;
+
+ #else
+
+ // Get the facet of the locale which deals with character conversion
+ const std::ctype<wchar_t>& facet = std::use_facet< std::ctype<wchar_t> >(locale);
+
+ // Use the facet to convert each character of the input string
+ *output++ = facet.narrow(static_cast<wchar_t>(codepoint), replacement);
+
+ return output;
+
+ #endif
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename Out>
+Out Utf<32>::EncodeWide(Uint32 codepoint, Out output, wchar_t replacement)
+{
+ // The encoding of wide characters is not well defined and is left to the system;
+ // however we can safely assume that it is UCS-2 on Windows and
+ // UCS-4 on Unix systems.
+ // For UCS-2 we need to check if the source characters fits in (UCS-2 is a subset of UCS-4).
+ // For UCS-4 we can do a direct copy (UCS-4 *is* UTF-32).
+
+ switch (sizeof(wchar_t))
+ {
+ case 4:
+ {
+ *output++ = static_cast<wchar_t>(codepoint);
+ break;
+ }
+
+ default:
+ {
+ if ((codepoint <= 0xFFFF) && ((codepoint < 0xD800) || (codepoint > 0xDFFF)))
+ {
+ *output++ = static_cast<wchar_t>(codepoint);
+ }
+ else if (replacement)
+ {
+ *output++ = replacement;
+ }
+ break;
+ }
+ }
+
+ return output;
+}
diff --git a/source/libs/asura-lib-core/graphics/binding/canvas.binding.cpp b/source/libs/asura-lib-core/graphics/binding/canvas.binding.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/canvas.binding.cpp
diff --git a/source/libs/asura-lib-core/graphics/binding/color.binding.cpp b/source/libs/asura-lib-core/graphics/binding/color.binding.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/color.binding.cpp
diff --git a/source/libs/asura-lib-core/graphics/binding/gif.binding.cpp b/source/libs/asura-lib-core/graphics/binding/gif.binding.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/gif.binding.cpp
diff --git a/source/libs/asura-lib-core/graphics/binding/image.binding.cpp b/source/libs/asura-lib-core/graphics/binding/image.binding.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/image.binding.cpp
diff --git a/source/libs/asura-lib-core/graphics/binding/image_data.binding.cpp b/source/libs/asura-lib-core/graphics/binding/image_data.binding.cpp
new file mode 100644
index 0000000..0d68c11
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/image_data.binding.cpp
@@ -0,0 +1,30 @@
+#include "../image.h"
+
+using namespace Luax;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ void Image::RegisterLuaxClass(LuaxState& state)
+ {
+
+ }
+
+ void Image::RegisterLuaxPostprocess(LuaxState& state)
+ {
+ // blendö٣AsuraEngine.EBlendMode
+ LuaxEnum EBlendMode[] = {
+ { "Additive", 1 },
+ { "PreBlend", 2 },
+ { "Substruction", 3 },
+ { "Multiplied", 4 },
+ {0, 0}
+ };
+
+ state.RegisterEnum("EBlendMode", EBlendMode);
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/binding/mesh2d.binding.cpp b/source/libs/asura-lib-core/graphics/binding/mesh2d.binding.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/mesh2d.binding.cpp
diff --git a/source/libs/asura-lib-core/graphics/binding/mesh2d_data.binding.cpp b/source/libs/asura-lib-core/graphics/binding/mesh2d_data.binding.cpp
new file mode 100644
index 0000000..6e15052
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/mesh2d_data.binding.cpp
@@ -0,0 +1,9 @@
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/binding/shader.binding.cpp b/source/libs/asura-lib-core/graphics/binding/shader.binding.cpp
new file mode 100644
index 0000000..2f2f507
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/shader.binding.cpp
@@ -0,0 +1,114 @@
+#include "../shader.h"
+
+using namespace Luax;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ void Shader::RegisterLuaxClass(LuaxState& state)
+ {
+
+ LuaxEnum EBuiltIn[] = {
+ {0, 0}
+ };
+
+ state.RegisterEnum("EBuiltIn", EBuiltIn);
+
+ }
+
+ void Shader::RegisterLuaxPostprocess(LuaxState& state)
+ {
+
+ }
+
+ ///
+ /// shaderΪ
+ ///
+ int Shader::l_Use(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ ///
+ /// shaderΪǻ
+ ///
+ int Shader::l_Unuse(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ ///
+ /// ɫйshaderɹtrueʧܷfalse
+ ///
+ int Shader::l_Load(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ ///
+ /// жshaderǷuniformзtrue,򷵻false
+ ///
+ int Shader::l_HasUniform(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ ///
+ /// uniformslocationûuniformnil򷵻ضӦloc
+ ///
+ int Shader::l_GetUniformLocation(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ int Shader::l_SetBuiltInUniforms(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ int Shader::l_SetUniformFloat(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ int Shader::l_SetUniformTexture(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ int Shader::l_SetUniformVector2(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ int Shader::l_SetUniformVector3(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ int Shader::l_SetUniformVector4(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ int Shader::l_SetUniformColor(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/binding/sprite_batch.binding.cpp b/source/libs/asura-lib-core/graphics/binding/sprite_batch.binding.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/sprite_batch.binding.cpp
diff --git a/source/libs/asura-lib-core/graphics/binding/window.binding.cpp b/source/libs/asura-lib-core/graphics/binding/window.binding.cpp
new file mode 100644
index 0000000..3befc8c
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/window.binding.cpp
@@ -0,0 +1,11 @@
+#include "../Window.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/blend_mode.h b/source/libs/asura-lib-core/graphics/blend_mode.h
new file mode 100644
index 0000000..775cc45
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/blend_mode.h
@@ -0,0 +1,17 @@
+#ifndef __ASURA_ENGINE_BLEND_MODE_H__
+#define __ASURA_ENGINE_BLEND_MODE_H__
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ enum BlendMode
+ {
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/canvas.cpp b/source/libs/asura-lib-core/graphics/canvas.cpp
new file mode 100644
index 0000000..61787b6
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/canvas.cpp
@@ -0,0 +1,41 @@
+#include "Canvas.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ Canvas::Canvas()
+ : Texture()
+ , mWidth(0)
+ , mHeight(0)
+ {
+ glGenFramebuffers(1, &mFBO);
+ GLint current_fbo;
+ glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &current_fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextureHandle, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, current_fbo);
+ }
+
+ void Canvas::SetSize(uint w, uint h)
+ {
+ GLint current_tex;
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &current_tex);
+ glBindTexture(GL_TEXTURE_2D, mTextureHandle);
+
+ glBindTexture(GL_TEXTURE_2D, current_tex);
+ }
+
+ void Canvas::Bind()
+ {
+
+ }
+
+ void Canvas::Unbind()
+ {
+
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/canvas.h b/source/libs/asura-lib-core/graphics/canvas.h
new file mode 100644
index 0000000..c4e0f65
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/canvas.h
@@ -0,0 +1,81 @@
+#ifndef __ASURA_ENGINE_CANVAS_H__
+#define __ASURA_ENGINE_CANVAS_H__
+
+#include <Scripting/Luax.hpp>
+
+#include "Math/Rect.hpp"
+#include "GL.h"
+#include "Texture.h"
+#include "RenderTarget.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// CanvasҲԳΪrender textureҲΪtextureȾ
+ ///
+ class Canvas ASURA_FINAL
+ : public Drawable
+ , public RenderTarget
+ , public Scripting::Portable
+ {
+ public:
+
+ Canvas();
+
+ ~Canvas();
+
+ ///
+ /// render textureĴС
+ ///
+ void SetSize(uint w, uint h);
+
+ void Clear(const Color& col = Color::Black) override;
+
+ void Clear(const Math::Recti& quad, const Color& col = Color::Black) override;
+
+ void Render(const RenderTarget* rt, const Math::Vector2i& pos, const Math::Vector2i& scale, const Math::Vector2i& center, float rot);
+
+ void Render(const RenderTarget* rt, const Math::Rectf& quad, const Math::Vector2i& pos, const Math::Vector2i& scale, const Math::Vector2i& center, float rot);
+
+ void Draw(const Drawable* texture, const RenderState& state);
+
+ void Draw(const Drawable* texture, const Math::Recti& quad, const RenderState& state);
+
+ private:
+
+ ///
+ /// Frame buffer object id.
+ ///
+ GLuint mFBO;
+
+ ///
+ /// canvasĴС
+ ///
+ uint mWidth, mHeight;
+
+ public:
+
+ //----------------------------------------------------------------------------------------------------------
+
+ LUAX_DECL_FACTORY(SimCanvas);
+
+ LUAX_DECL_METHOD(l_SetSize);
+ LUAX_DECL_METHOD(l_Bind);
+ LUAX_DECL_METHOD(l_Unbind);
+
+ //----------------------------------------------------------------------------------------------------------
+
+ };
+
+ ///
+ /// CanvasΪRenderTexture
+ ///
+ using RenderTexture = Canvas;
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/color.cpp b/source/libs/asura-lib-core/graphics/color.cpp
new file mode 100644
index 0000000..106493d
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/color.cpp
@@ -0,0 +1,132 @@
+#include "Color.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ Color32::Color32()
+ {
+ r = g = b = a = 0;
+ }
+
+ Color32::Color32(const Color32& c)
+ {
+ r = c.r;
+ g = c.g;
+ b = c.b;
+ a = c.a;
+ }
+
+ Color32::Color32(const Color& c)
+ {
+ r = 255.f * c.r;
+ g = 255.f * c.g;
+ b = 255.f * c.b;
+ a = 255.f * c.a;
+ }
+
+ Color32::Color32(byte r, byte g, byte b, byte a)
+ {
+ this->r = r;
+ this->g = g;
+ this->b = b;
+ this->a = a;
+ }
+
+ int Color32::l_GetRed(lua_State* L)
+ {
+
+ }
+
+ int Color32::l_GetGreen(lua_State* L)
+ {
+
+ }
+
+ int Color32::l_GetBlue(lua_State* L)
+ {
+
+ }
+
+ int Color32::l_GetAlpha(lua_State* L)
+ {
+
+ }
+
+ //------------------------------------------------------------------------------------------------------------
+
+ Color::Color()
+ {
+ r = g = b = a = 0;
+ }
+
+ Color::Color(const Color& c)
+ {
+ r = c.r;
+ g = c.g;
+ b = c.b;
+ a = c.a;
+ }
+
+ Color::Color(float r, float g, float b, float a)
+ {
+ this->r = r;
+ this->g = g;
+ this->b = b;
+ this->a = a;
+ }
+
+ Color::Color(const Color32& c)
+ {
+ r = c.r / 255.f;
+ g = c.g / 255.f;
+ b = c.b / 255.f;
+ a = c.a / 255.f;
+ }
+
+ Color Color::operator *(const Color& c)
+ {
+ r *= c.r;
+ g *= c.g;
+ b *= c.b;
+ a *= c.a;
+ }
+
+ int Color::l_GetRed(lua_State* L)
+ {
+
+ }
+
+ int Color::l_GetGreen(lua_State* L)
+ {
+
+ }
+
+ int Color::l_GetBlue(lua_State* L)
+ {
+
+ }
+
+ int Color::l_GetAlpha(lua_State* L)
+ {
+
+ }
+
+ int Color::l_Add(lua_State* L)
+ {
+
+ }
+
+ int Color::l_Minus(lua_State* L)
+ {
+
+ }
+
+ int Color::l_Multiply(lua_State* L)
+ {
+
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/color.h b/source/libs/asura-lib-core/graphics/color.h
new file mode 100644
index 0000000..a18c682
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/color.h
@@ -0,0 +1,95 @@
+#ifndef __ASURA_ENGINE_COLOR_H__
+#define __ASURA_ENGINE_COLOR_H__
+
+#include "config.h"
+#include "scripting/portable.hpp"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class Color;
+
+ ///
+ /// 32bitsɫ
+ ///
+ class Color32 ASURA_FINAL
+ : public Scripting::Portable<Color32>
+ {
+ public:
+
+ Color32();
+
+ ~Color32();
+
+ Color32(const Color32& c);
+
+ Color32(const Color& c);
+
+ Color32(byte r, byte g, byte b, byte a);
+
+ byte r, g, b, a;
+
+ //----------------------------------------------------------------------------------------------------------
+
+ LUAX_DECL_FACTORY(Color32);
+
+ LUAX_DECL_METHOD(l_ToColor);
+ LUAX_DECL_METHOD(l_GetRed);
+ LUAX_DECL_METHOD(l_GetGreen);
+ LUAX_DECL_METHOD(l_GetBlue);
+ LUAX_DECL_METHOD(l_GetAlpha);
+ LUAX_DECL_METHOD(l_Multiply);
+ LUAX_DECL_METHOD(l_Index); //r,g,b,a
+ LUAX_DECL_METHOD(l_NewIndex); //޸r,g,b,a
+
+ //----------------------------------------------------------------------------------------------------------
+
+ };
+
+ ///
+ /// 淶ɫ
+ ///
+ class Color ASURA_FINAL
+ : public Scripting::Portable<Color>
+ {
+ public:
+
+ static Color Black;
+ static Color White;
+ static Color Red;
+ static Color Green;
+ static Color Blue;
+
+ Color();
+
+ Color(const Color& c);
+
+ Color(float r, float g, float b, float a);
+
+ Color(const Color32& c);
+
+ ~Color();
+
+ Color operator *(const Color& c);
+
+ float r, g, b, a;
+
+ //----------------------------------------------------------------------------------------------------------
+
+ LUAX_DECL_FACTORY(Color);
+
+ LUAX_DECL_METHOD(l_ToColor32);
+ LUAX_DECL_METHOD(l_SetColor);
+ LUAX_DECL_METHOD(l_GetColor);
+ LUAX_DECL_METHOD(l_Multiply); // ɫ˷
+
+ //----------------------------------------------------------------------------------------------------------
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/color_palette.h b/source/libs/asura-lib-core/graphics/color_palette.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/color_palette.h
diff --git a/source/libs/asura-lib-core/graphics/gif.cpp b/source/libs/asura-lib-core/graphics/gif.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/gif.cpp
diff --git a/source/libs/asura-lib-core/graphics/gif.h b/source/libs/asura-lib-core/graphics/gif.h
new file mode 100644
index 0000000..8b89858
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/gif.h
@@ -0,0 +1,20 @@
+#ifndef __ASURA_GIF_H__
+#define __ASURA_GIF_H__
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// Gif
+ ///
+ class Gif
+ {
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/gl.cpp b/source/libs/asura-lib-core/graphics/gl.cpp
new file mode 100644
index 0000000..01c90de
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/gl.cpp
@@ -0,0 +1,25 @@
+#include "config.h"
+#include "gl.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ bool OpenGL::instantiated = false;
+
+ //
+ OpenGL gl;
+
+ OpenGL::OpenGL()
+ {
+ ASSERT(!instantiated);
+ instantiated = true;
+ }
+
+ OpenGL::~OpenGL()
+ {
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/gl.h b/source/libs/asura-lib-core/graphics/gl.h
new file mode 100644
index 0000000..bfc60ea
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/gl.h
@@ -0,0 +1,41 @@
+#ifndef __ASURA_ENGINE_OPENGL_H__
+#define __ASURA_ENGINE_OPENGL_H__
+
+#include "glad/glad.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class Profiler;
+
+ ///
+ /// һЩopengl״̬׷١
+ ///
+ class OpenGL
+ {
+ public:
+ OpenGL();
+ ~OpenGL();
+
+ private:
+
+ friend class Profiler;
+
+ ///
+ /// opengl
+ ///
+ static bool instantiated;
+
+ };
+
+ ///
+ /// OpenGL
+ ///
+ extern OpenGL gl;
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/image.cpp b/source/libs/asura-lib-core/graphics/image.cpp
new file mode 100644
index 0000000..e704945
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/image.cpp
@@ -0,0 +1,32 @@
+#include "Config.h"
+#include "Image.h"
+#include "GL.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ Image::Image()
+ {
+ }
+
+ Image::~Image()
+ {
+ }
+
+ //\Ϣ
+ bool Image::Load(ImageData* data)
+ {
+ ASSERT(data);
+
+ glBindTexture(GL_TEXTURE_2D, mTextureHandle);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, data->width, data->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data->pixels);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ return true;
+
+ RRA(data, mImageData);
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/image.h b/source/libs/asura-lib-core/graphics/image.h
new file mode 100644
index 0000000..2dd3a4a
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/image.h
@@ -0,0 +1,76 @@
+#ifndef __ASURA_ENGINE_IMAGE_H__
+#define __ASURA_ENGINE_IMAGE_H__
+
+#include "../math/vector2.hpp"
+#include "../scripting/portable.hpp"
+#include "../fileSystem/reloadable.h"
+#include "../stringmap.hpp"
+#include "../manager.hpp"
+
+#include "texture.h"
+#include "color.h"
+#include "image_data.h"
+#include "render_state.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class ImageFactory;
+
+ ///
+ /// ImageͼƬڴ󣬶ȡϷ󱣴ĽһImageڴ桢ԴֻᱣһݣҪ
+ /// imageêλãźתǶȣʹspriteһֻࡣҪǿǵeditorengineʹòͬķװ
+ ///
+ class Image ASURA_FINAL
+ : public Drawable
+ , public Scripting::Portable<Image>
+ , public Filesystem::Reloadable
+ {
+ public:
+
+ Image();
+
+ ~Image();
+
+ ///
+ /// bufferimageϢmPixelsΪգݡ¹imageʹglTexImage2Dύimage
+ /// ݡ
+ ///
+ bool Load(ImageData* data);
+
+ uint GetWidth();
+ uint GetHeight();
+ Math::Vector2u GetSize();
+
+ ///
+ /// ijһλõ
+ ///
+ Color32 GetPixel(uint x, uint y);
+
+ void Render(const RenderTarget* rt, const RenderState& state) override;
+
+ void Render(const RenderTarget* rt, const Math::Rectf& quad, const RenderState& state) override;
+
+ private:
+
+ ImageData* mImageData;
+
+ Math::Vector2u mSize;
+
+ public:
+
+ LUAX_DECL_FACTORY(SimImage);
+
+ LUAX_DECL_METHOD(l_Load);
+ LUAX_DECL_METHOD(l_GetWidth);
+ LUAX_DECL_METHOD(l_GetHeight);
+ LUAX_DECL_METHOD(l_GetSize);
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/image_data.cpp b/source/libs/asura-lib-core/graphics/image_data.cpp
new file mode 100644
index 0000000..821bfd6
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/image_data.cpp
@@ -0,0 +1,50 @@
+#include "image_data.h"
+#include "png_decoder.h"
+#include "stb_decoder.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ using namespace std;
+
+ // imagedecoderΪԡ
+ list<ImageDecoder*> ImageData::ImageDecoders = {
+ new PNGDecoder(), // png
+ new STBDecoder() // jpeg, tga, bmp
+ };
+
+ ImageData::ImageData(const Filesystem::DataBuffer& buffer)
+ : DecodedData(buffer)
+ {
+ }
+
+ ImageData::~ImageData()
+ {
+ if (pixels)
+ delete[] pixels;
+ }
+
+ ///
+ /// ޷ɹ׳쳣
+ ///
+ void ImageData::Decode(const Filesystem::DataBuffer& buffer)
+ {
+ for (ImageDecoder* decoder : ImageDecoders)
+ {
+ if (decoder->CanDecode(buffer))
+ {
+ decoder->Decode(buffer, this);
+ return;
+ }
+ }
+ }
+
+ Color ImageData::GetPixel(uint x, uint y)
+ {
+
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/image_data.h b/source/libs/asura-lib-core/graphics/image_data.h
new file mode 100644
index 0000000..1e711a8
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/image_data.h
@@ -0,0 +1,62 @@
+#ifndef __ASURA_ENGINE_IMAGEDATA_H__
+#define __ASURA_ENGINE_IMAGEDATA_H__
+
+#include <list>
+
+#include "scripting/luax.hpp"
+#include "filesystem/decoded_data.h"
+#include "image_decoder.h"
+#include "pixel_format.h"
+#include "color.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class ImageData ASURA_FINAL
+ : public Filesystem::DecodedData
+ , public Scripting::Portable
+ {
+ public:
+
+ ///
+ /// ͼƬļϢʧܣ׳쳣
+ ///
+ ImageData(const Filesystem::DataBuffer& buffer);
+
+ ~ImageData();
+
+ Color GetPixel(uint x, uint y);
+
+ uint width, height;
+ PixelFormat format;
+ std::size_t size;
+ byte* pixels;
+
+ private:
+
+ void Decode(const Filesystem::DataBuffer& buffer) override;
+
+ ///
+ /// ڵһ׼image dataʱṩdecoderڼdecodersмѡԡ
+ ///
+ static std::list<ImageDecoder*> ImageDecoders;
+
+ public:
+
+ //----------------------------------------------------------------------------------------------------------
+
+ LUAX_DECL_FACTORY(ImageData);
+
+ LUAX_DECL_METHOD(l_GetPixel);
+ LUAX_DECL_METHOD(l_GetSize);
+
+ //----------------------------------------------------------------------------------------------------------
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/image_decoder.h b/source/libs/asura-lib-core/graphics/image_decoder.h
new file mode 100644
index 0000000..2c73fd1
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/image_decoder.h
@@ -0,0 +1,35 @@
+#ifndef __ASURA_ENGINE_IMAGE_DECODER_H__
+#define __ASURA_ENGINE_IMAGE_DECODER_H__
+
+#include "FileSystem/DataBuffer.h"
+
+#include "ImageData.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class ImageDecoder
+ {
+ public:
+
+ ImageDecoder();
+ virtual ~ImageDecoder();
+
+ ///
+ /// жڴǷñdecoderѹ
+ ///
+ virtual bool CanDecode(const Filesystem::DataBuffer& buffer) = 0;
+
+ ///
+ /// һڴ棬һѹImage dataѹʧܷnullptr
+ ///
+ virtual void Decode(const Filesystem::DataBuffer& buffer, ImageData& data) = 0;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/mesh2d.cpp b/source/libs/asura-lib-core/graphics/mesh2d.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/mesh2d.cpp
diff --git a/source/libs/asura-lib-core/graphics/mesh2d.h b/source/libs/asura-lib-core/graphics/mesh2d.h
new file mode 100644
index 0000000..2c58f00
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/mesh2d.h
@@ -0,0 +1,30 @@
+#ifndef __ASURA_ENGINE_MESH2D_H__
+#define __ASURA_ENGINE_MESH2D_H__
+
+#include "Scripting/Luax.hpp"
+
+#include "scripting/portable.hpp"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// 2D meshһЩ㶯
+ ///
+ class Mesh2D ASURA_FINAL
+ : public Scripting::Portable<Mesh2D>
+ {
+ public:
+
+ Mesh2D();
+
+ ~Mesh2D();
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/mesh2d_data.cpp b/source/libs/asura-lib-core/graphics/mesh2d_data.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/mesh2d_data.cpp
diff --git a/source/libs/asura-lib-core/graphics/mesh2d_data.h b/source/libs/asura-lib-core/graphics/mesh2d_data.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/mesh2d_data.h
diff --git a/source/libs/asura-lib-core/graphics/pixel_format.h b/source/libs/asura-lib-core/graphics/pixel_format.h
new file mode 100644
index 0000000..8df07d5
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/pixel_format.h
@@ -0,0 +1,91 @@
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// ظʽ
+ ///
+ enum PixelFormat
+ {
+ PIXELFORMAT_UNKNOWN,
+
+ // these are converted to an actual format by love
+ PIXELFORMAT_NORMAL,
+ PIXELFORMAT_HDR,
+
+ // "regular" formats
+ PIXELFORMAT_R8,
+ PIXELFORMAT_RG8,
+ PIXELFORMAT_RGBA8,
+ PIXELFORMAT_sRGBA8,
+ PIXELFORMAT_R16,
+ PIXELFORMAT_RG16,
+ PIXELFORMAT_RGBA16,
+ PIXELFORMAT_R16F,
+ PIXELFORMAT_RG16F,
+ PIXELFORMAT_RGBA16F,
+ PIXELFORMAT_R32F,
+ PIXELFORMAT_RG32F,
+ PIXELFORMAT_RGBA32F,
+
+ PIXELFORMAT_LA8, // Same as RG8, but accessed as (L, L, L, A)
+
+ // packed formats
+ PIXELFORMAT_RGBA4,
+ PIXELFORMAT_RGB5A1,
+ PIXELFORMAT_RGB565,
+ PIXELFORMAT_RGB10A2,
+ PIXELFORMAT_RG11B10F,
+
+ // depth/stencil formats
+ PIXELFORMAT_STENCIL8,
+ PIXELFORMAT_DEPTH16,
+ PIXELFORMAT_DEPTH24,
+ PIXELFORMAT_DEPTH32F,
+ PIXELFORMAT_DEPTH24_STENCIL8,
+ PIXELFORMAT_DEPTH32F_STENCIL8,
+
+ // compressed formats
+ PIXELFORMAT_DXT1,
+ PIXELFORMAT_DXT3,
+ PIXELFORMAT_DXT5,
+ PIXELFORMAT_BC4,
+ PIXELFORMAT_BC4s,
+ PIXELFORMAT_BC5,
+ PIXELFORMAT_BC5s,
+ PIXELFORMAT_BC6H,
+ PIXELFORMAT_BC6Hs,
+ PIXELFORMAT_BC7,
+ PIXELFORMAT_PVR1_RGB2,
+ PIXELFORMAT_PVR1_RGB4,
+ PIXELFORMAT_PVR1_RGBA2,
+ PIXELFORMAT_PVR1_RGBA4,
+ PIXELFORMAT_ETC1,
+ PIXELFORMAT_ETC2_RGB,
+ PIXELFORMAT_ETC2_RGBA,
+ PIXELFORMAT_ETC2_RGBA1,
+ PIXELFORMAT_EAC_R,
+ PIXELFORMAT_EAC_Rs,
+ PIXELFORMAT_EAC_RG,
+ PIXELFORMAT_EAC_RGs,
+ PIXELFORMAT_ASTC_4x4,
+ PIXELFORMAT_ASTC_5x4,
+ PIXELFORMAT_ASTC_5x5,
+ PIXELFORMAT_ASTC_6x5,
+ PIXELFORMAT_ASTC_6x6,
+ PIXELFORMAT_ASTC_8x5,
+ PIXELFORMAT_ASTC_8x6,
+ PIXELFORMAT_ASTC_8x8,
+ PIXELFORMAT_ASTC_10x5,
+ PIXELFORMAT_ASTC_10x6,
+ PIXELFORMAT_ASTC_10x8,
+ PIXELFORMAT_ASTC_10x10,
+ PIXELFORMAT_ASTC_12x10,
+ PIXELFORMAT_ASTC_12x12,
+
+ PIXELFORMAT_MAX_ENUM
+ };
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/png_decoder.cpp b/source/libs/asura-lib-core/graphics/png_decoder.cpp
new file mode 100644
index 0000000..f919090
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/png_decoder.cpp
@@ -0,0 +1,19 @@
+#include "PNGDecoder.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ bool PNGDecoder::CanDecode(const Filesystem::DataBuffer& buffer)
+ {
+ return false;
+ }
+
+ void PNGDecoder::Decode(const Filesystem::DataBuffer& buffer, ImageData& data)
+ {
+
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/png_decoder.h b/source/libs/asura-lib-core/graphics/png_decoder.h
new file mode 100644
index 0000000..bb82032
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/png_decoder.h
@@ -0,0 +1,27 @@
+#ifndef __ASURA_ENGINE_PNGDECODER_H__
+#define __ASURA_ENGINE_PNGDECODER_H__
+
+#include "image_decoder.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// ʹlodepngѹpngļ
+ ///
+ class PNGDecoder ASURA_FINAL: public ImageDecoder
+ {
+ public:
+
+ bool CanDecode(const Filesystem::DataBuffer& buffer) override;
+
+ void Decode(const Filesystem::DataBuffer& buffer, ImageData& data) override;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/quad.cpp b/source/libs/asura-lib-core/graphics/quad.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/quad.cpp
diff --git a/source/libs/asura-lib-core/graphics/quad.h b/source/libs/asura-lib-core/graphics/quad.h
new file mode 100644
index 0000000..b7dd3d9
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/quad.h
@@ -0,0 +1 @@
+// Quadrectڣrectǵıƫᣬquadһ
diff --git a/source/libs/asura-lib-core/graphics/render_state.h b/source/libs/asura-lib-core/graphics/render_state.h
new file mode 100644
index 0000000..a80efd3
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/render_state.h
@@ -0,0 +1,50 @@
+#ifndef __ASURA_ENGINE_RENDER_STATE_H__
+#define __ASURA_ENGINE_RENDER_STATE_H__
+
+#include "Math/Vector2.hpp"
+#include "Math/Rect.hpp"
+#include "Math/Transform.h"
+
+#include "Shader.h"
+#include "blend_mode.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// Ⱦǰķʽ
+ ///
+ struct RenderState ASURA_FINAL
+ {
+ ///
+ /// Ĭϵrender state
+ ///
+ static RenderState Default;
+
+ RenderState();
+ ~RenderState();
+
+ ///
+ /// λášλúת
+ ///
+
+ Math::Transform transform;
+
+ ///
+ /// ɫ
+ ///
+ Shader* shader;
+
+ ///
+ /// Ϸʽ
+ ///
+ BlendMode blendMode;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/render_target.cpp b/source/libs/asura-lib-core/graphics/render_target.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/render_target.cpp
diff --git a/source/libs/asura-lib-core/graphics/render_target.h b/source/libs/asura-lib-core/graphics/render_target.h
new file mode 100644
index 0000000..d6de164
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/render_target.h
@@ -0,0 +1,54 @@
+#ifndef __ASURA_ENGINE_RENDERTARGET_H__
+#define __ASURA_ENGINE_RENDERTARGET_H__
+
+#include "Math/Rect.hpp"
+#include "Texture.h"
+#include "Scripting/Portable.h"
+#include "Color.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class Drawable;
+
+ ///
+ /// ɱΪȾĿ࣬
+ /// Canvas(RenderTexture)
+ /// Window(RenderWindow)
+ ///
+ class RenderTarget
+ {
+ public:
+
+ RenderTarget() {};
+
+ virtual ~RenderTarget() {};
+
+ ///
+ /// ɫcolRT
+ ///
+ virtual void Clear(const Color& col = Color::Black) = 0;
+
+ ///
+ /// ɫcolղRT
+ ///
+ virtual void Clear(const Math::Recti& quad, const Color& col = Color::Black) = 0;
+
+ ///
+ /// textureRT
+ ///
+ virtual void Draw(const Drawable* texture, const RenderState& state) = 0;
+
+ ///
+ /// һtextureRT
+ ///
+ virtual void Draw(const Drawable* texture, const Math::Recti& quad, const RenderState& state) = 0;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/shader.cpp b/source/libs/asura-lib-core/graphics/shader.cpp
new file mode 100644
index 0000000..1a85866
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/shader.cpp
@@ -0,0 +1,81 @@
+#include "Shader.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ Shader::Shader()
+ {
+
+ }
+
+ Shader::~Shader()
+ {
+
+ }
+
+ bool Shader::Load(const std::string& vertexShader, const std::string& fragmentShader)
+ {
+
+ }
+
+ uint Shader::GetUniformLocation(const std::string& uniform)
+ {
+
+ }
+
+ GLuint Shader::GetGLProgramHandle()
+ {
+ return mProgramHandle;
+ }
+
+ void Shader::Use()
+ {
+
+ }
+
+ void Shader::Unuse()
+ {
+
+ }
+
+ void Shader::SetUniformFloat(uint loc, float value)
+ {
+
+ }
+
+ void Shader::SetUniformFloat(uint loc, float value)
+ {
+
+ }
+
+ void Shader::SetUniformTexture(uint loc, const Texture& texture)
+ {
+
+ }
+
+ void Shader::SetUniformVector2(uint loc, const Math::Vector2f& vec2)
+ {
+
+ }
+
+ void Shader::SetUniformVector3(uint loc, const Math::Vector3f& vec3)
+ {
+
+ }
+
+ void Shader::SetUniformVector4(uint loc, const Math::Vector4f& vec4)
+ {
+
+ }
+
+ uint Shader::GetGLTextureUnitCount()
+ {
+ GLint maxTextureUnits = 0;
+ glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
+ return (uint)maxTextureUnits;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/shader.h b/source/libs/asura-lib-core/graphics/shader.h
new file mode 100644
index 0000000..65f214e
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/shader.h
@@ -0,0 +1,125 @@
+#ifndef __ASURA_ENGINE_SHADER_H__
+#define __ASURA_ENGINE_SHADER_H__
+
+#include <map>
+#include <string>
+
+#include "FileSystem/Reloadable.h"
+#include "Scripting/Luax.hpp"
+#include "Math/Vector2.hpp"
+#include "Math/Vector3.hpp"
+#include "Math/Vector4.h"
+#include "Math/Matrix44.h"
+#include "StringMap.hpp"
+#include "scripting/portable.hpp"
+#include "Color.h"
+#include "Manager.hpp"
+#include "Texture.h"
+#include "GL.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// һshaderһڲʼ乲ijShaderuniformsͶݣֻṩuniformsuseɫķ༭
+ /// ÿshaderͨshaderҵuniforms¶frameworkmaterialá
+ ///
+ class Shader ASURA_FINAL
+ : public Scripting::Portable<Shader>
+ , public Filesystem::Reloadable
+ {
+ public:
+
+ Shader();
+
+ ~Shader();
+
+ ///
+ /// ӴshaderʱȼǷϴλuniforms location mapʹglAttachShader±ɫ
+ /// ɫ
+ ///
+ bool Load(const std::string& vertexShader, const std::string& fragmentShader);
+
+ ///
+ /// shaderΪ
+ ///
+ void Use();
+
+ ///
+ /// shaderΪǻ
+ ///
+ void Unuse();
+
+ ///
+ /// Ѿ֪uniform location£ֵ
+ ///
+ void SetUniformFloat(uint loc, float value);
+ void SetUniformTexture(uint loc, const Texture& texture);
+ void SetUniformVector2(uint loc, const Math::Vector2f& vec2);
+ void SetUniformVector3(uint loc, const Math::Vector3f& vec3);
+ void SetUniformVector4(uint loc, const Math::Vector4f& vec4);
+ void SetUniformColor(uint loc, const Color& color);
+ void SetUniformMatrix44(uint loc, const Math::Matrix44& mat44);
+
+ uint GetUniformLocation(const std::string& uniform);
+
+ bool HasUniform(const std::string& uniform);
+
+ GLuint GetGLProgramHandle();
+
+ ///
+ /// texture unitһΪ16
+ ///
+ static uint GetGLTextureUnitCount();
+
+ private:
+
+ ///
+ /// ǰshader
+ ///
+ static Shader* mCurrentShader;
+
+ ///
+ /// ñ
+ /// vec2 Asura_Time xֵΪ뵱ǰʼʱ䣬yֵΪһ֡ʱ
+ /// vec2 Asura_RenderTargetSize RTĴСΪλ
+ /// Texture Asura_MainTexture
+ ///
+ void SetBuiltInUniforms();
+
+ ///
+ /// OpenGL shader program handle.
+ ///
+ GLuint mProgramHandle;
+
+ //------------------------------------------------------------------------------------------------------------
+
+ public:
+
+ LUAX_DECL_FACTORY(SimShader);
+
+ LUAX_DECL_METHOD(l_Use);
+ LUAX_DECL_METHOD(l_Unuse);
+ LUAX_DECL_METHOD(l_Load);
+ LUAX_DECL_METHOD(l_HasUniform);
+ LUAX_DECL_METHOD(l_GetUniformLocation);
+ LUAX_DECL_METHOD(l_SetBuiltInUniforms);
+ LUAX_DECL_METHOD(l_SetUniformFloat);
+ LUAX_DECL_METHOD(l_SetUniformTexture);
+ LUAX_DECL_METHOD(l_SetUniformVector2);
+ LUAX_DECL_METHOD(l_SetUniformVector3);
+ LUAX_DECL_METHOD(l_SetUniformVector4);
+ LUAX_DECL_METHOD(l_SetUniformColor);
+
+ private:
+
+ Luax::LuaxMemberRef mCodeLuaRef;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/shape.cpp b/source/libs/asura-lib-core/graphics/shape.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/shape.cpp
diff --git a/source/libs/asura-lib-core/graphics/shape.h b/source/libs/asura-lib-core/graphics/shape.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/shape.h
diff --git a/source/libs/asura-lib-core/graphics/sprite_batch.cpp b/source/libs/asura-lib-core/graphics/sprite_batch.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/sprite_batch.cpp
diff --git a/source/libs/asura-lib-core/graphics/sprite_batch.h b/source/libs/asura-lib-core/graphics/sprite_batch.h
new file mode 100644
index 0000000..7909519
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/sprite_batch.h
@@ -0,0 +1,28 @@
+#ifndef __ASURA_ENGINE_SPRITE_BATCH_H__
+#define __ASURA_ENGINE_SPRITE_BATCH_H__
+
+#include "Scripting/Portable.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// Sprite batchȾͼƬĵطϵͳ
+ ///
+ class SpriteBatch ASURA_FINAL
+ : public Scripting::Portable<SpriteBatch>
+ {
+ public:
+
+ SpriteBatch();
+
+ ~SpriteBatch();
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/stb_decoder.cpp b/source/libs/asura-lib-core/graphics/stb_decoder.cpp
new file mode 100644
index 0000000..b14d0f3
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/stb_decoder.cpp
@@ -0,0 +1,65 @@
+#include "STBDecoder.h"
+
+#include "Exceptions/Exception.h"
+#include "stb/stb_image.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ bool STBDecoder::CanDecode(const Filesystem::DataBuffer& buffer)
+ {
+ int w = 0;
+ int h = 0;
+ int comp = 0;
+
+ int status = stbi_info_from_memory((const stbi_uc*)buffer.data, buffer.size, &w, &h, &comp);
+
+ return status == 1 && w > 0 && h > 0;
+ }
+
+ void STBDecoder::Decode(const Filesystem::DataBuffer& db, ImageData& imageData)
+ {
+ const stbi_uc *buffer = (const stbi_uc *)db.data;
+ int bufferlen = db.size;
+ int width, height;
+ int comp = 0;
+ byte* data = nullptr;
+ PixelFormat format = PIXELFORMAT_UNKNOWN;
+ std::size_t size = 0;
+
+ if (stbi_is_hdr_from_memory(buffer, bufferlen))
+ {
+ // 4channelfloat
+ data = (byte*)stbi_loadf_from_memory(buffer, bufferlen, &width, &height, &comp, STBI_rgb_alpha);
+ format = PIXELFORMAT_RGBA32F;
+ size = width * height * 4 * sizeof(float);
+ }
+ else
+ {
+ data = (byte*)stbi_load_from_memory(buffer, bufferlen, &width, &height, &comp, STBI_rgb_alpha);
+ format = PIXELFORMAT_ASTC_8x5;
+ size = width * height * 4;
+ }
+ if (data)
+ {
+ // ֤ڴ汻ͷţһϲûͷŵΪimage dataһԵģimageǶεġ
+ if (imageData.pixels)
+ delete[] imageData.pixels;
+ imageData.pixels = (byte*)data;
+ imageData.format = format;
+ imageData.width = width;
+ imageData.height = height;
+ }
+ else
+ {
+ const char *err = stbi_failure_reason();
+ if (err == nullptr)
+ err = "unknown error";
+ throw Exception("Could not decode image with stb_image (%s).", err);
+ }
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/stb_decoder.h b/source/libs/asura-lib-core/graphics/stb_decoder.h
new file mode 100644
index 0000000..57b247c
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/stb_decoder.h
@@ -0,0 +1,28 @@
+#ifndef __ASURA_ENGINE_STBDECODER_H__
+#define __ASURA_ENGINE_STBDECODER_H__
+
+#include "image_decoder.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// ʹstb_imageѹJPEGTGABMPļ
+ ///
+ class STBDecoder ASURA_FINAL
+ : public ImageDecoder
+ {
+ public:
+
+ bool CanDecode(const Filesystem::DataBuffer& buffer) override;
+
+ void Decode(const Filesystem::DataBuffer& buffer, ImageData& data) override;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/texture.cpp b/source/libs/asura-lib-core/graphics/texture.cpp
new file mode 100644
index 0000000..6cb6497
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/texture.cpp
@@ -0,0 +1,26 @@
+#include "Texture.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ Texture::Texture()
+ : mTextureHandle(0)
+ {
+ // GL texture
+ glGenTextures(1, &mTextureHandle);
+ }
+
+ Texture::~Texture()
+ {
+ glDeleteTextures(1, &mTextureHandle);
+ }
+
+ GLuint Texture::GetGLTextureHandle() const
+ {
+ return mTextureHandle;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/texture.h b/source/libs/asura-lib-core/graphics/texture.h
new file mode 100644
index 0000000..81aa469
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/texture.h
@@ -0,0 +1,66 @@
+#ifndef __ASURA_ENGINE_TEXTURE_H__
+#define __ASURA_ENGINE_TEXTURE_H__
+
+#include "Config.h"
+#include "Math/Rect.hpp"
+#include "Math/Vector2.hpp"
+#include "Scripting/Luax.hpp"
+#include "RenderState.h"
+#include "GL.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class RenderTarget;
+
+ ///
+ /// 2D࣬2d meshrender targetбʹáTextureȾԭϽǣϷϲԵѿϵΪ׼
+ /// EditorҲϽΪԭ㣬Ϊ˷㡣
+ ///
+ ASURA_ABSTRACT class Texture
+ {
+ public:
+
+ Texture();
+
+ virtual ~Texture();
+
+ GLuint GetGLTextureHandle() const;
+
+ ///
+ /// ȾtexturertϣԭϽǣң
+ ///
+ virtual void Render(const RenderTarget* rt, const RenderState& state) = 0;
+
+ ///
+ /// ȾtextureһֵrtϣԭϽǣң졣
+ ///
+ virtual void Render(const RenderTarget* rt, const Math::Rectf& quad, const RenderState& state) = 0;
+
+ ///
+ /// ù˷ʽ
+ ///
+ void SetSmooth(bool smooth);
+
+ ///
+ /// ظʽ
+ ///
+ void SetRepeated();
+
+ protected:
+
+ ///
+ /// OpenGL texture handle
+ ///
+ GLuint mTextureHandle;
+
+ };
+
+ using Drawable = Texture;
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/window.cpp b/source/libs/asura-lib-core/graphics/window.cpp
new file mode 100644
index 0000000..83a4f53
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/window.cpp
@@ -0,0 +1,50 @@
+#include "Config.h"
+#include "Window.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ Window::Window(WindowStyle style)
+ {
+ }
+
+ Window::~Window()
+ {
+
+ }
+
+ void Window::SetPosition(int x, int y)
+ {
+ ASSERT(mWindowHandle);
+ SDL_SetWindowPosition(mWindowHandle, x, y);
+ }
+
+ void Window::SetTitle(const std::string& title)
+ {
+
+ }
+
+ void Window::Show()
+ {
+
+ }
+
+ void Window::Hide()
+ {
+
+ }
+
+ void Window::SetWindowStyle(WindowStyle style)
+ {
+
+ }
+
+ void Window::SwapRenderBuffer()
+ {
+
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/window.h b/source/libs/asura-lib-core/graphics/window.h
new file mode 100644
index 0000000..cb036f1
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/window.h
@@ -0,0 +1,68 @@
+#ifndef __ASURA_ENGINE_WINDOW_H__
+#define __ASURA_ENGINE_WINDOW_H__
+
+#include "../scripting/portable.hpp"
+#include "../math/vector2.hpp"
+#include "render_state.h"
+#include "render_target.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ enum WindowStyle
+ {
+ WINDOW_STYLE_FULLSCREEN = 1 << 1,
+ };
+
+ ///
+ /// ڣֶ֧രڡڱ༭Ҫ֧֣runnerֻҪһڡͬĿͻʵִ˽ӿڲֶעᵽlua
+ ///
+ ASURA_ABSTRACT class Window
+ : public RenderTarget
+ {
+ public:
+
+ Window(WindowStyle style);
+
+ ~Window();
+
+ virtual void SetSize(uint width, uint height) = 0;
+
+ virtual void SetPosition(int x, int y) = 0;
+
+ virtual void SetTitle(const std::string& title) = 0;
+
+ virtual void SetWindowStyle(WindowStyle style) = 0;
+
+ virtual void Show() = 0;
+
+ virtual void Hide() = 0;
+
+ ///
+ /// ǿ˫ĴڣҪչʾǰ̨
+ ///
+ virtual void SwapRenderBuffer() = 0;
+
+ virtual void Clear(const Color& col = Color::Black) = 0;
+
+ virtual void Clear(const Math::Recti& quad, const Color& col = Color::Black) = 0;
+
+ virtual void Draw(const Drawable* texture, const RenderState& state) = 0;
+
+ virtual void Draw(const Drawable* texture, const Math::Recti& quad, const RenderState& state) = 0;
+
+ protected:
+
+ Math::Vector2i mPosition;
+ Math::Vector2i mSize;
+
+ };
+
+ using RenderWindow = Window;
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/input/clipboard.cpp b/source/libs/asura-lib-core/input/clipboard.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/input/clipboard.cpp
diff --git a/source/libs/asura-lib-core/input/clipboard.h b/source/libs/asura-lib-core/input/clipboard.h
new file mode 100644
index 0000000..4cecd55
--- /dev/null
+++ b/source/libs/asura-lib-core/input/clipboard.h
@@ -0,0 +1,37 @@
+#ifndef __ASURA_ENGINE_CLIPBOARD_H__
+#define __ASURA_ENGINE_CLIPBOARD_H__
+
+#include "Text/String.hpp"
+#include "InputDevice.hpp"
+
+namespace AsuraEngine
+{
+ namespace Input
+ {
+
+ class Clipboard ASURA_FINAL : public InputDevice<Clipboard>
+ {
+ public:
+
+ Clipboard();
+
+ Text::String GetString();
+
+ void SetString(const Text::String& text);
+
+ //----------------------------------------------------------------------------------------------------------
+
+ LUAX_DECL_SINGLETON(Clipboard);
+
+ //----------------------------------------------------------------------------------------------------------
+
+ private:
+
+ ~Clipboard();
+
+ };
+
+ };
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/input/cursor.cpp b/source/libs/asura-lib-core/input/cursor.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/input/cursor.cpp
diff --git a/source/libs/asura-lib-core/input/cursor.defs b/source/libs/asura-lib-core/input/cursor.defs
new file mode 100644
index 0000000..f8b8492
--- /dev/null
+++ b/source/libs/asura-lib-core/input/cursor.defs
@@ -0,0 +1,25 @@
+
+// Types of system cursors.
+enum SystemCursor
+{
+ CURSOR_ARROW,
+ CURSOR_IBEAM,
+ CURSOR_WAIT,
+ CURSOR_CROSSHAIR,
+ CURSOR_WAITARROW,
+ CURSOR_SIZENWSE,
+ CURSOR_SIZENESW,
+ CURSOR_SIZEWE,
+ CURSOR_SIZENS,
+ CURSOR_SIZEALL,
+ CURSOR_NO,
+ CURSOR_HAND,
+ CURSOR_MAX_ENUM
+};
+
+enum CursorType
+{
+ CURSORTYPE_SYSTEM,
+ CURSORTYPE_IMAGE,
+ CURSORTYPE_MAX_ENUM
+};
diff --git a/source/libs/asura-lib-core/input/cursor.h b/source/libs/asura-lib-core/input/cursor.h
new file mode 100644
index 0000000..da4a765
--- /dev/null
+++ b/source/libs/asura-lib-core/input/cursor.h
@@ -0,0 +1,55 @@
+
+#ifndef __ASURA_ENGINE_CURSOR_H__
+#define __ASURA_ENGINE_CURSOR_H__
+
+#include <SDL2/SDL.h>
+
+#include "Scripting/Portable.h"
+#include "Graphics/ImageData.h"
+#include "InputDevice.hpp"
+
+namespace AsuraEngine
+{
+ namespace Input
+ {
+
+ class Cursor : public Scripting::Portable
+ {
+ public:
+
+ // ָö
+ #include "Cursor.defs"
+
+ Cursor(Graphics::ImageData& imageData, int hotx, int hoty);
+ Cursor(SystemCursor cursortype);
+
+ ~Cursor();
+
+ SDL_Cursor* GetHandle() const;
+ CursorType GetType() const;
+ SystemCursor GetSystemType() const;
+
+ private:
+
+ SDL_Cursor* mCursorHandle;
+
+ CursorType mType;
+ SystemCursor mSystemType;
+
+ public:
+
+ //----------------------------------------------------------------------------------------------------------
+
+ LUAX_DECL_FACTORY(Cursor);
+
+ LUAX_DECL_ENUM(EnumCursorType);
+ LUAX_DECL_ENUM(EnumSystemCursor);
+
+ //----------------------------------------------------------------------------------------------------------
+
+ };
+
+ }
+}
+
+#endif
diff --git a/source/libs/asura-lib-core/input/input_device.hpp b/source/libs/asura-lib-core/input/input_device.hpp
new file mode 100644
index 0000000..eb0b7a3
--- /dev/null
+++ b/source/libs/asura-lib-core/input/input_device.hpp
@@ -0,0 +1,30 @@
+#ifndef __ASURA_ENGINE_INPUT_BASE_H__
+#define __ASURA_ENGINE_INPUT_BASE_H__
+
+#include "Scripting/Portable.h"
+#include "Config.h"
+#include "Singleton.hpp"
+
+namespace AsuraEngine
+{
+ namespace Input
+ {
+
+ ///
+ /// 豸һ
+ ///
+ template<class T>
+ ASURA_ABSTRACT class InputDevice
+ : virtual public Scripting::Portable
+ , virtual public Singleton<T>
+ {
+ public:
+ InputDevice();
+ virtual ~InputDevice();
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/input/keyboard.cpp b/source/libs/asura-lib-core/input/keyboard.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/input/keyboard.cpp
diff --git a/source/libs/asura-lib-core/input/keyboard.defs b/source/libs/asura-lib-core/input/keyboard.defs
new file mode 100644
index 0000000..8f04dc2
--- /dev/null
+++ b/source/libs/asura-lib-core/input/keyboard.defs
@@ -0,0 +1,482 @@
+
+/**
+* Keyboard keys. They are dependent on the current layout of the keyboard.
+**/
+enum Key
+{
+ KEY_UNKNOWN,
+
+ KEY_RETURN,
+ KEY_ESCAPE,
+ KEY_BACKSPACE,
+ KEY_TAB,
+ KEY_SPACE,
+ KEY_EXCLAIM,
+ KEY_QUOTEDBL,
+ KEY_HASH,
+ KEY_PERCENT,
+ KEY_DOLLAR,
+ KEY_AMPERSAND,
+ KEY_QUOTE,
+ KEY_LEFTPAREN,
+ KEY_RIGHTPAREN,
+ KEY_ASTERISK,
+ KEY_PLUS,
+ KEY_COMMA,
+ KEY_MINUS,
+ KEY_PERIOD,
+ KEY_SLASH,
+ KEY_0,
+ KEY_1,
+ KEY_2,
+ KEY_3,
+ KEY_4,
+ KEY_5,
+ KEY_6,
+ KEY_7,
+ KEY_8,
+ KEY_9,
+ KEY_COLON,
+ KEY_SEMICOLON,
+ KEY_LESS,
+ KEY_EQUALS,
+ KEY_GREATER,
+ KEY_QUESTION,
+ KEY_AT,
+
+ KEY_LEFTBRACKET,
+ KEY_BACKSLASH,
+ KEY_RIGHTBRACKET,
+ KEY_CARET,
+ KEY_UNDERSCORE,
+ KEY_BACKQUOTE,
+ KEY_A,
+ KEY_B,
+ KEY_C,
+ KEY_D,
+ KEY_E,
+ KEY_F,
+ KEY_G,
+ KEY_H,
+ KEY_I,
+ KEY_J,
+ KEY_K,
+ KEY_L,
+ KEY_M,
+ KEY_N,
+ KEY_O,
+ KEY_P,
+ KEY_Q,
+ KEY_R,
+ KEY_S,
+ KEY_T,
+ KEY_U,
+ KEY_V,
+ KEY_W,
+ KEY_X,
+ KEY_Y,
+ KEY_Z,
+
+ KEY_CAPSLOCK,
+
+ KEY_F1,
+ KEY_F2,
+ KEY_F3,
+ KEY_F4,
+ KEY_F5,
+ KEY_F6,
+ KEY_F7,
+ KEY_F8,
+ KEY_F9,
+ KEY_F10,
+ KEY_F11,
+ KEY_F12,
+
+ KEY_PRINTSCREEN,
+ KEY_SCROLLLOCK,
+ KEY_PAUSE,
+ KEY_INSERT,
+ KEY_HOME,
+ KEY_PAGEUP,
+ KEY_DELETE,
+ KEY_END,
+ KEY_PAGEDOWN,
+ KEY_RIGHT,
+ KEY_LEFT,
+ KEY_DOWN,
+ KEY_UP,
+
+ KEY_NUMLOCKCLEAR,
+ KEY_KP_DIVIDE,
+ KEY_KP_MULTIPLY,
+ KEY_KP_MINUS,
+ KEY_KP_PLUS,
+ KEY_KP_ENTER,
+ KEY_KP_1,
+ KEY_KP_2,
+ KEY_KP_3,
+ KEY_KP_4,
+ KEY_KP_5,
+ KEY_KP_6,
+ KEY_KP_7,
+ KEY_KP_8,
+ KEY_KP_9,
+ KEY_KP_0,
+ KEY_KP_PERIOD,
+ KEY_KP_COMMA,
+ KEY_KP_EQUALS,
+
+ KEY_APPLICATION,
+ KEY_POWER,
+ KEY_F13,
+ KEY_F14,
+ KEY_F15,
+ KEY_F16,
+ KEY_F17,
+ KEY_F18,
+ KEY_F19,
+ KEY_F20,
+ KEY_F21,
+ KEY_F22,
+ KEY_F23,
+ KEY_F24,
+ KEY_EXECUTE,
+ KEY_HELP,
+ KEY_MENU,
+ KEY_SELECT,
+ KEY_STOP,
+ KEY_AGAIN,
+ KEY_UNDO,
+ KEY_CUT,
+ KEY_COPY,
+ KEY_PASTE,
+ KEY_FIND,
+ KEY_MUTE,
+ KEY_VOLUMEUP,
+ KEY_VOLUMEDOWN,
+
+ KEY_ALTERASE,
+ KEY_SYSREQ,
+ KEY_CANCEL,
+ KEY_CLEAR,
+ KEY_PRIOR,
+ KEY_RETURN2,
+ KEY_SEPARATOR,
+ KEY_OUT,
+ KEY_OPER,
+ KEY_CLEARAGAIN,
+
+ KEY_THOUSANDSSEPARATOR,
+ KEY_DECIMALSEPARATOR,
+ KEY_CURRENCYUNIT,
+ KEY_CURRENCYSUBUNIT,
+
+ KEY_LCTRL,
+ KEY_LSHIFT,
+ KEY_LALT,
+ KEY_LGUI,
+ KEY_RCTRL,
+ KEY_RSHIFT,
+ KEY_RALT,
+ KEY_RGUI,
+
+ KEY_MODE,
+
+ KEY_AUDIONEXT,
+ KEY_AUDIOPREV,
+ KEY_AUDIOSTOP,
+ KEY_AUDIOPLAY,
+ KEY_AUDIOMUTE,
+ KEY_MEDIASELECT,
+ KEY_WWW,
+ KEY_MAIL,
+ KEY_CALCULATOR,
+ KEY_COMPUTER,
+ KEY_APP_SEARCH,
+ KEY_APP_HOME,
+ KEY_APP_BACK,
+ KEY_APP_FORWARD,
+ KEY_APP_STOP,
+ KEY_APP_REFRESH,
+ KEY_APP_BOOKMARKS,
+
+ KEY_BRIGHTNESSDOWN,
+ KEY_BRIGHTNESSUP,
+ KEY_DISPLAYSWITCH,
+ KEY_KBDILLUMTOGGLE,
+ KEY_KBDILLUMDOWN,
+ KEY_KBDILLUMUP,
+ KEY_EJECT,
+ KEY_SLEEP,
+
+ KEY_MAX_ENUM
+};
+
+/**
+* Scancodes represent physical keys independent of the current layout.
+* Their names may not match the names of the keys printed on the keyboard.
+* Some of them are very esoteric...
+**/
+enum Scancode
+{
+ SCANCODE_UNKNOWN,
+
+ SCANCODE_A,
+ SCANCODE_B,
+ SCANCODE_C,
+ SCANCODE_D,
+ SCANCODE_E,
+ SCANCODE_F,
+ SCANCODE_G,
+ SCANCODE_H,
+ SCANCODE_I,
+ SCANCODE_J,
+ SCANCODE_K,
+ SCANCODE_L,
+ SCANCODE_M,
+ SCANCODE_N,
+ SCANCODE_O,
+ SCANCODE_P,
+ SCANCODE_Q,
+ SCANCODE_R,
+ SCANCODE_S,
+ SCANCODE_T,
+ SCANCODE_U,
+ SCANCODE_V,
+ SCANCODE_W,
+ SCANCODE_X,
+ SCANCODE_Y,
+ SCANCODE_Z,
+
+ SCANCODE_1,
+ SCANCODE_2,
+ SCANCODE_3,
+ SCANCODE_4,
+ SCANCODE_5,
+ SCANCODE_6,
+ SCANCODE_7,
+ SCANCODE_8,
+ SCANCODE_9,
+ SCANCODE_0,
+
+ SCANCODE_RETURN,
+ SCANCODE_ESCAPE,
+ SCANCODE_BACKSPACE,
+ SCANCODE_TAB,
+ SCANCODE_SPACE,
+
+ SCANCODE_MINUS,
+ SCANCODE_EQUALS,
+ SCANCODE_LEFTBRACKET,
+ SCANCODE_RIGHTBRACKET,
+ SCANCODE_BACKSLASH,
+ SCANCODE_NONUSHASH,
+ SCANCODE_SEMICOLON,
+ SCANCODE_APOSTROPHE,
+ SCANCODE_GRAVE,
+ SCANCODE_COMMA,
+ SCANCODE_PERIOD,
+ SCANCODE_SLASH,
+
+ SCANCODE_CAPSLOCK,
+
+ SCANCODE_F1,
+ SCANCODE_F2,
+ SCANCODE_F3,
+ SCANCODE_F4,
+ SCANCODE_F5,
+ SCANCODE_F6,
+ SCANCODE_F7,
+ SCANCODE_F8,
+ SCANCODE_F9,
+ SCANCODE_F10,
+ SCANCODE_F11,
+ SCANCODE_F12,
+
+ SCANCODE_PRINTSCREEN,
+ SCANCODE_SCROLLLOCK,
+ SCANCODE_PAUSE,
+ SCANCODE_INSERT,
+ SCANCODE_HOME,
+ SCANCODE_PAGEUP,
+ SCANCODE_DELETE,
+ SCANCODE_END,
+ SCANCODE_PAGEDOWN,
+ SCANCODE_RIGHT,
+ SCANCODE_LEFT,
+ SCANCODE_DOWN,
+ SCANCODE_UP,
+
+ SCANCODE_NUMLOCKCLEAR,
+ SCANCODE_KP_DIVIDE,
+ SCANCODE_KP_MULTIPLY,
+ SCANCODE_KP_MINUS,
+ SCANCODE_KP_PLUS,
+ SCANCODE_KP_ENTER,
+ SCANCODE_KP_1,
+ SCANCODE_KP_2,
+ SCANCODE_KP_3,
+ SCANCODE_KP_4,
+ SCANCODE_KP_5,
+ SCANCODE_KP_6,
+ SCANCODE_KP_7,
+ SCANCODE_KP_8,
+ SCANCODE_KP_9,
+ SCANCODE_KP_0,
+ SCANCODE_KP_PERIOD,
+
+ SCANCODE_NONUSBACKSLASH,
+ SCANCODE_APPLICATION,
+ SCANCODE_POWER,
+ SCANCODE_KP_EQUALS,
+ SCANCODE_F13,
+ SCANCODE_F14,
+ SCANCODE_F15,
+ SCANCODE_F16,
+ SCANCODE_F17,
+ SCANCODE_F18,
+ SCANCODE_F19,
+ SCANCODE_F20,
+ SCANCODE_F21,
+ SCANCODE_F22,
+ SCANCODE_F23,
+ SCANCODE_F24,
+ SCANCODE_EXECUTE,
+ SCANCODE_HELP,
+ SCANCODE_MENU,
+ SCANCODE_SELECT,
+ SCANCODE_STOP,
+ SCANCODE_AGAIN,
+ SCANCODE_UNDO,
+ SCANCODE_CUT,
+ SCANCODE_COPY,
+ SCANCODE_PASTE,
+ SCANCODE_FIND,
+ SCANCODE_MUTE,
+ SCANCODE_VOLUMEUP,
+ SCANCODE_VOLUMEDOWN,
+ SCANCODE_KP_COMMA,
+ SCANCODE_KP_EQUALSAS400,
+
+ SCANCODE_INTERNATIONAL1,
+ SCANCODE_INTERNATIONAL2,
+ SCANCODE_INTERNATIONAL3,
+ SCANCODE_INTERNATIONAL4,
+ SCANCODE_INTERNATIONAL5,
+ SCANCODE_INTERNATIONAL6,
+ SCANCODE_INTERNATIONAL7,
+ SCANCODE_INTERNATIONAL8,
+ SCANCODE_INTERNATIONAL9,
+ SCANCODE_LANG1,
+ SCANCODE_LANG2,
+ SCANCODE_LANG3,
+ SCANCODE_LANG4,
+ SCANCODE_LANG5,
+ SCANCODE_LANG6,
+ SCANCODE_LANG7,
+ SCANCODE_LANG8,
+ SCANCODE_LANG9,
+
+ SCANCODE_ALTERASE,
+ SCANCODE_SYSREQ,
+ SCANCODE_CANCEL,
+ SCANCODE_CLEAR,
+ SCANCODE_PRIOR,
+ SCANCODE_RETURN2,
+ SCANCODE_SEPARATOR,
+ SCANCODE_OUT,
+ SCANCODE_OPER,
+ SCANCODE_CLEARAGAIN,
+ SCANCODE_CRSEL,
+ SCANCODE_EXSEL,
+
+ SCANCODE_KP_00,
+ SCANCODE_KP_000,
+ SCANCODE_THOUSANDSSEPARATOR,
+ SCANCODE_DECIMALSEPARATOR,
+ SCANCODE_CURRENCYUNIT,
+ SCANCODE_CURRENCYSUBUNIT,
+ SCANCODE_KP_LEFTPAREN,
+ SCANCODE_KP_RIGHTPAREN,
+ SCANCODE_KP_LEFTBRACE,
+ SCANCODE_KP_RIGHTBRACE,
+ SCANCODE_KP_TAB,
+ SCANCODE_KP_BACKSPACE,
+ SCANCODE_KP_A,
+ SCANCODE_KP_B,
+ SCANCODE_KP_C,
+ SCANCODE_KP_D,
+ SCANCODE_KP_E,
+ SCANCODE_KP_F,
+ SCANCODE_KP_XOR,
+ SCANCODE_KP_POWER,
+ SCANCODE_KP_PERCENT,
+ SCANCODE_KP_LESS,
+ SCANCODE_KP_GREATER,
+ SCANCODE_KP_AMPERSAND,
+ SCANCODE_KP_DBLAMPERSAND,
+ SCANCODE_KP_VERTICALBAR,
+ SCANCODE_KP_DBLVERTICALBAR,
+ SCANCODE_KP_COLON,
+ SCANCODE_KP_HASH,
+ SCANCODE_KP_SPACE,
+ SCANCODE_KP_AT,
+ SCANCODE_KP_EXCLAM,
+ SCANCODE_KP_MEMSTORE,
+ SCANCODE_KP_MEMRECALL,
+ SCANCODE_KP_MEMCLEAR,
+ SCANCODE_KP_MEMADD,
+ SCANCODE_KP_MEMSUBTRACT,
+ SCANCODE_KP_MEMMULTIPLY,
+ SCANCODE_KP_MEMDIVIDE,
+ SCANCODE_KP_PLUSMINUS,
+ SCANCODE_KP_CLEAR,
+ SCANCODE_KP_CLEARENTRY,
+ SCANCODE_KP_BINARY,
+ SCANCODE_KP_OCTAL,
+ SCANCODE_KP_DECIMAL,
+ SCANCODE_KP_HEXADECIMAL,
+
+ SCANCODE_LCTRL,
+ SCANCODE_LSHIFT,
+ SCANCODE_LALT,
+ SCANCODE_LGUI,
+ SCANCODE_RCTRL,
+ SCANCODE_RSHIFT,
+ SCANCODE_RALT,
+ SCANCODE_RGUI,
+
+ SCANCODE_MODE,
+
+ SCANCODE_AUDIONEXT,
+ SCANCODE_AUDIOPREV,
+ SCANCODE_AUDIOSTOP,
+ SCANCODE_AUDIOPLAY,
+ SCANCODE_AUDIOMUTE,
+ SCANCODE_MEDIASELECT,
+ SCANCODE_WWW,
+ SCANCODE_MAIL,
+ SCANCODE_CALCULATOR,
+ SCANCODE_COMPUTER,
+ SCANCODE_AC_SEARCH,
+ SCANCODE_AC_HOME,
+ SCANCODE_AC_BACK,
+ SCANCODE_AC_FORWARD,
+ SCANCODE_AC_STOP,
+ SCANCODE_AC_REFRESH,
+ SCANCODE_AC_BOOKMARKS,
+
+ SCANCODE_BRIGHTNESSDOWN,
+ SCANCODE_BRIGHTNESSUP,
+ SCANCODE_DISPLAYSWITCH,
+ SCANCODE_KBDILLUMTOGGLE,
+ SCANCODE_KBDILLUMDOWN,
+ SCANCODE_KBDILLUMUP,
+ SCANCODE_EJECT,
+ SCANCODE_SLEEP,
+
+ SCANCODE_APP1,
+ SCANCODE_APP2,
+
+ SCANCODE_MAX_ENUM
+};
diff --git a/source/libs/asura-lib-core/input/keyboard.h b/source/libs/asura-lib-core/input/keyboard.h
new file mode 100644
index 0000000..1480d06
--- /dev/null
+++ b/source/libs/asura-lib-core/input/keyboard.h
@@ -0,0 +1,73 @@
+//#ifndef __ASURA_INPUT_KEYBOARD_H__
+//#define __ASURA_INPUT_KEYBOARD_H__
+//
+//#include <SDL2/SDL.h>
+//
+//#include "InputDevice.hpp"
+//#include "Scripting/Portable.h"
+//
+//namespace AsuraEngine
+//{
+// namespace Input
+// {
+//
+// class Keyboard ASURA_FINAL : public InputDevice<Keyboard>
+// {
+// public:
+//
+// // صö
+// #include "Keyboard.defs"
+//
+// Keyboard();
+//
+// void SetKeyRepeat(bool enable);
+// bool HasKeyRepeat() const;
+// bool IsDown(const std::vector<Key> &keylist) const;
+// bool IsScancodeDown(const std::vector<Scancode> &scancodelist) const;
+//
+// Key GetKeyFromScancode(Scancode scancode) const;
+// Scancode GetScancodeFromKey(Key key) const;
+//
+// void SetTextInput(bool enable);
+// void SetTextInput(bool enable, double x, double y, double w, double h);
+// bool HasTextInput() const;
+// bool HasScreenKeyboard() const;
+//
+// bool GetConstant(Scancode in, SDL_Scancode &out);
+// bool GetConstant(SDL_Scancode in, Scancode &out);
+//
+// private:
+//
+// ~Keyboard();
+//
+// public:
+//
+// //----------------------------------------------------------------------------------------------------------
+//
+// LUAX_DECL_SINGLETON(Keyboard); // ͨAsuraEngine.KeyboardֱӷʣûNew
+//
+// LUAX_DECL_ENUM(Key);
+// LUAX_DECL_ENUM(ScanCode);
+//
+// LUAX_DECL_METHOD(SetKeyRepeat);
+// LUAX_DECL_METHOD(HasKeyRepeat);
+// LUAX_DECL_METHOD(IsDown);
+// LUAX_DECL_METHOD(IsScancodeDown);
+//
+// LUAX_DECL_METHOD(GetKeyFromScancode);
+// LUAX_DECL_METHOD(GetScancodeFromKey);
+//
+// LUAX_DECL_METHOD(SetTextInput);
+// LUAX_DECL_METHOD(HasTextInput);
+// LUAX_DECL_METHOD(HasScreenKeyboard);
+//
+// LUAX_DECL_METHOD(GetConstant);
+//
+// //----------------------------------------------------------------------------------------------------------
+//
+// };
+//
+// }
+//}
+//
+//#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/input/mouse.cpp b/source/libs/asura-lib-core/input/mouse.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/input/mouse.cpp
diff --git a/source/libs/asura-lib-core/input/mouse.h b/source/libs/asura-lib-core/input/mouse.h
new file mode 100644
index 0000000..0f34fdd
--- /dev/null
+++ b/source/libs/asura-lib-core/input/mouse.h
@@ -0,0 +1,56 @@
+#ifndef __ASURA_ENGINE_MOUSE_H__
+#define __ASURA_ENGINE_MOUSE_H__
+
+#include "Cursor.h"
+#include "InputDevice.hpp"
+
+namespace AsuraEngine
+{
+ namespace Input
+ {
+
+ class Mouse : public InputDevice<Mouse>
+ {
+ public:
+
+ ///
+ /// ͼƬйָʹϵͳָ
+ ///
+ Cursor *CreateCursor(Graphics::ImageData *data, int hotx, int hoty);
+ Cursor *GetSystemCursor(Cursor::SystemCursor cursortype);
+
+ void SetCursor(Cursor *cursor);
+ void SetCursor() ;
+
+ Cursor* GetCursor() const;
+
+ bool IsCursorSupported() const;
+
+ double GetX() const;
+ double GetY() const;
+ void GetPosition(double &x, double &y) const;
+ void GetX(double x) ;
+ void SetY(double y) ;
+ void SetPosition(double x, double y) ;
+ void SetVisible(bool visible) ;
+ bool IsDown(const std::vector<int> &buttons) const;
+ bool IsVisible() const;
+ void SetGrabbed(bool grab) ;
+ bool IsGrabbed() const;
+ bool SetRelativeMode(bool relative) ;
+ bool GetRelativeMode() const;
+
+ //----------------------------------------------------------------------------------------------------------
+
+ LUAX_DECL_SINGLETON(Mouse);
+
+ //----------------------------------------------------------------------------------------------------------
+
+ private:
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/manager.hpp b/source/libs/asura-lib-core/manager.hpp
new file mode 100644
index 0000000..7b4e272
--- /dev/null
+++ b/source/libs/asura-lib-core/manager.hpp
@@ -0,0 +1,14 @@
+#ifndef __ASURA_ENGINE_MANAGER_H__
+#define __ASURA_ENGINE_MANAGER_H__
+
+namespace AsuraEngine
+{
+
+ class Manager
+ {
+
+ };
+
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/profiler/stats.cpp b/source/libs/asura-lib-core/profiler/stats.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/profiler/stats.cpp
diff --git a/source/libs/asura-lib-core/profiler/stats.h b/source/libs/asura-lib-core/profiler/stats.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/profiler/stats.h
diff --git a/source/libs/asura-lib-core/singleton.hpp b/source/libs/asura-lib-core/singleton.hpp
new file mode 100644
index 0000000..756209a
--- /dev/null
+++ b/source/libs/asura-lib-core/singleton.hpp
@@ -0,0 +1,59 @@
+#ifndef __ASURA_SINGLETON_H__
+#define __ASURA_SINGLETON_H__
+
+#include "Config.h"
+
+namespace AsuraEngine
+{
+
+ ///
+ /// ̳Singletonڵһʵʱʵ֮ٴʵᱨ
+ ///
+ template<class T>
+ class Singleton
+ {
+ public:
+
+ static T* Get()
+ {
+ // ֮ǰûдһ
+ if (!instance) instance = new T;
+ // ʵ
+ return instance;
+ }
+
+ static void Destroy()
+ {
+ delete instance;
+ instance = nullptr;
+ }
+
+ protected:
+
+ Singleton()
+ {
+ // instanceζִһʵǴġ
+ ASSERT(!instance);
+ // 򣬽ʵΪʵ
+ instance = static_cast<T*>(this);
+ };
+
+ virtual ~Singleton() {};
+
+ static T* instance;
+
+ private:
+
+ Singleton(const Singleton& singleton);
+
+ Singleton& operator = (const Singleton& singleton);
+
+ };
+
+ // ʵʼΪ
+ template<class T>
+ T* Singleton<T>::instance = nullptr;
+
+}
+
+#endif // __ASURA_SINGLETON_H__ \ No newline at end of file
diff --git a/source/libs/asura-lib-core/stringmap.cpp b/source/libs/asura-lib-core/stringmap.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/stringmap.cpp
diff --git a/source/libs/asura-lib-core/stringmap.hpp b/source/libs/asura-lib-core/stringmap.hpp
new file mode 100644
index 0000000..ddba128
--- /dev/null
+++ b/source/libs/asura-lib-core/stringmap.hpp
@@ -0,0 +1,29 @@
+#ifndef __ASURA_ENGINE_STRINGMAP_H__
+#define __ASURA_ENGINE_STRINGMAP_H__
+
+#include <string>
+
+namespace AsuraEngine
+{
+
+ ///
+ /// һ˫һһӦӳ䣬shader uniformsstatemathine state parameterID
+ ///
+ template<typename key_type>
+ class StringMap
+ {
+ public:
+
+ bool ContainsKey(const key_type& key);
+
+ bool ContainsString(const String& str);
+
+ std::string GetStringByKey(const key_type& key);
+
+ key_type GetKeyByString(const String& str);
+
+ };
+
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/time/timer.cpp b/source/libs/asura-lib-core/time/timer.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/time/timer.cpp
diff --git a/source/libs/asura-lib-core/time/timer.h b/source/libs/asura-lib-core/time/timer.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/time/timer.h
diff --git a/source/libs/asura-lib-core/type.h b/source/libs/asura-lib-core/type.h
new file mode 100644
index 0000000..88848d5
--- /dev/null
+++ b/source/libs/asura-lib-core/type.h
@@ -0,0 +1,11 @@
+#ifndef __ASURA_ENGINE_TYPE_H__
+#define __ASURA_ENGINE_TYPE_H__
+
+#include <stdint.h>
+
+namespace AsuraEngine
+{
+
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/compile.bat b/source/libs/asura-lib-framework/compile.bat
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-framework/compile.bat
diff --git a/source/libs/asura-lib-framework/compile.sh b/source/libs/asura-lib-framework/compile.sh
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-framework/compile.sh
diff --git a/source/libs/asura-lib-framework/main.cpp b/source/libs/asura-lib-framework/main.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-framework/main.cpp
diff --git a/source/libs/asura-lib-framework/scripts/ai/behavior_tree.lua b/source/libs/asura-lib-framework/scripts/ai/behavior_tree.lua
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/ai/behavior_tree.lua
diff --git a/source/libs/asura-lib-framework/scripts/ai/state_graph.lua b/source/libs/asura-lib-framework/scripts/ai/state_graph.lua
new file mode 100644
index 0000000..4f563dc
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/ai/state_graph.lua
@@ -0,0 +1,11 @@
+local StateGraph = AsuraEngine.Asset.Extend("StateGraph")
+
+AsuraEngine.StateGraph = StateGraph
+
+function StateGraph.Ctor(self)
+
+end
+
+function StateGraph.ToAsset()
+
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/ai/state_machine.lua b/source/libs/asura-lib-framework/scripts/ai/state_machine.lua
new file mode 100644
index 0000000..6dc5e14
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/ai/state_machine.lua
@@ -0,0 +1,6 @@
+local StateMachine = Class()
+AsuraEngine.StateMachine = StateMachine
+
+function StateMachine.Ctor(self, stategraph)
+ self.stategraph = stategraph
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/audio/sound.lua b/source/libs/asura-lib-framework/scripts/audio/sound.lua
new file mode 100644
index 0000000..d7dea4f
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/audio/sound.lua
@@ -0,0 +1,9 @@
+AsuraEngine.Sound = AsuraEngine.Asset.Extend("Sound")
+
+local Sound = AsuraEngine.Sound
+
+function Sound.Ctor(self)
+
+end
+
+return Sound \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/audio/source.lua b/source/libs/asura-lib-framework/scripts/audio/source.lua
new file mode 100644
index 0000000..7dec511
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/audio/source.lua
@@ -0,0 +1,22 @@
+-- Audio Source
+AsuraEngine.Source = AsuraEngine.Component.Extend("SoundPlayer")
+
+local Source = AsuraEngine.Source
+
+function Source.Ctor(self)
+ self.mSound = nil
+end
+
+function Source.SetSound(sound)
+ self.mSound = sound
+end
+
+function Source.GetSource()
+ return self.mSound
+end
+
+function Source.OnUpdate(dt)
+
+end
+
+return Source \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/class.lua b/source/libs/asura-lib-framework/scripts/class.lua
new file mode 100644
index 0000000..6392483
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/class.lua
@@ -0,0 +1,17 @@
+AsuraEngine.Class = {}
+
+local Class = AsuraEngine.Class
+Class.__index = Class
+
+function Class.Extend(base, classname)
+ local subclass = {}
+ base.__index = base
+ setmetatable(subclass, base)
+ return c
+end
+
+function Class.New(cls)
+ local obj = {}
+ setmetatable(obj, cls)
+ cls.__index = cls
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/component.lua b/source/libs/asura-lib-framework/scripts/component.lua
new file mode 100644
index 0000000..9306f3b
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/component.lua
@@ -0,0 +1,30 @@
+AsuraEngine.Component = AsuraEngine.Class("Component")
+
+local Component = AsuraEngine.Component
+
+-- Component要显示在inspector的变量
+Component.gameobject = AsuraEngine.Type.GameObject
+
+function Component.Extend(cname)
+ self.base(cname)
+ assert(Component.components[cname] == nil)
+
+end
+
+function Component:Ctor(gameobject)
+ self.gameobject = gameobject
+end
+
+function Component:OnEvent(e)
+
+end
+
+function Component:OnUpdate(ms)
+
+end
+
+function Component:OnDraw()
+
+end
+
+return Component \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/filesystem/animation_loader.lua b/source/libs/asura-lib-framework/scripts/filesystem/animation_loader.lua
new file mode 100644
index 0000000..9c57c43
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/filesystem/animation_loader.lua
@@ -0,0 +1,10 @@
+require "AnimationManager"
+require "Animation"
+
+local loader = AsuraEngine.Loader.New("animation")
+local manager = AsuraEngine.AnimationManager
+local Animation = AsuraEngine.Animation
+
+function AnimationLoader.OnLoad(asset)
+ local animation = AsuraEngine.Class()
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/filesystem/asset.lua b/source/libs/asura-lib-framework/scripts/filesystem/asset.lua
new file mode 100644
index 0000000..7cf3905
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/filesystem/asset.lua
@@ -0,0 +1,20 @@
+--
+-- 游戏资源类需要继承Asset类,引擎读取.asset文件寻找对应的loader加载进游戏生成对应的Asset派生类对象。对于脚本,不会
+-- 生成对应的对象,而是直接运行脚本将结果保存。
+--
+AsuraEngine.Asset = AsuraEngine.Class("Asset")
+
+local Asset = AsuraEngine.Asset
+
+function Asset.Ctor(self)
+ self.guid = nil
+end
+
+--获得资源编号
+function Asset.GetGUID(self)
+
+end
+
+function Asset.GetAssetByGUID(guid)
+
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/filesystem/entity_loader.lua b/source/libs/asura-lib-framework/scripts/filesystem/entity_loader.lua
new file mode 100644
index 0000000..57a890f
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/filesystem/entity_loader.lua
@@ -0,0 +1,5 @@
+local loader = AsuraEngine.Loader.New("gameobject")
+
+function loader.OnLoad(asset)
+
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/filesystem/image_loader.lua b/source/libs/asura-lib-framework/scripts/filesystem/image_loader.lua
new file mode 100644
index 0000000..6b0bef7
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/filesystem/image_loader.lua
@@ -0,0 +1,13 @@
+require "graphics.image"
+local loader = AsuraEngine.Loader.New("image")
+
+function loader.OnLoad(asset)
+ assert(asset ~= nil)
+ local path = asset.extern
+ local image = AusraEngine.Image.New(path)
+ if image == nil then
+ AsuraEngine.LogError("")
+ return
+ end
+ return image
+end
diff --git a/source/libs/asura-lib-framework/scripts/filesystem/loader.lua b/source/libs/asura-lib-framework/scripts/filesystem/loader.lua
new file mode 100644
index 0000000..e192e30
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/filesystem/loader.lua
@@ -0,0 +1,12 @@
+-- Assets loaders
+AsuraEngine.Loader = {}
+local Loader = AsuraEngine.Loader
+Loader.Loaders = {}
+
+function Loader.New(type)
+ assert(Loader.Loaders[type] == nil)
+ local loader = {}
+ Loader[type] = loader
+ return loader
+end
+
diff --git a/source/libs/asura-lib-framework/scripts/filesystem/material_loader.lua b/source/libs/asura-lib-framework/scripts/filesystem/material_loader.lua
new file mode 100644
index 0000000..07ca4e9
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/filesystem/material_loader.lua
@@ -0,0 +1,7 @@
+require "MaterialManager"
+
+local loader = AsuraEngine.Loader.New("material")
+
+function loader.OnLoad(asset)
+
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/filesystem/path_loader.lua b/source/libs/asura-lib-framework/scripts/filesystem/path_loader.lua
new file mode 100644
index 0000000..986e42c
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/filesystem/path_loader.lua
@@ -0,0 +1,9 @@
+require "Path/PathManager"
+
+local loader = AsuraEngine.Loader.New("path")
+
+function loader.OnLoad(asset)
+ if asset.type ~= "path" then
+ return nil
+ end
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/filesystem/scene_loader.lua b/source/libs/asura-lib-framework/scripts/filesystem/scene_loader.lua
new file mode 100644
index 0000000..45731f8
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/filesystem/scene_loader.lua
@@ -0,0 +1,7 @@
+local Scene = require "scene"
+
+local loader = AsuraEngine.Loader.New("scene")
+
+function loader.OnLoad(asset)
+
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/filesystem/script_loader.lua b/source/libs/asura-lib-framework/scripts/filesystem/script_loader.lua
new file mode 100644
index 0000000..e93d903
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/filesystem/script_loader.lua
@@ -0,0 +1,5 @@
+local loader = AsuraEngine.Loader.New("script")
+
+function loader.OnLoad(asset)
+
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/filesystem/shader_loader.lua b/source/libs/asura-lib-framework/scripts/filesystem/shader_loader.lua
new file mode 100644
index 0000000..12d88bb
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/filesystem/shader_loader.lua
@@ -0,0 +1,5 @@
+local loader = AsuraEngine.Loader.New("shader")
+
+function loader.OnLoad(asset)
+
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/filesystem/statemap_loader.lua b/source/libs/asura-lib-framework/scripts/filesystem/statemap_loader.lua
new file mode 100644
index 0000000..e52e086
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/filesystem/statemap_loader.lua
@@ -0,0 +1,7 @@
+require "ai/statemap_manager"
+local loader = AsuraEngine.Loader.New("statemap")
+
+--载入statemap
+function loader.OnLoad(asset)
+
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/framework.lua b/source/libs/asura-lib-framework/scripts/framework.lua
new file mode 100644
index 0000000..4643221
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/framework.lua
@@ -0,0 +1,21 @@
+package.path = "scripts\\?.lua"
+
+--loader
+local loadfn = function(modulename)
+ local errmsg = ""
+ local modulepath = string.gsub(modulename, "%.", "/")
+ for path in string.gmatch(package.path, "([^;]+)") do
+ local filename = string.gsub(path, "%?", modulepath)
+ filename = string.gsub(filename, "\\", "/")
+ local result = kleiloadlua(filename)
+ if result then
+ return result
+ end
+ errmsg = errmsg.."\n\tno file '"..filename.."' (checked with custom loader)"
+ end
+ return errmsg
+end
+
+table.insert(package.loaders, 1, loadfn)
+
+require ""
diff --git a/source/libs/asura-lib-framework/scripts/gameobject.lua b/source/libs/asura-lib-framework/scripts/gameobject.lua
new file mode 100644
index 0000000..a2d20ef
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/gameobject.lua
@@ -0,0 +1,115 @@
+--
+-- 实体,作为scene中的实体存在。Scene中唯一管理的就是实体entity,游戏里的所有component都依附于entity存在,包括camera组件。
+--
+require "transform"
+
+AsuraEngine.GameObject = AsuraEngine.Asset.Extend("GameObject")
+
+local GameObject = AsuraEngine.GameObject
+
+function GameObject:Ctor()
+ self.transform = AsuraEngine.Transform.New()
+ self.subentities = {} -- Extend node entities
+end
+
+function GameObject:AddChild(gameobject)
+ table.insert(self.child, gameobject)
+end
+
+function GameObject:AddComponent(type, name)
+ local cname = type
+ if name == nil then
+ cname = name
+ end
+ local component = AsuraEngine.Component.GetComponent(type)
+ self.components[cname] = compoennt
+end
+
+-- 根据组件名拿到组件
+function GameObject:GetComponent(name)
+ return self.components[name]
+end
+
+-- 根据组件类型拿到组件
+function GameObject:GetComponentByType(tname)
+
+end
+
+function GameObject:OnEnable()
+
+end
+
+function GameObject:OnEvent(e)
+ if self.components == nil or type(self.components) ~= "table" then
+ AsuraEditor.LogError("")
+ return
+ end
+ for name, component in self.components do
+ if component.OnEvent ~= nil then
+ component:OnEvent(e)
+ end
+ end
+end
+
+function GameObject:OnUpdate(dt)
+ for name, component in self.components do
+ if component.OnUpdate ~= nil then
+ component:OnUpdate(dt)
+ end
+ end
+end
+
+function GameObject:OnRender()
+ for name, component in self.components do
+ if component.OnRender ~= nil then
+ component.OnRender()
+ end
+ end
+end
+
+function GameObject:OnDisable()
+ for name, component in self.components do
+ if component.OnDisable ~= nil then
+ component.OnDisable()
+ end
+ end
+end
+
+function GameObject:GetTrasform()
+ return self.transform
+end
+
+function GameObject:GetPosition()
+
+end
+
+function GameObject:GetScale()
+
+end
+
+function GameObject:GetRotation()
+
+end
+
+function GameObject:SetTrasform(transform)
+
+end
+
+function GameObject:SetPosition()
+
+end
+
+function GameObject:SetScale()
+
+end
+
+function GameObject:SetRotation()
+
+end
+
+--写asset
+function GameObject:ToAsset()
+
+end
+
+return GameObject \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/animation.lua b/source/libs/asura-lib-framework/scripts/graphics/animation.lua
new file mode 100644
index 0000000..285adaa
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/animation.lua
@@ -0,0 +1,15 @@
+AsuraEngine.Animation = AsuraEngine.Asset.Extend("Animation")
+
+local Animation = AsuraEngine.Animation
+
+local Frame = AsuraEngine.Class("Frame")
+
+function Frame.Ctor(self)
+
+end
+
+function Animation.Ctor(self)
+
+end
+
+return Animation \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/animator.lua b/source/libs/asura-lib-framework/scripts/graphics/animator.lua
new file mode 100644
index 0000000..c019dfa
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/animator.lua
@@ -0,0 +1,33 @@
+local Component = AsuraEngine.Framework.Require("component")
+
+AsuraEngine.Animator = Component.Extend("Animator")
+
+local Animator = AsuraEngine.Animator
+
+-- Animator inspector variables.
+Animator.spriteRenderer = AsuraEngine.Type.SpriteRenderer
+Animator.animation = AsuraEngine.Type.Animation
+
+function Animator:Ctor(gameobject, animation)
+ self.base(gameobject)
+ self.spriteRenderer = gameobject:GetSpriteRenderer()
+ self.animation = animation
+end
+
+function Animator:SetAnimation(animation)
+ self.animation = animation
+end
+
+function Animator:GetAnimation()
+ return self.animation
+end
+
+function Animator:OnUpdate(dt)
+
+end
+
+function Animator:OnRender()
+
+end
+
+return Animator \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/camera.lua b/source/libs/asura-lib-framework/scripts/graphics/camera.lua
new file mode 100644
index 0000000..a989de6
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/camera.lua
@@ -0,0 +1,21 @@
+AsuraEngine.Camera = AsuraEngine.Component.Extend("Camera")
+
+local Camera = AsuraEngine.Camera
+
+Camera.isCulling = AsuraEngine.Type.Bool
+Camera.isOnScreen = AsuraEngine.Type.Bool
+
+function Camera.Ctor(self)
+ self.isCulling = false
+ self.isOnScreen = false
+end
+
+function Camera.OnUpdate(dt)
+
+end
+
+function Camera.OnRender()
+
+end
+
+return Camera \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/canvas.lua b/source/libs/asura-lib-framework/scripts/graphics/canvas.lua
new file mode 100644
index 0000000..ce2ca20
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/canvas.lua
@@ -0,0 +1,34 @@
+AsuraEngine.Canvas = AsuraEngine.Component.Extend("Canvas")
+
+local Canvas = AsuraEngine.Canvas
+
+function Canvas.Ctor(self, width, height)
+ self.simCanvas = AsuraEngine.SimCanvas.New(width, height)
+ self.width = width
+ self.height = height
+end
+
+function Canvas.GetWidth(self)
+ return self.width
+end
+
+function Canvas.GetHeight(self)
+ return self.height
+end
+
+function Canvas.GetSize(self)
+ return self.width, self.height
+end
+
+function Canvas.OnEnable(self)
+ if self.simCanvas == nil then
+ return
+ end
+ self.simCanvas:Begin()
+end
+
+function Canvas.OnDisable(self)
+
+end
+
+return Canvas \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/default_shaders.lua b/source/libs/asura-lib-framework/scripts/graphics/default_shaders.lua
new file mode 100644
index 0000000..bd54cb9
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/default_shaders.lua
@@ -0,0 +1,5 @@
+--[[
+õshaders.
+]]
+
+
diff --git a/source/libs/asura-lib-framework/scripts/graphics/image.lua b/source/libs/asura-lib-framework/scripts/graphics/image.lua
new file mode 100644
index 0000000..f5ebaa2
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/image.lua
@@ -0,0 +1,40 @@
+-- 图片资源
+AsuraEngine.Image = AsuraEngine.Asset.Extend("Image")
+
+local Image = AsuraEngine.Image
+
+function Image.Ctor(self, path)
+ local simImage = AsuraEngine.SimImage.New(path)
+ local w, h = simImage:GetSize()
+ self.simImage = simImage
+ self.width = w
+ self.height = h
+end
+
+function Image.GetWidth(self)
+ return self.simImage.GetWidth()
+end
+
+function Image.GetHeight(self)
+ return self.simImage.GetHeight()
+end
+
+function Image.GetSize(self)
+ return self.simImage.GetSize()
+end
+
+--获得x,y位置的颜色值
+function Image.GetColor(self, x, y)
+ return self.simImage.GetColor(x, y)
+end
+
+--获得所有像素,返回到一个table里
+function Image.GetPixels(self)
+ return self.simImage:GetPixels()
+end
+
+--image不可再编辑器编辑,所以没有ToAsset方法
+--function Image.ToAsset()
+--end
+
+return Image \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/material.lua b/source/libs/asura-lib-framework/scripts/graphics/material.lua
new file mode 100644
index 0000000..5a6e5bd
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/material.lua
@@ -0,0 +1,48 @@
+--material是shader的代理
+AsuraEngine.Material = AsuraEngine.Asset.Extend("Material")
+
+local Material = AsuraEngine.Material
+
+function Material.Ctor(self)
+ self.uniforms = {} --uniform变量和值
+ self.shader = nil
+ self.isShared = false
+end
+
+function Material.Clone(self)
+
+end
+
+function Material:ToAsset()
+
+end
+
+function Material:GetUniform(name)
+
+end
+
+function Material:SetFloat(uniform, value)
+
+end
+
+function Material:SetTexture(uniform, tex)
+
+end
+
+function Material:SetInteger(unifrom, value)
+
+end
+
+function Material:SetVec2(uniform, value)
+
+end
+
+function Material:SetMat44(uniform, value)
+
+end
+
+function Material:GetUniformID()
+
+end
+
+return Material \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/material_manager.lua b/source/libs/asura-lib-framework/scripts/graphics/material_manager.lua
new file mode 100644
index 0000000..086a5db
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/material_manager.lua
@@ -0,0 +1,3 @@
+local MaterialManager = AsuraEngine.Manager.New()
+
+return MaterialManager \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/mesh2d.lua b/source/libs/asura-lib-framework/scripts/graphics/mesh2d.lua
new file mode 100644
index 0000000..05b2e2e
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/mesh2d.lua
@@ -0,0 +1,9 @@
+AsuraEngine.Mesh2D = AsuraEngine.Asset.Extend("Mesh2D")
+
+local Mesh2D = AsuraEngine.Mesh2D
+
+function Mesh2D.Ctor(self)
+
+end
+
+return Mesh2D \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/mesh2d_renderer.lua b/source/libs/asura-lib-framework/scripts/graphics/mesh2d_renderer.lua
new file mode 100644
index 0000000..09c8c98
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/mesh2d_renderer.lua
@@ -0,0 +1,13 @@
+AsuraEngine.Mesh2DRenderer = AsuraEngine.Renderer.Extend("Mesh2DRenderer")
+
+local Mesh2DRenderer = AsuraEngine.Mesh2DRenderer
+
+function Mesh2DRenderer.Ctor(self, material)
+ self.base(material)
+end
+
+function Mesh2DRenderer.OnRender(self)
+
+end
+
+return Mesh2DRenderer \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/particle_system.lua b/source/libs/asura-lib-framework/scripts/graphics/particle_system.lua
new file mode 100644
index 0000000..8de3258
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/particle_system.lua
@@ -0,0 +1,20 @@
+require "graphics.sprite_renderer"
+
+AsuraEngine.ParticleSystem = AsuraEngine.Component.Extend("ParticleSystem")
+
+local ParticleSystem = AsuraEngine.ParticleSystem
+
+function ParticleSystem.Ctor(self, gameobject, def)
+ self.base(gameobject)
+ self.spriteRenderer = AsuraEngine.SpriteRenderer.New()
+end
+
+function ParticleSystem.OnRenderer()
+
+end
+
+function ParticleSystem.OnUpdate(dt)
+
+end
+
+return ParticleSystem \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/renderer.lua b/source/libs/asura-lib-framework/scripts/graphics/renderer.lua
new file mode 100644
index 0000000..92a6409
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/renderer.lua
@@ -0,0 +1,19 @@
+local Renderer = AsuraEngine.Component.Extend("Renderer")
+AsuraEngine.Renderer = Renderer
+
+function Renderer.Ctor(self)
+ self.materials = {}
+ self.material = nil
+ self.isMultiMaterials = false
+end
+
+--取材质,如果是shared,那么从此材质clone一个
+function Renderer.GetMaterial(self)
+
+end
+
+function Renderer.IsMultiMaterials(self)
+ return self.isMultiMaterials
+end
+
+return Renderer \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/shader.lua b/source/libs/asura-lib-framework/scripts/graphics/shader.lua
new file mode 100644
index 0000000..c411619
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/shader.lua
@@ -0,0 +1,75 @@
+AsuraEngine.Shader = AsuraEngine.Asset.Extend("Shader")
+
+local helper = AsuraEngine.Framework.Require("graphics/shaderHelper")
+
+local Shader = AsuraEngine.Shader
+
+function Shader.Ctor(self)
+ self.simShader = nil
+ self.uniforms = {} -- 映射uniform name到location
+end
+
+--编译shader
+function Shader.Load(self, vert, frag)
+ self.uniforms = {}
+ if self.simShader == nil then
+ self.simShader = AsuraEngine.SimShader.New(vert, frag)
+ else
+ self.simShader:Load(vert, frag)
+ end
+ if self.simShader == nil then
+ --shader编译错误
+ return
+ end
+ --在编译的时候就获得所有的uniform和loc
+ local uniforms = helper.GetUniforms(vert, frag)
+ if uniforms == nil then
+ return
+ end
+ for _, uniform in uniforms do
+ self.uniforms[uniform] = self.simShader:GetUniformLocation(uniform)
+ end
+end
+
+function Shader.GetUniformLocation(self, name)
+ if self.uniforms then
+ local id = self.uniforms[name]
+ return id
+ end
+ return 0
+end
+
+function Shader.SendVec2(self, name, vec2)
+ local id = self:GetUniformLocation(name)
+ self.simShader:SendUniformVector2(name, vec2)
+end
+
+function Shader.SendVec3(self, name, vec3)
+
+end
+
+function Shader.SendVec4(self, name, vec4)
+
+end
+
+function Shader.SendTexture(self, name, tex)
+
+end
+
+function Shader.SendFloat(self, name, number)
+
+end
+
+function Shader.SendInteger(self, name, integer)
+
+end
+
+function Shader.SendColor(self, name, color)
+
+end
+
+function Shader.SendMat44(self, name, mat44)
+
+end
+
+return Shader \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/shaderHelper.lua b/source/libs/asura-lib-framework/scripts/graphics/shaderHelper.lua
new file mode 100644
index 0000000..b1b42a6
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/shaderHelper.lua
@@ -0,0 +1,14 @@
+--[[
+解析vertex shader和 fragment shader,并取得两个shader里面定义的uniforms
+]]
+local helper = {}
+
+function helper.GetUniforms(vert, frag)
+
+end
+
+function helper.TryCompileShader(vert, frag)
+
+end
+
+return helper \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/shape.lua b/source/libs/asura-lib-framework/scripts/graphics/shape.lua
new file mode 100644
index 0000000..51ea8c3
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/shape.lua
@@ -0,0 +1,12 @@
+--
+-- 2D图形
+--
+AsuraEngine.Shape = AsuraEngine.Asset.Extend("Shape")
+
+local Shape = AsuraEngine.Shape
+
+function Shape.Ctor(self)
+
+end
+
+return Shape \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/shape_renderer.lua b/source/libs/asura-lib-framework/scripts/graphics/shape_renderer.lua
new file mode 100644
index 0000000..80b48b8
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/shape_renderer.lua
@@ -0,0 +1,13 @@
+AsuraEngine.ShapeRenderer = AsuraEngine.Component.Extend("ShapeRenderer")
+
+local ShapeRenderer = AsuraEngine.ShapeRenderer
+
+function ShapeRenderer.OnRenderer()
+
+end
+
+function ShapeRenderer.OnUpdate(dt)
+
+end
+
+return ShapeRenderer \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/sprite.lua b/source/libs/asura-lib-framework/scripts/graphics/sprite.lua
new file mode 100644
index 0000000..9bf05f4
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/sprite.lua
@@ -0,0 +1,10 @@
+local Sprite = AsuraEngine.Asset.Extend("Sprite")
+AsuraEngine.Sprite = Sprite
+
+function Sprite.Ctor(self, image)
+ self.image = image
+end
+
+function Sprite.ToAsset(self)
+
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/sprite_batch_renderer.lua b/source/libs/asura-lib-framework/scripts/graphics/sprite_batch_renderer.lua
new file mode 100644
index 0000000..9ec73d2
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/sprite_batch_renderer.lua
@@ -0,0 +1,9 @@
+AsuraEngine.SpriteBatchRenderer = AsuraEngine.Component.Extend("SpriteBatchRenderer")
+
+local SpriteBatchRenderer = AsuraEngine.SpriteBatchRenderer
+
+function SpriteBatchRenderer.Ctor(self)
+
+end
+
+return SpriteBatchRenderer \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/graphics/sprite_renderer.lua b/source/libs/asura-lib-framework/scripts/graphics/sprite_renderer.lua
new file mode 100644
index 0000000..0a41e08
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/graphics/sprite_renderer.lua
@@ -0,0 +1,14 @@
+require "graphics.renderer"
+
+local SpriteRenderer = AsuraEngine.Renderer.Extend("Spriterenderer")
+AsuraEngine.SpriteRenderer = SpriteRenderer
+
+function SpriteRenderer.Ctor(self)
+ self.materials = {}
+end
+
+function SpriteRenderer:OnRender()
+
+end
+
+return SpriteRenderer \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/gui/button.lua b/source/libs/asura-lib-framework/scripts/gui/button.lua
new file mode 100644
index 0000000..b122931
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/gui/button.lua
@@ -0,0 +1,21 @@
+AsuraEngine.Button = AsuraEngine.Component.Extend("Button")
+
+local Button = AsuraEngine.Button
+
+function Button.Ctor(self)
+
+end
+
+function Button.OnEvent(e)
+
+end
+
+function Button.OnRender()
+
+end
+
+function Button.OnUpdate(dt)
+
+end
+
+return Button \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/gui/text.lua b/source/libs/asura-lib-framework/scripts/gui/text.lua
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/gui/text.lua
diff --git a/source/libs/asura-lib-framework/scripts/gui/widget.lua b/source/libs/asura-lib-framework/scripts/gui/widget.lua
new file mode 100644
index 0000000..430ade0
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/gui/widget.lua
@@ -0,0 +1,14 @@
+--[[
+Imgui,用在游戏里面
+]]
+local Widget = AsuraEngine.Component("Widget")
+
+function Widget.Ctor(self)
+
+end
+
+function Widget.OnEvent(self, e)
+
+end
+
+return Widget \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/managers/scene_manager.lua b/source/libs/asura-lib-framework/scripts/managers/scene_manager.lua
new file mode 100644
index 0000000..7886dc6
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/managers/scene_manager.lua
@@ -0,0 +1,16 @@
+AsuraEngine.SceneManager = AsuraEngine.Class("SceneManager")
+
+local SceneManager = AsuraEngine.SceneManager
+
+--游戏里的所有场景
+SceneManager.scenes = {}
+
+function SceneManager.Ctor()
+
+end
+
+function SceneManager.GetSceneByGUID()
+
+end
+
+return SceneManager \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/managers/sprite_manager.lua b/source/libs/asura-lib-framework/scripts/managers/sprite_manager.lua
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/managers/sprite_manager.lua
diff --git a/source/libs/asura-lib-framework/scripts/math/curve.lua b/source/libs/asura-lib-framework/scripts/math/curve.lua
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/math/curve.lua
diff --git a/source/libs/asura-lib-framework/scripts/path/path.lua b/source/libs/asura-lib-framework/scripts/path/path.lua
new file mode 100644
index 0000000..1fc9b3a
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/path/path.lua
@@ -0,0 +1,13 @@
+local Path = AsuraEngine.Asset.New("path")
+
+function Path:Ctor()
+
+end
+
+-- ToAssetѶpathתΪ.assetļʽ
+function Path.ToAsset(path)
+ local builder = AsuraEngine.AssetBuilder.Get()
+
+end
+
+return Path \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/path/path_calculator.lua b/source/libs/asura-lib-framework/scripts/path/path_calculator.lua
new file mode 100644
index 0000000..d44da08
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/path/path_calculator.lua
@@ -0,0 +1,12 @@
+--[[
+ڱ༭componentsб
+]]
+local PathCalculator = AsuraEngine.Component.New("PathCalculator")
+
+PathCalculator.path = AsuraEngine.Asset.Type("path", "·")
+
+function PathCalculator:ctor(path)
+ self.path = path
+end
+
+return PathCalculator \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/path/path_manager.lua b/source/libs/asura-lib-framework/scripts/path/path_manager.lua
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/path/path_manager.lua
diff --git a/source/libs/asura-lib-framework/scripts/scene.lua b/source/libs/asura-lib-framework/scripts/scene.lua
new file mode 100644
index 0000000..3036ce1
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/scene.lua
@@ -0,0 +1,22 @@
+--
+-- Scene是一系列gameobject的集合。
+--
+AsuraEngine.Scene = AsuraEngine.Asset.Extend("Scene")
+
+local Scene = AsuraEngine.Scene
+
+function Scene.Ctor(self)
+ self.rootGameObjects = {} --当前场景的所有root gameobject
+ self.super.Ctor(self)
+end
+
+--获取当前的场景
+function Scene.GetCurrent()
+
+end
+
+function Scene.ToAsset()
+
+end
+
+return Scene \ No newline at end of file
diff --git a/source/libs/asura-lib-framework/scripts/transform.lua b/source/libs/asura-lib-framework/scripts/transform.lua
new file mode 100644
index 0000000..1d34ae6
--- /dev/null
+++ b/source/libs/asura-lib-framework/scripts/transform.lua
@@ -0,0 +1,13 @@
+-- transform的起点在左下角,逆时针为正向
+AsuraEngine.Transform = AsuraEngine.Class("Transform")
+local Transform = AsuraEngine.Transform
+
+function Transform.Ctor(self)
+ self.position = {x=0, y=0}
+ self.rotation = 0
+ self.size = {w=0, h=0}
+end
+
+function Transform.Move(self)
+
+end \ No newline at end of file
diff --git a/source/libs/asura-lib-json/json.cpp b/source/libs/asura-lib-json/json.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-json/json.cpp
diff --git a/source/libs/asura-lib-json/json.h b/source/libs/asura-lib-json/json.h
new file mode 100644
index 0000000..2bdaf53
--- /dev/null
+++ b/source/libs/asura-lib-json/json.h
@@ -0,0 +1,14 @@
+#ifndef __ASURA_JSON_H__
+#define __ASURA_JSON_H__
+
+namespace AsuraEngine
+{
+ namespace Json
+ {
+
+
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-json/json_module.cpp b/source/libs/asura-lib-json/json_module.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-json/json_module.cpp
diff --git a/source/libs/asura-lib-json/json_module.h b/source/libs/asura-lib-json/json_module.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-json/json_module.h
diff --git a/source/libs/asura-lib-openal/sound.cpp b/source/libs/asura-lib-openal/sound.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-openal/sound.cpp
diff --git a/source/libs/asura-lib-openal/sound.h b/source/libs/asura-lib-openal/sound.h
new file mode 100644
index 0000000..095bdb7
--- /dev/null
+++ b/source/libs/asura-lib-openal/sound.h
@@ -0,0 +1,27 @@
+#ifndef __ASURA_ENGINE_SOUND_H__
+#define __ASURA_ENGINE_SOUND_H__
+
+#include "Scripting/Portable.h"
+
+namespace AsuraEngine
+{
+ namespace Audio
+ {
+
+ class Sound ASURA_FINAL: virtual public Scripting::Portable
+ {
+ public:
+
+ Sound();
+ ~Sound();
+
+ private:
+
+
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-openal/sound_decoder.h b/source/libs/asura-lib-openal/sound_decoder.h
new file mode 100644
index 0000000..ad9f761
--- /dev/null
+++ b/source/libs/asura-lib-openal/sound_decoder.h
@@ -0,0 +1,29 @@
+#ifndef __ASURA_ENGINE_SOUND_DECODER_H__
+#define __ASURA_ENGINE_SOUND_DECODER_H__
+
+#include "Sound.h"
+#include "FileSystem/DataBuffer.h"
+
+namespace AsuraEngine
+{
+ namespace Audio
+ {
+
+ ///
+ /// Ƶļ
+ ///
+ class SoundDecoder
+ {
+ public:
+
+ SoundDecoder();
+ virtual ~SoundDecoder();
+
+ virtual Sound* Decode(const Filesystem::DataBuffer* db);
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/exceptions/exception.cpp b/source/libs/asura-lib-utils/exceptions/exception.cpp
new file mode 100644
index 0000000..dbb36ca
--- /dev/null
+++ b/source/libs/asura-lib-utils/exceptions/exception.cpp
@@ -0,0 +1,47 @@
+#include "Exception.h"
+
+#include <cstdarg>
+#include <iostream>
+
+namespace AsuraEngine
+{
+
+ Exception::Exception(const char *fmt, ...)
+ {
+ va_list args;
+ int size_buffer = 256, size_out;
+ char *buffer;
+ while (true)
+ {
+ buffer = new char[size_buffer];
+ memset(buffer, 0, size_buffer);
+
+ va_start(args, fmt);
+ size_out = vsnprintf(buffer, size_buffer, fmt, args);
+ va_end(args);
+
+ // see http://perfec.to/vsnprintf/pasprintf.c
+ // if size_out ...
+ // == -1 --> output was truncated
+ // == size_buffer --> output was truncated
+ // == size_buffer-1 --> ambiguous, /may/ have been truncated
+ // > size_buffer --> output was truncated, and size_out
+ // bytes would have been written
+ if (size_out == size_buffer || size_out == -1 || size_out == size_buffer - 1)
+ size_buffer *= 2;
+ else if (size_out > size_buffer)
+ size_buffer = size_out + 2; // to avoid the ambiguous case
+ else
+ break;
+
+ delete[] buffer;
+ }
+ message = std::string(buffer);
+ delete[] buffer;
+ }
+
+ Exception::~Exception() throw()
+ {
+ }
+
+}
diff --git a/source/libs/asura-lib-utils/exceptions/exception.h b/source/libs/asura-lib-utils/exceptions/exception.h
new file mode 100644
index 0000000..bed8a9a
--- /dev/null
+++ b/source/libs/asura-lib-utils/exceptions/exception.h
@@ -0,0 +1,43 @@
+#ifndef __ASURA_ENGINE_EXCEPTION_H__
+#define __ASURA_ENGINE_EXCEPTION_H__
+
+#include <exception>
+
+namespace AsuraEngine
+{
+
+ /**
+ * A convenient vararg-enabled exception class.
+ **/
+ class Exception : public std::exception
+ {
+ public:
+
+ /**
+ * Creates a new Exception according to printf-rules.
+ *
+ * See: http://www.cplusplus.com/reference/clibrary/cstdio/printf/
+ *
+ * @param fmt The format string (see printf).
+ **/
+ Exception(const char *fmt, ...);
+ virtual ~Exception() throw();
+
+ /**
+ * Returns a string containing reason for the exception.
+ * @return A description of the exception.
+ **/
+ inline virtual const char *what() const throw()
+ {
+ return message.c_str();
+ }
+
+ private:
+
+ std::string message;
+
+ }; // Exception
+
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/filesystem/binding/data_buffer.binding.cpp b/source/libs/asura-lib-utils/filesystem/binding/data_buffer.binding.cpp
new file mode 100644
index 0000000..a9113a7
--- /dev/null
+++ b/source/libs/asura-lib-utils/filesystem/binding/data_buffer.binding.cpp
@@ -0,0 +1,68 @@
+#include "../data_buffer.h"
+
+using namespace Luax;
+
+namespace AsuraEngine
+{
+ namespace Filesystem
+ {
+
+ LUAX_REGISTRY(DataBuffer)
+ {
+ luaL_Reg f[] = {
+ { "New", _New },
+ { "SetContent", _SetContent },
+ { "GetContent", _GetContent },
+ { "GetContentLength", _GetContentLength },
+ {0, 0}
+ };
+
+ state.RegisterMethods(f);
+ }
+
+ LUAX_POSTPROCESS(DataBuffer)
+ {
+
+ }
+
+ LUAX_IMPL_METHOD(DataBuffer, _New)
+ {
+
+ }
+
+ // SetContent(dataBuffer, lString)
+ LUAX_IMPL_METHOD(DataBuffer, _SetContent)
+ {
+ LUAX_SETUP(L, "US");
+ // params:
+ // 1: data buffer
+ // 2: lstring
+
+ DataBuffer* self = state.GetLuaUserdata<DataBuffer>(1);
+ size_t size = 0;
+ const char* str = lua_tolstring(L, 2, &size);
+ void* data = new char[size];
+ memcpy(data, str, size);
+ self->SetContent(data, size);
+ return 0;
+ }
+
+ LUAX_IMPL_METHOD(DataBuffer, _GetContent)
+ {
+ LUAX_SETUP(L, "U");
+
+ DataBuffer* self = state.GetLuaUserdata<DataBuffer>(1);
+ lua_pushlstring(L, (const char*)self->data, self->size);
+ return 1;
+ }
+
+ LUAX_IMPL_METHOD(DataBuffer, _GetContentLength)
+ {
+ LUAX_SETUP(L, "U");
+ DataBuffer* self = state.GetLuaUserdata<DataBuffer>(1);
+ lua_pushinteger(L, self->size);
+ return 1;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/filesystem/data_buffer.cpp b/source/libs/asura-lib-utils/filesystem/data_buffer.cpp
new file mode 100644
index 0000000..629dc92
--- /dev/null
+++ b/source/libs/asura-lib-utils/filesystem/data_buffer.cpp
@@ -0,0 +1,29 @@
+#include "data_buffer.h"
+
+namespace AsuraEngine
+{
+ namespace Filesystem
+ {
+
+ DataBuffer::DataBuffer(const void* data, std::size_t size)
+ {
+ this->data = (const byte*)data;
+ this->size = size;
+ }
+
+ DataBuffer::~DataBuffer()
+ {
+ delete[] data;
+ }
+
+ void DataBuffer::SetContent(const void* data, std::size_t siez)
+ {
+ if (this->data != nullptr)
+ delete[] this->data;
+
+ this->data = (const byte*)data;
+ this->size = size;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/filesystem/data_buffer.h b/source/libs/asura-lib-utils/filesystem/data_buffer.h
new file mode 100644
index 0000000..4b013ed
--- /dev/null
+++ b/source/libs/asura-lib-utils/filesystem/data_buffer.h
@@ -0,0 +1,45 @@
+#ifndef __ASURA_ENGINE_DATABUFFER_H__
+#define __ASURA_ENGINE_DATABUFFER_H__
+
+#include <cstdlib>
+
+#include "../scripting/Luax.hpp"
+#include "../scripting/portable.hpp"
+
+namespace AsuraEngine
+{
+ namespace Filesystem
+ {
+
+ ///
+ /// ڴݵķװеʹData bufferװֱʹconst void*ͨresource managerȡ
+ ///
+ class DataBuffer ASURA_FINAL
+ : public Scripting::Portable<DataBuffer>
+ {
+ public:
+
+ DataBuffer(const void* data, std::size_t size);
+
+ ~DataBuffer();
+
+ void SetContent(const void* data, std::size_t siez);
+
+ const byte* data;
+ size_t size;
+
+ //----------------------------------------------------------------------------------------------------------
+
+ LUAX_DECL_FACTORY(DataBuffer);
+
+ LUAX_DECL_METHOD(_New);
+ LUAX_DECL_METHOD(_SetContent);
+ LUAX_DECL_METHOD(_GetContent);
+ LUAX_DECL_METHOD(_GetContentLength);
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/filesystem/decoded_data.cpp b/source/libs/asura-lib-utils/filesystem/decoded_data.cpp
new file mode 100644
index 0000000..125c652
--- /dev/null
+++ b/source/libs/asura-lib-utils/filesystem/decoded_data.cpp
@@ -0,0 +1,20 @@
+#include "DecodedData.h"
+#include "Exceptions/Exception.h"
+
+namespace AsuraEngine
+{
+ namespace Filesystem
+ {
+
+ DecodedData::DecodedData(const DataBuffer* databuffer)
+ {
+ Decode(databuffer);
+ }
+
+ DecodedData::~DecodedData()
+ {
+
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-utils/filesystem/decoded_data.h b/source/libs/asura-lib-utils/filesystem/decoded_data.h
new file mode 100644
index 0000000..49b5815
--- /dev/null
+++ b/source/libs/asura-lib-utils/filesystem/decoded_data.h
@@ -0,0 +1,42 @@
+#ifndef __ASURA_ENGINE_DATA_H__
+#define __ASURA_ENGINE_DATA_H__
+
+#include <cstdlib>
+
+#include "../scripting/portable.hpp"
+
+#include "data_buffer.h"
+
+namespace AsuraEngine
+{
+ namespace Filesystem
+ {
+
+ ///
+ /// һ̹߳data̳дࡣͼƬݡƵݵȣһ߳нԭļڲݸʽ
+ /// ȡ
+ ///
+ ASURA_ABSTRACT class DecodedData
+ {
+ public:
+
+ ///
+ /// ڴйdataԷһ߳棬Դϵͳء
+ ///
+ DecodedData(const DataBuffer& databuffer);
+
+ virtual ~DecodedData();
+
+ protected:
+
+ ///
+ /// ڴеݡ
+ ///
+ virtual void Decode(const DataBuffer& buffer) = 0;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/filesystem/reloadable.h b/source/libs/asura-lib-utils/filesystem/reloadable.h
new file mode 100644
index 0000000..7c4ea52
--- /dev/null
+++ b/source/libs/asura-lib-utils/filesystem/reloadable.h
@@ -0,0 +1,27 @@
+#ifndef __ASURA_ENGINE_RELOADABLE_H__
+#define __ASURA_ENGINE_RELOADABLE_H__
+
+#include "../scripting/portable.hpp"
+
+namespace AsuraEngine
+{
+ namespace Filesystem
+ {
+
+ ///
+ /// ¹ݽṹͼƬƵ֣ⲿݿֱӹڱ༭¹ڲıhandleԴ
+ ///
+ ASURA_ABSTRACT class Reloadable
+ {
+ public:
+ Reloadable();
+ virtual ~Reloadable();
+
+ // ̳ReloadableҪṩһload
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/filesystem/resource_manager.cpp b/source/libs/asura-lib-utils/filesystem/resource_manager.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-utils/filesystem/resource_manager.cpp
diff --git a/source/libs/asura-lib-utils/filesystem/resource_manager.h b/source/libs/asura-lib-utils/filesystem/resource_manager.h
new file mode 100644
index 0000000..c5d8f06
--- /dev/null
+++ b/source/libs/asura-lib-utils/filesystem/resource_manager.h
@@ -0,0 +1,44 @@
+#ifndef __ASURA_ENGINE_RESOURCE_MANAGER_H__
+#define __ASURA_ENGINE_RESOURCE_MANAGER_H__
+
+#include <string>
+
+#include "../scripting/portable.hpp"
+#include "data_buffer.h"
+
+namespace AsuraEngine
+{
+ namespace Filesystem
+ {
+
+ ///
+ /// Դء洢ԴָĿ¼ȡ
+ ///
+ class ResourceManager ASURA_FINAL
+ {
+ public:
+
+ ResourceManager();
+ ~ResourceManager();
+
+ ///
+ /// װظĿ¼
+ ///
+ void Mount(const std::string& root);
+
+ ///
+ /// ȡļһdata bufferעҪȷȷڴ棬ڵôʹunique_ptr
+ ///
+ DataBuffer* LoadFile(const std::string& path);
+
+ ///
+ /// data buffer
+ ///
+ void SaveFile(const std::string& path, const DataBuffer* buffer);
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/math/curve.cpp b/source/libs/asura-lib-utils/math/curve.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/curve.cpp
diff --git a/source/libs/asura-lib-utils/math/curve.h b/source/libs/asura-lib-utils/math/curve.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/curve.h
diff --git a/source/libs/asura-lib-utils/math/functions.cpp b/source/libs/asura-lib-utils/math/functions.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/functions.cpp
diff --git a/source/libs/asura-lib-utils/math/functions.h b/source/libs/asura-lib-utils/math/functions.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/functions.h
diff --git a/source/libs/asura-lib-utils/math/matrix44.cpp b/source/libs/asura-lib-utils/math/matrix44.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/matrix44.cpp
diff --git a/source/libs/asura-lib-utils/math/matrix44.h b/source/libs/asura-lib-utils/math/matrix44.h
new file mode 100644
index 0000000..4ab3c0b
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/matrix44.h
@@ -0,0 +1,24 @@
+#ifndef __ASURA_ENGINE_MATRIX44_H__
+#define __ASURA_ENGINE_MATRIX44_H__
+
+namespace AsuraEngine
+{
+ namespace Math
+ {
+
+ ///
+ /// 4x4
+ ///
+ class Matrix44
+ {
+ public:
+
+ private:
+
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/math/ranged_value.cpp b/source/libs/asura-lib-utils/math/ranged_value.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/ranged_value.cpp
diff --git a/source/libs/asura-lib-utils/math/ranged_value.h b/source/libs/asura-lib-utils/math/ranged_value.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/ranged_value.h
diff --git a/source/libs/asura-lib-utils/math/rect.hpp b/source/libs/asura-lib-utils/math/rect.hpp
new file mode 100644
index 0000000..f635007
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/rect.hpp
@@ -0,0 +1,32 @@
+#ifndef __ASURA_ENGINE_RECT_H__
+#define __ASURA_ENGINE_RECT_H__
+
+namespace AsuraEngine
+{
+ namespace Math
+ {
+
+ template<typename T>
+ struct Rect
+ {
+ public:
+ Rect();
+ ~Rect(T x, T y, T w, T h);
+
+ template <typename U>
+ explicit Rect(const Rect<U>& rect);
+
+ T x, y, w, h;
+ };
+
+#include "Rect.inl"
+
+ // Define the most common types
+ typedef Rect<int> Recti;
+ typedef Rect<unsigned int> Rectu;
+ typedef Rect<float> Rectf;
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/math/rect.inl b/source/libs/asura-lib-utils/math/rect.inl
new file mode 100644
index 0000000..891a3f8
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/rect.inl
@@ -0,0 +1,19 @@
+template <typename T>
+inline Rect<T>::Rect()
+ : x(0)
+ , y(0)
+ , w(0)
+ , h(0)
+{
+
+}
+
+template <typename T>
+inline Rect<T>::Rect(T X, T Y, T W, T H)
+ : x(X)
+ , y(Y)
+ , w(W)
+ , h(H)
+{
+
+}
diff --git a/source/libs/asura-lib-utils/math/transform.cpp b/source/libs/asura-lib-utils/math/transform.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/transform.cpp
diff --git a/source/libs/asura-lib-utils/math/transform.h b/source/libs/asura-lib-utils/math/transform.h
new file mode 100644
index 0000000..be4c850
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/transform.h
@@ -0,0 +1,30 @@
+#ifndef __ASURA_ENGINE_TRANSFORM_H__
+#define __ASURA_ENGINE_TRANSFORM_H__
+
+#include "../scripting/portable.hpp"
+
+namespace AsuraEngine
+{
+ namespace Math
+ {
+
+ class Transform
+ {
+ public:
+
+ void Set(float x, float y, float sx, float sy, float ox, float oy, float r);
+
+ void LoadIdentity();
+
+ void Move(float dx = 0, float dy = 0);
+ void Rotate(float r);
+ void Scale(float sx, float sy);
+
+ float m[16]; //4x4 matrix
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/math/vector2.hpp b/source/libs/asura-lib-utils/math/vector2.hpp
new file mode 100644
index 0000000..df78255
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/vector2.hpp
@@ -0,0 +1,70 @@
+#ifndef __ASURA_ENGINE_VECTOR2_H__
+#define __ASURA_ENGINE_VECTOR2_H__
+
+namespace AsuraEngine
+{
+ namespace Math
+ {
+ template <typename T>
+ class Vector2
+ {
+ public:
+ Vector2();
+ Vector2(T X, T Y);
+
+ template <typename U>
+ explicit Vector2(const Vector2<U>& vector);
+
+ Set(T X, T Y);
+
+ T x; ///< X coordinate of the vector
+ T y; ///< Y coordinate of the vector
+ };
+
+ template <typename T>
+ Vector2<T> operator -(const Vector2<T>& right);
+
+ template <typename T>
+ Vector2<T>& operator +=(Vector2<T>& left, const Vector2<T>& right);
+
+ template <typename T>
+ Vector2<T>& operator -=(Vector2<T>& left, const Vector2<T>& right);
+
+ template <typename T>
+ Vector2<T> operator +(const Vector2<T>& left, const Vector2<T>& right);
+
+ template <typename T>
+ Vector2<T> operator -(const Vector2<T>& left, const Vector2<T>& right);
+
+ template <typename T>
+ Vector2<T> operator *(const Vector2<T>& left, T right);
+
+ template <typename T>
+ Vector2<T> operator *(T left, const Vector2<T>& right);
+
+ template <typename T>
+ Vector2<T>& operator *=(Vector2<T>& left, T right);
+
+ template <typename T>
+ Vector2<T> operator /(const Vector2<T>& left, T right);
+
+ template <typename T>
+ Vector2<T>& operator /=(Vector2<T>& left, T right);
+
+ template <typename T>
+ bool operator ==(const Vector2<T>& left, const Vector2<T>& right);
+
+ template <typename T>
+ bool operator !=(const Vector2<T>& left, const Vector2<T>& right);
+
+#include "Vector2.inl"
+
+ // Define the most common types
+ typedef Vector2<int> Vector2i;
+ typedef Vector2<unsigned int> Vector2u;
+ typedef Vector2<float> Vector2f;
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/math/vector2.inl b/source/libs/asura-lib-utils/math/vector2.inl
new file mode 100644
index 0000000..9e131a7
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/vector2.inl
@@ -0,0 +1,114 @@
+template <typename T>
+inline Vector2<T>::Vector2() :
+ x(0),
+ y(0)
+{
+
+}
+
+template <typename T>
+inline Vector2<T>::Vector2(T X, T Y) :
+ x(X),
+ y(Y)
+{
+
+}
+
+template <typename T>
+template <typename U>
+inline Vector2<T>::Vector2(const Vector2<U>& vector) :
+ x(static_cast<T>(vector.x)),
+ y(static_cast<T>(vector.y))
+{
+}
+
+template <typename T>
+inline Vector2<T>::Set(T X, T Y)
+{
+ x = X;
+ y = Y;
+}
+
+template <typename T>
+inline Vector2<T> operator -(const Vector2<T>& right)
+{
+ return Vector2<T>(-right.x, -right.y);
+}
+
+template <typename T>
+inline Vector2<T>& operator +=(Vector2<T>& left, const Vector2<T>& right)
+{
+ left.x += right.x;
+ left.y += right.y;
+
+ return left;
+}
+
+template <typename T>
+inline Vector2<T>& operator -=(Vector2<T>& left, const Vector2<T>& right)
+{
+ left.x -= right.x;
+ left.y -= right.y;
+
+ return left;
+}
+
+template <typename T>
+inline Vector2<T> operator +(const Vector2<T>& left, const Vector2<T>& right)
+{
+ return Vector2<T>(left.x + right.x, left.y + right.y);
+}
+
+template <typename T>
+inline Vector2<T> operator -(const Vector2<T>& left, const Vector2<T>& right)
+{
+ return Vector2<T>(left.x - right.x, left.y - right.y);
+}
+
+template <typename T>
+inline Vector2<T> operator *(const Vector2<T>& left, T right)
+{
+ return Vector2<T>(left.x * right, left.y * right);
+}
+
+template <typename T>
+inline Vector2<T> operator *(T left, const Vector2<T>& right)
+{
+ return Vector2<T>(right.x * left, right.y * left);
+}
+
+template <typename T>
+inline Vector2<T>& operator *=(Vector2<T>& left, T right)
+{
+ left.x *= right;
+ left.y *= right;
+
+ return left;
+}
+
+template <typename T>
+inline Vector2<T> operator /(const Vector2<T>& left, T right)
+{
+ return Vector2<T>(left.x / right, left.y / right);
+}
+
+template <typename T>
+inline Vector2<T>& operator /=(Vector2<T>& left, T right)
+{
+ left.x /= right;
+ left.y /= right;
+
+ return left;
+}
+
+template <typename T>
+inline bool operator ==(const Vector2<T>& left, const Vector2<T>& right)
+{
+ return (left.x == right.x) && (left.y == right.y);
+}
+
+template <typename T>
+inline bool operator !=(const Vector2<T>& left, const Vector2<T>& right)
+{
+ return (left.x != right.x) || (left.y != right.y);
+}
diff --git a/source/libs/asura-lib-utils/math/vector3.hpp b/source/libs/asura-lib-utils/math/vector3.hpp
new file mode 100644
index 0000000..2b23406
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/vector3.hpp
@@ -0,0 +1,233 @@
+#ifndef __ASURA_ENGINE_VECTOR3_H__
+#define __ASURA_ENGINE_VECTOR3_H__
+
+namespace AsuraEngine
+{
+ namespace Math
+ {
+ template <typename T>
+ class Vector3
+ {
+ public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Default constructor
+ ///
+ /// Creates a Vector3(0, 0, 0).
+ ///
+ ////////////////////////////////////////////////////////////
+ Vector3();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct the vector from its coordinates
+ ///
+ /// \param X X coordinate
+ /// \param Y Y coordinate
+ /// \param Z Z coordinate
+ ///
+ ////////////////////////////////////////////////////////////
+ Vector3(T X, T Y, T Z);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct the vector from another type of vector
+ ///
+ /// This constructor doesn't replace the copy constructor,
+ /// it's called only when U != T.
+ /// A call to this constructor will fail to compile if U
+ /// is not convertible to T.
+ ///
+ /// \param vector Vector to convert
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename U>
+ explicit Vector3(const Vector3<U>& vector);
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ T x; ///< X coordinate of the vector
+ T y; ///< Y coordinate of the vector
+ T z; ///< Z coordinate of the vector
+ };
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector3
+ /// \brief Overload of unary operator -
+ ///
+ /// \param left Vector to negate
+ ///
+ /// \return Memberwise opposite of the vector
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector3<T> operator -(const Vector3<T>& left);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector3
+ /// \brief Overload of binary operator +=
+ ///
+ /// This operator performs a memberwise addition of both vectors,
+ /// and assigns the result to \a left.
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return Reference to \a left
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector3<T>& operator +=(Vector3<T>& left, const Vector3<T>& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector3
+ /// \brief Overload of binary operator -=
+ ///
+ /// This operator performs a memberwise subtraction of both vectors,
+ /// and assigns the result to \a left.
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return Reference to \a left
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector3<T>& operator -=(Vector3<T>& left, const Vector3<T>& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector3
+ /// \brief Overload of binary operator +
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return Memberwise addition of both vectors
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector3<T> operator +(const Vector3<T>& left, const Vector3<T>& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector3
+ /// \brief Overload of binary operator -
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return Memberwise subtraction of both vectors
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector3<T> operator -(const Vector3<T>& left, const Vector3<T>& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector3
+ /// \brief Overload of binary operator *
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a scalar value)
+ ///
+ /// \return Memberwise multiplication by \a right
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector3<T> operator *(const Vector3<T>& left, T right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector3
+ /// \brief Overload of binary operator *
+ ///
+ /// \param left Left operand (a scalar value)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return Memberwise multiplication by \a left
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector3<T> operator *(T left, const Vector3<T>& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector3
+ /// \brief Overload of binary operator *=
+ ///
+ /// This operator performs a memberwise multiplication by \a right,
+ /// and assigns the result to \a left.
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a scalar value)
+ ///
+ /// \return Reference to \a left
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector3<T>& operator *=(Vector3<T>& left, T right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector3
+ /// \brief Overload of binary operator /
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a scalar value)
+ ///
+ /// \return Memberwise division by \a right
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector3<T> operator /(const Vector3<T>& left, T right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector3
+ /// \brief Overload of binary operator /=
+ ///
+ /// This operator performs a memberwise division by \a right,
+ /// and assigns the result to \a left.
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a scalar value)
+ ///
+ /// \return Reference to \a left
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector3<T>& operator /=(Vector3<T>& left, T right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector3
+ /// \brief Overload of binary operator ==
+ ///
+ /// This operator compares strict equality between two vectors.
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return True if \a left is equal to \a right
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ bool operator ==(const Vector3<T>& left, const Vector3<T>& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector3
+ /// \brief Overload of binary operator !=
+ ///
+ /// This operator compares strict difference between two vectors.
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return True if \a left is not equal to \a right
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ bool operator !=(const Vector3<T>& left, const Vector3<T>& right);
+
+#include "Vector3.inl"
+
+ // Define the most common types
+ typedef Vector3<int> Vector3i;
+ typedef Vector3<float> Vector3f;
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/math/vector3.inl b/source/libs/asura-lib-utils/math/vector3.inl
new file mode 100644
index 0000000..3a2aa93
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/vector3.inl
@@ -0,0 +1,145 @@
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector3<T>::Vector3() :
+ x(0),
+ y(0),
+ z(0)
+{
+
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector3<T>::Vector3(T X, T Y, T Z) :
+ x(X),
+ y(Y),
+ z(Z)
+{
+
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+template <typename U>
+inline Vector3<T>::Vector3(const Vector3<U>& vector) :
+ x(static_cast<T>(vector.x)),
+ y(static_cast<T>(vector.y)),
+ z(static_cast<T>(vector.z))
+{
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector3<T> operator -(const Vector3<T>& left)
+{
+ return Vector3<T>(-left.x, -left.y, -left.z);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector3<T>& operator +=(Vector3<T>& left, const Vector3<T>& right)
+{
+ left.x += right.x;
+ left.y += right.y;
+ left.z += right.z;
+
+ return left;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector3<T>& operator -=(Vector3<T>& left, const Vector3<T>& right)
+{
+ left.x -= right.x;
+ left.y -= right.y;
+ left.z -= right.z;
+
+ return left;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector3<T> operator +(const Vector3<T>& left, const Vector3<T>& right)
+{
+ return Vector3<T>(left.x + right.x, left.y + right.y, left.z + right.z);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector3<T> operator -(const Vector3<T>& left, const Vector3<T>& right)
+{
+ return Vector3<T>(left.x - right.x, left.y - right.y, left.z - right.z);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector3<T> operator *(const Vector3<T>& left, T right)
+{
+ return Vector3<T>(left.x * right, left.y * right, left.z * right);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector3<T> operator *(T left, const Vector3<T>& right)
+{
+ return Vector3<T>(right.x * left, right.y * left, right.z * left);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector3<T>& operator *=(Vector3<T>& left, T right)
+{
+ left.x *= right;
+ left.y *= right;
+ left.z *= right;
+
+ return left;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector3<T> operator /(const Vector3<T>& left, T right)
+{
+ return Vector3<T>(left.x / right, left.y / right, left.z / right);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector3<T>& operator /=(Vector3<T>& left, T right)
+{
+ left.x /= right;
+ left.y /= right;
+ left.z /= right;
+
+ return left;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline bool operator ==(const Vector3<T>& left, const Vector3<T>& right)
+{
+ return (left.x == right.x) && (left.y == right.y) && (left.z == right.z);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline bool operator !=(const Vector3<T>& left, const Vector3<T>& right)
+{
+ return (left.x != right.x) || (left.y != right.y) || (left.z != right.z);
+}
diff --git a/source/libs/asura-lib-utils/math/vector4.h b/source/libs/asura-lib-utils/math/vector4.h
new file mode 100644
index 0000000..13a9d8a
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/vector4.h
@@ -0,0 +1,234 @@
+#ifndef __ASURA_ENGINE_VECTOR4_H__
+#define __ASURA_ENGINE_VECTOR4_H__
+
+namespace AsuraEngine
+{
+ namespace Math
+ {
+ template <typename T>
+ class Vector4
+ {
+ public:
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Default constructor
+ ///
+ /// Creates a Vector4(0, 0, 0).
+ ///
+ ////////////////////////////////////////////////////////////
+ Vector4();
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct the vector from its coordinates
+ ///
+ /// \param X X coordinate
+ /// \param Y Y coordinate
+ /// \param Z Z coordinate
+ ///
+ ////////////////////////////////////////////////////////////
+ Vector4(T X, T Y, T Z, T W);
+
+ ////////////////////////////////////////////////////////////
+ /// \brief Construct the vector from another type of vector
+ ///
+ /// This constructor doesn't replace the copy constructor,
+ /// it's called only when U != T.
+ /// A call to this constructor will fail to compile if U
+ /// is not convertible to T.
+ ///
+ /// \param vector Vector to convert
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename U>
+ explicit Vector4(const Vector4<U>& vector);
+
+ ////////////////////////////////////////////////////////////
+ // Member data
+ ////////////////////////////////////////////////////////////
+ T x; ///< X coordinate of the vector
+ T y; ///< Y coordinate of the vector
+ T z; ///< Z coordinate of the vector
+ T w; ///< W coordinate of the vector
+ };
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector4
+ /// \brief Overload of unary operator -
+ ///
+ /// \param left Vector to negate
+ ///
+ /// \return Memberwise opposite of the vector
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector4<T> operator -(const Vector4<T>& left);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector4
+ /// \brief Overload of binary operator +=
+ ///
+ /// This operator performs a memberwise addition of both vectors,
+ /// and assigns the result to \a left.
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return Reference to \a left
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector4<T>& operator +=(Vector4<T>& left, const Vector4<T>& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector4
+ /// \brief Overload of binary operator -=
+ ///
+ /// This operator performs a memberwise subtraction of both vectors,
+ /// and assigns the result to \a left.
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return Reference to \a left
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector4<T>& operator -=(Vector4<T>& left, const Vector4<T>& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector4
+ /// \brief Overload of binary operator +
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return Memberwise addition of both vectors
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector4<T> operator +(const Vector4<T>& left, const Vector4<T>& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector4
+ /// \brief Overload of binary operator -
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return Memberwise subtraction of both vectors
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector4<T> operator -(const Vector4<T>& left, const Vector4<T>& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector4
+ /// \brief Overload of binary operator *
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a scalar value)
+ ///
+ /// \return Memberwise multiplication by \a right
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector4<T> operator *(const Vector4<T>& left, T right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector4
+ /// \brief Overload of binary operator *
+ ///
+ /// \param left Left operand (a scalar value)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return Memberwise multiplication by \a left
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector4<T> operator *(T left, const Vector4<T>& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector4
+ /// \brief Overload of binary operator *=
+ ///
+ /// This operator performs a memberwise multiplication by \a right,
+ /// and assigns the result to \a left.
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a scalar value)
+ ///
+ /// \return Reference to \a left
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector4<T>& operator *=(Vector4<T>& left, T right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector4
+ /// \brief Overload of binary operator /
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a scalar value)
+ ///
+ /// \return Memberwise division by \a right
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector4<T> operator /(const Vector4<T>& left, T right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector4
+ /// \brief Overload of binary operator /=
+ ///
+ /// This operator performs a memberwise division by \a right,
+ /// and assigns the result to \a left.
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a scalar value)
+ ///
+ /// \return Reference to \a left
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ Vector4<T>& operator /=(Vector4<T>& left, T right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector4
+ /// \brief Overload of binary operator ==
+ ///
+ /// This operator compares strict equality between two vectors.
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return True if \a left is equal to \a right
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ bool operator ==(const Vector4<T>& left, const Vector4<T>& right);
+
+ ////////////////////////////////////////////////////////////
+ /// \relates Vector4
+ /// \brief Overload of binary operator !=
+ ///
+ /// This operator compares strict difference between two vectors.
+ ///
+ /// \param left Left operand (a vector)
+ /// \param right Right operand (a vector)
+ ///
+ /// \return True if \a left is not equal to \a right
+ ///
+ ////////////////////////////////////////////////////////////
+ template <typename T>
+ bool operator !=(const Vector4<T>& left, const Vector4<T>& right);
+
+#include "Vector4.inl"
+
+ // Define the most common types
+ typedef Vector4<int> Vector4i;
+ typedef Vector4<float> Vector4f;
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/math/vector4.inl b/source/libs/asura-lib-utils/math/vector4.inl
new file mode 100644
index 0000000..025bfcc
--- /dev/null
+++ b/source/libs/asura-lib-utils/math/vector4.inl
@@ -0,0 +1,152 @@
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector4<T>::Vector4() :
+ x(0),
+ y(0),
+ z(0),
+ w(0)
+{
+
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector4<T>::Vector4(T X, T Y, T Z) :
+ x(X),
+ y(Y),
+ z(Z),
+ w(0)
+{
+
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+template <typename U>
+inline Vector4<T>::Vector4(const Vector4<U>& vector) :
+ x(static_cast<T>(vector.x)),
+ y(static_cast<T>(vector.y)),
+ z(static_cast<T>(vector.z))
+ w(static_cast<T>(vector.w))
+{
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector4<T> operator -(const Vector4<T>& left)
+{
+ return Vector4<T>(-left.x, -left.y, -left.z, -left.w);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector4<T>& operator +=(Vector4<T>& left, const Vector4<T>& right)
+{
+ left.x += right.x;
+ left.y += right.y;
+ left.z += right.z;
+ left.w += right.w;
+
+ return left;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector4<T>& operator -=(Vector4<T>& left, const Vector4<T>& right)
+{
+ left.x -= right.x;
+ left.y -= right.y;
+ left.z -= right.z;
+ left.w -= right.w;
+
+ return left;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector4<T> operator +(const Vector4<T>& left, const Vector4<T>& right)
+{
+ return Vector4<T>(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector4<T> operator -(const Vector4<T>& left, const Vector4<T>& right)
+{
+ return Vector4<T>(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector4<T> operator *(const Vector4<T>& left, T right)
+{
+ return Vector4<T>(left.x * right, left.y * right, left.z * right, left.w * right);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector4<T> operator *(T left, const Vector4<T>& right)
+{
+ return Vector4<T>(right.x * left, right.y * left, right.z * left, right.w * left);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector4<T>& operator *=(Vector4<T>& left, T right)
+{
+ left.x *= right;
+ left.y *= right;
+ left.z *= right;
+ left.w *= right;
+
+ return left;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector4<T> operator /(const Vector4<T>& left, T right)
+{
+ return Vector4<T>(left.x / right, left.y / right, left.z / right, left.w / right);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline Vector4<T>& operator /=(Vector4<T>& left, T right)
+{
+ left.x /= right;
+ left.y /= right;
+ left.z /= right;
+ left.w /= right;
+
+ return left;
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline bool operator ==(const Vector4<T>& left, const Vector4<T>& right)
+{
+ return (left.x == right.x) && (left.y == right.y) && (left.z == right.z) && (left.w == right.w);
+}
+
+
+////////////////////////////////////////////////////////////
+template <typename T>
+inline bool operator !=(const Vector4<T>& left, const Vector4<T>& right)
+{
+ return (left.x != right.x) || (left.y != right.y) || (left.z != right.z) || (left.w != right.w);
+}
diff --git a/source/libs/asura-lib-utils/module.h b/source/libs/asura-lib-utils/module.h
new file mode 100644
index 0000000..b22c68c
--- /dev/null
+++ b/source/libs/asura-lib-utils/module.h
@@ -0,0 +1,32 @@
+#ifndef __ASURA_MODULE_H__
+#define __ASURA_MODULE_H__
+
+#include "type.h"
+#include "scripting/portable.hpp"
+
+namespace AsuraEngine
+{
+
+ ///
+ /// Asura libs Ҫ̳д࣬Կעᡣģа˳Щģ飬Ȼ˳InitializeFinalizeʼ
+ /// رЩģ顣
+ ///
+ ASURA_ABSTRACT class Module
+ {
+ public:
+
+ ///
+ /// ʼģ顣
+ ///
+ virtual void Initialize(Luax::LuaxState& state) = 0;
+
+ ///
+ /// رģ顣
+ ///
+ virtual void Finalize(Luax::LuaxState& state) = 0;
+
+ };
+
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/scripting/luax.hpp b/source/libs/asura-lib-utils/scripting/luax.hpp
new file mode 100644
index 0000000..cca26e2
--- /dev/null
+++ b/source/libs/asura-lib-utils/scripting/luax.hpp
@@ -0,0 +1,13 @@
+#ifndef __ASURA_ENGINE_LUAX_H__
+#define __ASURA_ENGINE_LUAX_H__
+
+///
+/// Scripting with Lua.
+///
+extern "C" {
+#include <Lua51/lua.h>
+#include <Lua51/lauxlib.h>
+}
+#include <Luax/luax.h>
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/scripting/portable.hpp b/source/libs/asura-lib-utils/scripting/portable.hpp
new file mode 100644
index 0000000..7f780d1
--- /dev/null
+++ b/source/libs/asura-lib-utils/scripting/portable.hpp
@@ -0,0 +1,22 @@
+#ifndef __ASURA_ENGINE_PORTABLE_H__
+#define __ASURA_ENGINE_PORTABLE_H__
+
+#include "../type.h"
+
+#include "Luax.hpp"
+
+namespace AsuraEngine
+{
+ namespace Scripting
+ {
+
+ ///
+ /// ҪעluanativeҪ̳дģ塣
+ ///
+ template<typename T>
+ using Portable = Luax::LuaxNativeClass<T>;
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/scripting/portable.inl b/source/libs/asura-lib-utils/scripting/portable.inl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-utils/scripting/portable.inl
diff --git a/source/libs/asura-lib-utils/type.h b/source/libs/asura-lib-utils/type.h
new file mode 100644
index 0000000..25b52fe
--- /dev/null
+++ b/source/libs/asura-lib-utils/type.h
@@ -0,0 +1,70 @@
+#ifndef __ASURA_UTILS_TYPE_H__
+#define __ASURA_UTILS_TYPE_H__
+
+#include <cstdlib>
+#include <stdint.h>
+
+namespace AsuraEngine
+{
+
+ //----------------------------------------------------------------------------------------------------------------
+
+ typedef int8_t int8;
+ typedef uint8_t uint8;
+ typedef uint8 byte;
+ typedef int16_t int16;
+ typedef uint16_t uint16;
+ typedef int32_t int32;
+ typedef uint32_t uint32;
+ typedef int64_t int64;
+ typedef uint64_t uint64;
+
+ typedef uint32_t uint;
+ typedef int32_t sint;
+
+ typedef std::size_t size_t;
+
+ //----------------------------------------------------------------------------------------------------------------
+
+#ifndef ASSERT
+ #ifdef NDEBUG
+ #define ASSERT(x) { false ? (void)(x) : (void)0; }
+ #else
+ #ifdef _WIN32
+ #define ASURA_DEBUG_BREAK() __debugbreak()
+ #else
+ #define ASURA_DEBUG_BREAK() raise(SIGTRAP)
+ #endif
+ #define ASSERT(x) do { const volatile bool asura_assert_b____ = !(x); if(asura_assert_b____) ASURA_DEBUG_BREAK(); } while (false)
+ #endif
+#endif
+
+ //----------------------------------------------------------------------------------------------------------------
+
+#ifdef _WIN32
+ #define ASURA_FINAL final
+ #define ASURA_LIBRARY_EXPORT __declspec(dllexport)
+ #define ASURA_LIBRARY_IMPORT __declspec(dllimport)
+ #define ASURA_FORCE_INLINE __forceinline
+ #define ASURA_RESTRICT __restrict
+ #define ASURA_ATTRIBUTE_USED
+ #define ASURA_ABSTRACT
+ #define ASURA_API ASURA_LIBRARY_EXPORT
+#else
+ #define ASURA_FINAL final
+ #define ASURA_LIBRARY_EXPORT __attribute__((visibility("default")))
+ #define ASURA_LIBRARY_IMPORT
+ #define ASURA_FORCE_INLINE __attribute__((always_inline)) inline
+ #define ASURA_RESTRICT __restrict__
+ #define ASURA_ATTRIBUTE_USED __attribute__((used))
+ #define ASURA_ABSTRACT
+ #define ASURA_API ASURA_LIBRARY_EXPORT
+#endif
+
+ //----------------------------------------------------------------------------------------------------------------
+
+#define ASURA_SDL_HOST 1
+
+} // namespace AsuraEngine
+
+#endif // __ASURA_CONFIG_H__ \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/utils.h b/source/libs/asura-lib-utils/utils.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-utils/utils.h
diff --git a/source/libs/asura-lib-utils/utils_module.cpp b/source/libs/asura-lib-utils/utils_module.cpp
new file mode 100644
index 0000000..7fe3612
--- /dev/null
+++ b/source/libs/asura-lib-utils/utils_module.cpp
@@ -0,0 +1,20 @@
+#include "utils_module.h"
+#include "./filesystem/data_buffer.h"
+
+using namespace AsuraEngine::Filesystem;
+
+namespace AsuraEngine
+{
+
+ void UtilsModule::Initialize(Luax::LuaxState& state)
+ {
+ LUAX_REGISTER_FACTORY(state, DataBuffer);
+
+ }
+
+ void UtilsModule::Finalize(Luax::LuaxState& state)
+ {
+
+ }
+
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-utils/utils_module.h b/source/libs/asura-lib-utils/utils_module.h
new file mode 100644
index 0000000..0b5d076
--- /dev/null
+++ b/source/libs/asura-lib-utils/utils_module.h
@@ -0,0 +1,24 @@
+#ifndef __ASURA_LIBS_UTIL_MODULE_H__
+#define __ASURA_LIBS_UTIL_MODULE_H__
+
+#include "module.h"
+
+namespace AsuraEngine
+{
+
+ ///
+ /// Asuraģ
+ ///
+ class UtilsModule : public Module
+ {
+ public:
+
+ void Initialize(Luax::LuaxState& state) override;
+
+ void Finalize(Luax::LuaxState& state) override;
+
+ };
+
+}
+
+#endif \ No newline at end of file