fekalnigtacko/src/gfx/draw_list.hpp
2026-02-11 14:31:46 +01:00

73 lines
1.9 KiB
C++

#pragma once
#include <vector>
#include "assets/skeleton.hpp"
#include "hud.hpp"
#include "surface.hpp"
#include "uniform_buffer.hpp"
namespace gfx
{
struct DrawSurfaceCmd
{
const Surface* surface = nullptr;
const glm::mat4* matrices = nullptr; // model matrix
const glm::vec4* color = nullptr; // optional tint
uint32_t first = 0; // first triangle index
uint32_t count = 0; // num triangles
float dist = 0.0f; // distance to camera - for transparnt sorting
const UniformBuffer<glm::mat4>* skinning = nullptr; // skinning matrices for skeletal meshes
};
struct DrawBeamCmd
{
glm::vec3 start;
glm::vec3 end;
uint32_t color;
float radius;
size_t num_segments;
float max_offset;
DrawBeamCmd(const glm::vec3& start, const glm::vec3& end, uint32_t color, float radius,
size_t num_segments, float max_offset)
: start(start), end(end), color(color), radius(radius), num_segments(num_segments), max_offset(max_offset)
{
}
};
struct DrawHudCmd
{
const VertexArray* va = nullptr;
const Texture* texture = nullptr;
const HudPosition* pos = nullptr;
const glm::vec4* color = nullptr;
};
struct DrawList
{
std::vector<DrawSurfaceCmd> surfaces;
std::vector<DrawBeamCmd> beams;
std::vector<DrawHudCmd> huds;
void AddSurface(const DrawSurfaceCmd& cmd) { surfaces.emplace_back(cmd); }
void AddBeam(const DrawBeamCmd& cmd) { beams.emplace_back(cmd); }
void AddBeam(const glm::vec3& start, const glm::vec3& end, uint32_t color = 0xFFFFFFFF, float radius = 0.1f,
size_t num_segments = 1, float max_offset = 0.0f)
{
beams.emplace_back(start, end, color, radius, num_segments, max_offset);
}
void AddHUD(const DrawHudCmd& cmd) { huds.emplace_back(cmd); }
void Clear()
{
surfaces.clear();
beams.clear();
huds.clear();
}
};
} // namespace gfx