From 8644e03586ac9c39741f62cbcbce87b18805538c Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 14 Mar 2019 23:12:54 +0800 Subject: =?UTF-8?q?*=E5=A4=A7=E5=B0=8F=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source/3rdParty/Luax/luax.h | 1 + Source/3rdParty/Luax/luax_class.cpp | 6 - Source/3rdParty/Luax/luax_class.hpp | 12 +- Source/3rdParty/Luax/luax_class.inl | 8 +- Source/3rdParty/Luax/luax_context.cpp | 36 + Source/3rdParty/Luax/luax_context.h | 36 + Source/3rdParty/Luax/luax_enum.cpp | 37 + Source/3rdParty/Luax/luax_enum.h | 24 + Source/3rdParty/Luax/luax_function.h | 11 + Source/3rdParty/Luax/luax_module.cpp | 8 + Source/3rdParty/Luax/luax_module.h | 12 + Source/3rdParty/Luax/luax_reftable.h | 2 + Source/3rdParty/Luax/luax_runtime.cpp | 16 +- Source/3rdParty/Luax/luax_runtime.h | 19 +- Source/3rdParty/Luax/luax_state.cpp | 215 +++--- Source/3rdParty/Luax/luax_state.h | 36 +- Source/3rdParty/Luax/luax_state.inl | 9 +- Source/3rdParty/Luax/luax_variable.cpp | 0 Source/3rdParty/Luax/luax_variable.h | 0 Source/Asura.Editor/scripts/compile.bat | 0 Source/Asura.Editor/scripts/compile.sh | 0 Source/Asura.Editor/scripts/main.lua | 5 + Source/Asura.Editor/scripts/scene_view.lua | 2 + Source/Asura.Editor/source/editor.cpp | 6 + Source/Asura.Editor/source/graphics/shader.cpp | 0 Source/Asura.Editor/source/graphics/shader.h | 21 + Source/Asura.Editor/source/widgets/button.cpp | 0 Source/Asura.Editor/source/widgets/button.h | 30 + Source/Asura.Editor/source/widgets/checkbox.cpp | 0 Source/Asura.Editor/source/widgets/checkbox.h | 0 Source/Asura.Editor/source/widgets/hslider.cpp | 0 Source/Asura.Editor/source/widgets/hslider.h | 0 Source/Asura.Editor/source/widgets/hvslider.cpp | 0 Source/Asura.Editor/source/widgets/hvslider.h | 0 Source/Asura.Editor/source/widgets/label.cpp | 0 Source/Asura.Editor/source/widgets/label.h | 18 + Source/Asura.Editor/source/widgets/panel.cpp | 0 Source/Asura.Editor/source/widgets/panel.h | 0 Source/Asura.Editor/source/widgets/rbutton.cpp | 0 Source/Asura.Editor/source/widgets/rbutton.h | 0 Source/Asura.Editor/source/widgets/textbox.cpp | 0 Source/Asura.Editor/source/widgets/textbox.h | 0 Source/Asura.Editor/source/widgets/vslider.cpp | 0 Source/Asura.Editor/source/widgets/vslider.h | 0 Source/Asura.Editor/source/widgets/widget.h | 24 + Source/Asura.Editor/source/window/window.h | 14 + Source/Asura.Engine/Audio/SoundDecoder.h | 29 - Source/Asura.Engine/FileSystem/DataBuffer.cpp | 14 - Source/Asura.Engine/FileSystem/DataBuffer.h | 39 -- Source/Asura.Engine/FileSystem/DecodedData.cpp | 20 - Source/Asura.Engine/FileSystem/DecodedData.h | 41 -- Source/Asura.Engine/FileSystem/ResourceManager.cpp | 0 Source/Asura.Engine/FileSystem/ResourceManager.h | 44 -- ...26\207\346\234\254\346\226\207\346\241\243.txt" | 0 Source/Asura.Engine/Graphics/BlendMode.h | 17 - Source/Asura.Engine/Graphics/ImageData.cpp | 50 -- Source/Asura.Engine/Graphics/ImageData.h | 62 -- Source/Asura.Engine/Graphics/ImageDecoder.h | 35 - Source/Asura.Engine/Graphics/PNGDecoder.cpp | 19 - Source/Asura.Engine/Graphics/PNGDecoder.h | 27 - Source/Asura.Engine/Graphics/PixelFormat.h | 91 --- Source/Asura.Engine/Graphics/Port/Canvas.cpp | 0 Source/Asura.Engine/Graphics/Port/Color.cpp | 0 Source/Asura.Engine/Graphics/Port/Image.cpp | 0 Source/Asura.Engine/Graphics/Port/ImageData.cpp | 0 Source/Asura.Engine/Graphics/Port/Mesh2D.cpp | 0 Source/Asura.Engine/Graphics/Port/Mesh2DData.cpp | 0 Source/Asura.Engine/Graphics/Port/Shader.cpp | 103 --- Source/Asura.Engine/Graphics/Port/SpriteBatch.cpp | 0 Source/Asura.Engine/Graphics/Port/Window.cpp | 11 - Source/Asura.Engine/Graphics/RenderState.h | 50 -- Source/Asura.Engine/Graphics/RenderTarget.cpp | 0 Source/Asura.Engine/Graphics/RenderTarget.h | 54 -- Source/Asura.Engine/Graphics/STBDecoder.cpp | 65 -- Source/Asura.Engine/Graphics/STBDecoder.h | 27 - Source/Asura.Engine/Graphics/Shader.h | 4 +- Source/Asura.Engine/Graphics/SpriteBatch.cpp | 0 Source/Asura.Engine/Graphics/SpriteBatch.h | 27 - Source/Asura.Engine/Input/InputDevice.hpp | 30 - Source/Asura.Engine/Math/RangedValue.cpp | 0 Source/Asura.Engine/Math/RangedValue.h | 0 Source/Asura.Engine/Scripting/Object.h | 23 - Source/Asura.Engine/Scripting/Portable.h | 7 +- Source/Asura.Engine/Text/TrueTypeFont.cpp | 0 Source/Asura.Engine/Text/TrueTypeFont.h | 0 Source/Asura.Engine/application.cpp | 59 ++ Source/Asura.Engine/application.h | 83 +++ Source/Asura.Engine/asura.h | 15 + Source/Asura.Engine/audio/sound.cpp | 0 Source/Asura.Engine/audio/sound.h | 27 + Source/Asura.Engine/audio/sound_decoder.h | 29 + Source/Asura.Engine/config.h | 82 +++ Source/Asura.Engine/exceptions/exception.cpp | 47 ++ Source/Asura.Engine/exceptions/exception.h | 43 ++ Source/Asura.Engine/filesystem/data_buffer.cpp | 14 + Source/Asura.Engine/filesystem/data_buffer.h | 39 ++ Source/Asura.Engine/filesystem/decoded_data.cpp | 20 + Source/Asura.Engine/filesystem/decoded_data.h | 41 ++ Source/Asura.Engine/filesystem/reloadable.h | 27 + .../Asura.Engine/filesystem/resource_manager.cpp | 0 Source/Asura.Engine/filesystem/resource_manager.h | 44 ++ .../Asura.Engine/graphics/application.graphics.cpp | 19 + Source/Asura.Engine/graphics/binding/canvas.cpp | 0 Source/Asura.Engine/graphics/binding/color.cpp | 0 Source/Asura.Engine/graphics/binding/image.cpp | 0 .../Asura.Engine/graphics/binding/image_data.cpp | 0 Source/Asura.Engine/graphics/binding/mesh2d.cpp | 0 .../Asura.Engine/graphics/binding/mesh2d_data.cpp | 0 Source/Asura.Engine/graphics/binding/shader.cpp | 119 ++++ .../Asura.Engine/graphics/binding/sprite_batch.cpp | 0 Source/Asura.Engine/graphics/binding/window.cpp | 11 + Source/Asura.Engine/graphics/blend_mode.h | 17 + Source/Asura.Engine/graphics/canvas.cpp | 41 ++ Source/Asura.Engine/graphics/canvas.h | 81 +++ Source/Asura.Engine/graphics/color.cpp | 132 ++++ Source/Asura.Engine/graphics/color.h | 94 +++ Source/Asura.Engine/graphics/gl.cpp | 11 + Source/Asura.Engine/graphics/gl.h | 19 + Source/Asura.Engine/graphics/image.cpp | 32 + Source/Asura.Engine/graphics/image.h | 78 +++ Source/Asura.Engine/graphics/image_data.cpp | 50 ++ Source/Asura.Engine/graphics/image_data.h | 62 ++ Source/Asura.Engine/graphics/image_decoder.h | 35 + Source/Asura.Engine/graphics/mesh2d.cpp | 0 Source/Asura.Engine/graphics/mesh2d.h | 29 + Source/Asura.Engine/graphics/pixel_format.h | 91 +++ Source/Asura.Engine/graphics/png_decoder.cpp | 19 + Source/Asura.Engine/graphics/png_decoder.h | 27 + Source/Asura.Engine/graphics/quad.cpp | 0 Source/Asura.Engine/graphics/quad.h | 1 + Source/Asura.Engine/graphics/render_state.h | 50 ++ Source/Asura.Engine/graphics/render_target.cpp | 0 Source/Asura.Engine/graphics/render_target.h | 54 ++ Source/Asura.Engine/graphics/shader.cpp | 81 +++ Source/Asura.Engine/graphics/shader.h | 123 ++++ Source/Asura.Engine/graphics/shape.cpp | 0 Source/Asura.Engine/graphics/shape.h | 0 Source/Asura.Engine/graphics/sprite_batch.cpp | 0 Source/Asura.Engine/graphics/sprite_batch.h | 28 + Source/Asura.Engine/graphics/stb_decoder.cpp | 65 ++ Source/Asura.Engine/graphics/stb_decoder.h | 27 + Source/Asura.Engine/graphics/texture.cpp | 26 + Source/Asura.Engine/graphics/texture.h | 66 ++ Source/Asura.Engine/graphics/window.cpp | 56 ++ Source/Asura.Engine/graphics/window.h | 85 +++ Source/Asura.Engine/input/clipboard.cpp | 0 Source/Asura.Engine/input/clipboard.h | 37 + Source/Asura.Engine/input/cursor.cpp | 0 Source/Asura.Engine/input/cursor.defs | 25 + Source/Asura.Engine/input/cursor.h | 54 ++ Source/Asura.Engine/input/input_device.hpp | 30 + Source/Asura.Engine/input/keyboard.cpp | 0 Source/Asura.Engine/input/keyboard.defs | 482 +++++++++++++ Source/Asura.Engine/input/keyboard.h | 73 ++ Source/Asura.Engine/input/mouse.cpp | 0 Source/Asura.Engine/input/mouse.h | 56 ++ Source/Asura.Engine/manager.hpp | 14 + Source/Asura.Engine/math/curve.cpp | 0 Source/Asura.Engine/math/curve.h | 0 Source/Asura.Engine/math/functions.cpp | 0 Source/Asura.Engine/math/functions.h | 0 Source/Asura.Engine/math/matrix44.cpp | 0 Source/Asura.Engine/math/matrix44.h | 24 + Source/Asura.Engine/math/ranged_value.cpp | 0 Source/Asura.Engine/math/ranged_value.h | 0 Source/Asura.Engine/math/rect.hpp | 32 + Source/Asura.Engine/math/rect.inl | 19 + Source/Asura.Engine/math/transform.cpp | 0 Source/Asura.Engine/math/transform.h | 30 + Source/Asura.Engine/math/vector2.hpp | 70 ++ Source/Asura.Engine/math/vector2.inl | 114 ++++ Source/Asura.Engine/math/vector3.hpp | 233 +++++++ Source/Asura.Engine/math/vector3.inl | 145 ++++ Source/Asura.Engine/math/vector4.h | 234 +++++++ Source/Asura.Engine/math/vector4.inl | 152 +++++ Source/Asura.Engine/physics/world.h | 25 + Source/Asura.Engine/profiler/stats.cpp | 0 Source/Asura.Engine/profiler/stats.h | 0 Source/Asura.Engine/scripting/luax.hpp | 18 + Source/Asura.Engine/scripting/portable.cpp | 9 + Source/Asura.Engine/scripting/portable.h | 19 + Source/Asura.Engine/scripting/type.h | 17 + Source/Asura.Engine/singleton.hpp | 59 ++ Source/Asura.Engine/stringmap.cpp | 0 Source/Asura.Engine/stringmap.hpp | 29 + Source/Asura.Engine/text/glyph.cpp | 0 Source/Asura.Engine/text/glyph.h | 0 Source/Asura.Engine/text/string.cpp | 376 +++++++++++ Source/Asura.Engine/text/string.hpp | 594 ++++++++++++++++ Source/Asura.Engine/text/string.inl | 29 + Source/Asura.Engine/text/ttf.cpp | 0 Source/Asura.Engine/text/ttf.h | 17 + Source/Asura.Engine/text/utf.hpp | 720 ++++++++++++++++++++ Source/Asura.Engine/text/utf.inl | 752 +++++++++++++++++++++ Source/Asura.Engine/time/timer.cpp | 0 Source/Asura.Engine/time/timer.h | 0 Source/Asura.Engine/type.h | 11 + Source/Asura.Runner/runner.cpp | 10 + Source/Asura.Runner/runner.h | 16 + Source/Asura.Runner/scripts/main.lua | 0 Source/Samples/LuaxTest/main.cpp | 51 +- 201 files changed, 7216 insertions(+), 1056 deletions(-) delete mode 100644 Source/3rdParty/Luax/luax_class.cpp create mode 100644 Source/3rdParty/Luax/luax_context.cpp create mode 100644 Source/3rdParty/Luax/luax_context.h create mode 100644 Source/3rdParty/Luax/luax_enum.cpp create mode 100644 Source/3rdParty/Luax/luax_enum.h create mode 100644 Source/3rdParty/Luax/luax_module.cpp create mode 100644 Source/3rdParty/Luax/luax_module.h delete mode 100644 Source/3rdParty/Luax/luax_variable.cpp delete mode 100644 Source/3rdParty/Luax/luax_variable.h create mode 100644 Source/Asura.Editor/scripts/compile.bat create mode 100644 Source/Asura.Editor/scripts/compile.sh create mode 100644 Source/Asura.Editor/scripts/main.lua create mode 100644 Source/Asura.Editor/scripts/scene_view.lua create mode 100644 Source/Asura.Editor/source/editor.cpp create mode 100644 Source/Asura.Editor/source/graphics/shader.cpp create mode 100644 Source/Asura.Editor/source/graphics/shader.h create mode 100644 Source/Asura.Editor/source/widgets/button.cpp create mode 100644 Source/Asura.Editor/source/widgets/button.h create mode 100644 Source/Asura.Editor/source/widgets/checkbox.cpp create mode 100644 Source/Asura.Editor/source/widgets/checkbox.h create mode 100644 Source/Asura.Editor/source/widgets/hslider.cpp create mode 100644 Source/Asura.Editor/source/widgets/hslider.h create mode 100644 Source/Asura.Editor/source/widgets/hvslider.cpp create mode 100644 Source/Asura.Editor/source/widgets/hvslider.h create mode 100644 Source/Asura.Editor/source/widgets/label.cpp create mode 100644 Source/Asura.Editor/source/widgets/label.h create mode 100644 Source/Asura.Editor/source/widgets/panel.cpp create mode 100644 Source/Asura.Editor/source/widgets/panel.h create mode 100644 Source/Asura.Editor/source/widgets/rbutton.cpp create mode 100644 Source/Asura.Editor/source/widgets/rbutton.h create mode 100644 Source/Asura.Editor/source/widgets/textbox.cpp create mode 100644 Source/Asura.Editor/source/widgets/textbox.h create mode 100644 Source/Asura.Editor/source/widgets/vslider.cpp create mode 100644 Source/Asura.Editor/source/widgets/vslider.h create mode 100644 Source/Asura.Editor/source/widgets/widget.h create mode 100644 Source/Asura.Editor/source/window/window.h delete mode 100644 Source/Asura.Engine/Audio/SoundDecoder.h delete mode 100644 Source/Asura.Engine/FileSystem/DataBuffer.cpp delete mode 100644 Source/Asura.Engine/FileSystem/DataBuffer.h delete mode 100644 Source/Asura.Engine/FileSystem/DecodedData.cpp delete mode 100644 Source/Asura.Engine/FileSystem/DecodedData.h delete mode 100644 Source/Asura.Engine/FileSystem/ResourceManager.cpp delete mode 100644 Source/Asura.Engine/FileSystem/ResourceManager.h delete mode 100644 "Source/Asura.Engine/FileSystem/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt" delete mode 100644 Source/Asura.Engine/Graphics/BlendMode.h delete mode 100644 Source/Asura.Engine/Graphics/ImageData.cpp delete mode 100644 Source/Asura.Engine/Graphics/ImageData.h delete mode 100644 Source/Asura.Engine/Graphics/ImageDecoder.h delete mode 100644 Source/Asura.Engine/Graphics/PNGDecoder.cpp delete mode 100644 Source/Asura.Engine/Graphics/PNGDecoder.h delete mode 100644 Source/Asura.Engine/Graphics/PixelFormat.h delete mode 100644 Source/Asura.Engine/Graphics/Port/Canvas.cpp delete mode 100644 Source/Asura.Engine/Graphics/Port/Color.cpp delete mode 100644 Source/Asura.Engine/Graphics/Port/Image.cpp delete mode 100644 Source/Asura.Engine/Graphics/Port/ImageData.cpp delete mode 100644 Source/Asura.Engine/Graphics/Port/Mesh2D.cpp delete mode 100644 Source/Asura.Engine/Graphics/Port/Mesh2DData.cpp delete mode 100644 Source/Asura.Engine/Graphics/Port/Shader.cpp delete mode 100644 Source/Asura.Engine/Graphics/Port/SpriteBatch.cpp delete mode 100644 Source/Asura.Engine/Graphics/Port/Window.cpp delete mode 100644 Source/Asura.Engine/Graphics/RenderState.h delete mode 100644 Source/Asura.Engine/Graphics/RenderTarget.cpp delete mode 100644 Source/Asura.Engine/Graphics/RenderTarget.h delete mode 100644 Source/Asura.Engine/Graphics/STBDecoder.cpp delete mode 100644 Source/Asura.Engine/Graphics/STBDecoder.h delete mode 100644 Source/Asura.Engine/Graphics/SpriteBatch.cpp delete mode 100644 Source/Asura.Engine/Graphics/SpriteBatch.h delete mode 100644 Source/Asura.Engine/Input/InputDevice.hpp delete mode 100644 Source/Asura.Engine/Math/RangedValue.cpp delete mode 100644 Source/Asura.Engine/Math/RangedValue.h delete mode 100644 Source/Asura.Engine/Scripting/Object.h delete mode 100644 Source/Asura.Engine/Text/TrueTypeFont.cpp delete mode 100644 Source/Asura.Engine/Text/TrueTypeFont.h create mode 100644 Source/Asura.Engine/application.cpp create mode 100644 Source/Asura.Engine/application.h create mode 100644 Source/Asura.Engine/asura.h create mode 100644 Source/Asura.Engine/audio/sound.cpp create mode 100644 Source/Asura.Engine/audio/sound.h create mode 100644 Source/Asura.Engine/audio/sound_decoder.h create mode 100644 Source/Asura.Engine/config.h create mode 100644 Source/Asura.Engine/exceptions/exception.cpp create mode 100644 Source/Asura.Engine/exceptions/exception.h create mode 100644 Source/Asura.Engine/filesystem/data_buffer.cpp create mode 100644 Source/Asura.Engine/filesystem/data_buffer.h create mode 100644 Source/Asura.Engine/filesystem/decoded_data.cpp create mode 100644 Source/Asura.Engine/filesystem/decoded_data.h create mode 100644 Source/Asura.Engine/filesystem/reloadable.h create mode 100644 Source/Asura.Engine/filesystem/resource_manager.cpp create mode 100644 Source/Asura.Engine/filesystem/resource_manager.h create mode 100644 Source/Asura.Engine/graphics/application.graphics.cpp create mode 100644 Source/Asura.Engine/graphics/binding/canvas.cpp create mode 100644 Source/Asura.Engine/graphics/binding/color.cpp create mode 100644 Source/Asura.Engine/graphics/binding/image.cpp create mode 100644 Source/Asura.Engine/graphics/binding/image_data.cpp create mode 100644 Source/Asura.Engine/graphics/binding/mesh2d.cpp create mode 100644 Source/Asura.Engine/graphics/binding/mesh2d_data.cpp create mode 100644 Source/Asura.Engine/graphics/binding/shader.cpp create mode 100644 Source/Asura.Engine/graphics/binding/sprite_batch.cpp create mode 100644 Source/Asura.Engine/graphics/binding/window.cpp create mode 100644 Source/Asura.Engine/graphics/blend_mode.h create mode 100644 Source/Asura.Engine/graphics/canvas.cpp create mode 100644 Source/Asura.Engine/graphics/canvas.h create mode 100644 Source/Asura.Engine/graphics/color.cpp create mode 100644 Source/Asura.Engine/graphics/color.h create mode 100644 Source/Asura.Engine/graphics/gl.cpp create mode 100644 Source/Asura.Engine/graphics/gl.h create mode 100644 Source/Asura.Engine/graphics/image.cpp create mode 100644 Source/Asura.Engine/graphics/image.h create mode 100644 Source/Asura.Engine/graphics/image_data.cpp create mode 100644 Source/Asura.Engine/graphics/image_data.h create mode 100644 Source/Asura.Engine/graphics/image_decoder.h create mode 100644 Source/Asura.Engine/graphics/mesh2d.cpp create mode 100644 Source/Asura.Engine/graphics/mesh2d.h create mode 100644 Source/Asura.Engine/graphics/pixel_format.h create mode 100644 Source/Asura.Engine/graphics/png_decoder.cpp create mode 100644 Source/Asura.Engine/graphics/png_decoder.h create mode 100644 Source/Asura.Engine/graphics/quad.cpp create mode 100644 Source/Asura.Engine/graphics/quad.h create mode 100644 Source/Asura.Engine/graphics/render_state.h create mode 100644 Source/Asura.Engine/graphics/render_target.cpp create mode 100644 Source/Asura.Engine/graphics/render_target.h create mode 100644 Source/Asura.Engine/graphics/shader.cpp create mode 100644 Source/Asura.Engine/graphics/shader.h create mode 100644 Source/Asura.Engine/graphics/shape.cpp create mode 100644 Source/Asura.Engine/graphics/shape.h create mode 100644 Source/Asura.Engine/graphics/sprite_batch.cpp create mode 100644 Source/Asura.Engine/graphics/sprite_batch.h create mode 100644 Source/Asura.Engine/graphics/stb_decoder.cpp create mode 100644 Source/Asura.Engine/graphics/stb_decoder.h create mode 100644 Source/Asura.Engine/graphics/texture.cpp create mode 100644 Source/Asura.Engine/graphics/texture.h create mode 100644 Source/Asura.Engine/graphics/window.cpp create mode 100644 Source/Asura.Engine/graphics/window.h create mode 100644 Source/Asura.Engine/input/clipboard.cpp create mode 100644 Source/Asura.Engine/input/clipboard.h create mode 100644 Source/Asura.Engine/input/cursor.cpp create mode 100644 Source/Asura.Engine/input/cursor.defs create mode 100644 Source/Asura.Engine/input/cursor.h create mode 100644 Source/Asura.Engine/input/input_device.hpp create mode 100644 Source/Asura.Engine/input/keyboard.cpp create mode 100644 Source/Asura.Engine/input/keyboard.defs create mode 100644 Source/Asura.Engine/input/keyboard.h create mode 100644 Source/Asura.Engine/input/mouse.cpp create mode 100644 Source/Asura.Engine/input/mouse.h create mode 100644 Source/Asura.Engine/manager.hpp create mode 100644 Source/Asura.Engine/math/curve.cpp create mode 100644 Source/Asura.Engine/math/curve.h create mode 100644 Source/Asura.Engine/math/functions.cpp create mode 100644 Source/Asura.Engine/math/functions.h create mode 100644 Source/Asura.Engine/math/matrix44.cpp create mode 100644 Source/Asura.Engine/math/matrix44.h create mode 100644 Source/Asura.Engine/math/ranged_value.cpp create mode 100644 Source/Asura.Engine/math/ranged_value.h create mode 100644 Source/Asura.Engine/math/rect.hpp create mode 100644 Source/Asura.Engine/math/rect.inl create mode 100644 Source/Asura.Engine/math/transform.cpp create mode 100644 Source/Asura.Engine/math/transform.h create mode 100644 Source/Asura.Engine/math/vector2.hpp create mode 100644 Source/Asura.Engine/math/vector2.inl create mode 100644 Source/Asura.Engine/math/vector3.hpp create mode 100644 Source/Asura.Engine/math/vector3.inl create mode 100644 Source/Asura.Engine/math/vector4.h create mode 100644 Source/Asura.Engine/math/vector4.inl create mode 100644 Source/Asura.Engine/physics/world.h create mode 100644 Source/Asura.Engine/profiler/stats.cpp create mode 100644 Source/Asura.Engine/profiler/stats.h create mode 100644 Source/Asura.Engine/scripting/luax.hpp create mode 100644 Source/Asura.Engine/scripting/portable.cpp create mode 100644 Source/Asura.Engine/scripting/portable.h create mode 100644 Source/Asura.Engine/scripting/type.h create mode 100644 Source/Asura.Engine/singleton.hpp create mode 100644 Source/Asura.Engine/stringmap.cpp create mode 100644 Source/Asura.Engine/stringmap.hpp create mode 100644 Source/Asura.Engine/text/glyph.cpp create mode 100644 Source/Asura.Engine/text/glyph.h create mode 100644 Source/Asura.Engine/text/string.cpp create mode 100644 Source/Asura.Engine/text/string.hpp create mode 100644 Source/Asura.Engine/text/string.inl create mode 100644 Source/Asura.Engine/text/ttf.cpp create mode 100644 Source/Asura.Engine/text/ttf.h create mode 100644 Source/Asura.Engine/text/utf.hpp create mode 100644 Source/Asura.Engine/text/utf.inl create mode 100644 Source/Asura.Engine/time/timer.cpp create mode 100644 Source/Asura.Engine/time/timer.h create mode 100644 Source/Asura.Engine/type.h create mode 100644 Source/Asura.Runner/runner.cpp create mode 100644 Source/Asura.Runner/runner.h create mode 100644 Source/Asura.Runner/scripts/main.lua (limited to 'Source') diff --git a/Source/3rdParty/Luax/luax.h b/Source/3rdParty/Luax/luax.h index 58ea2c8..ed67bdc 100644 --- a/Source/3rdParty/Luax/luax.h +++ b/Source/3rdParty/Luax/luax.h @@ -6,6 +6,7 @@ #include "luax_namespace.h" #include "luax_ref.h" #include "luax_reftable.h" +#include "luax_enum.h" #include "luax_class.hpp" #include "luax_class.inl" #include "luax_state.inl" diff --git a/Source/3rdParty/Luax/luax_class.cpp b/Source/3rdParty/Luax/luax_class.cpp deleted file mode 100644 index 3cb1f8a..0000000 --- a/Source/3rdParty/Luax/luax_class.cpp +++ /dev/null @@ -1,6 +0,0 @@ - - -namespace Luax -{ - -} \ No newline at end of file diff --git a/Source/3rdParty/Luax/luax_class.hpp b/Source/3rdParty/Luax/luax_class.hpp index 6ce8d19..96124f0 100644 --- a/Source/3rdParty/Luax/luax_class.hpp +++ b/Source/3rdParty/Luax/luax_class.hpp @@ -19,6 +19,7 @@ namespace Luax #define LUAX_DECL_FACTORY(type) \ static void RegisterLuaxClass(LuaxState&);\ static void RegisterLuaxInterface(LuaxState&);\ + static void RegisterLuaxPostprocess(LuaxState&); \ static const char* GetLuaxFactoryName() { return #type; };\ static const char* GetLuaxClassName() { return #type; };\ static bool IsLuaxClassSingleton() { return false; }; @@ -134,17 +135,6 @@ namespace Luax }; - /// - /// 在成员方法里创建LuaxState并对参数进行检查。 - /// -#define LUAX_SETUP(L, params) \ - LuaxRuntime& runtime = LuaxRuntime::Get(); \ - LuaxState& state = runtime[L].state; \ - if(!state.CheckParams(1, params)) return 0 - -#define LUAX_STATE(L) \ - LuaxState& state = LuaxRuntime::Get().GetLuaxState(L) - } #endif \ No newline at end of file diff --git a/Source/3rdParty/Luax/luax_class.inl b/Source/3rdParty/Luax/luax_class.inl index 895152e..2d28d68 100644 --- a/Source/3rdParty/Luax/luax_class.inl +++ b/Source/3rdParty/Luax/luax_class.inl @@ -30,7 +30,7 @@ namespace Luax { NULL, NULL } }; - state.Register(regTable); + state.RegisterMethods(regTable); } @@ -45,7 +45,7 @@ namespace Luax { NULL, NULL } }; - state.Register(regTable); + state.RegisterMethods(regTable); } @@ -60,7 +60,7 @@ namespace Luax { NULL, NULL } }; - state.Register(regTable); + state.RegisterMethods(regTable); } @@ -74,7 +74,7 @@ namespace Luax { NULL, NULL } }; - state.Register(regTable); + state.RegisterMethods(regTable); } template diff --git a/Source/3rdParty/Luax/luax_context.cpp b/Source/3rdParty/Luax/luax_context.cpp new file mode 100644 index 0000000..c0fb2f5 --- /dev/null +++ b/Source/3rdParty/Luax/luax_context.cpp @@ -0,0 +1,36 @@ +#include "luax_context.h" + +namespace Luax +{ + + // 如果调用了此函数,报错。 + int l_Errfunc(lua_State* L) + { + cc8* err = lua_tostring(L, lua_upvalueindex(1)); + return luaL_error(L, err); + } + + Context::Context(lua_State* L) + : state(L) + { + assert(state); + } + + Context::~Context() + { + } + + // 初始化context + void Context::Setup() + { + SetupRefTables(); + } + + void Context::SetupRefTables() + { + // strong ref和 weak ref + strongRefTable.Init(state, "LUAX_STRONGREF_TABLE"); + weakRefTable.Init(state, "LUAX_WEAKREF_TABLE", "v"); + } + +} \ No newline at end of file diff --git a/Source/3rdParty/Luax/luax_context.h b/Source/3rdParty/Luax/luax_context.h new file mode 100644 index 0000000..5746cf1 --- /dev/null +++ b/Source/3rdParty/Luax/luax_context.h @@ -0,0 +1,36 @@ +#ifndef __LUAX_CONTEXT_H__ +#define __LUAX_CONTEXT_H__ + +#include "luax_ref.h" +#include "luax_config.h" +#include "luax_state.h" + +namespace Luax +{ + + /// + /// 单个lua_state相关的context。是一系列代理的集合,拷贝也没关系,主要是为了节约内存。 + /// + class Context + { + public: + Context(lua_State* L); + ~Context(); + + void Setup(); + + LuaxState state; // lua state + LuaxRefTable strongRefTable; // strong ref table + LuaxRefTable weakRefTable; // weak ref table + + size_t objectCount; // 统计所有在此state中创建的实例 + + private: + + void SetupRefTables(); + + }; + +} + +#endif \ No newline at end of file diff --git a/Source/3rdParty/Luax/luax_enum.cpp b/Source/3rdParty/Luax/luax_enum.cpp new file mode 100644 index 0000000..1ccc900 --- /dev/null +++ b/Source/3rdParty/Luax/luax_enum.cpp @@ -0,0 +1,37 @@ +#include "luax_enum.h" +#include "luax_state.h" +#include "luax_runtime.h" + +namespace Luax +{ + + /// + /// 只读metatable的__index + /// + int l_rmt__index(lua_State* L) + { + // params: + // 1. enum table + // 2. key + + // upvalues: + // 1. metatable + + int mt = lua_upvalueindex(1); + lua_pushvalue(L, 2); + lua_rawget(L, mt); + + return 1; + } + + int l_rmt__newindex(lua_State* L) + { + // upvalue: + // 1. enum table name + + cc8* name = lua_tostring(L, lua_upvalueindex(1)); + + return luaL_error(L, "Enum called \"%s\" is readonly.", name); + } + +} \ No newline at end of file diff --git a/Source/3rdParty/Luax/luax_enum.h b/Source/3rdParty/Luax/luax_enum.h new file mode 100644 index 0000000..bb96102 --- /dev/null +++ b/Source/3rdParty/Luax/luax_enum.h @@ -0,0 +1,24 @@ +#ifndef __LUAX_ENUM_H__ +#define __LUAX_ENUM_H__ + +#include "luax_config.h" + +namespace Luax +{ + + /// + /// 导出枚举,枚举是一类不可修改整型集合,枚举的值在 + /// + struct LuaxEnum + { + cc8* name; + int value; + }; + + extern int l_rmt__index(lua_State* L); + + extern int l_rmt__newindex(lua_State* L); + +} + +#endif \ No newline at end of file diff --git a/Source/3rdParty/Luax/luax_function.h b/Source/3rdParty/Luax/luax_function.h index e69de29..f4cc98b 100644 --- a/Source/3rdParty/Luax/luax_function.h +++ b/Source/3rdParty/Luax/luax_function.h @@ -0,0 +1,11 @@ +#ifndef __LUAX_FUNCTION_H__ +#define __LUAX_FUNCTION_H__ + +namespace Luax +{ + + + +} + +#endif \ No newline at end of file diff --git a/Source/3rdParty/Luax/luax_module.cpp b/Source/3rdParty/Luax/luax_module.cpp new file mode 100644 index 0000000..94de1a6 --- /dev/null +++ b/Source/3rdParty/Luax/luax_module.cpp @@ -0,0 +1,8 @@ +#include "luax_module.h" + +namespace Luax +{ + + + +} \ No newline at end of file diff --git a/Source/3rdParty/Luax/luax_module.h b/Source/3rdParty/Luax/luax_module.h new file mode 100644 index 0000000..96d954c --- /dev/null +++ b/Source/3rdParty/Luax/luax_module.h @@ -0,0 +1,12 @@ +#ifndef __LUAX_MODULE_H__ +#define __LUAX_MODULE_H__ + +namespace Luax +{ + +#define LUAX_BEGIN_MODULE(MDL) +#define LUAX_END_MODULE(MDL) + +} + +#endif \ No newline at end of file diff --git a/Source/3rdParty/Luax/luax_reftable.h b/Source/3rdParty/Luax/luax_reftable.h index 0ba42f7..58e4b9c 100644 --- a/Source/3rdParty/Luax/luax_reftable.h +++ b/Source/3rdParty/Luax/luax_reftable.h @@ -24,6 +24,8 @@ namespace Luax LuaxRefTable(); ~LuaxRefTable(); + inline operator bool() { return mState; }; + void Init(LuaxState& state, cc8* name, cc8* mode = nullptr); bool IsKeyWeak(); diff --git a/Source/3rdParty/Luax/luax_runtime.cpp b/Source/3rdParty/Luax/luax_runtime.cpp index 1c5becb..3903d9c 100644 --- a/Source/3rdParty/Luax/luax_runtime.cpp +++ b/Source/3rdParty/Luax/luax_runtime.cpp @@ -8,19 +8,6 @@ using namespace std; namespace Luax { - Context::Context(lua_State* L) - : state(L) - { - strongRefTable.Init(state, "LUAX_STRONGREF_TABLE"); - weakRefTable.Init(state, "LUAX_WEAKREF_TABLE", "v"); - } - - Context::~Context() - { - } - - //-------------------------------------------------------------------------------------------------------------- - LuaxRuntime* LuaxRuntime::mRuntime = nullptr; LuaxRuntime::LuaxRuntime() {}; @@ -38,7 +25,10 @@ namespace Luax { lua_State* L = lua_open(); assert(L); + // 加入 mContexts.insert(pair(L, Context(L))); + // 初始化context + (*this)[L].Setup(); return L; } diff --git a/Source/3rdParty/Luax/luax_runtime.h b/Source/3rdParty/Luax/luax_runtime.h index fe70580..cb8b66b 100644 --- a/Source/3rdParty/Luax/luax_runtime.h +++ b/Source/3rdParty/Luax/luax_runtime.h @@ -3,29 +3,14 @@ #include +#include "luax_ref.h" #include "luax_config.h" #include "luax_state.h" +#include "luax_context.h" namespace Luax { - /// - /// 单个lua_state相关的context。是一系列代理的集合,拷贝也没关系,主要是为了节约内存。 - /// - class Context - { - public: - Context(lua_State* L); - ~Context(); - - LuaxState state; // lua state - LuaxRefTable strongRefTable; // strong ref table - LuaxRefTable weakRefTable; // weak ref table - - size_t objectCount; // 统计所有在此state中创建的实例 - - }; - /// /// 统一管理程序所有的lua states。 /// diff --git a/Source/3rdParty/Luax/luax_state.cpp b/Source/3rdParty/Luax/luax_state.cpp index 87c3bcd..5253a2c 100644 --- a/Source/3rdParty/Luax/luax_state.cpp +++ b/Source/3rdParty/Luax/luax_state.cpp @@ -1,18 +1,19 @@ +//#include "luax_class.h" +#include "luax_enum.h" #include "luax_state.h" +#include "luax_runtime.h" namespace Luax { -#define L mState - LuaxState::LuaxState(lua_State* state) - : L(state) + : mState(state) { assert(state); } LuaxState::LuaxState(const LuaxState& state) - : L(state.mState) + : mState(state.mState) { assert(state.mState); } @@ -21,49 +22,24 @@ namespace Luax { } - LuaxState::operator lua_State*() - { - return L; - }; - - LuaxState::operator bool() - { - return L != nullptr; - } - - lua_State* LuaxState::operator ->() - { - return L; - } - - lua_State& LuaxState::operator*() - { - return *L; - } - - lua_State* LuaxState::GetHandle() - { - return L; - } - void LuaxState::OpenLibs() { - luaL_openlibs(L); + luaL_openlibs(mState); } void LuaxState::PushNamespace(cc8* name) { - bool isG = !lua_istable(L, -1); + bool isG = !lua_istable(mState, -1); int idx = isG ? LUA_GLOBALSINDEX : -1; - lua_getfield(L, idx, name); - if (lua_isnil(L, -1)) + lua_getfield(mState, idx, name); + if (lua_isnil(mState, -1)) { - lua_pop(L, 1); - lua_newtable(L); - assert(lua_istable(L, -1)); - lua_pushvalue(L, -1); + lua_pop(mState, 1); + lua_newtable(mState); + assert(lua_istable(mState, -1)); + lua_pushvalue(mState, -1); int t = isG ? LUA_GLOBALSINDEX : -3; - lua_setfield(L, t, name); + lua_setfield(mState, t, name); } // stack: @@ -72,25 +48,25 @@ namespace Luax void LuaxState::PopNamespace() { - assert(lua_istable(L, -1)); - lua_pop(L, 1); + assert(lua_istable(mState, -1)); + lua_pop(mState, 1); } void LuaxState::DoString(const std::string& code) { - luaL_dostring(L, code.c_str()); + luaL_dostring(mState, code.c_str()); } int LuaxState::AbsIndex(int idx) { /* -#define abs_index(L, i) ((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : \ - lua_gettop(L) + (i) + 1) +#define abs_index(mState, i) ((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : \ + lua_gettop(mState) + (i) + 1) */ if (idx < 0) { - //return lua_gettop(L) + idx + 1; + //return lua_gettop(mState) + idx + 1; return ((idx) > 0 || (idx) <= LUA_REGISTRYINDEX ? (idx) : \ - lua_gettop(L) + (idx)+1); + lua_gettop(mState) + (idx)+1); } return idx; } @@ -102,107 +78,107 @@ namespace Luax void LuaxState::PushNil() { - lua_pushnil(L); + lua_pushnil(mState); } void LuaxState::Push(bool value) { - lua_pushboolean(L, value ? 1 : 0); + lua_pushboolean(mState, value ? 1 : 0); } void LuaxState::Push(cc8* value) { - lua_pushstring(L, value); + lua_pushstring(mState, value); } void LuaxState::Push(double value) { - lua_pushnumber(L, value); + lua_pushnumber(mState, value); } void LuaxState::Push(float value) { - lua_pushnumber(L, value); + lua_pushnumber(mState, value); } void LuaxState::Push(int value) { - lua_pushnumber(L, value); + lua_pushnumber(mState, value); } void LuaxState::Push(u16 value) { - lua_pushnumber(L, value); + lua_pushnumber(mState, value); } void LuaxState::Push(u32 value) { - lua_pushnumber(L, value); + lua_pushnumber(mState, value); } void LuaxState::Push(u64 value) { - lua_pushnumber(L, (double)value); + lua_pushnumber(mState, (double)value); } void LuaxState::Push(uintptr value) { - lua_pushlightuserdata(L, (void*)value); + lua_pushlightuserdata(mState, (void*)value); } void LuaxState::Push(lua_CFunction value) { - lua_pushcfunction(L, value); + lua_pushcfunction(mState, value); } void LuaxState::Push(void* data, size_t size) { - lua_pushlstring(L, (cc8*)data, size); + lua_pushlstring(mState, (cc8*)data, size); } void LuaxState::Push(const void* value) { - lua_pushlightuserdata(L, (void*)value); + lua_pushlightuserdata(mState, (void*)value); } void LuaxState::Pop(int n /* = 1 */) { - lua_pop(L, n); + lua_pop(mState, n); } void LuaxState::Settop(int idx) { - lua_settop(L, idx); + lua_settop(mState, idx); } bool LuaxState::IsNil(int idx) { - return lua_isnil(L, idx); + return lua_isnil(mState, idx); } bool LuaxState::IsNilOrNone(int idx) { - int t = lua_type(L, idx); + int t = lua_type(mState, idx); return ((t == LUA_TNONE) || (t == LUA_TNIL)); } bool LuaxState::IsTableOrUserdata(int idx) { - int check = lua_type(L, idx); + int check = lua_type(mState, idx); return ((check == LUA_TTABLE) || (check == LUA_TUSERDATA)); } bool LuaxState::IsTrueOrNotNil(int idx) { - if (lua_isboolean(L, idx)) { - return lua_toboolean(L, idx) ? true : false; + if (lua_isboolean(mState, idx)) { + return lua_toboolean(mState, idx) ? true : false; } - return !lua_isnil(L, idx); + return !lua_isnil(mState, idx); } bool LuaxState::IsType(int idx, int type) { - return (lua_type(L, idx) == type); + return (lua_type(mState, idx) == type); } bool LuaxState::IsType(int idx, cc8* name, int type) @@ -212,7 +188,7 @@ namespace Luax bool LuaxState::IsValid() { - return (L != 0); + return (mState != 0); } int LuaxState::GetTop() @@ -222,9 +198,9 @@ namespace Luax bool LuaxState::HasField(int idx, cc8* name) { - lua_getfield(L, idx, name); - bool hasField = (lua_isnil(L, -1) == false); - lua_pop(L, 1); + lua_getfield(mState, idx, name); + bool hasField = (lua_isnil(mState, -1) == false); + lua_pop(mState, 1); return hasField; } @@ -232,17 +208,17 @@ namespace Luax bool LuaxState::HasField(int idx, int key) { this->GetField(idx, key); - bool hasField = (lua_isnil(L, -1) == false); - lua_pop(L, 1); + bool hasField = (lua_isnil(mState, -1) == false); + lua_pop(mState, 1); return hasField; } bool LuaxState::HasField(int idx, cc8* name, int type) { - lua_getfield(L, idx, name); - bool hasField = (lua_type(L, -1) == type); - lua_pop(L, 1); + lua_getfield(mState, idx, name); + bool hasField = (lua_type(mState, -1) == type); + lua_pop(mState, 1); return hasField; } @@ -250,8 +226,8 @@ namespace Luax bool LuaxState::HasField(int idx, int key, int type) { this->GetField(idx, key); - bool hasField = (lua_type(L, -1) == type); - lua_pop(L, 1); + bool hasField = (lua_type(mState, -1) == type); + lua_pop(mState, 1); return hasField; } @@ -260,38 +236,38 @@ namespace Luax idx = this->AbsIndex(idx); - lua_pushnil(L); /* first key */ - if (lua_next(L, idx) != 0) { - lua_pop(L, 2); + lua_pushnil(mState); /* first key */ + if (lua_next(mState, idx) != 0) { + lua_pop(mState, 2); return true; } return false; } - void LuaxState::Register(const luaL_Reg *l) + void LuaxState::RegisterMethods(const luaL_Reg *l) { - luaL_register(L, 0, l); + luaL_register(mState, 0, l); } void LuaxState::GetField(int idx, cc8* name) { - lua_getfield(L, idx, name); + lua_getfield(mState, idx, name); } void LuaxState::GetField(int idx, int key) { idx = this->AbsIndex(idx); - lua_pushinteger(L, key); - lua_gettable(L, idx); + lua_pushinteger(mState, key); + lua_gettable(mState, idx); } std::string LuaxState::GetField(int idx, cc8* key, cc8* value) { std::string str; if (this->GetFieldWithType(idx, key, LUA_TSTRING)) { - str = lua_tostring(L, -1); - lua_pop(L, 1); + str = lua_tostring(mState, -1); + lua_pop(mState, 1); } else { str = value; @@ -303,8 +279,8 @@ namespace Luax { std::string str; if (this->GetFieldWithType(idx, key, LUA_TSTRING)) { - str = lua_tostring(L, -1); - lua_pop(L, 1); + str = lua_tostring(mState, -1); + lua_pop(mState, 1); } else { str = value; @@ -316,8 +292,8 @@ namespace Luax { std::string str; if (this->GetFieldWithType(idx, key, LUA_TSTRING)) { - str = lua_tostring(L, -1); - lua_pop(L, 1); + str = lua_tostring(mState, -1); + lua_pop(mState, 1); } else { str = value; @@ -329,8 +305,8 @@ namespace Luax { std::string str; if (this->GetFieldWithType(idx, key, LUA_TSTRING)) { - str = lua_tostring(L, -1); - lua_pop(L, 1); + str = lua_tostring(mState, -1); + lua_pop(mState, 1); } else { str = value; @@ -340,9 +316,9 @@ namespace Luax bool LuaxState::GetFieldWithType(int idx, cc8* name, int type) { - lua_getfield(L, idx, name); - if (lua_type(L, -1) != type) { - lua_pop(L, 1); + lua_getfield(mState, idx, name); + if (lua_type(mState, -1) != type) { + lua_pop(mState, 1); return false; } return true; @@ -351,8 +327,8 @@ namespace Luax bool LuaxState::GetFieldWithType(int idx, int key, int type) { this->GetField(idx, key); - if (lua_type(L, -1) != type) { - lua_pop(L, 1); + if (lua_type(mState, -1) != type) { + lua_pop(mState, 1); return false; } return true; @@ -363,7 +339,7 @@ namespace Luax if (IsTableOrUserdata(idx)) { idx = AbsIndex(idx); - lua_setfield(L, idx, key); + lua_setfield(mState, idx, key); } } @@ -631,4 +607,43 @@ namespace Luax (*handle) = ptr; } + void LuaxState::RegisterEnum(cc8* name, LuaxEnum* en) + { + assert(name); + assert(en); + + // short name + lua_State* L = mState; + + int top = GetTop(); + + lua_newtable(L); // enum table + + int et = GetTop(); + + lua_newtable(L); // matatable + + // 所有枚举都存在metatable下,修改时触发__newindex报错 + for (; en->name; ++en) + { + lua_pushinteger(L, en->value); + lua_setfield(L, -2, en->name); + } + + // __index + //lua_pushvalue(L, -1); // metatable + //lua_pushcclosure(L, l_rmt__index, 1); + lua_pushvalue(L, -1); + lua_setfield(L, -2, "__index"); + + // __newinedx + lua_pushstring(L, name); // enum name + lua_pushcclosure(L, l_rmt__newindex, 1); + lua_setfield(L, -2, "__newindex"); + + lua_setmetatable(L, et); + + lua_setfield(L, top, name); + } + } \ No newline at end of file diff --git a/Source/3rdParty/Luax/luax_state.h b/Source/3rdParty/Luax/luax_state.h index 2b143f8..166ac26 100644 --- a/Source/3rdParty/Luax/luax_state.h +++ b/Source/3rdParty/Luax/luax_state.h @@ -10,6 +10,9 @@ namespace Luax { class Context; + class LuaxEnum; + class LuaxStrongRef; + class LuaxWeakRef; /// /// 对lua_State的代理,除了保存一个lua_State的引用不保存其他内容。一个实例的metatable如下: @@ -23,15 +26,15 @@ namespace Luax { public: - operator lua_State*(); - operator bool(); - lua_State* operator ->(); - lua_State& operator *(); + inline lua_State* operator ->() { return mState; }; + inline lua_State& operator *() { return *mState; }; + inline operator lua_State*() { return mState; } + inline operator bool() { return mState != nullptr; }; /// /// 获取绑定的lua_State /// - lua_State* GetHandle(); + inline lua_State* GetHandle() { return mState; }; //------------------------------------------------------------------------------------------------------------ @@ -55,7 +58,7 @@ namespace Luax /// /// 注册C函数,注意后面加一行{0, 0} /// - void Register(const luaL_Reg *l); + void RegisterMethods(const luaL_Reg *l); void GetField(int idx, cc8* name); void GetField(int idx, int key); @@ -109,11 +112,6 @@ namespace Luax template T* GetLuaUserdata(int idx); - //------------------------------------------------------------------------------------------------------------ - // 对引用的管理,包含register[LUAX_STRONG_REFTABLE]和register[LUAX_WEAK_REFTABLE] - - void Ref(); - //------------------------------------------------------------------------------------------------------------ template T GetValue(int idx, T default_value); @@ -139,6 +137,11 @@ namespace Luax /// template void RegisterSingleton(); + /// + /// 注册枚举 + /// + void RegisterEnum(cc8* name, LuaxEnum* enums); + private: friend class Context; @@ -175,6 +178,17 @@ namespace Luax template <> std::string LuaxState::GetValue < std::string >(int idx, const std::string value); template <> const void* LuaxState::GetValue < const void* >(int idx, const void* value); + /// + /// 在成员方法里创建LuaxState并对参数进行检查。 + /// +#define LUAX_SETUP(L, params) \ + LuaxRuntime& runtime = LuaxRuntime::Get(); \ + LuaxState& state = runtime[L].state; \ + if(!state.CheckParams(1, params)) return 0 + +#define LUAX_STATE(L) \ + LuaxState& state = LuaxRuntime::Get().GetLuaxState(L) + } #endif \ No newline at end of file diff --git a/Source/3rdParty/Luax/luax_state.inl b/Source/3rdParty/Luax/luax_state.inl index 2c9f7a8..b5ee5aa 100644 --- a/Source/3rdParty/Luax/luax_state.inl +++ b/Source/3rdParty/Luax/luax_state.inl @@ -44,12 +44,12 @@ namespace Luax assert(IsType(-1, LUA_TFUNCTION)); \ Pop(); - // New方法可以没有,如果没有的话表示这是一个抽象类 - //_assertmethod(-1, "New"); + // New方法可以没有,如果没有的话表示这是一个抽象类 + //_assertmethod(-1, "New"); #undef _assertmethod - // .Extend() + // .Extend() lua_pushvalue(state, -1); // class table LuaxClass::PushInterfaceTable(state); // interface table lua_pushcclosure(state, LuaxClass::l_ExtendFactory, 2); @@ -66,6 +66,9 @@ namespace Luax // reset top lua_settop(L, top); + + // 后处理 + T::RegisterLuaxPostprocess(state); } // 注册单例 diff --git a/Source/3rdParty/Luax/luax_variable.cpp b/Source/3rdParty/Luax/luax_variable.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/3rdParty/Luax/luax_variable.h b/Source/3rdParty/Luax/luax_variable.h deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Editor/scripts/compile.bat b/Source/Asura.Editor/scripts/compile.bat new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/scripts/compile.sh b/Source/Asura.Editor/scripts/compile.sh new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/scripts/main.lua b/Source/Asura.Editor/scripts/main.lua new file mode 100644 index 0000000..a513f87 --- /dev/null +++ b/Source/Asura.Editor/scripts/main.lua @@ -0,0 +1,5 @@ +local Editor = require("Asura.Editor") + +--编辑器入口 +--编辑器真正的内容在Asura.Editor/Scripts下面实现 + diff --git a/Source/Asura.Editor/scripts/scene_view.lua b/Source/Asura.Editor/scripts/scene_view.lua new file mode 100644 index 0000000..ff96b2c --- /dev/null +++ b/Source/Asura.Editor/scripts/scene_view.lua @@ -0,0 +1,2 @@ +-- 鍦烘櫙绐楀彛 + diff --git a/Source/Asura.Editor/source/editor.cpp b/Source/Asura.Editor/source/editor.cpp new file mode 100644 index 0000000..29fb76d --- /dev/null +++ b/Source/Asura.Editor/source/editor.cpp @@ -0,0 +1,6 @@ + + +int main(int argc, char *argv[]) +{ + +} \ No newline at end of file diff --git a/Source/Asura.Editor/source/graphics/shader.cpp b/Source/Asura.Editor/source/graphics/shader.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/graphics/shader.h b/Source/Asura.Editor/source/graphics/shader.h new file mode 100644 index 0000000..7511e1c --- /dev/null +++ b/Source/Asura.Editor/source/graphics/shader.h @@ -0,0 +1,21 @@ +#ifndef __ASURA_EDITOR_SHADER_H__ +#define __ASURA_EDITOR_SHADER_H__ + +#include + +namespace AsuraEditor +{ + + /// + /// 编辑器中使用的shader,不会有lua接口。 + /// + class Shader : public AEGraphics::Shader + { + public: + + + }; + +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Editor/source/widgets/button.cpp b/Source/Asura.Editor/source/widgets/button.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/button.h b/Source/Asura.Editor/source/widgets/button.h new file mode 100644 index 0000000..b8c2f56 --- /dev/null +++ b/Source/Asura.Editor/source/widgets/button.h @@ -0,0 +1,30 @@ +#ifndef __ASURA_EDITOR_BUTTON_H__ +#define __ASURA_EDITOR_BUTTON_H__ + +// Asura.Engine Headers +#include + +#include "Widget.h" + +namespace AsuraEditor +{ + + class Button : public Widget + { + + public: + + Button(); + + private: + + // Image mIcon; // 图标,或许不需要 + // Text mText; //按钮文字 + + LUAX_DECL_FACTORY(Button); // AsuraEditor.Button + + }; + +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Editor/source/widgets/checkbox.cpp b/Source/Asura.Editor/source/widgets/checkbox.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/checkbox.h b/Source/Asura.Editor/source/widgets/checkbox.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/hslider.cpp b/Source/Asura.Editor/source/widgets/hslider.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/hslider.h b/Source/Asura.Editor/source/widgets/hslider.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/hvslider.cpp b/Source/Asura.Editor/source/widgets/hvslider.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/hvslider.h b/Source/Asura.Editor/source/widgets/hvslider.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/label.cpp b/Source/Asura.Editor/source/widgets/label.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/label.h b/Source/Asura.Editor/source/widgets/label.h new file mode 100644 index 0000000..6889818 --- /dev/null +++ b/Source/Asura.Editor/source/widgets/label.h @@ -0,0 +1,18 @@ +#ifndef __ASURA_EDITOR_LABEL_H__ +#define __ASURA_EDITOR_LABEL_H__ + +namespace AsuraEditor +{ + + class Label + { + + public: + + + + }; + +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Editor/source/widgets/panel.cpp b/Source/Asura.Editor/source/widgets/panel.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/panel.h b/Source/Asura.Editor/source/widgets/panel.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/rbutton.cpp b/Source/Asura.Editor/source/widgets/rbutton.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/rbutton.h b/Source/Asura.Editor/source/widgets/rbutton.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/textbox.cpp b/Source/Asura.Editor/source/widgets/textbox.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/textbox.h b/Source/Asura.Editor/source/widgets/textbox.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/vslider.cpp b/Source/Asura.Editor/source/widgets/vslider.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/vslider.h b/Source/Asura.Editor/source/widgets/vslider.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Editor/source/widgets/widget.h b/Source/Asura.Editor/source/widgets/widget.h new file mode 100644 index 0000000..437e2bf --- /dev/null +++ b/Source/Asura.Editor/source/widgets/widget.h @@ -0,0 +1,24 @@ +#ifndef __ASURA_EDITOR_WIDGET_H__ +#define __ASURA_EDITOR_WIDGET_H__ + +#include + +namespace AusraEditor +{ + + /// + /// Asura Editor的控件逻辑,不包含渲染、窗口和事件轮询,只包含对事件的响应和逻辑处理接口。 + /// + class Widget : virtual public Object + { + + public: + + // 控件有绘制方法 + virtual void Draw() = 0; + + }; + +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Editor/source/window/window.h b/Source/Asura.Editor/source/window/window.h new file mode 100644 index 0000000..7b265ef --- /dev/null +++ b/Source/Asura.Editor/source/window/window.h @@ -0,0 +1,14 @@ +#ifndef __ASURA_EDITOR_WINDOW_H__ +#define __ASURA_EDITOR_WINDOW_H__ + +namespace AsuraEditor +{ + + class Window + { + + }; + +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/Audio/SoundDecoder.h b/Source/Asura.Engine/Audio/SoundDecoder.h deleted file mode 100644 index ad9f761..0000000 --- a/Source/Asura.Engine/Audio/SoundDecoder.h +++ /dev/null @@ -1,29 +0,0 @@ -#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/Asura.Engine/FileSystem/DataBuffer.cpp b/Source/Asura.Engine/FileSystem/DataBuffer.cpp deleted file mode 100644 index ec2995a..0000000 --- a/Source/Asura.Engine/FileSystem/DataBuffer.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "DataBuffer.h" - -namespace AsuraEngine -{ - namespace Filesystem - { - - DataBuffer::~DataBuffer() - { - delete[] data; - } - - } -} \ No newline at end of file diff --git a/Source/Asura.Engine/FileSystem/DataBuffer.h b/Source/Asura.Engine/FileSystem/DataBuffer.h deleted file mode 100644 index 84d445c..0000000 --- a/Source/Asura.Engine/FileSystem/DataBuffer.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef __ASURA_ENGINE_DATABUFFER_H__ -#define __ASURA_ENGINE_DATABUFFER_H__ - -#include - -#include "Scripting/Luax.hpp" -#include "Scripting/Portable.h" - -namespace AsuraEngine -{ - namespace Filesystem - { - - /// - /// 对内存数据的封装,所有的数据使用Data buffer包装,不直接使用const void*。通过resource manager读取。 - /// - class DataBuffer ASURA_FINAL: public Scripting::Portable - { - public: - - DataBuffer(const void* data, std::size_t size); - - ~DataBuffer(); - - byte* data; - size_t size; - - //---------------------------------------------------------------------------------------------------------- - - LUAX_DECL_FACTORY(DataBuffer); - - //---------------------------------------------------------------------------------------------------------- - - }; - - } -} - -#endif \ No newline at end of file diff --git a/Source/Asura.Engine/FileSystem/DecodedData.cpp b/Source/Asura.Engine/FileSystem/DecodedData.cpp deleted file mode 100644 index 125c652..0000000 --- a/Source/Asura.Engine/FileSystem/DecodedData.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "DecodedData.h" -#include "Exceptions/Exception.h" - -namespace AsuraEngine -{ - namespace Filesystem - { - - DecodedData::DecodedData(const DataBuffer* databuffer) - { - Decode(databuffer); - } - - DecodedData::~DecodedData() - { - - } - - } -} diff --git a/Source/Asura.Engine/FileSystem/DecodedData.h b/Source/Asura.Engine/FileSystem/DecodedData.h deleted file mode 100644 index 0b661b6..0000000 --- a/Source/Asura.Engine/FileSystem/DecodedData.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef __ASURA_ENGINE_DATA_H__ -#define __ASURA_ENGINE_DATA_H__ - -#include - -#include "DataBuffer.h" -#include "Scripting/Portable.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/Asura.Engine/FileSystem/ResourceManager.cpp b/Source/Asura.Engine/FileSystem/ResourceManager.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/FileSystem/ResourceManager.h b/Source/Asura.Engine/FileSystem/ResourceManager.h deleted file mode 100644 index e22ce91..0000000 --- a/Source/Asura.Engine/FileSystem/ResourceManager.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef __ASURA_ENGINE_RESOURCE_MANAGER_H__ -#define __ASURA_ENGINE_RESOURCE_MANAGER_H__ - -#include - -#include "DataBuffer.h" -#include "Scripting/Portable.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/Asura.Engine/FileSystem/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt" "b/Source/Asura.Engine/FileSystem/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt" deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Graphics/BlendMode.h b/Source/Asura.Engine/Graphics/BlendMode.h deleted file mode 100644 index 775cc45..0000000 --- a/Source/Asura.Engine/Graphics/BlendMode.h +++ /dev/null @@ -1,17 +0,0 @@ -#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/Asura.Engine/Graphics/ImageData.cpp b/Source/Asura.Engine/Graphics/ImageData.cpp deleted file mode 100644 index 68781a1..0000000 --- a/Source/Asura.Engine/Graphics/ImageData.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "ImageData.h" -#include "PNGDecoder.h" -#include "STBDecoder.h" - -namespace AsuraEngine -{ - namespace Graphics - { - - using namespace std; - - // 解析image的decoder,用来作为解析策略。 - list 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/Asura.Engine/Graphics/ImageData.h b/Source/Asura.Engine/Graphics/ImageData.h deleted file mode 100644 index 931eaa3..0000000 --- a/Source/Asura.Engine/Graphics/ImageData.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef __ASURA_ENGINE_IMAGEDATA_H__ -#define __ASURA_ENGINE_IMAGEDATA_H__ - -#include - -#include "Scripting/Luax.hpp" -#include "Filesystem/DecodedData.h" -#include "ImageDecoder.h" -#include "PixelFormat.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 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/Asura.Engine/Graphics/ImageDecoder.h b/Source/Asura.Engine/Graphics/ImageDecoder.h deleted file mode 100644 index 2c73fd1..0000000 --- a/Source/Asura.Engine/Graphics/ImageDecoder.h +++ /dev/null @@ -1,35 +0,0 @@ -#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/Asura.Engine/Graphics/PNGDecoder.cpp b/Source/Asura.Engine/Graphics/PNGDecoder.cpp deleted file mode 100644 index f919090..0000000 --- a/Source/Asura.Engine/Graphics/PNGDecoder.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#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/Asura.Engine/Graphics/PNGDecoder.h b/Source/Asura.Engine/Graphics/PNGDecoder.h deleted file mode 100644 index 980753f..0000000 --- a/Source/Asura.Engine/Graphics/PNGDecoder.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __ASURA_ENGINE_PNGDECODER_H__ -#define __ASURA_ENGINE_PNGDECODER_H__ - -#include "ImageDecoder.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/Asura.Engine/Graphics/PixelFormat.h b/Source/Asura.Engine/Graphics/PixelFormat.h deleted file mode 100644 index 8df07d5..0000000 --- a/Source/Asura.Engine/Graphics/PixelFormat.h +++ /dev/null @@ -1,91 +0,0 @@ -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/Asura.Engine/Graphics/Port/Canvas.cpp b/Source/Asura.Engine/Graphics/Port/Canvas.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Graphics/Port/Color.cpp b/Source/Asura.Engine/Graphics/Port/Color.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Graphics/Port/Image.cpp b/Source/Asura.Engine/Graphics/Port/Image.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Graphics/Port/ImageData.cpp b/Source/Asura.Engine/Graphics/Port/ImageData.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Graphics/Port/Mesh2D.cpp b/Source/Asura.Engine/Graphics/Port/Mesh2D.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Graphics/Port/Mesh2DData.cpp b/Source/Asura.Engine/Graphics/Port/Mesh2DData.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Graphics/Port/Shader.cpp b/Source/Asura.Engine/Graphics/Port/Shader.cpp deleted file mode 100644 index ba355f5..0000000 --- a/Source/Asura.Engine/Graphics/Port/Shader.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include "../Shader.h" - -using namespace Luax; - -namespace AsuraEngine -{ - namespace Graphics - { - - /// - /// 将此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); - - } - - /// - /// 后的uniforms的location,如果没有这个uniform,返回nil,否则返回对应的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); - - } - - void Shader::RegisterLuaxClass(LuaxState& state) - { - - } - - } -} \ No newline at end of file diff --git a/Source/Asura.Engine/Graphics/Port/SpriteBatch.cpp b/Source/Asura.Engine/Graphics/Port/SpriteBatch.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Graphics/Port/Window.cpp b/Source/Asura.Engine/Graphics/Port/Window.cpp deleted file mode 100644 index 3befc8c..0000000 --- a/Source/Asura.Engine/Graphics/Port/Window.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "../Window.h" - -namespace AsuraEngine -{ - namespace Graphics - { - - - - } -} diff --git a/Source/Asura.Engine/Graphics/RenderState.h b/Source/Asura.Engine/Graphics/RenderState.h deleted file mode 100644 index f313296..0000000 --- a/Source/Asura.Engine/Graphics/RenderState.h +++ /dev/null @@ -1,50 +0,0 @@ -#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 "BlendMode.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/Asura.Engine/Graphics/RenderTarget.cpp b/Source/Asura.Engine/Graphics/RenderTarget.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Graphics/RenderTarget.h b/Source/Asura.Engine/Graphics/RenderTarget.h deleted file mode 100644 index d6de164..0000000 --- a/Source/Asura.Engine/Graphics/RenderTarget.h +++ /dev/null @@ -1,54 +0,0 @@ -#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() {}; - - /// - /// 用颜色col清空整个RT - /// - virtual void Clear(const Color& col = Color::Black) = 0; - - /// - /// 用颜色col清空部分RT - /// - virtual void Clear(const Math::Recti& quad, const Color& col = Color::Black) = 0; - - /// - /// 绘制texture到本RT上 - /// - virtual void Draw(const Drawable* texture, const RenderState& state) = 0; - - /// - /// 绘制一部分texture到本RT上 - /// - 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/Asura.Engine/Graphics/STBDecoder.cpp b/Source/Asura.Engine/Graphics/STBDecoder.cpp deleted file mode 100644 index b14d0f3..0000000 --- a/Source/Asura.Engine/Graphics/STBDecoder.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#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)) - { - // 4个channel都是float - 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/Asura.Engine/Graphics/STBDecoder.h b/Source/Asura.Engine/Graphics/STBDecoder.h deleted file mode 100644 index 5567466..0000000 --- a/Source/Asura.Engine/Graphics/STBDecoder.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __ASURA_ENGINE_STBDECODER_H__ -#define __ASURA_ENGINE_STBDECODER_H__ - -#include "ImageDecoder.h" - -namespace AsuraEngine -{ - namespace Graphics - { - - /// - /// 使用stb_image解压JPEG、TGA、BMP文件 - /// - 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/Asura.Engine/Graphics/Shader.h b/Source/Asura.Engine/Graphics/Shader.h index 932cc42..103c7b7 100644 --- a/Source/Asura.Engine/Graphics/Shader.h +++ b/Source/Asura.Engine/Graphics/Shader.h @@ -11,7 +11,7 @@ #include "Math/Vector4.h" #include "Math/Matrix44.h" #include "StringMap.hpp" -#include "Scripting/Portable.h" +#include "scripting/portable.h" #include "Color.h" #include "Manager.hpp" #include "Texture.h" @@ -27,7 +27,7 @@ namespace AsuraEngine /// 器针对每个shader,会通过shader代码找到声明的uniforms变量,并暴露给framework的material设置。 /// class Shader ASURA_FINAL - : public Scripting::Portable + : public Scripting::Portable , public Filesystem::Reloadable { public: diff --git a/Source/Asura.Engine/Graphics/SpriteBatch.cpp b/Source/Asura.Engine/Graphics/SpriteBatch.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Graphics/SpriteBatch.h b/Source/Asura.Engine/Graphics/SpriteBatch.h deleted file mode 100644 index 353bf77..0000000 --- a/Source/Asura.Engine/Graphics/SpriteBatch.h +++ /dev/null @@ -1,27 +0,0 @@ -#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 - { - public: - - SpriteBatch(); - - ~SpriteBatch(); - - }; - - } -} - -#endif \ No newline at end of file diff --git a/Source/Asura.Engine/Input/InputDevice.hpp b/Source/Asura.Engine/Input/InputDevice.hpp deleted file mode 100644 index eb0b7a3..0000000 --- a/Source/Asura.Engine/Input/InputDevice.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#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 - ASURA_ABSTRACT class InputDevice - : virtual public Scripting::Portable - , virtual public Singleton - { - public: - InputDevice(); - virtual ~InputDevice(); - - }; - - } -} - -#endif \ No newline at end of file diff --git a/Source/Asura.Engine/Math/RangedValue.cpp b/Source/Asura.Engine/Math/RangedValue.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Math/RangedValue.h b/Source/Asura.Engine/Math/RangedValue.h deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Scripting/Object.h b/Source/Asura.Engine/Scripting/Object.h deleted file mode 100644 index 58b7e1a..0000000 --- a/Source/Asura.Engine/Scripting/Object.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef __ASURA_ENGINE_OBJECT_H__ -#define __ASURA_ENGINE_OBJECT_H__ - -#include "Config.h" -#include "Portable.h" - -namespace AsuraEngine -{ - namespace Scripting - { - - /// - /// AsuraEngine脚本的抽象基类,所有的东西都从这里派生 - /// - class Object : public Portable - { - - }; - - } -} - -#endif \ No newline at end of file diff --git a/Source/Asura.Engine/Scripting/Portable.h b/Source/Asura.Engine/Scripting/Portable.h index e3c5bef..0527308 100644 --- a/Source/Asura.Engine/Scripting/Portable.h +++ b/Source/Asura.Engine/Scripting/Portable.h @@ -10,12 +10,9 @@ namespace AsuraEngine namespace Scripting { - /// - /// 需要导出到lua的继承此类 - /// - template + template using Portable = Luax::LuaxClass; - + } } diff --git a/Source/Asura.Engine/Text/TrueTypeFont.cpp b/Source/Asura.Engine/Text/TrueTypeFont.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/Text/TrueTypeFont.h b/Source/Asura.Engine/Text/TrueTypeFont.h deleted file mode 100644 index e69de29..0000000 diff --git a/Source/Asura.Engine/application.cpp b/Source/Asura.Engine/application.cpp new file mode 100644 index 0000000..598bca8 --- /dev/null +++ b/Source/Asura.Engine/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(); + + 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/Asura.Engine/application.h b/Source/Asura.Engine/application.h new file mode 100644 index 0000000..08b3bea --- /dev/null +++ b/Source/Asura.Engine/application.h @@ -0,0 +1,83 @@ +#ifndef __ASURA_ENGINE_APPLICATION_H__ +#define __ASURA_ENGINE_APPLICATION_H__ + +#include "Scripting/Portable.h" +#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); + + /// + /// 注册lua类,可以被重载,自定义导出的类 + /// + virtual void PortToLua(); + + /// + /// 进入入口 + /// + virtual void Run(int argc, char* args[]); + + /// + /// 退出run时的处理 + /// + virtual void Exit(); + + private: + + /// + /// 子模块初始化函数,在各自模块的文件夹下面实现。 + /// + bool InitGraphics(); + bool InitAudio(); + bool InitFont(); + bool InitInput(); + bool InitMath(); + bool InitPhysics(); + bool InitTime(); + bool InitWindow(); + + /// + /// Lua state. + /// + lua_State* mLuaState; + + }; + +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/asura.h b/Source/Asura.Engine/asura.h new file mode 100644 index 0000000..5ca56f3 --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/audio/sound.cpp b/Source/Asura.Engine/audio/sound.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/audio/sound.h b/Source/Asura.Engine/audio/sound.h new file mode 100644 index 0000000..095bdb7 --- /dev/null +++ b/Source/Asura.Engine/audio/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/Asura.Engine/audio/sound_decoder.h b/Source/Asura.Engine/audio/sound_decoder.h new file mode 100644 index 0000000..ad9f761 --- /dev/null +++ b/Source/Asura.Engine/audio/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/Asura.Engine/config.h b/Source/Asura.Engine/config.h new file mode 100644 index 0000000..f02a2ba --- /dev/null +++ b/Source/Asura.Engine/config.h @@ -0,0 +1,82 @@ +#ifndef __ASURA_CONFIG_H__ +#define __ASURA_CONFIG_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; + + //---------------------------------------------------------------------------------------------------------------- + // assert + +#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_RUN(App) \ +int main(int argc, char* args[]) \ +{ \ + App app; \ + app.InitSubModules(); \ + app.PortToLua(); \ + app.Run(argc, args); \ + return 0; \ +} + + //---------------------------------------------------------------------------------------------------------------- + // + +} // namespace AsuraEngine + +#endif // __ASURA_CONFIG_H__ \ No newline at end of file diff --git a/Source/Asura.Engine/exceptions/exception.cpp b/Source/Asura.Engine/exceptions/exception.cpp new file mode 100644 index 0000000..dbb36ca --- /dev/null +++ b/Source/Asura.Engine/exceptions/exception.cpp @@ -0,0 +1,47 @@ +#include "Exception.h" + +#include +#include + +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/Asura.Engine/exceptions/exception.h b/Source/Asura.Engine/exceptions/exception.h new file mode 100644 index 0000000..bed8a9a --- /dev/null +++ b/Source/Asura.Engine/exceptions/exception.h @@ -0,0 +1,43 @@ +#ifndef __ASURA_ENGINE_EXCEPTION_H__ +#define __ASURA_ENGINE_EXCEPTION_H__ + +#include + +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/Asura.Engine/filesystem/data_buffer.cpp b/Source/Asura.Engine/filesystem/data_buffer.cpp new file mode 100644 index 0000000..3c80aa1 --- /dev/null +++ b/Source/Asura.Engine/filesystem/data_buffer.cpp @@ -0,0 +1,14 @@ +#include "data_buffer.h" + +namespace AsuraEngine +{ + namespace Filesystem + { + + DataBuffer::~DataBuffer() + { + delete[] data; + } + + } +} \ No newline at end of file diff --git a/Source/Asura.Engine/filesystem/data_buffer.h b/Source/Asura.Engine/filesystem/data_buffer.h new file mode 100644 index 0000000..84d445c --- /dev/null +++ b/Source/Asura.Engine/filesystem/data_buffer.h @@ -0,0 +1,39 @@ +#ifndef __ASURA_ENGINE_DATABUFFER_H__ +#define __ASURA_ENGINE_DATABUFFER_H__ + +#include + +#include "Scripting/Luax.hpp" +#include "Scripting/Portable.h" + +namespace AsuraEngine +{ + namespace Filesystem + { + + /// + /// 对内存数据的封装,所有的数据使用Data buffer包装,不直接使用const void*。通过resource manager读取。 + /// + class DataBuffer ASURA_FINAL: public Scripting::Portable + { + public: + + DataBuffer(const void* data, std::size_t size); + + ~DataBuffer(); + + byte* data; + size_t size; + + //---------------------------------------------------------------------------------------------------------- + + LUAX_DECL_FACTORY(DataBuffer); + + //---------------------------------------------------------------------------------------------------------- + + }; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/filesystem/decoded_data.cpp b/Source/Asura.Engine/filesystem/decoded_data.cpp new file mode 100644 index 0000000..125c652 --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/filesystem/decoded_data.h b/Source/Asura.Engine/filesystem/decoded_data.h new file mode 100644 index 0000000..0b661b6 --- /dev/null +++ b/Source/Asura.Engine/filesystem/decoded_data.h @@ -0,0 +1,41 @@ +#ifndef __ASURA_ENGINE_DATA_H__ +#define __ASURA_ENGINE_DATA_H__ + +#include + +#include "DataBuffer.h" +#include "Scripting/Portable.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/Asura.Engine/filesystem/reloadable.h b/Source/Asura.Engine/filesystem/reloadable.h new file mode 100644 index 0000000..eb35d3e --- /dev/null +++ b/Source/Asura.Engine/filesystem/reloadable.h @@ -0,0 +1,27 @@ +#ifndef __ASURA_ENGINE_RELOADABLE_H__ +#define __ASURA_ENGINE_RELOADABLE_H__ + +#include "Scripting/Portable.h" + +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/Asura.Engine/filesystem/resource_manager.cpp b/Source/Asura.Engine/filesystem/resource_manager.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/filesystem/resource_manager.h b/Source/Asura.Engine/filesystem/resource_manager.h new file mode 100644 index 0000000..e22ce91 --- /dev/null +++ b/Source/Asura.Engine/filesystem/resource_manager.h @@ -0,0 +1,44 @@ +#ifndef __ASURA_ENGINE_RESOURCE_MANAGER_H__ +#define __ASURA_ENGINE_RESOURCE_MANAGER_H__ + +#include + +#include "DataBuffer.h" +#include "Scripting/Portable.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/Asura.Engine/graphics/application.graphics.cpp b/Source/Asura.Engine/graphics/application.graphics.cpp new file mode 100644 index 0000000..4d3102f --- /dev/null +++ b/Source/Asura.Engine/graphics/application.graphics.cpp @@ -0,0 +1,19 @@ +#include "Application.h" +#include "Sdl2/SDL.h" +#include "Exceptions/Exception.h" + +namespace AsuraEngine +{ + + /// + /// 初始化graphics模块 + /// + bool Application::InitGraphics() + { + + if (SDL_Init(SDL_INIT_VIDEO) < 0) + return false; + + } + +} \ No newline at end of file diff --git a/Source/Asura.Engine/graphics/binding/canvas.cpp b/Source/Asura.Engine/graphics/binding/canvas.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/binding/color.cpp b/Source/Asura.Engine/graphics/binding/color.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/binding/image.cpp b/Source/Asura.Engine/graphics/binding/image.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/binding/image_data.cpp b/Source/Asura.Engine/graphics/binding/image_data.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/binding/mesh2d.cpp b/Source/Asura.Engine/graphics/binding/mesh2d.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/binding/mesh2d_data.cpp b/Source/Asura.Engine/graphics/binding/mesh2d_data.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/binding/shader.cpp b/Source/Asura.Engine/graphics/binding/shader.cpp new file mode 100644 index 0000000..27ed856 --- /dev/null +++ b/Source/Asura.Engine/graphics/binding/shader.cpp @@ -0,0 +1,119 @@ +#include "../Shader.h" + +using namespace Luax; + +namespace AsuraEngine +{ + namespace Graphics + { + + /// + /// 将此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); + + } + + /// + /// 后的uniforms的location,如果没有这个uniform,返回nil,否则返回对应的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); + + } + + void Shader::RegisterLuaxClass(LuaxState& state) + { + + } + + void Shader::RegisterLuaxInterface(LuaxState& state) + { + + } + + void Shader::RegisterLuaxClass(LuaxState& state) + { + + LuaxEnum EBuiltIn[] = { + {0, 0} + }; + + state.RegisterEnum("EBuiltIn", EBuiltIn); + + } + + } +} \ No newline at end of file diff --git a/Source/Asura.Engine/graphics/binding/sprite_batch.cpp b/Source/Asura.Engine/graphics/binding/sprite_batch.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/binding/window.cpp b/Source/Asura.Engine/graphics/binding/window.cpp new file mode 100644 index 0000000..3befc8c --- /dev/null +++ b/Source/Asura.Engine/graphics/binding/window.cpp @@ -0,0 +1,11 @@ +#include "../Window.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + + + } +} diff --git a/Source/Asura.Engine/graphics/blend_mode.h b/Source/Asura.Engine/graphics/blend_mode.h new file mode 100644 index 0000000..775cc45 --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/graphics/canvas.cpp b/Source/Asura.Engine/graphics/canvas.cpp new file mode 100644 index 0000000..61787b6 --- /dev/null +++ b/Source/Asura.Engine/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, ¤t_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, ¤t_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/Asura.Engine/graphics/canvas.h b/Source/Asura.Engine/graphics/canvas.h new file mode 100644 index 0000000..c4e0f65 --- /dev/null +++ b/Source/Asura.Engine/graphics/canvas.h @@ -0,0 +1,81 @@ +#ifndef __ASURA_ENGINE_CANVAS_H__ +#define __ASURA_ENGINE_CANVAS_H__ + +#include + +#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/Asura.Engine/graphics/color.cpp b/Source/Asura.Engine/graphics/color.cpp new file mode 100644 index 0000000..106493d --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/graphics/color.h b/Source/Asura.Engine/graphics/color.h new file mode 100644 index 0000000..0d65cb1 --- /dev/null +++ b/Source/Asura.Engine/graphics/color.h @@ -0,0 +1,94 @@ +#ifndef __ASURA_ENGINE_COLOR_H__ +#define __ASURA_ENGINE_COLOR_H__ + +#include "Scripting/Luax.hpp" +#include "Scripting/Portable.h" +#include "Config.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + class Color; + + /// + /// 32bits颜色 + /// + class Color32 ASURA_FINAL: public Scripting::Portable + { + 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 + { + 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/Asura.Engine/graphics/gl.cpp b/Source/Asura.Engine/graphics/gl.cpp new file mode 100644 index 0000000..dac2ea4 --- /dev/null +++ b/Source/Asura.Engine/graphics/gl.cpp @@ -0,0 +1,11 @@ +#include "OpenGL.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + + + } +} \ No newline at end of file diff --git a/Source/Asura.Engine/graphics/gl.h b/Source/Asura.Engine/graphics/gl.h new file mode 100644 index 0000000..0661e17 --- /dev/null +++ b/Source/Asura.Engine/graphics/gl.h @@ -0,0 +1,19 @@ +#ifndef __ASURA_ENGINE_OPENGL_H__ +#define __ASURA_ENGINE_OPENGL_H__ + +#include "glad/glad.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + class OpenGL + { + + }; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/graphics/image.cpp b/Source/Asura.Engine/graphics/image.cpp new file mode 100644 index 0000000..e704945 --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/graphics/image.h b/Source/Asura.Engine/graphics/image.h new file mode 100644 index 0000000..66c7ae1 --- /dev/null +++ b/Source/Asura.Engine/graphics/image.h @@ -0,0 +1,78 @@ +#ifndef __ASURA_ENGINE_IMAGE_H__ +#define __ASURA_ENGINE_IMAGE_H__ + +#include "Math/Vector2.hpp" +#include "Scripting/Portable.h" +#include "FileSystem/Reloadable.h" +#include "StringMap.hpp" +#include "Manager.hpp" +#include "Texture.h" +#include "Color.h" +#include "ImageData.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + class ImageFactory; + + /// + /// Image是图片从内存中载入后,读取进游戏后保存的结果。一个Image在内存、显存中只会保存一份,不会产生副本。需要特征 + /// 化的区别image,如锚点位置,缩放和旋转角度,使用sprite。是一个只读类。主要是考虑到editor和engine使用不同的封装。 + /// + class Image ASURA_FINAL + : public Drawable + , public Scripting::Portable + , public Filesystem::Reloadable + { + public: + + Image(); + + ~Image(); + + /// + /// 从数据buffer构建image像素信息,如果mPixels不为空,先清空数据。用来重新构建image,使用glTexImage2D重新提交image + /// 的像素数据。 + /// + bool Load(ImageData* data); + + uint GetWidth(); + uint GetHeight(); + Math::Vector2u GetSize(); + + /// + /// 获得某一个位置的像素 + /// + 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/Asura.Engine/graphics/image_data.cpp b/Source/Asura.Engine/graphics/image_data.cpp new file mode 100644 index 0000000..68781a1 --- /dev/null +++ b/Source/Asura.Engine/graphics/image_data.cpp @@ -0,0 +1,50 @@ +#include "ImageData.h" +#include "PNGDecoder.h" +#include "STBDecoder.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + using namespace std; + + // 解析image的decoder,用来作为解析策略。 + list 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/Asura.Engine/graphics/image_data.h b/Source/Asura.Engine/graphics/image_data.h new file mode 100644 index 0000000..931eaa3 --- /dev/null +++ b/Source/Asura.Engine/graphics/image_data.h @@ -0,0 +1,62 @@ +#ifndef __ASURA_ENGINE_IMAGEDATA_H__ +#define __ASURA_ENGINE_IMAGEDATA_H__ + +#include + +#include "Scripting/Luax.hpp" +#include "Filesystem/DecodedData.h" +#include "ImageDecoder.h" +#include "PixelFormat.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 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/Asura.Engine/graphics/image_decoder.h b/Source/Asura.Engine/graphics/image_decoder.h new file mode 100644 index 0000000..2c73fd1 --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/graphics/mesh2d.cpp b/Source/Asura.Engine/graphics/mesh2d.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/mesh2d.h b/Source/Asura.Engine/graphics/mesh2d.h new file mode 100644 index 0000000..de4a0c8 --- /dev/null +++ b/Source/Asura.Engine/graphics/mesh2d.h @@ -0,0 +1,29 @@ +#ifndef __ASURA_ENGINE_MESH2D_H__ +#define __ASURA_ENGINE_MESH2D_H__ + +#include "Scripting/Luax.hpp" + +#include "Scripting/Portable.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + /// + /// 2D mesh,用于做一些顶点动画。 + /// + class Mesh2D ASURA_FINAL: public Scripting::Portable + { + public: + + Mesh2D(); + + ~Mesh2D(); + + }; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/graphics/pixel_format.h b/Source/Asura.Engine/graphics/pixel_format.h new file mode 100644 index 0000000..8df07d5 --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/graphics/png_decoder.cpp b/Source/Asura.Engine/graphics/png_decoder.cpp new file mode 100644 index 0000000..f919090 --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/graphics/png_decoder.h b/Source/Asura.Engine/graphics/png_decoder.h new file mode 100644 index 0000000..980753f --- /dev/null +++ b/Source/Asura.Engine/graphics/png_decoder.h @@ -0,0 +1,27 @@ +#ifndef __ASURA_ENGINE_PNGDECODER_H__ +#define __ASURA_ENGINE_PNGDECODER_H__ + +#include "ImageDecoder.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/Asura.Engine/graphics/quad.cpp b/Source/Asura.Engine/graphics/quad.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/quad.h b/Source/Asura.Engine/graphics/quad.h new file mode 100644 index 0000000..b7dd3d9 --- /dev/null +++ b/Source/Asura.Engine/graphics/quad.h @@ -0,0 +1 @@ +// Quad和rect的区别在于,rect是的边偏向于轴,quad不一定。 diff --git a/Source/Asura.Engine/graphics/render_state.h b/Source/Asura.Engine/graphics/render_state.h new file mode 100644 index 0000000..f313296 --- /dev/null +++ b/Source/Asura.Engine/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 "BlendMode.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/Asura.Engine/graphics/render_target.cpp b/Source/Asura.Engine/graphics/render_target.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/render_target.h b/Source/Asura.Engine/graphics/render_target.h new file mode 100644 index 0000000..d6de164 --- /dev/null +++ b/Source/Asura.Engine/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() {}; + + /// + /// 用颜色col清空整个RT + /// + virtual void Clear(const Color& col = Color::Black) = 0; + + /// + /// 用颜色col清空部分RT + /// + virtual void Clear(const Math::Recti& quad, const Color& col = Color::Black) = 0; + + /// + /// 绘制texture到本RT上 + /// + virtual void Draw(const Drawable* texture, const RenderState& state) = 0; + + /// + /// 绘制一部分texture到本RT上 + /// + 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/Asura.Engine/graphics/shader.cpp b/Source/Asura.Engine/graphics/shader.cpp new file mode 100644 index 0000000..1a85866 --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/graphics/shader.h b/Source/Asura.Engine/graphics/shader.h new file mode 100644 index 0000000..103c7b7 --- /dev/null +++ b/Source/Asura.Engine/graphics/shader.h @@ -0,0 +1,123 @@ +#ifndef __ASURA_ENGINE_SHADER_H__ +#define __ASURA_ENGINE_SHADER_H__ + +#include +#include + +#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.h" +#include "Color.h" +#include "Manager.hpp" +#include "Texture.h" +#include "GL.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + /// + /// 一个shader是一个在材质间共享的程序。Shader本身不保存uniforms和顶点数据,只提供设置uniforms和use着色器的方法。编辑 + /// 器针对每个shader,会通过shader代码找到声明的uniforms变量,并暴露给framework的material设置。 + /// + class Shader ASURA_FINAL + : public Scripting::Portable + , 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); + + //---------------------------------------------------------------------------------------------------------- + + }; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/graphics/shape.cpp b/Source/Asura.Engine/graphics/shape.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/shape.h b/Source/Asura.Engine/graphics/shape.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/sprite_batch.cpp b/Source/Asura.Engine/graphics/sprite_batch.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/graphics/sprite_batch.h b/Source/Asura.Engine/graphics/sprite_batch.h new file mode 100644 index 0000000..7909519 --- /dev/null +++ b/Source/Asura.Engine/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 + { + public: + + SpriteBatch(); + + ~SpriteBatch(); + + }; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/graphics/stb_decoder.cpp b/Source/Asura.Engine/graphics/stb_decoder.cpp new file mode 100644 index 0000000..b14d0f3 --- /dev/null +++ b/Source/Asura.Engine/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)) + { + // 4个channel都是float + 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/Asura.Engine/graphics/stb_decoder.h b/Source/Asura.Engine/graphics/stb_decoder.h new file mode 100644 index 0000000..b8fb83c --- /dev/null +++ b/Source/Asura.Engine/graphics/stb_decoder.h @@ -0,0 +1,27 @@ +#ifndef __ASURA_ENGINE_STBDECODER_H__ +#define __ASURA_ENGINE_STBDECODER_H__ + +#include "image_decoder.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + /// + /// 使用stb_image解压JPEG、TGA、BMP文件 + /// + 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/Asura.Engine/graphics/texture.cpp b/Source/Asura.Engine/graphics/texture.cpp new file mode 100644 index 0000000..6cb6497 --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/graphics/texture.h b/Source/Asura.Engine/graphics/texture.h new file mode 100644 index 0000000..81aa469 --- /dev/null +++ b/Source/Asura.Engine/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 mesh和render target中被使用。Texture的渲染原点在左上角,游戏里面的上层会以笛卡尔坐标系为标准。 + /// 在Editor里面界面和组件也是以左上角为原点,这样是为了方便。 + /// + ASURA_ABSTRACT class Texture + { + public: + + Texture(); + + virtual ~Texture(); + + GLuint GetGLTextureHandle() const; + + /// + /// 渲染整个texture到rt上,原点在左上角,向右,向下延伸 + /// + 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/Asura.Engine/graphics/window.cpp b/Source/Asura.Engine/graphics/window.cpp new file mode 100644 index 0000000..bb941e1 --- /dev/null +++ b/Source/Asura.Engine/graphics/window.cpp @@ -0,0 +1,56 @@ +#include "Config.h" +#include "Window.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + Window::Window(WindowStyle style) + { + //mWindowHandle = SDL_CreateWindow(); + } + + Window::~Window() + { + + } + + SDL_Window* Window::GetSDLWindowHandle() + { + return mWindowHandle; + } + + 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/Asura.Engine/graphics/window.h b/Source/Asura.Engine/graphics/window.h new file mode 100644 index 0000000..973fd98 --- /dev/null +++ b/Source/Asura.Engine/graphics/window.h @@ -0,0 +1,85 @@ +#ifndef __ASURA_ENGINE_WINDOW_H__ +#define __ASURA_ENGINE_WINDOW_H__ + +#include "SDL2/Sdl.h" +#include "Graphics/RenderTarget.h" +#include "Math/Vector2.hpp" +#include "Scripting/Portable.h" + +namespace AsuraEngine +{ + namespace Graphics + { + + enum WindowStyle + { + WINDOW_STYLE_FULLSCREEN = 1 << 1, + }; + + /// + /// 窗口,支持多窗口。在编辑器下需要多个窗口支持,runner只需要一个窗口。 + /// + class Window ASURA_FINAL + : public RenderTarget + , public Scripting::Portable + { + public: + + Window(WindowStyle style); + + ~Window(); + + SDL_Window* GetSDLWindowHandle(); + + void SetSize(uint width, uint height); + + void SetPosition(int x, int y); + + void SetTitle(const std::string& title); + + void SetWindowStyle(WindowStyle style); + + void Show(); + + void Hide(); + + /// + /// 如果是开启双缓冲的窗口,需要交换缓冲区来展示到前台 + /// + void SwapRenderBuffer(); + + void Clear(const Color& col = Color::Black) override; + + void Clear(const Math::Recti& quad, const Color& col = Color::Black) override; + + void Draw(const Drawable* texture, const RenderState& state) override; + + void Draw(const Drawable* texture, const Math::Recti& quad, const RenderState& state) override; + + private: + + /// + /// SDL window handle. + /// + SDL_Window* mWindowHandle; + + Math::Vector2i mPosition; + + Math::Vector2i mSize; + + public: + + //---------------------------------------------------------------------------------------------------------- + + LUAX_DECL_FACTORY(Window); + + //---------------------------------------------------------------------------------------------------------- + + }; + + using RenderWindow = Window; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/input/clipboard.cpp b/Source/Asura.Engine/input/clipboard.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/input/clipboard.h b/Source/Asura.Engine/input/clipboard.h new file mode 100644 index 0000000..4cecd55 --- /dev/null +++ b/Source/Asura.Engine/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 + { + 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/Asura.Engine/input/cursor.cpp b/Source/Asura.Engine/input/cursor.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/input/cursor.defs b/Source/Asura.Engine/input/cursor.defs new file mode 100644 index 0000000..f8b8492 --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/input/cursor.h b/Source/Asura.Engine/input/cursor.h new file mode 100644 index 0000000..7125869 --- /dev/null +++ b/Source/Asura.Engine/input/cursor.h @@ -0,0 +1,54 @@ +#ifndef __ASURA_ENGINE_CURSOR_H__ +#define __ASURA_ENGINE_CURSOR_H__ + +#include + +#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 \ No newline at end of file diff --git a/Source/Asura.Engine/input/input_device.hpp b/Source/Asura.Engine/input/input_device.hpp new file mode 100644 index 0000000..eb0b7a3 --- /dev/null +++ b/Source/Asura.Engine/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 + ASURA_ABSTRACT class InputDevice + : virtual public Scripting::Portable + , virtual public Singleton + { + public: + InputDevice(); + virtual ~InputDevice(); + + }; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/input/keyboard.cpp b/Source/Asura.Engine/input/keyboard.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/input/keyboard.defs b/Source/Asura.Engine/input/keyboard.defs new file mode 100644 index 0000000..8f04dc2 --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/input/keyboard.h b/Source/Asura.Engine/input/keyboard.h new file mode 100644 index 0000000..488209b --- /dev/null +++ b/Source/Asura.Engine/input/keyboard.h @@ -0,0 +1,73 @@ +#ifndef __ASURA_INPUT_KEYBOARD_H__ +#define __ASURA_INPUT_KEYBOARD_H__ + +#include + +#include "InputDevice.hpp" +#include "Scripting/Portable.h" + +namespace AsuraEngine +{ + namespace Input + { + + class Keyboard ASURA_FINAL : public InputDevice + { + public: + + // 键盘相关的枚举 + #include "Keyboard.defs" + + Keyboard(); + + void SetKeyRepeat(bool enable); + bool HasKeyRepeat() const; + bool IsDown(const std::vector &keylist) const; + bool IsScancodeDown(const std::vector &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/Asura.Engine/input/mouse.cpp b/Source/Asura.Engine/input/mouse.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/input/mouse.h b/Source/Asura.Engine/input/mouse.h new file mode 100644 index 0000000..0f34fdd --- /dev/null +++ b/Source/Asura.Engine/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 + { + 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 &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/Asura.Engine/manager.hpp b/Source/Asura.Engine/manager.hpp new file mode 100644 index 0000000..7b4e272 --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/math/curve.cpp b/Source/Asura.Engine/math/curve.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/math/curve.h b/Source/Asura.Engine/math/curve.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/math/functions.cpp b/Source/Asura.Engine/math/functions.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/math/functions.h b/Source/Asura.Engine/math/functions.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/math/matrix44.cpp b/Source/Asura.Engine/math/matrix44.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/math/matrix44.h b/Source/Asura.Engine/math/matrix44.h new file mode 100644 index 0000000..4ab3c0b --- /dev/null +++ b/Source/Asura.Engine/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/Asura.Engine/math/ranged_value.cpp b/Source/Asura.Engine/math/ranged_value.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/math/ranged_value.h b/Source/Asura.Engine/math/ranged_value.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/math/rect.hpp b/Source/Asura.Engine/math/rect.hpp new file mode 100644 index 0000000..f635007 --- /dev/null +++ b/Source/Asura.Engine/math/rect.hpp @@ -0,0 +1,32 @@ +#ifndef __ASURA_ENGINE_RECT_H__ +#define __ASURA_ENGINE_RECT_H__ + +namespace AsuraEngine +{ + namespace Math + { + + template + struct Rect + { + public: + Rect(); + ~Rect(T x, T y, T w, T h); + + template + explicit Rect(const Rect& rect); + + T x, y, w, h; + }; + +#include "Rect.inl" + + // Define the most common types + typedef Rect Recti; + typedef Rect Rectu; + typedef Rect Rectf; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/math/rect.inl b/Source/Asura.Engine/math/rect.inl new file mode 100644 index 0000000..891a3f8 --- /dev/null +++ b/Source/Asura.Engine/math/rect.inl @@ -0,0 +1,19 @@ +template +inline Rect::Rect() + : x(0) + , y(0) + , w(0) + , h(0) +{ + +} + +template +inline Rect::Rect(T X, T Y, T W, T H) + : x(X) + , y(Y) + , w(W) + , h(H) +{ + +} diff --git a/Source/Asura.Engine/math/transform.cpp b/Source/Asura.Engine/math/transform.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/math/transform.h b/Source/Asura.Engine/math/transform.h new file mode 100644 index 0000000..33c3d4b --- /dev/null +++ b/Source/Asura.Engine/math/transform.h @@ -0,0 +1,30 @@ +#ifndef __ASURA_ENGINE_TRANSFORM_H__ +#define __ASURA_ENGINE_TRANSFORM_H__ + +#include "Scripting/Portable.h" + +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/Asura.Engine/math/vector2.hpp b/Source/Asura.Engine/math/vector2.hpp new file mode 100644 index 0000000..df78255 --- /dev/null +++ b/Source/Asura.Engine/math/vector2.hpp @@ -0,0 +1,70 @@ +#ifndef __ASURA_ENGINE_VECTOR2_H__ +#define __ASURA_ENGINE_VECTOR2_H__ + +namespace AsuraEngine +{ + namespace Math + { + template + class Vector2 + { + public: + Vector2(); + Vector2(T X, T Y); + + template + explicit Vector2(const Vector2& vector); + + Set(T X, T Y); + + T x; ///< X coordinate of the vector + T y; ///< Y coordinate of the vector + }; + + template + Vector2 operator -(const Vector2& right); + + template + Vector2& operator +=(Vector2& left, const Vector2& right); + + template + Vector2& operator -=(Vector2& left, const Vector2& right); + + template + Vector2 operator +(const Vector2& left, const Vector2& right); + + template + Vector2 operator -(const Vector2& left, const Vector2& right); + + template + Vector2 operator *(const Vector2& left, T right); + + template + Vector2 operator *(T left, const Vector2& right); + + template + Vector2& operator *=(Vector2& left, T right); + + template + Vector2 operator /(const Vector2& left, T right); + + template + Vector2& operator /=(Vector2& left, T right); + + template + bool operator ==(const Vector2& left, const Vector2& right); + + template + bool operator !=(const Vector2& left, const Vector2& right); + +#include "Vector2.inl" + + // Define the most common types + typedef Vector2 Vector2i; + typedef Vector2 Vector2u; + typedef Vector2 Vector2f; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/math/vector2.inl b/Source/Asura.Engine/math/vector2.inl new file mode 100644 index 0000000..9e131a7 --- /dev/null +++ b/Source/Asura.Engine/math/vector2.inl @@ -0,0 +1,114 @@ +template +inline Vector2::Vector2() : + x(0), + y(0) +{ + +} + +template +inline Vector2::Vector2(T X, T Y) : + x(X), + y(Y) +{ + +} + +template +template +inline Vector2::Vector2(const Vector2& vector) : + x(static_cast(vector.x)), + y(static_cast(vector.y)) +{ +} + +template +inline Vector2::Set(T X, T Y) +{ + x = X; + y = Y; +} + +template +inline Vector2 operator -(const Vector2& right) +{ + return Vector2(-right.x, -right.y); +} + +template +inline Vector2& operator +=(Vector2& left, const Vector2& right) +{ + left.x += right.x; + left.y += right.y; + + return left; +} + +template +inline Vector2& operator -=(Vector2& left, const Vector2& right) +{ + left.x -= right.x; + left.y -= right.y; + + return left; +} + +template +inline Vector2 operator +(const Vector2& left, const Vector2& right) +{ + return Vector2(left.x + right.x, left.y + right.y); +} + +template +inline Vector2 operator -(const Vector2& left, const Vector2& right) +{ + return Vector2(left.x - right.x, left.y - right.y); +} + +template +inline Vector2 operator *(const Vector2& left, T right) +{ + return Vector2(left.x * right, left.y * right); +} + +template +inline Vector2 operator *(T left, const Vector2& right) +{ + return Vector2(right.x * left, right.y * left); +} + +template +inline Vector2& operator *=(Vector2& left, T right) +{ + left.x *= right; + left.y *= right; + + return left; +} + +template +inline Vector2 operator /(const Vector2& left, T right) +{ + return Vector2(left.x / right, left.y / right); +} + +template +inline Vector2& operator /=(Vector2& left, T right) +{ + left.x /= right; + left.y /= right; + + return left; +} + +template +inline bool operator ==(const Vector2& left, const Vector2& right) +{ + return (left.x == right.x) && (left.y == right.y); +} + +template +inline bool operator !=(const Vector2& left, const Vector2& right) +{ + return (left.x != right.x) || (left.y != right.y); +} diff --git a/Source/Asura.Engine/math/vector3.hpp b/Source/Asura.Engine/math/vector3.hpp new file mode 100644 index 0000000..2b23406 --- /dev/null +++ b/Source/Asura.Engine/math/vector3.hpp @@ -0,0 +1,233 @@ +#ifndef __ASURA_ENGINE_VECTOR3_H__ +#define __ASURA_ENGINE_VECTOR3_H__ + +namespace AsuraEngine +{ + namespace Math + { + template + 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 + explicit Vector3(const Vector3& 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 + Vector3 operator -(const Vector3& 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 + Vector3& operator +=(Vector3& left, const Vector3& 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 + Vector3& operator -=(Vector3& left, const Vector3& 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 + Vector3 operator +(const Vector3& left, const Vector3& 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 + Vector3 operator -(const Vector3& left, const Vector3& 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 + Vector3 operator *(const Vector3& 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 + Vector3 operator *(T left, const Vector3& 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 + Vector3& operator *=(Vector3& 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 + Vector3 operator /(const Vector3& 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 + Vector3& operator /=(Vector3& 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 + bool operator ==(const Vector3& left, const Vector3& 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 + bool operator !=(const Vector3& left, const Vector3& right); + +#include "Vector3.inl" + + // Define the most common types + typedef Vector3 Vector3i; + typedef Vector3 Vector3f; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/math/vector3.inl b/Source/Asura.Engine/math/vector3.inl new file mode 100644 index 0000000..3a2aa93 --- /dev/null +++ b/Source/Asura.Engine/math/vector3.inl @@ -0,0 +1,145 @@ + + +//////////////////////////////////////////////////////////// +template +inline Vector3::Vector3() : + x(0), + y(0), + z(0) +{ + +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3::Vector3(T X, T Y, T Z) : + x(X), + y(Y), + z(Z) +{ + +} + + +//////////////////////////////////////////////////////////// +template +template +inline Vector3::Vector3(const Vector3& vector) : + x(static_cast(vector.x)), + y(static_cast(vector.y)), + z(static_cast(vector.z)) +{ +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3 operator -(const Vector3& left) +{ + return Vector3(-left.x, -left.y, -left.z); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3& operator +=(Vector3& left, const Vector3& right) +{ + left.x += right.x; + left.y += right.y; + left.z += right.z; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3& operator -=(Vector3& left, const Vector3& right) +{ + left.x -= right.x; + left.y -= right.y; + left.z -= right.z; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3 operator +(const Vector3& left, const Vector3& right) +{ + return Vector3(left.x + right.x, left.y + right.y, left.z + right.z); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3 operator -(const Vector3& left, const Vector3& right) +{ + return Vector3(left.x - right.x, left.y - right.y, left.z - right.z); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3 operator *(const Vector3& left, T right) +{ + return Vector3(left.x * right, left.y * right, left.z * right); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3 operator *(T left, const Vector3& right) +{ + return Vector3(right.x * left, right.y * left, right.z * left); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3& operator *=(Vector3& left, T right) +{ + left.x *= right; + left.y *= right; + left.z *= right; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3 operator /(const Vector3& left, T right) +{ + return Vector3(left.x / right, left.y / right, left.z / right); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector3& operator /=(Vector3& left, T right) +{ + left.x /= right; + left.y /= right; + left.z /= right; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline bool operator ==(const Vector3& left, const Vector3& right) +{ + return (left.x == right.x) && (left.y == right.y) && (left.z == right.z); +} + + +//////////////////////////////////////////////////////////// +template +inline bool operator !=(const Vector3& left, const Vector3& right) +{ + return (left.x != right.x) || (left.y != right.y) || (left.z != right.z); +} diff --git a/Source/Asura.Engine/math/vector4.h b/Source/Asura.Engine/math/vector4.h new file mode 100644 index 0000000..13a9d8a --- /dev/null +++ b/Source/Asura.Engine/math/vector4.h @@ -0,0 +1,234 @@ +#ifndef __ASURA_ENGINE_VECTOR4_H__ +#define __ASURA_ENGINE_VECTOR4_H__ + +namespace AsuraEngine +{ + namespace Math + { + template + 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 + explicit Vector4(const Vector4& 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 + Vector4 operator -(const Vector4& 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 + Vector4& operator +=(Vector4& left, const Vector4& 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 + Vector4& operator -=(Vector4& left, const Vector4& 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 + Vector4 operator +(const Vector4& left, const Vector4& 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 + Vector4 operator -(const Vector4& left, const Vector4& 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 + Vector4 operator *(const Vector4& 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 + Vector4 operator *(T left, const Vector4& 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 + Vector4& operator *=(Vector4& 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 + Vector4 operator /(const Vector4& 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 + Vector4& operator /=(Vector4& 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 + bool operator ==(const Vector4& left, const Vector4& 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 + bool operator !=(const Vector4& left, const Vector4& right); + +#include "Vector4.inl" + + // Define the most common types + typedef Vector4 Vector4i; + typedef Vector4 Vector4f; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/math/vector4.inl b/Source/Asura.Engine/math/vector4.inl new file mode 100644 index 0000000..025bfcc --- /dev/null +++ b/Source/Asura.Engine/math/vector4.inl @@ -0,0 +1,152 @@ + + +//////////////////////////////////////////////////////////// +template +inline Vector4::Vector4() : + x(0), + y(0), + z(0), + w(0) +{ + +} + + +//////////////////////////////////////////////////////////// +template +inline Vector4::Vector4(T X, T Y, T Z) : + x(X), + y(Y), + z(Z), + w(0) +{ + +} + + +//////////////////////////////////////////////////////////// +template +template +inline Vector4::Vector4(const Vector4& vector) : + x(static_cast(vector.x)), + y(static_cast(vector.y)), + z(static_cast(vector.z)) + w(static_cast(vector.w)) +{ +} + + +//////////////////////////////////////////////////////////// +template +inline Vector4 operator -(const Vector4& left) +{ + return Vector4(-left.x, -left.y, -left.z, -left.w); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector4& operator +=(Vector4& left, const Vector4& right) +{ + left.x += right.x; + left.y += right.y; + left.z += right.z; + left.w += right.w; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline Vector4& operator -=(Vector4& left, const Vector4& right) +{ + left.x -= right.x; + left.y -= right.y; + left.z -= right.z; + left.w -= right.w; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline Vector4 operator +(const Vector4& left, const Vector4& right) +{ + return Vector4(left.x + right.x, left.y + right.y, left.z + right.z, left.w + right.w); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector4 operator -(const Vector4& left, const Vector4& right) +{ + return Vector4(left.x - right.x, left.y - right.y, left.z - right.z, left.w - right.w); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector4 operator *(const Vector4& left, T right) +{ + return Vector4(left.x * right, left.y * right, left.z * right, left.w * right); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector4 operator *(T left, const Vector4& right) +{ + return Vector4(right.x * left, right.y * left, right.z * left, right.w * left); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector4& operator *=(Vector4& left, T right) +{ + left.x *= right; + left.y *= right; + left.z *= right; + left.w *= right; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline Vector4 operator /(const Vector4& left, T right) +{ + return Vector4(left.x / right, left.y / right, left.z / right, left.w / right); +} + + +//////////////////////////////////////////////////////////// +template +inline Vector4& operator /=(Vector4& left, T right) +{ + left.x /= right; + left.y /= right; + left.z /= right; + left.w /= right; + + return left; +} + + +//////////////////////////////////////////////////////////// +template +inline bool operator ==(const Vector4& left, const Vector4& right) +{ + return (left.x == right.x) && (left.y == right.y) && (left.z == right.z) && (left.w == right.w); +} + + +//////////////////////////////////////////////////////////// +template +inline bool operator !=(const Vector4& left, const Vector4& right) +{ + return (left.x != right.x) || (left.y != right.y) || (left.z != right.z) || (left.w != right.w); +} diff --git a/Source/Asura.Engine/physics/world.h b/Source/Asura.Engine/physics/world.h new file mode 100644 index 0000000..71984f5 --- /dev/null +++ b/Source/Asura.Engine/physics/world.h @@ -0,0 +1,25 @@ +#ifndef __ASURA_ENGINE_WORLD_H__ +#define __ASURA_ENGINE_WORLD_H__ + +#include "Luax/luax.h" +#include "Box2D/Box2D.h" + +namespace AsuraEngine +{ + namespace Physics + { + + class World + { + public: + + private: + + LUAX_DECL_FACTORY(SimWorld); //AsuraEngine.SimWorld + + }; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/profiler/stats.cpp b/Source/Asura.Engine/profiler/stats.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/profiler/stats.h b/Source/Asura.Engine/profiler/stats.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/scripting/luax.hpp b/Source/Asura.Engine/scripting/luax.hpp new file mode 100644 index 0000000..2bb1160 --- /dev/null +++ b/Source/Asura.Engine/scripting/luax.hpp @@ -0,0 +1,18 @@ +#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" + +/// +/// 暴露给lua的类用poartable派生 +/// +#include "Portable.h" + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/scripting/portable.cpp b/Source/Asura.Engine/scripting/portable.cpp new file mode 100644 index 0000000..0aa5f08 --- /dev/null +++ b/Source/Asura.Engine/scripting/portable.cpp @@ -0,0 +1,9 @@ +#include "Portable.h" + +namespace AsuraEngine +{ + namespace Scripting + { + + } +} diff --git a/Source/Asura.Engine/scripting/portable.h b/Source/Asura.Engine/scripting/portable.h new file mode 100644 index 0000000..0527308 --- /dev/null +++ b/Source/Asura.Engine/scripting/portable.h @@ -0,0 +1,19 @@ +#ifndef __ASURA_ENGINE_PORTABLE_H__ +#define __ASURA_ENGINE_PORTABLE_H__ + +#include "Luax.hpp" +#include "Config.h" +#include "Type.h" + +namespace AsuraEngine +{ + namespace Scripting + { + + template + using Portable = Luax::LuaxClass; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/scripting/type.h b/Source/Asura.Engine/scripting/type.h new file mode 100644 index 0000000..0665810 --- /dev/null +++ b/Source/Asura.Engine/scripting/type.h @@ -0,0 +1,17 @@ +#ifndef __ASURA_SCRIPTING_TYPE_H__ +#define __ASURA_SCRIPTING_TYPE_H__ + +namespace AsuraEngine +{ + namespace Scripting + { + + class Type + { + + }; + + } +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Engine/singleton.hpp b/Source/Asura.Engine/singleton.hpp new file mode 100644 index 0000000..756209a --- /dev/null +++ b/Source/Asura.Engine/singleton.hpp @@ -0,0 +1,59 @@ +#ifndef __ASURA_SINGLETON_H__ +#define __ASURA_SINGLETON_H__ + +#include "Config.h" + +namespace AsuraEngine +{ + + /// + /// 继承Singleton的类在第一次实例化时保存实例,之后如果再次实例化会报错。 + /// + template + 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(this); + }; + + virtual ~Singleton() {}; + + static T* instance; + + private: + + Singleton(const Singleton& singleton); + + Singleton& operator = (const Singleton& singleton); + + }; + + // 实例初始化为空 + template + T* Singleton::instance = nullptr; + +} + +#endif // __ASURA_SINGLETON_H__ \ No newline at end of file diff --git a/Source/Asura.Engine/stringmap.cpp b/Source/Asura.Engine/stringmap.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/stringmap.hpp b/Source/Asura.Engine/stringmap.hpp new file mode 100644 index 0000000..ddba128 --- /dev/null +++ b/Source/Asura.Engine/stringmap.hpp @@ -0,0 +1,29 @@ +#ifndef __ASURA_ENGINE_STRINGMAP_H__ +#define __ASURA_ENGINE_STRINGMAP_H__ + +#include + +namespace AsuraEngine +{ + + /// + /// 一个双向一一对应的映射,用来储存shader uniforms、statemathine state parameter的ID。 + /// + template + 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/Asura.Engine/text/glyph.cpp b/Source/Asura.Engine/text/glyph.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/text/glyph.h b/Source/Asura.Engine/text/glyph.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/text/string.cpp b/Source/Asura.Engine/text/string.cpp new file mode 100644 index 0000000..8c9c55a --- /dev/null +++ b/Source/Asura.Engine/text/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::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& 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 String::ToUtf8() const + { + // Prepare the output string + std::basic_string output; + output.reserve(mString.length()); + + // Convert + Utf32::ToUtf8(mString.begin(), mString.end(), std::back_inserter(output)); + + return output; + } + + + //////////////////////////////////////////////////////////// + std::basic_string String::ToUtf16() const + { + // Prepare the output string + std::basic_string output; + output.reserve(mString.length()); + + // Convert + Utf32::ToUtf16(mString.begin(), mString.end(), std::back_inserter(output)); + + return output; + } + + + //////////////////////////////////////////////////////////// + std::basic_string 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/Asura.Engine/text/string.hpp b/Source/Asura.Engine/text/string.hpp new file mode 100644 index 0000000..226735b --- /dev/null +++ b/Source/Asura.Engine/text/string.hpp @@ -0,0 +1,594 @@ +#ifndef __ASURA_ENGINE_STRING_H__ +#define __ASURA_ENGINE_STRING_H__ + +#include "Config.h" +#include +#include +#include + +namespace AsuraEngine +{ + namespace Text + { + + + //////////////////////////////////////////////////////////// + /// \brief Utility string class that automatically handles + /// conversions between types and encodings + /// + //////////////////////////////////////////////////////////// + class String + { + public: + + //////////////////////////////////////////////////////////// + // Types + //////////////////////////////////////////////////////////// + typedef std::basic_string::iterator Iterator; ///< Iterator type + typedef std::basic_string::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& 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 + 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 + 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. + /// + /// \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 + 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 ToUtf8() const; + + //////////////////////////////////////////////////////////// + /// \brief Convert the Unicode string to a UTF-16 string + /// + /// \return Converted UTF-16 string + /// + /// \see toUtf8, toUtf32 + /// + //////////////////////////////////////////////////////////// + std::basic_string 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 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 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/Asura.Engine/text/string.inl b/Source/Asura.Engine/text/string.inl new file mode 100644 index 0000000..ef18228 --- /dev/null +++ b/Source/Asura.Engine/text/string.inl @@ -0,0 +1,29 @@ + +//////////////////////////////////////////////////////////// +template +String String::fromUtf8(T begin, T end) +{ + String string; + Utf8::toUtf32(begin, end, std::back_inserter(string.m_string)); + return string; +} + + +//////////////////////////////////////////////////////////// +template +String String::fromUtf16(T begin, T end) +{ + String string; + Utf16::toUtf32(begin, end, std::back_inserter(string.m_string)); + return string; +} + + +//////////////////////////////////////////////////////////// +template +String String::fromUtf32(T begin, T end) +{ + String string; + string.m_string.assign(begin, end); + return string; +} diff --git a/Source/Asura.Engine/text/ttf.cpp b/Source/Asura.Engine/text/ttf.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/text/ttf.h b/Source/Asura.Engine/text/ttf.h new file mode 100644 index 0000000..840b63e --- /dev/null +++ b/Source/Asura.Engine/text/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/Asura.Engine/text/utf.hpp b/Source/Asura.Engine/text/utf.hpp new file mode 100644 index 0000000..2e04ee4 --- /dev/null +++ b/Source/Asura.Engine/text/utf.hpp @@ -0,0 +1,720 @@ +#ifndef __ASURA_UTF_HPP__ +#define __ASURA_UTF_HPP__ + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include +#include +#include + +namespace AsuraEngine +{ + namespace Text + { + + template + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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/Asura.Engine/text/utf.inl b/Source/Asura.Engine/text/utf.inl new file mode 100644 index 0000000..69a523b --- /dev/null +++ b/Source/Asura.Engine/text/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 +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(*begin)]; + if (begin + trailingBytes < end) + { + output = 0; + switch (trailingBytes) + { + case 5: output += static_cast(*begin++); output <<= 6; + case 4: output += static_cast(*begin++); output <<= 6; + case 3: output += static_cast(*begin++); output <<= 6; + case 2: output += static_cast(*begin++); output <<= 6; + case 1: output += static_cast(*begin++); output <<= 6; + case 0: output += static_cast(*begin++); + } + output -= offsets[trailingBytes]; + } + else + { + // Incomplete character + begin = end; + output = replacement; + } + + return begin; +} + + +//////////////////////////////////////////////////////////// +template +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((input | 0x80) & 0xBF); input >>= 6; + case 3: bytes[2] = static_cast((input | 0x80) & 0xBF); input >>= 6; + case 2: bytes[1] = static_cast((input | 0x80) & 0xBF); input >>= 6; + case 1: bytes[0] = static_cast (input | firstBytes[bytestoWrite]); + } + + // Add them to the output + output = std::copy(bytes, bytes + bytestoWrite, output); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +In Utf<8>::Next(In begin, In end) +{ + Uint32 codepoint; + return Decode(begin, end, codepoint); +} + + +//////////////////////////////////////////////////////////// +template +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 +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 +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 +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 +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 +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 +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(codepoint) : replacement; + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<8>::ToUtf8(In begin, In end, Out output) +{ + return std::copy(begin, end, output); +} + + +//////////////////////////////////////////////////////////// +template +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 +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 +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 +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(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((input >> 10) + 0xD800); + *output++ = static_cast((input & 0x3FFUL) + 0xDC00); + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +In Utf<16>::Next(In begin, In end) +{ + Uint32 codepoint; + return Decode(begin, end, codepoint); +} + + +//////////////////////////////////////////////////////////// +template +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 +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 +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 +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 +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 +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 +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(*begin) : replacement; + begin++; + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +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 +Out Utf<16>::ToUtf16(In begin, In end, Out output) +{ + return std::copy(begin, end, output); +} + + +//////////////////////////////////////////////////////////// +template +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 +In Utf<32>::Decode(In begin, In /*end*/, Uint32& output, Uint32 /*replacement*/) +{ + output = *begin++; + return begin; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::Encode(Uint32 input, Out output, Uint32 /*replacement*/) +{ + *output++ = input; + return output; +} + + +//////////////////////////////////////////////////////////// +template +In Utf<32>::Next(In begin, In /*end*/) +{ + return ++begin; +} + + +//////////////////////////////////////////////////////////// +template +std::size_t Utf<32>::Count(In begin, In end) +{ + return begin - end; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::FromAnsi(In begin, In end, Out output, const std::locale& locale) +{ + while (begin < end) + *output++ = DecodeAnsi(*begin++, locale); + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::FromWide(In begin, In end, Out output) +{ + while (begin < end) + *output++ = DecodeWide(*begin++); + + return output; +} + + +//////////////////////////////////////////////////////////// +template +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 +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 +Out Utf<32>::ToWide(In begin, In end, Out output, wchar_t replacement) +{ + while (begin < end) + output = EncodeWide(*begin++, output, replacement); + + return output; +} + + +//////////////////////////////////////////////////////////// +template +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(*begin) : replacement; + begin++; + } + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::ToUtf8(In begin, In end, Out output) +{ + while (begin < end) + output = Utf<8>::Encode(*begin++, output); + + return output; +} + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::ToUtf16(In begin, In end, Out output) +{ + while (begin < end) + output = Utf<16>::Encode(*begin++, output); + + return output; +} + + +//////////////////////////////////////////////////////////// +template +Out Utf<32>::ToUtf32(In begin, In end, Out output) +{ + return std::copy(begin, end, output); +} + + +//////////////////////////////////////////////////////////// +template +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(character); + + #else + + // Get the facet of the locale which deals with character conversion + const std::ctype& facet = std::use_facet< std::ctype >(locale); + + // Use the facet to convert each character of the input string + return static_cast(facet.widen(input)); + + #endif +} + + +//////////////////////////////////////////////////////////// +template +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 +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(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& facet = std::use_facet< std::ctype >(locale); + + // Use the facet to convert each character of the input string + *output++ = facet.narrow(static_cast(codepoint), replacement); + + return output; + + #endif +} + + +//////////////////////////////////////////////////////////// +template +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(codepoint); + break; + } + + default: + { + if ((codepoint <= 0xFFFF) && ((codepoint < 0xD800) || (codepoint > 0xDFFF))) + { + *output++ = static_cast(codepoint); + } + else if (replacement) + { + *output++ = replacement; + } + break; + } + } + + return output; +} diff --git a/Source/Asura.Engine/time/timer.cpp b/Source/Asura.Engine/time/timer.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/time/timer.h b/Source/Asura.Engine/time/timer.h new file mode 100644 index 0000000..e69de29 diff --git a/Source/Asura.Engine/type.h b/Source/Asura.Engine/type.h new file mode 100644 index 0000000..88848d5 --- /dev/null +++ b/Source/Asura.Engine/type.h @@ -0,0 +1,11 @@ +#ifndef __ASURA_ENGINE_TYPE_H__ +#define __ASURA_ENGINE_TYPE_H__ + +#include + +namespace AsuraEngine +{ + +} + +#endif \ No newline at end of file diff --git a/Source/Asura.Runner/runner.cpp b/Source/Asura.Runner/runner.cpp new file mode 100644 index 0000000..47f44ec --- /dev/null +++ b/Source/Asura.Runner/runner.cpp @@ -0,0 +1,10 @@ +#include "Asura.h" +#include "Runner.h" + +void Runner::Run(int argc, char* args[]) +{ + + +} + +ASURA_RUN(Runner); \ No newline at end of file diff --git a/Source/Asura.Runner/runner.h b/Source/Asura.Runner/runner.h new file mode 100644 index 0000000..8d1bc49 --- /dev/null +++ b/Source/Asura.Runner/runner.h @@ -0,0 +1,16 @@ +#ifndef __ASURA_RUNNER_H__ +#define __ASURA_RUNNER_H__ + +#include "Asura.h" + +using namespace AsuraEngine; + +class Runner : public Application +{ +public: + + void Run(int argc, char* args[]) override; + +}; + +#endif \ No newline at end of file diff --git a/Source/Asura.Runner/scripts/main.lua b/Source/Asura.Runner/scripts/main.lua new file mode 100644 index 0000000..e69de29 diff --git a/Source/Samples/LuaxTest/main.cpp b/Source/Samples/LuaxTest/main.cpp index fdcf29a..a629da6 100644 --- a/Source/Samples/LuaxTest/main.cpp +++ b/Source/Samples/LuaxTest/main.cpp @@ -53,7 +53,7 @@ void School::RegisterLuaxClass(LuaxState& state) { NULL, NULL } }; - state.Register(regTable); + state.RegisterMethods(regTable); } @@ -101,11 +101,8 @@ int Boy::l_New(lua_State* L) int Boy::l_GetAge(lua_State* L) { LUAX_SETUP(L, "U"); - Boy* self = state.GetLuaUserdata(1); - state.Push(self->mAge); - return 1; } @@ -135,7 +132,19 @@ void Boy::RegisterLuaxClass(LuaxState& state) {NULL, NULL} }; - state.Register(regTable); + state.RegisterMethods(regTable); + + // boy的爱好 + LuaxEnum EHabits[] = { + { "Computer", 1}, + { "Buscketball", 2}, + { "Baseball", 3}, + { "Girls", 4}, + {0, 0} + }; + + state.RegisterEnum("EHabits", EHabits); + } void Boy::RegisterLuaxInterface(LuaxState& state) @@ -146,7 +155,21 @@ void Boy::RegisterLuaxInterface(LuaxState& state) {NULL, NULL} }; - state.Register(regTable); + state.RegisterMethods(regTable); +} + +void Boy::RegisterLuaxPostprocess(LuaxState& state) +{ + // boy的爱好 + LuaxEnum EHabits[] = { + { "Computer", 1}, + { "Buscketball", 2}, + { "Baseball", 3}, + { "Girls", 4}, + {0, 0} + }; + + state.RegisterEnum("EHabits", EHabits); } //---------------------------------------------------------------------------------------------------------------- @@ -203,6 +226,11 @@ function main() end print(Asura.SimBoy.Foo()) + print(Asura.EGender.BOY) + --Asura.EGender.BOY = 2 + print(Asura.EGender.BOY) + print(Asura.SimBoy.EHabits.Girls) + print(Asura.EHabits.Girls) end function err(msg) print(msg) @@ -227,6 +255,17 @@ int main() Luax::LuaxState& state = runtime[L].state; state.OpenLibs(); state.PushNamespace("Asura"); + + //注册enum + LuaxEnum EGender[] = { + { "BOY", 7 }, + { "GIRL", 8 }, + { "MID", 9 }, + { 0, 0 }, + }; + + state.RegisterEnum("EGender", EGender); + state.PushNamespace("author"); state.SetField(-1, "name", "chai"); state.SetField(-1, "func", func); -- cgit v1.1-26-g67d0