v/renderer/webgpu/renderer.h
2026-04-28 19:46:41 +02:00

106 lines
1.9 KiB
C++

//
// Created by Vicente Ferrari Smith on 06.03.26.
//
#ifndef V_RENDERER_H
#define V_RENDERER_H
#ifdef __EMSCRIPTEN__
#include <GLFW/emscripten_glfw3.h>
#else
#include <GLFW/glfw3.h>
#endif
#include <glm/glm.hpp>
#include <webgpu/webgpu.h>
#include "../sprite.h"
enum class PROJECTION_TYPE : uint8_t {
NONE,
ORTHOGRAPHIC_WORLD,
ORTHOGRAPHIC_WINDOW,
PERSPECTIVE_WORLD,
PERSPECTIVE_WINDOW,
COUNT,
};
// commands
enum class PipelineType : uint8_t {
None,
TexturedQuad,
ColoredQuad,
Line,
Text,
Chunk
};
struct TexturedQuadCmd {
glm::vec2 pos;
glm::vec2 scale;
glm::vec2 uv0;
glm::vec2 uv1;
glm::vec4 colour;
WGPUTextureDescriptor texture;
};
struct ColoredQuadCmd {
glm::vec2 pos;
glm::vec2 scale;
glm::vec4 colour;
};
struct LineCmd {
glm::vec2 start;
glm::vec2 end;
glm::vec4 color;
};
struct SortKey {
uint16_t depth; // world Z or Y-sorted depth
uint16_t materialID; // texture sheet, font atlas, etc.
uint8_t pipeline; // PipelineType
bool operator<(const SortKey& b) const;
};
struct RenderCommand {
SortKey key;
PipelineType pipeline;
union {
TexturedQuadCmd textured_quad;
ColoredQuadCmd colored_quad;
LineCmd line;
// TextCmd text;
// ChunkCmd chunk;
};
};
struct Renderer {
std::vector<RenderCommand> commands{};
WGPURenderPipeline textured_quad_pipeline;
size_t elementCount = 64;
WGPUComputePipeline compute_pipeline;
WGPUBuffer input_buffer;
WGPUBuffer output_buffer;
WGPUBuffer staging_buffer;
Renderer() = default;
Renderer(GLFWwindow *window);
void begin_frame();
void end_frame(GLFWwindow *window);
void submit_sprite(glm::vec2 pos, const sprite_t &sprite);
void create_render_pipeline();
void create_compute_pipeline();
};
#endif //V_RENDERER_H