summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-11-04 14:48:07 +0800
committerchai <chaifix@163.com>2021-11-04 14:48:07 +0800
commitae2c6b26c2453cfb84153c39861a1bcd02479a85 (patch)
tree259457dcd09db3c256ff613c4483e67495d29fec
parentd7c051cecf0db9056e94d5e80146aa0b066e606b (diff)
-textureUnitBucket
-rw-r--r--Data/Scripts/Editor/AssetBrowser.lua1
-rw-r--r--Projects/VisualStudio/Editor/Editor.vcxproj1
-rw-r--r--Projects/VisualStudio/Editor/Editor.vcxproj.filters3
-rw-r--r--Runtime/GUI/Font.cpp2
-rw-r--r--Runtime/GUI/UITextMesh.cpp9
-rw-r--r--Runtime/Graphics/GfxDevice.cpp28
-rw-r--r--Runtime/Graphics/GfxDevice.h2
-rw-r--r--Runtime/Scripting/Rendering/Rendering.bind.cpp7
-rw-r--r--Runtime/Utilities/AutoInvoke.h27
9 files changed, 51 insertions, 29 deletions
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 @@
<ClInclude Include="..\..\..\Runtime\Threading\Semaphore.h" />
<ClInclude Include="..\..\..\Runtime\Threading\Thread.h" />
<ClInclude Include="..\..\..\Runtime\Utilities\Assert.h" />
+ <ClInclude Include="..\..\..\Runtime\Utilities\AutoInvoke.h" />
<ClInclude Include="..\..\..\Runtime\Utilities\Base64.h" />
<ClInclude Include="..\..\..\Runtime\Utilities\Callback.h" />
<ClInclude Include="..\..\..\Runtime\Utilities\DynamicArray.h" />
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 @@
<ClInclude Include="..\..\..\Runtime\Math\MathHelper.h">
<Filter>Runtime\Math</Filter>
</ClInclude>
+ <ClInclude Include="..\..\..\Runtime\Utilities\AutoInvoke.h">
+ <Filter>Runtime\Utilities</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\..\Runtime\Lua\LuaBind\LuaBindClass.inc">
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 <vector>
#include <unordered_map>
#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<int, int> 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<byte> s_AvailableTextureUnitPreset = {0,1,2,3,4,5,6,7}; // ֧8ͼ
+//static std::vector<byte> s_TextureUnitBucket = s_AvailableTextureUnitPreset;
-static const std::vector<byte> s_AvailableTextureUnitPreset = {0,1,2,3,4,5,6,7}; // ֧8ͼ
-static std::vector<byte> 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);
+