From ae2c6b26c2453cfb84153c39861a1bcd02479a85 Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 4 Nov 2021 14:48:07 +0800 Subject: -textureUnitBucket --- Data/Scripts/Editor/AssetBrowser.lua | 1 - Projects/VisualStudio/Editor/Editor.vcxproj | 1 + .../VisualStudio/Editor/Editor.vcxproj.filters | 3 +++ Runtime/GUI/Font.cpp | 2 +- Runtime/GUI/UITextMesh.cpp | 9 ++++--- Runtime/Graphics/GfxDevice.cpp | 28 ++++++++++------------ Runtime/Graphics/GfxDevice.h | 2 -- Runtime/Scripting/Rendering/Rendering.bind.cpp | 7 ------ Runtime/Utilities/AutoInvoke.h | 27 +++++++++++++++++++++ 9 files changed, 51 insertions(+), 29 deletions(-) create mode 100644 Runtime/Utilities/AutoInvoke.h diff --git a/Data/Scripts/Editor/AssetBrowser.lua b/Data/Scripts/Editor/AssetBrowser.lua index 377aa8e..c1542c2 100644 --- a/Data/Scripts/Editor/AssetBrowser.lua +++ b/Data/Scripts/Editor/AssetBrowser.lua @@ -40,7 +40,6 @@ AssetBrowser.OnGUI = function(self) --Engine.Rendering.DrawUIQuad({0, 0, 200, 200}) _G["default_font"]:GetCharacters("你好世界!\nHello,World!\nProject Window Properties", 12) --Engine.Rendering.DrawUI9Slicing(1, {25, 25}, {25, 25}, {80, 80}, {400, 50} ) - Engine.Rendering.ResetUniformState() end AssetBrowser.OnFocus = function(self) diff --git a/Projects/VisualStudio/Editor/Editor.vcxproj b/Projects/VisualStudio/Editor/Editor.vcxproj index fe39c0f..7acc117 100644 --- a/Projects/VisualStudio/Editor/Editor.vcxproj +++ b/Projects/VisualStudio/Editor/Editor.vcxproj @@ -334,6 +334,7 @@ + diff --git a/Projects/VisualStudio/Editor/Editor.vcxproj.filters b/Projects/VisualStudio/Editor/Editor.vcxproj.filters index 4a06e34..3f940a7 100644 --- a/Projects/VisualStudio/Editor/Editor.vcxproj.filters +++ b/Projects/VisualStudio/Editor/Editor.vcxproj.filters @@ -711,6 +711,9 @@ Runtime\Math + + Runtime\Utilities + diff --git a/Runtime/GUI/Font.cpp b/Runtime/GUI/Font.cpp index a2d3078..207e658 100644 --- a/Runtime/GUI/Font.cpp +++ b/Runtime/GUI/Font.cpp @@ -186,7 +186,7 @@ bool Font::RenderCharacter(character::Unicode codepoint, int pixelSize) memcpy(&s_PixelBuffer[0], pixels, s_SizePerPixel * w * h); } - TextHelper::print_glyph(&s_PixelBuffer[0], w, h); + //TextHelper::print_glyph(&s_PixelBuffer[0], w, h); GlyphAtals* atlas = RequestAtlas(pixelSize, Vector2(w, h)); Assert(atlas); diff --git a/Runtime/GUI/UITextMesh.cpp b/Runtime/GUI/UITextMesh.cpp index 7fc2614..a800dcd 100644 --- a/Runtime/GUI/UITextMesh.cpp +++ b/Runtime/GUI/UITextMesh.cpp @@ -8,6 +8,7 @@ #include #include #include "Runtime/Graphics/GfxDevice.h" +#include "Runtime/Utilities/AutoInvoke.h" using namespace std; @@ -75,6 +76,11 @@ UITextMesh::UITextMesh(const UnicodeString& str, Font* font, int pixelSize, int static unordered_map s_LineOffsets; s_LineOffsets.clear(); + InvokeWhenLeave([]() { + s_LineWidths.clear(); + s_LineOffsets.clear(); + }); + m_Font = font; const Vector2 atlasSize = font->GetAtlasSize(); @@ -256,8 +262,5 @@ void UITextMesh::Draw() WipeGLError(); vbo->Draw(s_TextMeshVBOLayout); - - WipeGLError(); - g_GfxDevice.ResetUniformsState(); } } diff --git a/Runtime/Graphics/GfxDevice.cpp b/Runtime/Graphics/GfxDevice.cpp index e172756..f83a9b4 100644 --- a/Runtime/Graphics/GfxDevice.cpp +++ b/Runtime/Graphics/GfxDevice.cpp @@ -3,9 +3,19 @@ #include "Runtime/Math/Math.h" static bool deviceInited = false; +// +//static const std::vector s_AvailableTextureUnitPreset = {0,1,2,3,4,5,6,7}; // ֧8ͼ +//static std::vector s_TextureUnitBucket = s_AvailableTextureUnitPreset; -static const std::vector s_AvailableTextureUnitPreset = {0,1,2,3,4,5,6,7}; // ֧8ͼ -static std::vector s_TextureUnitBucket = s_AvailableTextureUnitPreset; +static const int kMaxAvailableTextureUnitCount = 8; // ֧8ͼ +static int s_CurAvailableTextureUnit = 0; + +static int ClaimTextureUnit() +{ + int unit = s_CurAvailableTextureUnit; + s_CurAvailableTextureUnit = (s_CurAvailableTextureUnit + 1) % kMaxAvailableTextureUnitCount; + return unit; +} GfxDevice g_GfxDevice; @@ -129,14 +139,7 @@ void GfxDevice::SetUniformMat4(const char* name, Matrix44 mat4) void GfxDevice::SetUniformTexture(const char* name, Texture* texture) { - if (s_TextureUnitBucket.size() == 0) - { - log_error("No available texture unit. Too many textures or forget invoke ResetUniformsState()"); - return; - } - - int texUnit = s_TextureUnitBucket.back(); - s_TextureUnitBucket.pop_back(); + int texUnit = ClaimTextureUnit(); glActiveTexture(GL_TEXTURE0 + texUnit); glBindTexture(GL_TEXTURE_2D, texture->GetGpuID()); @@ -144,11 +147,6 @@ void GfxDevice::SetUniformTexture(const char* name, Texture* texture) glUniform1i(loc, texUnit); } -void GfxDevice::ResetUniformsState() -{ - s_TextureUnitBucket = s_AvailableTextureUnitPreset; -} - void GfxDevice::BeginFrame() { m_IsInsideFrame = true; diff --git a/Runtime/Graphics/GfxDevice.h b/Runtime/Graphics/GfxDevice.h index f00a58f..dccde4b 100644 --- a/Runtime/Graphics/GfxDevice.h +++ b/Runtime/Graphics/GfxDevice.h @@ -70,8 +70,6 @@ public: void SetUniformMat4(const char* name, Matrix44 mat4); void SetUniformTexture(const char* name, Texture* texture); - void ResetUniformsState(); - void BeginFrame(); void EndFrame(); void PresentFrame(); diff --git a/Runtime/Scripting/Rendering/Rendering.bind.cpp b/Runtime/Scripting/Rendering/Rendering.bind.cpp index 58e95bc..c78c7c9 100644 --- a/Runtime/Scripting/Rendering/Rendering.bind.cpp +++ b/Runtime/Scripting/Rendering/Rendering.bind.cpp @@ -16,12 +16,6 @@ static int DrawUIQuad(lua_State* L) return 0; } -static int ResetUniformState(lua_State* L) -{ - g_GfxDevice.ResetUniformsState(); - return 0; -} - // mode, horizontal, vertical, texSize, quadSize static int DrawUI9Slicing(lua_State* L) { @@ -43,7 +37,6 @@ static int DrawUI9Slicing(lua_State* L) static luaL_Reg funcs[] = { {"DrawUIQuad", DrawUIQuad}, {"DrawUI9Slicing", DrawUI9Slicing}, - {"ResetUniformState", ResetUniformState}, {0, 0} }; diff --git a/Runtime/Utilities/AutoInvoke.h b/Runtime/Utilities/AutoInvoke.h new file mode 100644 index 0000000..a443960 --- /dev/null +++ b/Runtime/Utilities/AutoInvoke.h @@ -0,0 +1,27 @@ +#pragma once + +typedef void(*AutoInvokeAction)(); + +// RAII auto call +class AutoInvokerWhenLeave +{ +public: + AutoInvokerWhenLeave(AutoInvokeAction func) + { + m_Func = func; + }; + ~AutoInvokerWhenLeave() + { + if (m_Func) + { + m_Func(); + } + } +private: + AutoInvokeAction m_Func; + +}; + +#define InvokeWhenLeave(func) \ +AutoInvokerWhenLeave auto_invoker = AutoInvokerWhenLeave(func); + -- cgit v1.1-26-g67d0