summaryrefslogtreecommitdiff
path: root/Runtime/Graphics
diff options
context:
space:
mode:
Diffstat (limited to 'Runtime/Graphics')
-rw-r--r--Runtime/Graphics/Device.h12
-rw-r--r--Runtime/Graphics/ImageData.h49
-rw-r--r--Runtime/Graphics/RenderTexture.h4
-rw-r--r--Runtime/Graphics/Texture.cpp69
-rw-r--r--Runtime/Graphics/Texture.h103
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