summaryrefslogtreecommitdiff
path: root/source/libs/asura-lib-core/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'source/libs/asura-lib-core/graphics')
-rw-r--r--source/libs/asura-lib-core/graphics/binding/_canvas.cpp46
-rw-r--r--source/libs/asura-lib-core/graphics/binding/_color.cpp54
-rw-r--r--source/libs/asura-lib-core/graphics/binding/_color32.cpp86
-rw-r--r--source/libs/asura-lib-core/graphics/binding/_image.cpp99
-rw-r--r--source/libs/asura-lib-core/graphics/binding/_image_data.cpp70
-rw-r--r--source/libs/asura-lib-core/graphics/binding/_image_decode_task.cpp21
-rw-r--r--source/libs/asura-lib-core/graphics/binding/_mesh2d.cpp21
-rw-r--r--source/libs/asura-lib-core/graphics/binding/_shader.cpp126
-rw-r--r--source/libs/asura-lib-core/graphics/binding/_sprite_batch.cpp21
-rw-r--r--source/libs/asura-lib-core/graphics/binding/_window.cpp103
-rw-r--r--source/libs/asura-lib-core/graphics/blend_mode.h17
-rw-r--r--source/libs/asura-lib-core/graphics/canvas.cpp41
-rw-r--r--source/libs/asura-lib-core/graphics/canvas.h83
-rw-r--r--source/libs/asura-lib-core/graphics/color.cpp47
-rw-r--r--source/libs/asura-lib-core/graphics/color.h55
-rw-r--r--source/libs/asura-lib-core/graphics/color32.cpp39
-rw-r--r--source/libs/asura-lib-core/graphics/color32.h51
-rw-r--r--source/libs/asura-lib-core/graphics/color_palette.h0
-rw-r--r--source/libs/asura-lib-core/graphics/gif.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/gif.h20
-rw-r--r--source/libs/asura-lib-core/graphics/gl.cpp25
-rw-r--r--source/libs/asura-lib-core/graphics/gl.h41
-rw-r--r--source/libs/asura-lib-core/graphics/image.cpp32
-rw-r--r--source/libs/asura-lib-core/graphics/image.h83
-rw-r--r--source/libs/asura-lib-core/graphics/image_data.cpp51
-rw-r--r--source/libs/asura-lib-core/graphics/image_data.h68
-rw-r--r--source/libs/asura-lib-core/graphics/image_decode_task.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/image_decode_task.h25
-rw-r--r--source/libs/asura-lib-core/graphics/image_decoder.h35
-rw-r--r--source/libs/asura-lib-core/graphics/mesh2d.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/mesh2d.h28
-rw-r--r--source/libs/asura-lib-core/graphics/mesh2d_data.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/mesh2d_data.h0
-rw-r--r--source/libs/asura-lib-core/graphics/pixel_format.h91
-rw-r--r--source/libs/asura-lib-core/graphics/png_decoder.cpp19
-rw-r--r--source/libs/asura-lib-core/graphics/png_decoder.h27
-rw-r--r--source/libs/asura-lib-core/graphics/quad.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/quad.h1
-rw-r--r--source/libs/asura-lib-core/graphics/render_state.h49
-rw-r--r--source/libs/asura-lib-core/graphics/render_target.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/render_target.h56
-rw-r--r--source/libs/asura-lib-core/graphics/shader.cpp81
-rw-r--r--source/libs/asura-lib-core/graphics/shader.h126
-rw-r--r--source/libs/asura-lib-core/graphics/shape.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/shape.h0
-rw-r--r--source/libs/asura-lib-core/graphics/sprite_batch.cpp0
-rw-r--r--source/libs/asura-lib-core/graphics/sprite_batch.h28
-rw-r--r--source/libs/asura-lib-core/graphics/stb_decoder.cpp65
-rw-r--r--source/libs/asura-lib-core/graphics/stb_decoder.h28
-rw-r--r--source/libs/asura-lib-core/graphics/texture.cpp26
-rw-r--r--source/libs/asura-lib-core/graphics/texture.h68
51 files changed, 2053 insertions, 0 deletions
diff --git a/source/libs/asura-lib-core/graphics/binding/_canvas.cpp b/source/libs/asura-lib-core/graphics/binding/_canvas.cpp
new file mode 100644
index 0000000..7927995
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/_canvas.cpp
@@ -0,0 +1,46 @@
+#include "../canvas.h"
+
+using namespace std;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ LUAX_REGISTRY(Canvas)
+ {
+ LUAX_REGISTER_METHODS(state,
+ { "SetSize", _SetSize },
+ { "Bind", _Bind },
+ { "Unbind", _Unbind }
+ );
+ }
+
+ LUAX_POSTPROCESS(Canvas)
+ {
+
+ }
+
+ // canvas:SetSize()
+ LUAX_IMPL_METHOD(Canvas, _SetSize)
+ {
+ LUAX_PREPARE(L, Canvas);
+
+ }
+
+ // canvas:Bind()
+ LUAX_IMPL_METHOD(Canvas, _Bind)
+ {
+ LUAX_PREPARE(L, Canvas);
+
+ }
+
+ // canvas:Unbind()
+ LUAX_IMPL_METHOD(Canvas, _Unbind)
+ {
+ LUAX_PREPARE(L, Canvas);
+
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/binding/_color.cpp b/source/libs/asura-lib-core/graphics/binding/_color.cpp
new file mode 100644
index 0000000..11e80a1
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/_color.cpp
@@ -0,0 +1,54 @@
+#include "../color.h"
+
+using namespace std;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ LUAX_REGISTRY(Color)
+ {
+ LUAX_REGISTER_METHODS(state,
+ { "ToColor32", _ToColor32 },
+ { "SetColor", _SetColor },
+ { "GetColor", _GetColor },
+ { "Multiply", _Multiply }
+ );
+ }
+
+ LUAX_POSTPROCESS(Color)
+ {
+
+ }
+
+ // color:ToColor32()
+ LUAX_IMPL_METHOD(Color, _ToColor32)
+ {
+ LUAX_PREPARE(L, Color);
+
+ }
+
+ // color:SetColor()
+ LUAX_IMPL_METHOD(Color, _SetColor)
+ {
+ LUAX_PREPARE(L, Color);
+
+ }
+
+ // color:GetColor()
+ LUAX_IMPL_METHOD(Color, _GetColor)
+ {
+ LUAX_PREPARE(L, Color);
+
+ }
+
+ // color:Multiply()
+ LUAX_IMPL_METHOD(Color, _Multiply)
+ {
+ LUAX_PREPARE(L, Color);
+
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/binding/_color32.cpp b/source/libs/asura-lib-core/graphics/binding/_color32.cpp
new file mode 100644
index 0000000..7095866
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/_color32.cpp
@@ -0,0 +1,86 @@
+#include "../color32.h"
+
+using namespace std;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ LUAX_REGISTRY(Color32)
+ {
+ LUAX_REGISTER_METHODS(state,
+ { "ToColor", _ToColor },
+ { "GetRed", _GetRed },
+ { "GetGreen", _GetGreen },
+ { "GetBlue", _GetBlue },
+ { "GetAlpha", _GetAlpha },
+ { "Multiply", _Multiply },
+ { "Index", _Index },
+ { "NewIndex", _NewIndex }
+ );
+ }
+
+ LUAX_POSTPROCESS(Color32)
+ {
+
+ }
+
+ // color32:ToColor()
+ LUAX_IMPL_METHOD(Color32, _ToColor)
+ {
+ LUAX_PREPARE(L, Color32);
+
+ }
+
+ // color32:GetRed()
+ LUAX_IMPL_METHOD(Color32, _GetRed)
+ {
+ LUAX_PREPARE(L, Color32);
+
+ }
+
+ // color32:GetGreen()
+ LUAX_IMPL_METHOD(Color32, _GetGreen)
+ {
+ LUAX_PREPARE(L, Color32);
+
+ }
+
+ // color32:GetBlue()
+ LUAX_IMPL_METHOD(Color32, _GetBlue)
+ {
+ LUAX_PREPARE(L, Color32);
+
+ }
+
+ // color32:GetAlpha()
+ LUAX_IMPL_METHOD(Color32, _GetAlpha)
+ {
+ LUAX_PREPARE(L, Color32);
+
+ }
+
+ // color32:Multiply()
+ LUAX_IMPL_METHOD(Color32, _Multiply)
+ {
+ LUAX_PREPARE(L, Color32);
+
+ }
+
+ // color32:Index()
+ LUAX_IMPL_METHOD(Color32, _Index)
+ {
+ LUAX_PREPARE(L, Color32);
+
+ }
+
+ // color32:NewIndex()
+ LUAX_IMPL_METHOD(Color32, _NewIndex)
+ {
+ LUAX_PREPARE(L, Color32);
+
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/binding/_image.cpp b/source/libs/asura-lib-core/graphics/binding/_image.cpp
new file mode 100644
index 0000000..cb008d3
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/_image.cpp
@@ -0,0 +1,99 @@
+#include "../image.h"
+
+using namespace std;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ LUAX_REGISTRY(Image)
+ {
+ LUAX_REGISTER_METHODS(state,
+ { "New", _New },
+ { "Load", _Load },
+ { "GetWidth", _GetWidth },
+ { "GetHeight", _GetHeight },
+ { "GetSize", _GetSize },
+ { "GetPixel", _GetPixel },
+ { "Render", _Render }
+ );
+ }
+
+ LUAX_POSTPROCESS(Image)
+ {
+
+ }
+
+ // image = Image.New()
+ LUAX_IMPL_METHOD(Image, _New)
+ {
+ LUAX_STATE(L);
+
+ Image* image = new Image();
+ image->PushLuaxUserdata(state);
+ return 0;
+ }
+
+ // successed = image:Load(image_data)
+ LUAX_IMPL_METHOD(Image, _Load)
+ {
+ LUAX_PREPARE(L, Image);
+
+ ImageData* imgdata = state.CheckUserdata<ImageData>(2);
+ bool loaded = self->Load(imgdata);
+ state.Push(loaded);
+ return 1;
+ }
+
+ // width = image:GetWidth()
+ LUAX_IMPL_METHOD(Image, _GetWidth)
+ {
+ LUAX_PREPARE(L, Image);
+
+ state.Push(self->GetWidth());
+ return 1;
+ }
+
+ // height = image:GetHeight()
+ LUAX_IMPL_METHOD(Image, _GetHeight)
+ {
+ LUAX_PREPARE(L, Image);
+
+ state.Push(self->GetHeight());
+ return 1;
+ }
+
+ // w, h = image:GetSize()
+ LUAX_IMPL_METHOD(Image, _GetSize)
+ {
+ LUAX_PREPARE(L, Image);
+
+ Math::Vector2u size = self->GetSize();
+ state.Push(size.x);
+ state.Push(size.y);
+ return 2;
+ }
+
+ // color32 = image:GetPixel(x, y)
+ LUAX_IMPL_METHOD(Image, _GetPixel)
+ {
+ LUAX_PREPARE(L, Image);
+
+ uint x = state.CheckValue<uint>(2);
+ uint y = state.CheckValue<uint>(3);
+ Color32* c32 = new Color32(self->GetPixel(x, y));
+ c32->PushLuaxUserdata(state);
+ return 1;
+ }
+
+ // image:Render()
+ LUAX_IMPL_METHOD(Image, _Render)
+ {
+ LUAX_PREPARE(L, Image);
+
+ return 0;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/binding/_image_data.cpp b/source/libs/asura-lib-core/graphics/binding/_image_data.cpp
new file mode 100644
index 0000000..3ff38f9
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/_image_data.cpp
@@ -0,0 +1,70 @@
+#include "../image_data.h"
+
+using namespace std;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ LUAX_REGISTRY(ImageData)
+ {
+ LUAX_REGISTER_METHODS(state,
+ { "New", _New },
+ { "GetPixel", _GetPixel },
+ { "GetSize", _GetSize },
+ { "GetWidth", _GetWidth },
+ { "GetHeight", _GetHeight },
+ { "GetPixelFormat", _GetPixelFormat }
+ );
+ }
+
+ LUAX_POSTPROCESS(ImageData)
+ {
+
+ }
+
+ // ImageData.New()
+ LUAX_IMPL_METHOD(ImageData, _New)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ // imagedata:GetPixel()
+ LUAX_IMPL_METHOD(ImageData, _GetPixel)
+ {
+ LUAX_PREPARE(L, ImageData);
+
+ }
+
+ // imagedata:GetSize()
+ LUAX_IMPL_METHOD(ImageData, _GetSize)
+ {
+ LUAX_PREPARE(L, ImageData);
+
+ }
+
+ // imagedata:GetWidth()
+ LUAX_IMPL_METHOD(ImageData, _GetWidth)
+ {
+ LUAX_PREPARE(L, ImageData);
+
+ }
+
+ // imagedata:GetHeight()
+ LUAX_IMPL_METHOD(ImageData, _GetHeight)
+ {
+ LUAX_PREPARE(L, ImageData);
+
+ }
+
+ // imagedata:GetPixelFormat()
+ LUAX_IMPL_METHOD(ImageData, _GetPixelFormat)
+ {
+ LUAX_PREPARE(L, ImageData);
+
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/binding/_image_decode_task.cpp b/source/libs/asura-lib-core/graphics/binding/_image_decode_task.cpp
new file mode 100644
index 0000000..76b544b
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/_image_decode_task.cpp
@@ -0,0 +1,21 @@
+#include "../image_decode_task.h"
+
+using namespace std;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ LUAX_REGISTRY(ImageDecodeTask)
+ {
+
+ }
+
+ LUAX_POSTPROCESS(ImageDecodeTask)
+ {
+
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/binding/_mesh2d.cpp b/source/libs/asura-lib-core/graphics/binding/_mesh2d.cpp
new file mode 100644
index 0000000..07e9f12
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/_mesh2d.cpp
@@ -0,0 +1,21 @@
+#include "../mesh2d.h"
+
+using namespace std;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ LUAX_REGISTRY(Mesh2D)
+ {
+
+ }
+
+ LUAX_POSTPROCESS(Mesh2D)
+ {
+
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/binding/_shader.cpp b/source/libs/asura-lib-core/graphics/binding/_shader.cpp
new file mode 100644
index 0000000..a06e54b
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/_shader.cpp
@@ -0,0 +1,126 @@
+#include "../shader.h"
+
+using namespace std;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ LUAX_REGISTRY(Shader)
+ {
+ LUAX_REGISTER_METHODS(state,
+ { "New", _New },
+ { "Use", _Use },
+ { "Unuse", _Unuse },
+ { "Load", _Load },
+ { "HasUniform", _HasUniform },
+ { "GetUniformLocation", _GetUniformLocation },
+ { "SetBuiltInUniforms", _SetBuiltInUniforms },
+ { "SetUniformFloat", _SetUniformFloat },
+ { "SetUniformTexture", _SetUniformTexture },
+ { "SetUniformVector2", _SetUniformVector2 },
+ { "SetUniformVector3", _SetUniformVector3 },
+ { "SetUniformVector4", _SetUniformVector4 },
+ { "SetUniformColor", _SetUniformColor }
+ );
+ }
+
+ LUAX_POSTPROCESS(Shader)
+ {
+
+ }
+
+ // Shader.New()
+ LUAX_IMPL_METHOD(Shader, _New)
+ {
+ LUAX_STATE(L);
+
+ }
+
+ // shader:Use()
+ LUAX_IMPL_METHOD(Shader, _Use)
+ {
+ LUAX_PREPARE(L, Shader);
+
+ }
+
+ // shader:Unuse()
+ LUAX_IMPL_METHOD(Shader, _Unuse)
+ {
+ LUAX_PREPARE(L, Shader);
+
+ }
+
+ // shader:Load()
+ LUAX_IMPL_METHOD(Shader, _Load)
+ {
+ LUAX_PREPARE(L, Shader);
+
+ }
+
+ // shader:HasUniform()
+ LUAX_IMPL_METHOD(Shader, _HasUniform)
+ {
+ LUAX_PREPARE(L, Shader);
+
+ }
+
+ // shader:GetUniformLocation()
+ LUAX_IMPL_METHOD(Shader, _GetUniformLocation)
+ {
+ LUAX_PREPARE(L, Shader);
+
+ }
+
+ // shader:SetBuiltInUniforms()
+ LUAX_IMPL_METHOD(Shader, _SetBuiltInUniforms)
+ {
+ LUAX_PREPARE(L, Shader);
+
+ }
+
+ // shader:SetUniformFloat()
+ LUAX_IMPL_METHOD(Shader, _SetUniformFloat)
+ {
+ LUAX_PREPARE(L, Shader);
+
+ }
+
+ // shader:SetUniformTexture()
+ LUAX_IMPL_METHOD(Shader, _SetUniformTexture)
+ {
+ LUAX_PREPARE(L, Shader);
+
+ }
+
+ // shader:SetUniformVector2()
+ LUAX_IMPL_METHOD(Shader, _SetUniformVector2)
+ {
+ LUAX_PREPARE(L, Shader);
+
+ }
+
+ // shader:SetUniformVector3()
+ LUAX_IMPL_METHOD(Shader, _SetUniformVector3)
+ {
+ LUAX_PREPARE(L, Shader);
+
+ }
+
+ // shader:SetUniformVector4()
+ LUAX_IMPL_METHOD(Shader, _SetUniformVector4)
+ {
+ LUAX_PREPARE(L, Shader);
+
+ }
+
+ // shader:SetUniformColor()
+ LUAX_IMPL_METHOD(Shader, _SetUniformColor)
+ {
+ LUAX_PREPARE(L, Shader);
+
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/binding/_sprite_batch.cpp b/source/libs/asura-lib-core/graphics/binding/_sprite_batch.cpp
new file mode 100644
index 0000000..8556c02
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/_sprite_batch.cpp
@@ -0,0 +1,21 @@
+#include "../sprite_batch.h"
+
+using namespace std;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ LUAX_REGISTRY(SpriteBatch)
+ {
+
+ }
+
+ LUAX_POSTPROCESS(SpriteBatch)
+ {
+
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/binding/_window.cpp b/source/libs/asura-lib-core/graphics/binding/_window.cpp
new file mode 100644
index 0000000..fc74d6c
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/binding/_window.cpp
@@ -0,0 +1,103 @@
+#include "../window.h"
+
+using namespace std;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ LUAX_REGISTRY(Window)
+ {
+ LUAX_REGISTER_METHODS(state,
+ { "Show", _Show },
+ { "Hide", _Hide },
+ { "SetResolution", _SetResolution },
+ { "SetFullScreen", _SetFullScreen },
+ { "SetTitle", _SetTitle },
+ { "SetWindowStyle", _SetWindowStyle },
+ { "Clear", _Clear },
+ { "Draw", _Draw },
+ { "SwapRenderBuffer", _SwapRenderBuffer }
+ );
+ }
+
+ LUAX_POSTPROCESS(Window)
+ {
+
+ }
+
+ // window:Show()
+ LUAX_IMPL_METHOD(Window, _Show)
+ {
+ LUAX_PREPARE(L, Window);
+
+ return 0;
+ }
+
+ // window:Hide()
+ LUAX_IMPL_METHOD(Window, _Hide)
+ {
+ LUAX_PREPARE(L, Window);
+
+ return 0;
+ }
+
+ // window:SetResolution()
+ LUAX_IMPL_METHOD(Window, _SetResolution)
+ {
+ LUAX_PREPARE(L, Window);
+
+ return 0;
+ }
+
+ // window:SetFullScreen()
+ LUAX_IMPL_METHOD(Window, _SetFullScreen)
+ {
+ LUAX_PREPARE(L, Window);
+
+ return 0;
+ }
+
+ // window:SetTitle()
+ LUAX_IMPL_METHOD(Window, _SetTitle)
+ {
+ LUAX_PREPARE(L, Window);
+
+ return 0;
+ }
+
+ // window:SetWindowStyle()
+ LUAX_IMPL_METHOD(Window, _SetWindowStyle)
+ {
+ LUAX_PREPARE(L, Window);
+
+ return 0;
+ }
+
+ // window:Clear()
+ LUAX_IMPL_METHOD(Window, _Clear)
+ {
+ LUAX_PREPARE(L, Window);
+
+ return 0;
+ }
+
+ // window:Draw()
+ LUAX_IMPL_METHOD(Window, _Draw)
+ {
+ LUAX_PREPARE(L, Window);
+
+ return 0;
+ }
+
+ // window:SwapRenderBuffer()
+ LUAX_IMPL_METHOD(Window, _SwapRenderBuffer)
+ {
+ LUAX_PREPARE(L, Window);
+
+ return 0;
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/blend_mode.h b/source/libs/asura-lib-core/graphics/blend_mode.h
new file mode 100644
index 0000000..775cc45
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/blend_mode.h
@@ -0,0 +1,17 @@
+#ifndef __ASURA_ENGINE_BLEND_MODE_H__
+#define __ASURA_ENGINE_BLEND_MODE_H__
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ enum BlendMode
+ {
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/canvas.cpp b/source/libs/asura-lib-core/graphics/canvas.cpp
new file mode 100644
index 0000000..61787b6
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/canvas.cpp
@@ -0,0 +1,41 @@
+#include "Canvas.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ Canvas::Canvas()
+ : Texture()
+ , mWidth(0)
+ , mHeight(0)
+ {
+ glGenFramebuffers(1, &mFBO);
+ GLint current_fbo;
+ glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &current_fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextureHandle, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, current_fbo);
+ }
+
+ void Canvas::SetSize(uint w, uint h)
+ {
+ GLint current_tex;
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &current_tex);
+ glBindTexture(GL_TEXTURE_2D, mTextureHandle);
+
+ glBindTexture(GL_TEXTURE_2D, current_tex);
+ }
+
+ void Canvas::Bind()
+ {
+
+ }
+
+ void Canvas::Unbind()
+ {
+
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/canvas.h b/source/libs/asura-lib-core/graphics/canvas.h
new file mode 100644
index 0000000..5b188ca
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/canvas.h
@@ -0,0 +1,83 @@
+#ifndef __ASURA_ENGINE_CANVAS_H__
+#define __ASURA_ENGINE_CANVAS_H__
+
+#include <asura-lib-utils/scripting/portable.hpp>
+#include <asura-lib-utils/math/rect.hpp>
+#include <asura-lib-utils/math/vector2.hpp>
+
+#include "gl.h"
+#include "texture.h"
+#include "render_target.h"
+#include "render_state.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// CanvasҲԳΪrender textureҲΪtextureȾ
+ ///
+ class Canvas ASURA_FINAL
+ : public Drawable
+ , public RenderTarget
+ , public Scripting::Portable<Canvas>
+ {
+ 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(_SetSize);
+ LUAX_DECL_METHOD(_Bind);
+ LUAX_DECL_METHOD(_Unbind);
+
+ //----------------------------------------------------------------------------------------------------------
+
+ };
+
+ ///
+ /// CanvasΪRenderTexture
+ ///
+ using RenderTexture = Canvas;
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/color.cpp b/source/libs/asura-lib-core/graphics/color.cpp
new file mode 100644
index 0000000..4d3691e
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/color.cpp
@@ -0,0 +1,47 @@
+#include "color.h"
+#include "color32.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ 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;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/color.h b/source/libs/asura-lib-core/graphics/color.h
new file mode 100644
index 0000000..607314b
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/color.h
@@ -0,0 +1,55 @@
+#ifndef __ASURA_ENGINE_COLOR_H__
+#define __ASURA_ENGINE_COLOR_H__
+
+#include <asura-lib-utils/scripting/portable.hpp>
+
+#include "../core_config.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class Color32;
+
+ ///
+ /// 淶ɫ
+ ///
+ class Color ASURA_FINAL
+ : public Scripting::Portable<Color>
+ {
+ public:
+
+ static Color Black;
+ static Color White;
+ static Color Red;
+ static Color Green;
+ static Color Blue;
+
+ Color();
+
+ Color(const Color& c);
+
+ Color(float r, float g, float b, float a);
+
+ Color(const Color32& c);
+
+ ~Color();
+
+ Color operator *(const Color& c);
+
+ float r, g, b, a;
+
+ LUAX_DECL_FACTORY(Color);
+
+ LUAX_DECL_METHOD(_ToColor32);
+ LUAX_DECL_METHOD(_SetColor);
+ LUAX_DECL_METHOD(_GetColor);
+ LUAX_DECL_METHOD(_Multiply); // ɫ˷
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/color32.cpp b/source/libs/asura-lib-core/graphics/color32.cpp
new file mode 100644
index 0000000..0ebc77c
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/color32.cpp
@@ -0,0 +1,39 @@
+#include "color.h"
+#include "color32.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;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/color32.h b/source/libs/asura-lib-core/graphics/color32.h
new file mode 100644
index 0000000..c64a9b9
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/color32.h
@@ -0,0 +1,51 @@
+#ifndef __ASURA_ENGINE_COLOR32_H__
+#define __ASURA_ENGINE_COLOR32_H__
+
+#include <asura-lib-utils/scripting/portable.hpp>
+
+#include "../core_config.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class Color;
+
+ ///
+ /// 32bitsɫ
+ ///
+ class Color32 ASURA_FINAL
+ : public Scripting::Portable<Color32>
+ {
+ public:
+
+ LUAX_DECL_FACTORY(Color32);
+
+ 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_METHOD(_ToColor);
+ LUAX_DECL_METHOD(_GetRed);
+ LUAX_DECL_METHOD(_GetGreen);
+ LUAX_DECL_METHOD(_GetBlue);
+ LUAX_DECL_METHOD(_GetAlpha);
+ LUAX_DECL_METHOD(_Multiply);
+ LUAX_DECL_METHOD(_Index); //r,g,b,a
+ LUAX_DECL_METHOD(_NewIndex); //޸r,g,b,a
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/color_palette.h b/source/libs/asura-lib-core/graphics/color_palette.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/color_palette.h
diff --git a/source/libs/asura-lib-core/graphics/gif.cpp b/source/libs/asura-lib-core/graphics/gif.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/gif.cpp
diff --git a/source/libs/asura-lib-core/graphics/gif.h b/source/libs/asura-lib-core/graphics/gif.h
new file mode 100644
index 0000000..8b89858
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/gif.h
@@ -0,0 +1,20 @@
+#ifndef __ASURA_GIF_H__
+#define __ASURA_GIF_H__
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// Gif
+ ///
+ class Gif
+ {
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/gl.cpp b/source/libs/asura-lib-core/graphics/gl.cpp
new file mode 100644
index 0000000..7c68c8f
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/gl.cpp
@@ -0,0 +1,25 @@
+#include "../core_config.h"
+#include "gl.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ bool OpenGL::instantiated = false;
+
+ //
+ OpenGL gl;
+
+ OpenGL::OpenGL()
+ {
+ ASSERT(!instantiated);
+ instantiated = true;
+ }
+
+ OpenGL::~OpenGL()
+ {
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/gl.h b/source/libs/asura-lib-core/graphics/gl.h
new file mode 100644
index 0000000..bfc60ea
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/gl.h
@@ -0,0 +1,41 @@
+#ifndef __ASURA_ENGINE_OPENGL_H__
+#define __ASURA_ENGINE_OPENGL_H__
+
+#include "glad/glad.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class Profiler;
+
+ ///
+ /// һЩopengl״̬׷١
+ ///
+ class OpenGL
+ {
+ public:
+ OpenGL();
+ ~OpenGL();
+
+ private:
+
+ friend class Profiler;
+
+ ///
+ /// opengl
+ ///
+ static bool instantiated;
+
+ };
+
+ ///
+ /// OpenGL
+ ///
+ extern OpenGL gl;
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/image.cpp b/source/libs/asura-lib-core/graphics/image.cpp
new file mode 100644
index 0000000..e704945
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/image.cpp
@@ -0,0 +1,32 @@
+#include "Config.h"
+#include "Image.h"
+#include "GL.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ Image::Image()
+ {
+ }
+
+ Image::~Image()
+ {
+ }
+
+ //\Ϣ
+ bool Image::Load(ImageData* data)
+ {
+ ASSERT(data);
+
+ glBindTexture(GL_TEXTURE_2D, mTextureHandle);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, data->width, data->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data->pixels);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ return true;
+
+ RRA(data, mImageData);
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/image.h b/source/libs/asura-lib-core/graphics/image.h
new file mode 100644
index 0000000..4d9787b
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/image.h
@@ -0,0 +1,83 @@
+#ifndef __ASURA_ENGINE_IMAGE_H__
+#define __ASURA_ENGINE_IMAGE_H__
+
+#include <asura-lib-utils/math/rect.hpp>
+#include <asura-lib-utils/math/vector2.hpp>
+#include <asura-lib-utils/scripting/portable.hpp>
+#include <asura-lib-utils/io/reloadable.h>
+#include <asura-lib-utils/stringmap.hpp>
+#include <asura-lib-utils/manager.hpp>
+
+#include "texture.h"
+#include "color.h"
+#include "color32.h"
+#include "image_data.h"
+#include "render_state.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class ImageFactory;
+
+ ///
+ /// ImageͼƬڴ󣬶ȡϷ󱣴ĽһImageڴ桢Դֻᱣһ
+ /// ݣҪimageêλãźתǶȣʹsprite
+ /// һֻࡣҪǿǵeditorengineʹòͬķװ
+ ///
+ class Image ASURA_FINAL
+ : public Drawable
+ , public Scripting::Portable<Image>
+ , public AEIO::Reloadable
+ {
+ public:
+
+ LUAX_DECL_FACTORY(SimImage);
+
+ Image();
+
+ ~Image();
+
+ ///
+ /// bufferimageϢmPixelsΪգݡ¹image
+ /// ʹglTexImage2Dύimageݡ
+ ///
+ bool Load(ImageData* data);
+
+ uint GetWidth();
+ uint GetHeight();
+ Math::Vector2u GetSize();
+
+ ///
+ /// ijһλõ
+ ///
+ Color32 GetPixel(uint x, uint y);
+
+ void Render(const RenderTarget* rt, const RenderState& state) override;
+
+ void Render(const RenderTarget* rt, const Math::Rectf& quad, const RenderState& state) override;
+
+ private:
+
+ ImageData* mImageData;
+ Luax::LuaxMemberRef mImageDataRef;
+
+ Math::Vector2u mSize;
+
+ LUAX_DECL_METHOD(_New);
+ LUAX_DECL_METHOD(_Load);
+ LUAX_DECL_METHOD(_GetWidth);
+ LUAX_DECL_METHOD(_GetHeight);
+ LUAX_DECL_METHOD(_GetSize);
+ LUAX_DECL_METHOD(_GetPixel);
+ LUAX_DECL_METHOD(_Render);
+
+ };
+
+ }
+}
+
+namespace AEGraphics = AsuraEngine::Graphics;
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/image_data.cpp b/source/libs/asura-lib-core/graphics/image_data.cpp
new file mode 100644
index 0000000..b79dfab
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/image_data.cpp
@@ -0,0 +1,51 @@
+#include "image_data.h"
+#include "png_decoder.h"
+#include "stb_decoder.h"
+#include "image_decoder.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ using namespace std;
+
+ // imagedecoderΪԡ
+ list<ImageDecoder*> ImageData::ImageDecoders = {
+ new PNGDecoder(), // png
+ new STBDecoder() // jpeg, tga, bmp
+ };
+
+ ImageData::ImageData(const IO::DataBuffer& buffer)
+ : DecodedData(buffer)
+ {
+ }
+
+ ImageData::~ImageData()
+ {
+ if (pixels)
+ delete[] pixels;
+ }
+
+ ///
+ /// ޷ɹ׳쳣
+ ///
+ void ImageData::Decode(const IO::DataBuffer& buffer)
+ {
+ for (ImageDecoder* decoder : ImageDecoders)
+ {
+ if (decoder->CanDecode(buffer))
+ {
+ decoder->Decode(buffer, *this);
+ return;
+ }
+ }
+ }
+
+ Color ImageData::GetPixel(uint x, uint y)
+ {
+
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/image_data.h b/source/libs/asura-lib-core/graphics/image_data.h
new file mode 100644
index 0000000..820e276
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/image_data.h
@@ -0,0 +1,68 @@
+#ifndef __ASURA_ENGINE_IMAGEDATA_H__
+#define __ASURA_ENGINE_IMAGEDATA_H__
+
+#include <list>
+
+#include <asura-lib-utils/scripting/portable.hpp>
+#include <asura-lib-utils/io/decoded_data.h>
+#include <asura-lib-utils/io/data_buffer.h>
+#include <asura-lib-utils/threading/thread.h>
+
+#include "pixel_format.h"
+#include "color.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class ImageDecoder;
+
+ class ImageData ASURA_FINAL
+ : public AEIO::DecodedData
+ , public Scripting::Portable<ImageData>
+ {
+ public:
+
+ LUAX_DECL_FACTORY(ImageData);
+
+ ///
+ /// ͼƬļϢʧܣ׳쳣
+ ///
+ ImageData(const AEIO::DataBuffer& buffer);
+ ~ImageData();
+
+ void Load(const AEIO::DataBuffer& buffer);
+ void LoadAsync(const AEIO::DataBuffer& buffer, AEThreading::Thread* thread);
+
+ Color GetPixel(uint x, uint y);
+
+ uint width, height;
+ PixelFormat format;
+ std::size_t size;
+ byte* pixels;
+
+ private:
+
+ void Decode(const AEIO::DataBuffer& buffer) override;
+
+ ///
+ /// ڵһ׼image dataʱṩdecoderڼdecodersмѡԡ
+ ///
+ static std::list<ImageDecoder*> ImageDecoders;
+
+ LUAX_DECL_METHOD(_New);
+ LUAX_DECL_METHOD(_GetPixel);
+ LUAX_DECL_METHOD(_GetSize);
+ LUAX_DECL_METHOD(_GetWidth);
+ LUAX_DECL_METHOD(_GetHeight);
+ LUAX_DECL_METHOD(_GetPixelFormat);
+
+ };
+
+ }
+}
+
+namespace AEGraphics = AsuraEngine::Graphics;
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/image_decode_task.cpp b/source/libs/asura-lib-core/graphics/image_decode_task.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/image_decode_task.cpp
diff --git a/source/libs/asura-lib-core/graphics/image_decode_task.h b/source/libs/asura-lib-core/graphics/image_decode_task.h
new file mode 100644
index 0000000..a721b3e
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/image_decode_task.h
@@ -0,0 +1,25 @@
+#ifndef __ASURA_IMAGE_DECODE_TASK_H__
+#define __ASURA_IMAGE_DECODE_TASK_H__
+
+#include <asura-lib-utils/threading/thread_task.h>
+#include <asura-lib-utils/scripting/portable.hpp>
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class ImageDecodeTask
+ : public AEScripting::Portable<ImageDecodeTask>
+ , public AEThreading::ThreadTask
+ {
+ public:
+
+ LUAX_DECL_FACTORY(ImageDecodeTask);
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/image_decoder.h b/source/libs/asura-lib-core/graphics/image_decoder.h
new file mode 100644
index 0000000..6f2049a
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/image_decoder.h
@@ -0,0 +1,35 @@
+#ifndef __ASURA_ENGINE_IMAGE_DECODER_H__
+#define __ASURA_ENGINE_IMAGE_DECODER_H__
+
+#include <asura-lib-utils/io/data_buffer.h>
+
+#include "image_data.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class ImageDecoder
+ {
+ public:
+
+ ImageDecoder();
+ virtual ~ImageDecoder();
+
+ ///
+ /// жڴǷñdecoderѹ
+ ///
+ virtual bool CanDecode(const AEIO::DataBuffer& buffer) = 0;
+
+ ///
+ /// һڴ棬һѹImage dataѹʧܷnullptr
+ ///
+ virtual void Decode(const AEIO::DataBuffer& buffer, ImageData& data) = 0;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/mesh2d.cpp b/source/libs/asura-lib-core/graphics/mesh2d.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/mesh2d.cpp
diff --git a/source/libs/asura-lib-core/graphics/mesh2d.h b/source/libs/asura-lib-core/graphics/mesh2d.h
new file mode 100644
index 0000000..48b461d
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/mesh2d.h
@@ -0,0 +1,28 @@
+#ifndef __ASURA_ENGINE_MESH2D_H__
+#define __ASURA_ENGINE_MESH2D_H__
+
+#include <asura-lib-utils/scripting/portable.hpp>
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// 2D meshһЩ㶯
+ ///
+ class Mesh2D ASURA_FINAL
+ : public Scripting::Portable<Mesh2D>
+ {
+ public:
+
+ Mesh2D();
+
+ ~Mesh2D();
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/mesh2d_data.cpp b/source/libs/asura-lib-core/graphics/mesh2d_data.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/mesh2d_data.cpp
diff --git a/source/libs/asura-lib-core/graphics/mesh2d_data.h b/source/libs/asura-lib-core/graphics/mesh2d_data.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/mesh2d_data.h
diff --git a/source/libs/asura-lib-core/graphics/pixel_format.h b/source/libs/asura-lib-core/graphics/pixel_format.h
new file mode 100644
index 0000000..8df07d5
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/pixel_format.h
@@ -0,0 +1,91 @@
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// ظʽ
+ ///
+ enum PixelFormat
+ {
+ PIXELFORMAT_UNKNOWN,
+
+ // these are converted to an actual format by love
+ PIXELFORMAT_NORMAL,
+ PIXELFORMAT_HDR,
+
+ // "regular" formats
+ PIXELFORMAT_R8,
+ PIXELFORMAT_RG8,
+ PIXELFORMAT_RGBA8,
+ PIXELFORMAT_sRGBA8,
+ PIXELFORMAT_R16,
+ PIXELFORMAT_RG16,
+ PIXELFORMAT_RGBA16,
+ PIXELFORMAT_R16F,
+ PIXELFORMAT_RG16F,
+ PIXELFORMAT_RGBA16F,
+ PIXELFORMAT_R32F,
+ PIXELFORMAT_RG32F,
+ PIXELFORMAT_RGBA32F,
+
+ PIXELFORMAT_LA8, // Same as RG8, but accessed as (L, L, L, A)
+
+ // packed formats
+ PIXELFORMAT_RGBA4,
+ PIXELFORMAT_RGB5A1,
+ PIXELFORMAT_RGB565,
+ PIXELFORMAT_RGB10A2,
+ PIXELFORMAT_RG11B10F,
+
+ // depth/stencil formats
+ PIXELFORMAT_STENCIL8,
+ PIXELFORMAT_DEPTH16,
+ PIXELFORMAT_DEPTH24,
+ PIXELFORMAT_DEPTH32F,
+ PIXELFORMAT_DEPTH24_STENCIL8,
+ PIXELFORMAT_DEPTH32F_STENCIL8,
+
+ // compressed formats
+ PIXELFORMAT_DXT1,
+ PIXELFORMAT_DXT3,
+ PIXELFORMAT_DXT5,
+ PIXELFORMAT_BC4,
+ PIXELFORMAT_BC4s,
+ PIXELFORMAT_BC5,
+ PIXELFORMAT_BC5s,
+ PIXELFORMAT_BC6H,
+ PIXELFORMAT_BC6Hs,
+ PIXELFORMAT_BC7,
+ PIXELFORMAT_PVR1_RGB2,
+ PIXELFORMAT_PVR1_RGB4,
+ PIXELFORMAT_PVR1_RGBA2,
+ PIXELFORMAT_PVR1_RGBA4,
+ PIXELFORMAT_ETC1,
+ PIXELFORMAT_ETC2_RGB,
+ PIXELFORMAT_ETC2_RGBA,
+ PIXELFORMAT_ETC2_RGBA1,
+ PIXELFORMAT_EAC_R,
+ PIXELFORMAT_EAC_Rs,
+ PIXELFORMAT_EAC_RG,
+ PIXELFORMAT_EAC_RGs,
+ PIXELFORMAT_ASTC_4x4,
+ PIXELFORMAT_ASTC_5x4,
+ PIXELFORMAT_ASTC_5x5,
+ PIXELFORMAT_ASTC_6x5,
+ PIXELFORMAT_ASTC_6x6,
+ PIXELFORMAT_ASTC_8x5,
+ PIXELFORMAT_ASTC_8x6,
+ PIXELFORMAT_ASTC_8x8,
+ PIXELFORMAT_ASTC_10x5,
+ PIXELFORMAT_ASTC_10x6,
+ PIXELFORMAT_ASTC_10x8,
+ PIXELFORMAT_ASTC_10x10,
+ PIXELFORMAT_ASTC_12x10,
+ PIXELFORMAT_ASTC_12x12,
+
+ PIXELFORMAT_MAX_ENUM
+ };
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/png_decoder.cpp b/source/libs/asura-lib-core/graphics/png_decoder.cpp
new file mode 100644
index 0000000..f919090
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/png_decoder.cpp
@@ -0,0 +1,19 @@
+#include "PNGDecoder.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ bool PNGDecoder::CanDecode(const Filesystem::DataBuffer& buffer)
+ {
+ return false;
+ }
+
+ void PNGDecoder::Decode(const Filesystem::DataBuffer& buffer, ImageData& data)
+ {
+
+ }
+
+ }
+}
diff --git a/source/libs/asura-lib-core/graphics/png_decoder.h b/source/libs/asura-lib-core/graphics/png_decoder.h
new file mode 100644
index 0000000..bc871fa
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/png_decoder.h
@@ -0,0 +1,27 @@
+#ifndef __ASURA_ENGINE_PNGDECODER_H__
+#define __ASURA_ENGINE_PNGDECODER_H__
+
+#include "image_decoder.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// ʹlodepngѹpngļ
+ ///
+ class PNGDecoder ASURA_FINAL: public ImageDecoder
+ {
+ public:
+
+ bool CanDecode(const AEIO::DataBuffer& buffer) override;
+
+ void Decode(const AEIO::DataBuffer& buffer, ImageData& data) override;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/quad.cpp b/source/libs/asura-lib-core/graphics/quad.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/quad.cpp
diff --git a/source/libs/asura-lib-core/graphics/quad.h b/source/libs/asura-lib-core/graphics/quad.h
new file mode 100644
index 0000000..b7dd3d9
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/quad.h
@@ -0,0 +1 @@
+// Quadrectڣrectǵıƫᣬquadһ
diff --git a/source/libs/asura-lib-core/graphics/render_state.h b/source/libs/asura-lib-core/graphics/render_state.h
new file mode 100644
index 0000000..4d1831c
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/render_state.h
@@ -0,0 +1,49 @@
+#ifndef __ASURA_ENGINE_RENDER_STATE_H__
+#define __ASURA_ENGINE_RENDER_STATE_H__
+
+#include <asura-lib-utils/math/vector2.hpp>
+#include <asura-lib-utils/math/transform.h>
+
+#include "Shader.h"
+#include "blend_mode.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// Ⱦǰķʽ
+ ///
+ struct RenderState ASURA_FINAL
+ {
+ ///
+ /// Ĭϵrender state
+ ///
+ static RenderState Default;
+
+ RenderState();
+ ~RenderState();
+
+ ///
+ /// λášλúת
+ ///
+
+ Math::Transform transform;
+
+ ///
+ /// ɫ
+ ///
+ Shader* shader;
+
+ ///
+ /// Ϸʽ
+ ///
+ BlendMode blendMode;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/render_target.cpp b/source/libs/asura-lib-core/graphics/render_target.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/render_target.cpp
diff --git a/source/libs/asura-lib-core/graphics/render_target.h b/source/libs/asura-lib-core/graphics/render_target.h
new file mode 100644
index 0000000..afa5c6a
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/render_target.h
@@ -0,0 +1,56 @@
+#ifndef __ASURA_ENGINE_RENDERTARGET_H__
+#define __ASURA_ENGINE_RENDERTARGET_H__
+
+#include <asura-lib-utils/math/vector2.hpp>
+#include <asura-lib-utils/math/rect.hpp>
+#include <asura-lib-utils/scripting/portable.hpp>
+
+#include "texture.h"
+#include "color.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class Drawable;
+
+ ///
+ /// ɱΪȾĿ࣬
+ /// Canvas(RenderTexture)
+ /// Window(RenderWindow)
+ ///
+ class RenderTarget
+ {
+ public:
+
+ RenderTarget() {};
+
+ virtual ~RenderTarget() {};
+
+ ///
+ /// ɫcolRT
+ ///
+ virtual void Clear(const Color& col = Color::Black) = 0;
+
+ ///
+ /// ɫcolղRT
+ ///
+ virtual void Clear(const Math::Recti& quad, const Color& col = Color::Black) = 0;
+
+ ///
+ /// textureRT
+ ///
+ virtual void Draw(const Drawable* texture, const RenderState& state) = 0;
+
+ ///
+ /// һtextureRT
+ ///
+ virtual void Draw(const Drawable* texture, const Math::Recti& quad, const RenderState& state) = 0;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/shader.cpp b/source/libs/asura-lib-core/graphics/shader.cpp
new file mode 100644
index 0000000..1a85866
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/shader.cpp
@@ -0,0 +1,81 @@
+#include "Shader.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ Shader::Shader()
+ {
+
+ }
+
+ Shader::~Shader()
+ {
+
+ }
+
+ bool Shader::Load(const std::string& vertexShader, const std::string& fragmentShader)
+ {
+
+ }
+
+ uint Shader::GetUniformLocation(const std::string& uniform)
+ {
+
+ }
+
+ GLuint Shader::GetGLProgramHandle()
+ {
+ return mProgramHandle;
+ }
+
+ void Shader::Use()
+ {
+
+ }
+
+ void Shader::Unuse()
+ {
+
+ }
+
+ void Shader::SetUniformFloat(uint loc, float value)
+ {
+
+ }
+
+ void Shader::SetUniformFloat(uint loc, float value)
+ {
+
+ }
+
+ void Shader::SetUniformTexture(uint loc, const Texture& texture)
+ {
+
+ }
+
+ void Shader::SetUniformVector2(uint loc, const Math::Vector2f& vec2)
+ {
+
+ }
+
+ void Shader::SetUniformVector3(uint loc, const Math::Vector3f& vec3)
+ {
+
+ }
+
+ void Shader::SetUniformVector4(uint loc, const Math::Vector4f& vec4)
+ {
+
+ }
+
+ uint Shader::GetGLTextureUnitCount()
+ {
+ GLint maxTextureUnits = 0;
+ glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
+ return (uint)maxTextureUnits;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/shader.h b/source/libs/asura-lib-core/graphics/shader.h
new file mode 100644
index 0000000..1c81355
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/shader.h
@@ -0,0 +1,126 @@
+#ifndef __ASURA_ENGINE_SHADER_H__
+#define __ASURA_ENGINE_SHADER_H__
+
+#include <map>
+#include <string>
+
+#include <asura-lib-utils/scripting/portable.hpp>
+#include <asura-lib-utils/io/reloadable.h>
+#include <asura-lib-utils/math/vector2.hpp>
+#include <asura-lib-utils/math/vector3.hpp>
+#include <asura-lib-utils/math/vector4.h>
+#include <asura-lib-utils/math/matrix44.h>
+#include <asura-lib-utils/stringmap.hpp>
+#include <asura-lib-utils/manager.hpp>
+
+#include "color.h"
+#include "texture.h"
+#include "gl.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// һshaderһڲʼ乲ijShaderuniformsͶݣֻṩuniformsuseɫķ༭
+ /// ÿshaderͨshaderҵuniforms¶frameworkmaterialá
+ ///
+ class Shader ASURA_FINAL
+ : public Scripting::Portable<Shader>
+ , public AEIO::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(_New);
+ LUAX_DECL_METHOD(_Use);
+ LUAX_DECL_METHOD(_Unuse);
+ LUAX_DECL_METHOD(_Load);
+ LUAX_DECL_METHOD(_HasUniform);
+ LUAX_DECL_METHOD(_GetUniformLocation);
+ LUAX_DECL_METHOD(_SetBuiltInUniforms);
+ LUAX_DECL_METHOD(_SetUniformFloat);
+ LUAX_DECL_METHOD(_SetUniformTexture);
+ LUAX_DECL_METHOD(_SetUniformVector2);
+ LUAX_DECL_METHOD(_SetUniformVector3);
+ LUAX_DECL_METHOD(_SetUniformVector4);
+ LUAX_DECL_METHOD(_SetUniformColor);
+
+ private:
+
+ Luax::LuaxMemberRef mCodeLuaRef;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/shape.cpp b/source/libs/asura-lib-core/graphics/shape.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/shape.cpp
diff --git a/source/libs/asura-lib-core/graphics/shape.h b/source/libs/asura-lib-core/graphics/shape.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/shape.h
diff --git a/source/libs/asura-lib-core/graphics/sprite_batch.cpp b/source/libs/asura-lib-core/graphics/sprite_batch.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/sprite_batch.cpp
diff --git a/source/libs/asura-lib-core/graphics/sprite_batch.h b/source/libs/asura-lib-core/graphics/sprite_batch.h
new file mode 100644
index 0000000..d8d9ca6
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/sprite_batch.h
@@ -0,0 +1,28 @@
+#ifndef __ASURA_ENGINE_SPRITE_BATCH_H__
+#define __ASURA_ENGINE_SPRITE_BATCH_H__
+
+#include <asura-lib-utils/scripting/portable.hpp>
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// Sprite batchȾͼƬĵطϵͳ
+ ///
+ class SpriteBatch ASURA_FINAL
+ : public Scripting::Portable<SpriteBatch>
+ {
+ public:
+
+ SpriteBatch();
+
+ ~SpriteBatch();
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/stb_decoder.cpp b/source/libs/asura-lib-core/graphics/stb_decoder.cpp
new file mode 100644
index 0000000..a13d6b8
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/stb_decoder.cpp
@@ -0,0 +1,65 @@
+#include <asura-lib-utils/exceptions/exception.h>
+
+#include "stb_decoder.h"
+#include "stb/stb_image.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ bool STBDecoder::CanDecode(const Filesystem::DataBuffer& buffer)
+ {
+ int w = 0;
+ int h = 0;
+ int comp = 0;
+
+ int status = stbi_info_from_memory((const stbi_uc*)buffer.data, buffer.size, &w, &h, &comp);
+
+ return status == 1 && w > 0 && h > 0;
+ }
+
+ void STBDecoder::Decode(const Filesystem::DataBuffer& db, ImageData& imageData)
+ {
+ const stbi_uc *buffer = (const stbi_uc *)db.data;
+ int bufferlen = db.size;
+ int width, height;
+ int comp = 0;
+ byte* data = nullptr;
+ PixelFormat format = PIXELFORMAT_UNKNOWN;
+ std::size_t size = 0;
+
+ if (stbi_is_hdr_from_memory(buffer, bufferlen))
+ {
+ // 4channelfloat
+ data = (byte*)stbi_loadf_from_memory(buffer, bufferlen, &width, &height, &comp, STBI_rgb_alpha);
+ format = PIXELFORMAT_RGBA32F;
+ size = width * height * 4 * sizeof(float);
+ }
+ else
+ {
+ data = (byte*)stbi_load_from_memory(buffer, bufferlen, &width, &height, &comp, STBI_rgb_alpha);
+ format = PIXELFORMAT_ASTC_8x5;
+ size = width * height * 4;
+ }
+ if (data)
+ {
+ // ֤ڴ汻ͷţһϲûͷŵΪimage dataһԵģimageǶεġ
+ if (imageData.pixels)
+ delete[] imageData.pixels;
+ imageData.pixels = (byte*)data;
+ imageData.format = format;
+ imageData.width = width;
+ imageData.height = height;
+ }
+ else
+ {
+ const char *err = stbi_failure_reason();
+ if (err == nullptr)
+ err = "unknown error";
+ throw Exception("Could not decode image with stb_image (%s).", err);
+ }
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/stb_decoder.h b/source/libs/asura-lib-core/graphics/stb_decoder.h
new file mode 100644
index 0000000..85bad21
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/stb_decoder.h
@@ -0,0 +1,28 @@
+#ifndef __ASURA_ENGINE_STBDECODER_H__
+#define __ASURA_ENGINE_STBDECODER_H__
+
+#include "image_decoder.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ ///
+ /// ʹstb_imageѹJPEGTGABMPļ
+ ///
+ class STBDecoder ASURA_FINAL
+ : public ImageDecoder
+ {
+ public:
+
+ bool CanDecode(const AEIO::DataBuffer& buffer) override;
+
+ void Decode(const AEIO::DataBuffer& buffer, ImageData& data) override;
+
+ };
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/texture.cpp b/source/libs/asura-lib-core/graphics/texture.cpp
new file mode 100644
index 0000000..6cb6497
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/texture.cpp
@@ -0,0 +1,26 @@
+#include "Texture.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ Texture::Texture()
+ : mTextureHandle(0)
+ {
+ // GL texture
+ glGenTextures(1, &mTextureHandle);
+ }
+
+ Texture::~Texture()
+ {
+ glDeleteTextures(1, &mTextureHandle);
+ }
+
+ GLuint Texture::GetGLTextureHandle() const
+ {
+ return mTextureHandle;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/source/libs/asura-lib-core/graphics/texture.h b/source/libs/asura-lib-core/graphics/texture.h
new file mode 100644
index 0000000..c412b2e
--- /dev/null
+++ b/source/libs/asura-lib-core/graphics/texture.h
@@ -0,0 +1,68 @@
+#ifndef __ASURA_ENGINE_TEXTURE_H__
+#define __ASURA_ENGINE_TEXTURE_H__
+
+#include <asura-lib-utils/math/rect.hpp>
+#include <asura-lib-utils/math/vector2.hpp>
+#include <asura-lib-utils/scripting/portable.hpp>
+
+#include "../core_config.h"
+
+#include "render_state.h"
+#include "gl.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class RenderTarget;
+
+ ///
+ /// 2D࣬2d meshrender targetбʹáTextureȾԭϽǣϷϲԵѿϵΪ׼
+ /// EditorҲϽΪԭ㣬Ϊ˷㡣
+ ///
+ ASURA_ABSTRACT class Texture
+ {
+ public:
+
+ Texture();
+
+ virtual ~Texture();
+
+ GLuint GetGLTextureHandle() const;
+
+ ///
+ /// ȾtexturertϣԭϽǣң
+ ///
+ virtual void Render(const RenderTarget* rt, const RenderState& state) = 0;
+
+ ///
+ /// ȾtextureһֵrtϣԭϽǣң졣
+ ///
+ virtual void Render(const RenderTarget* rt, const Math::Rectf& quad, const RenderState& state) = 0;
+
+ ///
+ /// ù˷ʽ
+ ///
+ void SetSmooth(bool smooth);
+
+ ///
+ /// ظʽ
+ ///
+ void SetRepeated();
+
+ protected:
+
+ ///
+ /// OpenGL texture handle
+ ///
+ GLuint mTextureHandle;
+
+ };
+
+ using Drawable = Texture;
+
+ }
+}
+
+#endif \ No newline at end of file