Files
Vivid2DRenderer/Vivid2DRenderer/systems/buffer/Tesselator.h
tzdwindows 7 ab8c621a00 refactor(buffer): rename namespace from Buffer to Vivid2D::Render::Buffer
- Updated namespace in BufferBuilder.cpp
- Updated namespace in BufferBuilder.h
- Updated namespace in BufferUploader.cpp
- Updated namespace in BufferUploader.h
- Updated namespace in Tesselator.cpp
- Updated namespace in Tesselator.h

chore(project): add new source files and update preprocessor definitions

- Added GLM_ENABLE_EXPERIMENTAL and _CRT_SECURE_NO_WARNINGS to preprocessor definitions
- Included new header files: AnimationParameter.h, Mesh2D.h, ModelPart.h, BoundingBox.h, VertexList.h
- Included new source files: AnimationParameter.cpp, Mesh2D.cpp, ModelPart.cpp, BoundingBox.cpp, VertexList.cpp
- Added MultiSelectionBoxRenderer.h and MultiSelectionBoxRenderer.cpp
- Added Texture.h and Texture.cpp
- Added Vertex.h and Vertex.cpp
- Updated project filters for new files
2025-11-15 10:21:03 +08:00

119 lines
3.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <memory>
#include "BufferBuilder.h"
#include "../../systems/RenderSystem.h"
/**
* @file BufferSystem.h
* @brief Vivid2D 渲染系统的即时模式Immediate Mode缓冲区管理系统。
*
* 核心目标:提供一个简单、高效的接口,用于在运行时动态构建几何体数据(顶点流),
* 并使用一次 Draw Call 提交给 GPU 渲染,然后立即释放 GPU 资源。
*
* ==========================================================
* 核心组件介绍
* ==========================================================
*
* 1. Tesselator (单例管理器)
* ----------------------------
* - 作用:系统的入口点,管理一个 BufferBuilder 单例实例。
* - 接口Tesselator::getInstance() 获取单例Tesselator::getBuilder() 获取构建器。
* - 核心方法Tesselator::end()。调用此方法会触发整个绘制流程 (Builder -> Uploader)。
*
* 2. BufferBuilder (数据构建器)
* ----------------------------
* - 作用:负责在 CPU 内存中收集顶点数据x, y, u, v和当前的渲染状态 (RenderState)。
* - 接口begin() 启动构建vertex() 添加顶点setTexture/setColor 等设置状态。
* - 输出end() 返回一个 BuiltBuffer 实例。
*
* 3. BuiltBuffer (缓冲区结果)
* --------------------------
* - 作用:一个数据结构,封装了所有必要的 GPU 资源句柄 (VAO/VBO)、顶点数量、GL 模式,以及构建时捕获的 RenderState 副本。
* - 特点:所有权通过 std::unique_ptr 转移,确保资源只被 Uploader 绘制和清理一次。
*
* 4. BufferUploader (绘制和清理器)
* --------------------------------
* - 作用:接收 BuiltBuffer将其中记录的 RenderState 应用到 GL 上下文,绑定 VAO执行 glDrawArrays 绘制,最后清理 GPU 资源。
* - 核心方法BufferUploader::drawWithShader(std::unique_ptr<BuiltBuffer> buffer)。
*
* ==========================================================
* 典型工作流程 (绘制一个带纹理的四边形)
* ==========================================================
*
* 1. 初始化和获取:
* Tesselator& t = Tesselator::getInstance();
* BufferBuilder& builder = t.getBuilder();
*
* 2. 开始构建:
* builder.begin(GL_QUADS, 4); // 预计绘制一个包含 4 个顶点的四边形
*
* 3. 设置状态:
* builder.setShader(myProgramId);
* builder.setTexture(myTextureId, 0);
* builder.setColor(glm::vec4(1.0f, 1.0f, 1.0f, 0.5f)); // 半透明白色
*
* 4. 添加顶点x, y, u, v
* builder.vertex(10.0f, 10.0f, 0.0f, 0.0f);
* builder.vertex(110.0f, 10.0f, 1.0f, 0.0f);
* builder.vertex(110.0f, 110.0f, 1.0f, 1.0f);
* builder.vertex(10.0f, 110.0f, 0.0f, 1.0f);
*
* 5. 提交绘制和清理:
* t.end();
* // 此时数据已上传、绘制完成GPU 上的 VAO/VBO 资源已被释放。
*
*/
namespace Vivid2D::Render::Buffer {
class BufferBuilder;
/**
* @brief Tesselator 类:作为 BufferBuilder 的单例管理器。
* * 职责:
* 1. 提供单例访问。
* 2. 封装 BufferBuilder提供一致的几何体构建接口。
* 3. 在 end() 调用时,将构建结果交由 BufferUploader 立即绘制。
*/
class VIVID_2D_MYDLL_API Tesselator {
private:
static constexpr int DEFAULT_BUFFER_SIZE = 2097152; // 2MB floats
std::unique_ptr<BufferBuilder> builder; // BufferBuilder 实例
/**
* @brief 私有构造函数,确保单例。
*/
explicit Tesselator(int bufferSize);
/**
* @brief 私有默认构造函数。
*/
Tesselator();
public:
Tesselator(const Tesselator&) = delete;
Tesselator& operator=(const Tesselator&) = delete;
/**
* @brief 获取 Tesselator 的单例实例(线程安全延迟初始化)。
* * 必须在渲染线程上调用或在初始化阶段调用。
* @return Tesselator& 单例实例的引用。
*/
static Tesselator& getInstance();
/**
* @brief 结束构建,将数据上传到 GPU并立即绘制。
* * 必须在渲染线程上调用。
*/
void end();
/**
* @brief 获取底层的 BufferBuilder 对象,用于添加顶点和设置状态。
* @return BufferBuilder&
*/
BufferBuilder& getBuilder();
};
} // namespace Buffer