diff options
Diffstat (limited to 'Runtime/Graphics')
-rw-r--r-- | Runtime/Graphics/Device.h | 12 | ||||
-rw-r--r-- | Runtime/Graphics/ImageData.h | 49 | ||||
-rw-r--r-- | Runtime/Graphics/RenderTexture.h | 4 | ||||
-rw-r--r-- | Runtime/Graphics/Texture.cpp | 69 | ||||
-rw-r--r-- | Runtime/Graphics/Texture.h | 103 |
5 files changed, 185 insertions, 52 deletions
diff --git a/Runtime/Graphics/Device.h b/Runtime/Graphics/Device.h index e445efa..c7a059e 100644 --- a/Runtime/Graphics/Device.h +++ b/Runtime/Graphics/Device.h @@ -12,8 +12,8 @@ struct DeviceSetting { - TextureFilter texFilter; - TextureWrap texWrap; + ETextureFilterMode texFilter; + ETextureWrapMode texWrap; }; class Device : public NonCopyable @@ -46,8 +46,8 @@ public: GET_SET(Color, ClearColor, m_ClearColor); - GET_SET(TextureFilter, TextureFilter, m_TexFilter); - GET_SET(TextureWrap, TextureWrap, m_TexWrap); + GET_SET(ETextureFilterMode, TextureFilter, m_TexFilter); + GET_SET(ETextureWrapMode, TextureWrap, m_TexWrap); inline bool IsInsideFrame(); @@ -55,8 +55,8 @@ private: uint m_EnableFlag; // Global texture setting - TextureFilter m_TexFilter; - TextureWrap m_TexWrap; + ETextureFilterMode m_TexFilter; + ETextureWrapMode m_TexWrap; Color m_ClearColor; diff --git a/Runtime/Graphics/ImageData.h b/Runtime/Graphics/ImageData.h index af44f11..4663e0e 100644 --- a/Runtime/Graphics/ImageData.h +++ b/Runtime/Graphics/ImageData.h @@ -3,27 +3,54 @@ #include <vector> #include "Runtime/Threading/Job.h" +#include "Runtime/Lua/LuaHelper.h" // 图片像素数据 -class ImageData +class ImageData : public LuaBind::NativeClass<ImageData> { public: - enum ImageFormat + enum EPixelFormat { - ImageFormat_Rgba_Int, - ImageFormat_Rgba_Float, + RGBA, + RGB, + R, + RG, + BGR, + BGRA }; -private: - void* m_Data; + enum EPixelElementType + { + UNSIGNED_BYTE, + UNSIGNED_INT, + BYTE, + INT, + FLOAT, + }; + ImageData(LuaBind::VM* vm) + : LuaBind::NativeClass<ImageData>(vm) + { + } + + void* pixels; // 像素数据,格式和类型参考 http://docs.gl/gl3/glTexImage2D pixel data的format和type
+ EPixelFormat format;
+ EPixelElementType type;
+ int width, height;
+
+private:
+ LUA_BIND_DECL_CLASS(ImageData);
+
+ LUA_BIND_DECL_METHOD(_GetWidth); + LUA_BIND_DECL_METHOD(_GetHeight); + LUA_BIND_DECL_METHOD(_GetSize); }; -enum ImageDataAsyncError +enum EImageDataAsyncError { - ImageDataAsyncError_NoFile = 1, - ImageDataAsyncError_ParseFailed = 2, - ImageDataAsyncError_InvalidFormat = 3, + NoFile = 1, + ParseFailed = 2, + InvalidFormat = 3, }; struct ImageDataRequest @@ -42,6 +69,8 @@ namespace ImageDataUtil ImageDataRequest* LoadAsync(std::vector<const char*> paths); } +// 在工作线程最多只能走到读取->解码完,提交到GPU还得主线程做 + class ReadImageFilesJob : public Job { diff --git a/Runtime/Graphics/RenderTexture.h b/Runtime/Graphics/RenderTexture.h index 74c5602..a501f50 100644 --- a/Runtime/Graphics/RenderTexture.h +++ b/Runtime/Graphics/RenderTexture.h @@ -7,10 +7,10 @@ class RenderTexture : public Texture { public: - RenderTexture(TextureFormat format); + RenderTexture(ETextureFormat format); }; -RenderTexture* CreateRenderTexture(int width, int height, TextureFormat format); +RenderTexture* CreateRenderTexture(int width, int height, ETextureFormat format); #endif
\ No newline at end of file diff --git a/Runtime/Graphics/Texture.cpp b/Runtime/Graphics/Texture.cpp index e69de29..ce09927 100644 --- a/Runtime/Graphics/Texture.cpp +++ b/Runtime/Graphics/Texture.cpp @@ -0,0 +1,69 @@ +#include "ImageData.h"
+#include "Texture.h"
+
+using namespace LuaBind;
+
+Texture::Texture(LuaBind::VM* vm, TextureSetting setting, ImageData* imgData)
+ : NativeClass<Texture>(vm)
+{
+ m_Width = imgData->width;
+ m_Height = imgData->height;
+ m_Type = setting.type;
+ m_Format = setting.format;
+ m_WrapMode = setting.wrapMode;
+ m_FilterMode = setting.filterMode;
+ m_KeepPixelData = setting.keepImageData;
+
+ glGenTextures(1, &m_GPUID);
+ glBindTexture(GL_TEXTURE_2D, m_GPUID);
+
+ switch (m_WrapMode) {
+ case ETextureWrapMode::Clamp:
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ break;
+ case ETextureWrapMode::Repeat:
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ break;
+ case ETextureWrapMode::Mirror:
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
+ break;
+ default:
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ break;
+ }
+
+ switch (m_FilterMode) {
+ case ETextureFilterMode::Linear:
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ break;
+ case ETextureFilterMode::Nearest:
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ break;
+ default:
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ break;
+ }
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imgData->width, imgData->height, 0, GL_RGB, GL_UNSIGNED_BYTE, imgData->pixels);
+
+ // keep image data ?
+ if (m_KeepPixelData)
+ {
+ LuaBind::State state = vm->GetCurThread();
+ imgData->PushUserdata(state);
+ SetMemberRef(state, m_ImageData, -1);
+ state.Pop(1);
+ }
+}
+
+Texture::~Texture()
+{
+ glDeleteTextures(1, &m_GPUID);
+}
\ No newline at end of file diff --git a/Runtime/Graphics/Texture.h b/Runtime/Graphics/Texture.h index d09429c..30cf303 100644 --- a/Runtime/Graphics/Texture.h +++ b/Runtime/Graphics/Texture.h @@ -1,61 +1,96 @@ -#ifndef TEXTURE_H -#define TEXTURE_H +#pragma once +#include <exception> #include "Runtime/Lua/LuaHelper.h" -#include "Runtime/Lua/LuaBind/LuaBind.h" #include "../Utilities/UtilMacros.h" #include "OpenGL.h" -#include "ImageData.h" -enum TextureFormat +class ImageData; + +enum ETextureType +{ + TEX_2D, + TEX_CUBE, +}; + +enum ETextureFormat +{ + RGBA32, + RGB24, + RGB16, + R8, + A8, +}; + +enum ETextureWrapMode +{ + Clamp, + Repeat, + Mirror, +}; + +enum ETextureFilterMode { - TextureFormat_DepthComponent, - TextureFormat_Red, - TextureFormat_Green, - TextureFormat_Blue, - TextureFormat_Alpha, - TextureFormat_Rgb, - TextureFormat_Rgba, + Nearest, + Linear, }; -enum TextureWrap +struct TextureSetting { - TextureWrap_Clamp, - TextureWrap_Repeat, + bool keepImageData; // 是否保存图片数据 + int type; // 图片类型 + int format; // 内部格式 + int wrapMode; // 包围 + int filterMode; // 滤波 }; -enum TextureFilter +class TextureException : public std::exception { - TextureFilter_Nearest, - TextureFilter_Bilinear, - TextureFilter_Trilinear, +public: + TextureException(const char* what) + : std::exception(what) + {} }; -class Texture +class Texture : public LuaBind::NativeClass<Texture> { public: - Texture(); - Texture(ImageData* imgData, TextureFormat format); - Texture(ImageData* imgData, TextureFormat format, TextureWrap wrap, TextureFilter filter); + Texture(LuaBind::VM* vm, TextureSetting setting, ImageData* imgData)/*throw TextureException*/; ~Texture(); GET(int, Width, m_Width); GET(int, Height, m_Height); - GET(TextureFilter, Filter, m_Filter); - GET(TextureWrap, Wrap, m_Wrap); - - GET(GLint, Handle, m_Handle); + GET(GLuint, GpuID, m_GPUID); protected: - GLint m_Handle; + GLuint m_GPUID; + int m_Width, m_Height; - TextureFilter m_Filter; - TextureWrap m_Wrap; -}; + int m_Type; + int m_Format; + int m_FilterMode; + int m_WrapMode; + + bool m_KeepPixelData; // 是否保存图像像素数据,默认导入后不保存 + + LuaBind::MemberRef m_ImageData; //图片像素数据 + + LUA_BIND_DECL_CLASS(Texture); + + LUA_BIND_DECL_METHOD(_New); + + LUA_BIND_DECL_METHOD(_GetWidth); + LUA_BIND_DECL_METHOD(_GetHeight); + LUA_BIND_DECL_METHOD(_GetSize); + + LUA_BIND_DECL_METHOD(_GetType); + LUA_BIND_DECL_METHOD(_GetFormat); + LUA_BIND_DECL_METHOD(_GetWrapMode); + LUA_BIND_DECL_METHOD(_GetFilterMode); -Texture* CreateTexture(ImageData* imgData, TextureFormat format); -Texture* CreateTexture(ImageData* imgData, TextureFormat format, TextureWrap wrap, TextureFilter filter); + LUA_BIND_DECL_METHOD(_IsKeepImageData); + LUA_BIND_DECL_METHOD(_GetImageData); -#endif
\ No newline at end of file +};
\ No newline at end of file |