From 42ec7286b2d36a9ba22925f816a17cb1cc2aa5ce Mon Sep 17 00:00:00 2001 From: chai Date: Sat, 30 Oct 2021 11:32:16 +0800 Subject: + Penlight --- Runtime/Graphics/Texture.cpp | 117 ++++++++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 52 deletions(-) (limited to 'Runtime/Graphics/Texture.cpp') 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() -- cgit v1.1-26-g67d0