feat(renderer): implement texture binding with texture unit support

- Added generate_new_uuid function for unique identifier generation
- Included stduuid/uuid.h and declared generate_new_uuid in pch.h
- Added bindTexture overload to accept Texture object and texture unit
- Implemented texture unit validation and OpenGL texture activation
- Added Texture class declaration in RenderSystem header
- Updated project files to include new model and utility headers/sources
- Configured C++20 standard in Vivid2D project settings
- Fixed namespace references in Vivid2D.cpp for Buffer classes
This commit is contained in:
tzdwindows 7
2025-11-15 16:22:14 +08:00
parent 0b88b1a7f4
commit 6dcd006f0e
8 changed files with 376 additions and 4 deletions

View File

@@ -150,8 +150,8 @@ int main() {
RenderSystem::clearColor(0.2f, 0.3f, 0.3f, 1.0f);
RenderSystem::clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Buffer::Tesselator& t = Buffer::Tesselator::getInstance();
Buffer::BufferBuilder& builder = t.getBuilder();
Vivid2D::Render::Buffer::Tesselator& t = Vivid2D::Render::Buffer::Tesselator::getInstance();
Vivid2D::Render::Buffer::BufferBuilder& builder = t.getBuilder();
// 矩形的位置和大小
const float rectX = 0; // 矩形左上角的 X 坐标

View File

@@ -122,6 +122,7 @@
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp20</LanguageStandard>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>

View File

@@ -210,9 +210,16 @@ endlocal
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="model\AnimationParameter.h" />
<ClInclude Include="model\FrameInterpolator.h" />
<ClInclude Include="model\util\AnimationClip.h" />
<ClInclude Include="model\util\AnimationLayer.h" />
<ClInclude Include="model\util\LightSource.h" />
<ClInclude Include="model\Mesh2D.h" />
<ClInclude Include="model\Model2D.h" />
<ClInclude Include="model\ModelPart.h" />
<ClInclude Include="model\util\BoundingBox.h" />
<ClInclude Include="model\util\ModelPose.h" />
<ClInclude Include="model\util\PhysicsSystem.h" />
<ClInclude Include="model\util\VertexList.h" />
<ClInclude Include="systems\buffer\BufferUploader.h" />
<ClInclude Include="systems\buffer\BufferBuilder.h" />
@@ -233,9 +240,16 @@ endlocal
</ItemGroup>
<ItemGroup>
<ClCompile Include="model\AnimationParameter.cpp" />
<ClCompile Include="model\FrameInterpolator.cpp" />
<ClCompile Include="model\util\AnimationClip.cpp" />
<ClCompile Include="model\util\AnimationLayer.cpp" />
<ClCompile Include="model\util\LightSource.cpp" />
<ClCompile Include="model\Mesh2D.cpp" />
<ClCompile Include="model\Model2D.cpp" />
<ClCompile Include="model\ModelPart.cpp" />
<ClCompile Include="model\util\BoundingBox.cpp" />
<ClCompile Include="model\util\ModelPose.cpp" />
<ClCompile Include="model\util\PhysicsSystem.cpp" />
<ClCompile Include="model\util\VertexList.cpp" />
<ClCompile Include="systems\buffer\BufferUploader.cpp" />
<ClCompile Include="systems\buffer\BufferBuilder.cpp" />

View File

@@ -78,6 +78,27 @@
<ClInclude Include="model\AnimationParameter.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="model\util\LightSource.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="model\util\ModelPose.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="model\Model2D.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="model\util\PhysicsSystem.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="model\util\AnimationLayer.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="model\util\AnimationClip.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="model\FrameInterpolator.h">
<Filter>头文件</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp">
@@ -137,5 +158,26 @@
<ClCompile Include="model\AnimationParameter.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="model\util\LightSource.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="model\util\ModelPose.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="model\Model2D.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="model\util\PhysicsSystem.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="model\util\AnimationLayer.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="model\util\AnimationClip.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="model\FrameInterpolator.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@@ -1,6 +1,13 @@
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
uuids::uuid generate_new_uuid() {
static std::random_device rd;
static std::mt19937 engine(rd());
static uuids::uuid_random_generator generator(engine);
return generator();
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved

View File

@@ -17,6 +17,9 @@
// 作用:告诉编译器,使用此宏标记的类、函数或变量,必须从当前 DLL 中导出。
// 这是在编译 DLL 自身源代码时,确保其接口能够被外部应用程序使用的关键步骤。
#define VIVID_2D_MYDLL_API __declspec(dllexport)
#include <stduuid/uuid.h>
uuids::uuid generate_new_uuid();
// 添加要在此处预编译的标头
#include "framework.h"

View File

@@ -1,5 +1,7 @@
#include "pch.h"
#include "RenderSystem.h"
#include "Texture.h"
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
@@ -367,10 +369,21 @@ void RenderSystem::_disableDepthTest() { assertOnRenderThread(); glDisable(GL_DE
// ================== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==================
void RenderSystem::bindTexture(GLuint texture) { RENDER_SYSTEM_QUEUE_CALL(_bindTexture, texture); }
void RenderSystem::bindTexture(const Vivid2D::Render::Texture::Texture& texture, int textureUnit) {
GLuint textureId = texture.getTextureId();
if (textureUnit < 0 || textureUnit >= 32) {
textureUnit = 0;
}
GLenum glTextureUnit = GL_TEXTURE0 + textureUnit;
recordRenderCall([glTextureUnit, textureId]() {
_activeTexture(glTextureUnit);
_bindTexture(textureId);
});
}
void RenderSystem::_bindTexture(GLuint t) { assertOnRenderThread(); glBindTexture(GL_TEXTURE_2D, t); }
void RenderSystem::getTexImage(GLenum t, GLint l, GLenum f, GLenum ty, void* p) { assertOnRenderThread(); glGetTexImage(t, l, f, ty, p); }
// [<5B><><EFBFBD><EFBFBD>] _getTexImage <20>Ķ<EFBFBD><C4B6><EFBFBD>
// _getTexImage <20>Ķ<EFBFBD><C4B6><EFBFBD>
void RenderSystem::_getTexImage(GLenum target, GLint level, GLenum format, GLenum type, void* pixels) {
assertOnRenderThread();
glGetTexImage(target, level, format, type, pixels);

View File

@@ -13,13 +13,30 @@
#include <memory>
#include <atomic>
namespace Vivid2D::Render::Texture
{
class Texture;
}
// <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD> spdlog::logger <20>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD><C4BC>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
namespace spdlog {
class logger;
}
/**
* @class RenderSystem
* @brief <20>һ<E1B9A9><D2BB><EFBFBD>̰߳<DFB3>ȫ<EFBFBD>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD> OpenGL API <20><>װ<EFBFBD>
* @details
* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>̬<EFBFBD><CCAC><EFBFBD>ּ࣬<E0A3AC>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA>̵߳<DFB3><CCB5><EFBFBD>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD><EFBFBD>Ŷӣ<C5B6><D3A3><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ר<EFBFBD>õ<EFBFBD><C3B5><EFBFBD>Ⱦ<EFBFBD>߳<EFBFBD><DFB3><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD>ǡ<EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OpenGL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰߳<DFB3>ȫ<EFBFBD>ԡ<EFBFBD><D4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD> OpenGL ״̬<D7B4><CCAC><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3>Լ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>ԵĴ<D4B5><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD>
* ʹ<>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̻߳<DFB3><CCBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC>߳<EFBFBD><DFB3>е<EFBFBD><D0B5>ù<EFBFBD><C3B9><EFBFBD><EFBFBD>ľ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RenderSystem::drawElements<74><73><EFBFBD><EFBFBD>
* <20><>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1BDAB>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD>̵߳<DFB3>ѭ<EFBFBD><D1AD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD> RenderSystem::replayQueue()
* <20><>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷӵ<C5B6><D3B5><EFBFBD><EFBFBD>
*/
class VIVID_2D_MYDLL_API RenderSystem {
public:
// RenderSystem <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A3AC><EFBFBD>˽<EFBFBD>ֹʵ<D6B9><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RenderSystem() = delete;
~RenderSystem() = delete;
RenderSystem(const RenderSystem&) = delete;
@@ -38,36 +55,151 @@ public:
static void ShutdownLogging();
// ================== <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>̹߳<DFB3><CCB9><EFBFBD> ==================
/**
* @brief <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD>õ<EFBFBD><C3B5><EFBFBD>Ⱦ<EFBFBD>̡߳<DFB3>
*/
static void initRenderThread();
/**
* @brief <20><>ʼ<EFBFBD><CABC>Ⱦϵͳ<CFB5>ij<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>׶Ρ<D7B6><CEA1>ڴ˽׶Σ<D7B6><CEA3><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD>ִ<EFBFBD>С<EFBFBD>
*/
static void beginInitialization();
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦϵͳ<CFB5>ij<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>׶Ρ<D7B6><CEA1>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷӡ<C5B6>
*/
static void finishInitialization();
/**
* @brief <20><><EFBFBD>鵱ǰ<E9B5B1>߳<EFBFBD><DFB3>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD>̡߳<DFB3>
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD>̣߳<DFB3><CCA3>򷵻<EFBFBD> true<75><65>
*/
static bool isOnRenderThread();
/**
* @brief <20><><EFBFBD>鵱ǰ<E9B5B1>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>׶Ρ<D7B6>
* @return <20><><EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>׶Σ<D7B6><CEA3>򷵻<EFBFBD> true<75><65>
*/
static bool isInInitPhase();
/**
* @brief <20><><EFBFBD>Ե<EFBFBD>ǰ<EFBFBD>̱߳<DFB3><CCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD>̣߳<DFB3><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>
*/
static void assertOnRenderThread();
/**
* @brief <20><><EFBFBD>Ե<EFBFBD>ǰ<EFBFBD>̱߳<DFB3><CCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD>̻߳<DFB3><CCBB><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>׶Ρ<D7B6>
*/
static void assertOnRenderThreadOrInit();
/**
* @brief ʹ<><CAB9> GLAD <20><><EFBFBD><EFBFBD> OpenGL <20><><EFBFBD><EFBFBD>ָ<EFBFBD>
* @param loader һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EBA3AC><EFBFBD>ڻ<EFBFBD>ȡ OpenGL <20><><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> glfwGetProcAddress<73><73><EFBFBD><EFBFBD>
*/
static void loadGLFunctions(GLADloader loader);
// ================== <20><>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==================
/**
* @brief <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ⱦ<EFBFBD><C8BE><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>Ϊ lambda <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>Ա<EFBFBD><D4B1>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD>߳<EFBFBD><DFB3><EFBFBD>ִ<EFBFBD>С<EFBFBD>
* @param renderCall Ҫִ<D2AA>е<EFBFBD><D0B5><EFBFBD>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static void recordRenderCall(std::function<void()>&& renderCall);
/**
* @brief <20><><EFBFBD><EFBFBD>Ⱦ<EFBFBD>߳<EFBFBD><DFB3><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD><C8BE><EFBFBD>á<EFBFBD>
*/
static void replayQueue();
// ================== OpenGL ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ ==================
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> OpenGL <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD> GL_BLEND<4E><44><EFBFBD><EFBFBD>
* @param capability Ҫ<><D2AA><EFBFBD>õ<EFBFBD> OpenGL <20><><EFBFBD><EFBFBD>ö<EFBFBD>١<EFBFBD>
*/
static void enable(GLenum capability);
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> OpenGL <20><><EFBFBD>ܡ<EFBFBD>
* @param capability Ҫ<><D2AA><EFBFBD>õ<EFBFBD> OpenGL <20><><EFBFBD><EFBFBD>ö<EFBFBD>١<EFBFBD>
*/
static void disable(GLenum capability);
/**
* @brief <20><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Ⱦ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD><CFA1>ӿڵȣ<DAB5><C8A3><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>ջ<EFBFBD><D5BB>
*/
static void pushState();
/**
* @brief <20><>״̬<D7B4><CCAC>ջ<EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>Ⱦ״̬<D7B4><CCAC>
*/
static void popState();
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ǰ״̬<D7B4><CCAC>ջ<EFBFBD>Ĵ<EFBFBD>С<EFBFBD><D0A1>
* @return <20><>ջ<EFBFBD>е<EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static size_t getStateStackSize();
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB>
*/
static void clearColor(float r, float g, float b, float a);
/**
* @brief <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GL_COLOR_BUFFER_BIT<49><54><EFBFBD><EFBFBD>
* @param mask Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>
*/
static void clear(GLbitfield mask);
/**
* @brief <20><><EFBFBD><EFBFBD> OpenGL <20>ӿڡ<D3BF>
*/
static void viewport(int x, int y, int width, int height);
// ================== VAO / VBO / EBO <20><><EFBFBD><EFBFBD> ==================
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (VAO)<29><>
* @return <20>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD> VAO <20>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static GLuint GenVertexArrays();
/**
* @brief ɾ<><C9BE>һ<EFBFBD><D2BB> VAO<41><4F>
* @param vao Ҫɾ<D2AA><C9BE><EFBFBD><EFBFBD> VAO <20>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static void DeleteVertexArrays(GLuint vao);
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> VAO<41><4F>
* @param vao Ҫ<>󶨵<EFBFBD> VAO <20>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static void BindVertexArray(GLuint vao);
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (VBO/EBO)<29><>
* @return <20>´<EFBFBD><C2B4><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static GLuint GenBuffers();
/**
* @brief ɾ<><C9BE>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param buffer Ҫɾ<D2AA><C9BE><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static void DeleteBuffers(GLuint buffer);
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param target <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF> (<28><><EFBFBD><EFBFBD> GL_ARRAY_BUFFER)<29><>
* @param buffer Ҫ<>󶨵Ļ<F3B6A8B5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static void BindBuffer(GLenum target, GLuint buffer);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>󶨵Ļ<F3B6A8B5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param target <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>
* @param size <20><><EFBFBD>ݵĴ<DDB5>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
* @param data ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD>
* @param usage <20><><EFBFBD>ݵ<EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>; (<28><><EFBFBD><EFBFBD> GL_STATIC_DRAW)<29><>
*/
static void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage);
// ================== Uniform <20><><EFBFBD><EFBFBD> ==================
@@ -83,39 +215,147 @@ public:
static void uniform4f(GLint location, const glm::vec4& vec);
static void uniformMatrix3(GLint location, const glm::mat3& matrix, bool transpose = false);
static void uniformMatrix4(GLint location, const glm::mat4& matrix, bool transpose = false);
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> uniform <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>á<EFBFBD>
* @param program <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
* @param name uniform <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD>
* @return uniform <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>á<EFBFBD>
*/
static GLint getUniformLocation(GLuint program, const std::string& name);
// ================== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==================
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>
*/
static void lineWidth(float width);
/**
* @brief ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB>ơ<EFBFBD>
*/
static void drawElements(GLenum mode, GLsizei count, GLenum type, const void* indices);
/**
* @brief ֱ<><D6B1>ʹ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB>ơ<EFBFBD>
*/
static void drawArrays(GLenum mode, GLint first, GLsizei count);
// ================== <20><><EFBFBD><EFBFBD>ģʽ ==================
/**
* @brief <20><><EFBFBD>û<EFBFBD><C3BB>ϡ<EFBFBD>
*/
static void enableBlend();
/**
* @brief <20><><EFBFBD>û<EFBFBD><C3BB>ϡ<EFBFBD>
*/
static void disableBlend();
/**
* @brief <20><><EFBFBD>û<EFBFBD><C3BB>Ϻ<EFBFBD><CFBA><EFBFBD><EFBFBD><EFBFBD>
*/
static void blendFunc(GLenum sfactor, GLenum dfactor);
/**
* @brief <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD> Alpha <20><><EFBFBD>Ϻ<EFBFBD><CFBA><EFBFBD> (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)<29><>
*/
static void defaultBlendFunc();
// ================== <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==================
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <20>³<EFBFBD><C2B3><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static GLuint createProgram();
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD>󶨵<EFBFBD><F3B6A8B5><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static GLint getCurrentProgram();
/**
* @brief <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static void attachShader(GLuint program, GLuint shader);
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static void linkProgram(GLuint program);
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>
*/
static GLint getProgrami(GLuint program, GLenum pname);
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>Ϣ<EFBFBD><CFA2>
*/
static std::string getProgramInfoLog(GLuint program);
/**
* @brief <20>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
*/
static void detachShader(GLuint program, GLuint shader);
/**
* @brief ɾ<><C9BE>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static void deleteProgram(GLuint program);
/**
* @brief <20><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD>
*/
static GLuint linkProgram(GLuint vertexShader, GLuint fragmentShader);
/**
* @brief <20><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD><E3A1A2><EFBFBD>κ<EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD>
*/
static GLuint linkProgram(GLuint vertexShader, GLuint geometryShader, GLuint fragmentShader);
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static void useProgram(GLuint program);
// ================== <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==================
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param type <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> GL_VERTEX_SHADER)<29><>
* @return <20><><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static GLuint createShader(GLenum type);
/**
* @brief Ϊ<><CEAA>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>
*/
static void shaderSource(GLuint shader, const std::string& source);
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
*/
static void compileShader(GLuint shader);
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ɫ<EFBFBD><C9AB><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>
*/
static GLint getShaderi(GLuint shader, GLenum pname);
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>Ϣ<EFBFBD><CFA2>
*/
static std::string getShaderInfoLog(GLuint shader);
/**
* @brief ɾ<><C9BE>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
*/
static void deleteShader(GLuint shader);
/**
* @brief <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static GLuint compileShader(GLenum type, const std::string& source);
// ================== <20><><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD> ==================
@@ -126,10 +366,36 @@ public:
static void disableDepthTest();
// ================== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==================
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> 2D <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EEB6AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
* @param texture Ҫ<>󶨵<EFBFBD><F3B6A8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static void bindTexture(GLuint texture);
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> Texture <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
* @details <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>Ͱ<EFBFBD><CDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD>Ϊһ<CEAA><D2BB><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><E1BDBB><EFBFBD><EFBFBD>Ⱦ<EFBFBD>̡߳<DFB3>
* @param texture Ҫ<>󶨵<EFBFBD> Texture <20><><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
* @param textureUnit Ҫ<>󶨵<EFBFBD><F3B6A8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> (0, 1, 2, ...)<29><>
*/
static void bindTexture(const Vivid2D::Render::Texture::Texture& texture, int textureUnit = 0);
static void getTexImage(GLenum target, GLint level, GLenum format, GLenum type, void* pixels);
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
* @param texture Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ (<28><><EFBFBD><EFBFBD> GL_TEXTURE0)<29><>
*/
static void activeTexture(GLenum texture);
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static GLuint genTextures();
/**
* @brief ɾ<><C9BE>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param texture Ҫɾ<D2AA><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static void deleteTextures(GLuint texture);
static void texImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
static void texParameteri(GLenum target, GLenum pname, GLint param);
@@ -137,6 +403,11 @@ public:
static void setTextureMagFilter(GLenum filter);
static void setTextureWrapS(GLenum wrap);
static void setTextureWrapT(GLenum wrap);
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ĭ<EFBFBD>ϵ<EFBFBD> 1x1 <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return Ĭ<><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>
*/
static GLuint createDefaultTexture();
// ================== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ==================
@@ -146,20 +417,41 @@ public:
// ================== <20><><EFBFBD>߷<EFBFBD><DFB7><EFBFBD> ==================
static void readPixels(int x, int y, int width, int height, GLenum format, GLenum type, void* pixels);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>֧<EFBFBD><D6A7>ij<EFBFBD><C4B3> OpenGL <20><>չ<EFBFBD><D5B9>
*/
static bool isExtensionSupported(const std::string& extension);
static void pixelStore(GLenum pname, GLint param);
static std::string getVendor();
static std::string getRenderer();
static std::string getOpenGLVersion();
static std::string getGLSLVersion();
/**
* @brief <20><>¼<EFBFBD><C2BC>ϸ<EFBFBD><CFB8> OpenGL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
*/
static void logDetailedGLInfo();
/**
* @brief <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ĭ<EFBFBD>ϵ<EFBFBD> OpenGL ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
*/
static void setupDefaultState();
/**
* @brief <20><><EFBFBD><EFBFBD><E9B2A2>¼<EFBFBD>κη<CEBA><CEB7><EFBFBD><EFBFBD><EFBFBD> OpenGL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param operation <20><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD>
*/
static void checkGLError(const std::string& operation);
// ================== <20><>ȡ״̬ ==================
static int getViewportWidth();
static int getViewportHeight();
static glm::vec4 getClearColor();
/**
* @brief <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <20><><EFBFBD>д<EFBFBD>С<EFBFBD><D0A1>
*/
static size_t getQueueSize();
private: