From 42ec7286b2d36a9ba22925f816a17cb1cc2aa5ce Mon Sep 17 00:00:00 2001 From: chai Date: Sat, 30 Oct 2021 11:32:16 +0800 Subject: + Penlight --- Runtime/Graphics/DefaultVertexLayout.cpp | 4 +- Runtime/Graphics/DefaultVertexLayout.h | 22 +++--- Runtime/Graphics/Texture.cpp | 117 +++++++++++++++++-------------- Runtime/Graphics/Texture.h | 5 +- 4 files changed, 82 insertions(+), 66 deletions(-) (limited to 'Runtime/Graphics') diff --git a/Runtime/Graphics/DefaultVertexLayout.cpp b/Runtime/Graphics/DefaultVertexLayout.cpp index 0781c2e..a468100 100644 --- a/Runtime/Graphics/DefaultVertexLayout.cpp +++ b/Runtime/Graphics/DefaultVertexLayout.cpp @@ -30,8 +30,8 @@ namespace VertexLayout if (attr == VertexAttr_Color) return true; /* - if (format == VertexAttrFormat_Color || format == VertexAttrFormat_Byte) - return true; + if (format == VertexAttrFormat_Color || format == VertexAttrFormat_Byte) + return true; */ return false; } diff --git a/Runtime/Graphics/DefaultVertexLayout.h b/Runtime/Graphics/DefaultVertexLayout.h index fbb1f76..be5437c 100644 --- a/Runtime/Graphics/DefaultVertexLayout.h +++ b/Runtime/Graphics/DefaultVertexLayout.h @@ -7,7 +7,7 @@ #include "GPUDataBuffer.h" #include "VertexAttribute.h" -// 默认的顶点布局,适用于Mesh导入的结果,保持shader的一致性 +// 默认的顶点布局,适用于Mesh导入的结果,以保持shader的一致性 // 如果需要修改布局,比如编辑器UI中,用CustomVertexLayout // 默认的顶点属性以及顺序 @@ -36,16 +36,16 @@ struct DefaultVertexLayout namespace VertexLayout { // ibo无论是default还是custom布局都是short - extern uint GetDefaultIndexSize(); - extern GLenum GetDefaultIndexFormat(); - - extern uint32 GetDynamicChunkStride(uint32 vertexAttrMask); - extern bool IsGLVertexAttrNeedNormalized(uint attr); - extern uint GetDefaultShaderChannelFormat(uint attr); - extern uint32 GetDefaultVertexAttrSize(int attr); - extern uint GetDefaultVertexAttrDimension(uint attr); - extern uint GetDefaultShaderChannelDimension(uint attr); - extern GLenum GetDefaultVertexAttrComponentType(uint attr); + uint GetDefaultIndexSize(); + GLenum GetDefaultIndexFormat(); + + uint32 GetDynamicChunkStride(uint32 vertexAttrMask); + bool IsGLVertexAttrNeedNormalized(uint attr); + uint GetDefaultShaderChannelFormat(uint attr); + uint32 GetDefaultVertexAttrSize(int attr); + uint GetDefaultVertexAttrDimension(uint attr); + uint GetDefaultShaderChannelDimension(uint attr); + GLenum GetDefaultVertexAttrComponentType(uint attr); void SetupDefaultVertexLayout(const DefaultVertexLayout& info); void InvalidateVertexInputCache(); diff --git a/Runtime/Graphics/Texture.cpp b/Runtime/Graphics/Texture.cpp index 1fdc0ca..6b682e9 100644 --- a/Runtime/Graphics/Texture.cpp +++ b/Runtime/Graphics/Texture.cpp @@ -3,44 +3,66 @@ using namespace LuaBind; + +Texture::Texture(TextureSetting setting, ImageData* imgData) + : NativeClass() +{ + Init(setting, imgData); + // force not keep imgData + m_KeepPixelData = false; +} + Texture::Texture(LuaBind::VM* vm, TextureSetting setting, ImageData* imgData) : NativeClass(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; + Init(setting, imgData); + // keep image data ? + if (m_KeepPixelData) + { + LuaBind::State state = vm->GetCurThread(); + imgData->PushUserdata(state); + SetMemberRef(state, m_ImageData, -1); + state.Pop(1); + } +} - glGenTextures(1, &m_GPUID); - glBindTexture(GL_TEXTURE_2D, m_GPUID); +void Texture::Init(TextureSetting setting, ImageData* imgData) +{ + 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); CheckGLError( glDeleteTextures(1, &m_GPUID); glBindTexture(GL_TEXTURE_2D, 0); throw TextureException(error); ); - - 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_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; + } CheckGLError( glDeleteTextures(1, &m_GPUID); @@ -48,37 +70,28 @@ Texture::Texture(LuaBind::VM* vm, TextureSetting setting, ImageData* imgData) throw TextureException(error); ); - 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; - } + 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); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imgData->width, imgData->height, 0, GL_RGB, GL_UNSIGNED_BYTE, imgData->pixels); CheckGLError( glDeleteTextures(1, &m_GPUID); glBindTexture(GL_TEXTURE_2D, 0); throw TextureException(error); ); - - // keep image data ? - if (m_KeepPixelData) - { - LuaBind::State state = vm->GetCurThread(); - imgData->PushUserdata(state); - SetMemberRef(state, m_ImageData, -1); - state.Pop(1); - } } Texture::~Texture() diff --git a/Runtime/Graphics/Texture.h b/Runtime/Graphics/Texture.h index 1aa8bdf..d02634c 100644 --- a/Runtime/Graphics/Texture.h +++ b/Runtime/Graphics/Texture.h @@ -61,6 +61,7 @@ public: class Texture : public LuaBind::NativeClass { public: + Texture(TextureSetting setting, ImageData* imgData)/*throw TextureException*/; Texture(LuaBind::VM* vm, TextureSetting setting, ImageData* imgData)/*throw TextureException*/; ~Texture(); @@ -69,7 +70,9 @@ public: GET(GLuint, GpuID, m_GPUID); -protected: +private: + void Init(TextureSetting setting, ImageData* imgData); + GLuint m_GPUID; int m_Width, m_Height; -- cgit v1.1-26-g67d0