158 lines
5.7 KiB
C++
158 lines
5.7 KiB
C++
/*
|
|
* Implementation of render target for debug rendering
|
|
*/
|
|
|
|
// TOP
|
|
|
|
struct Dbg_Renderer_Vars{
|
|
Partition part;
|
|
b32 initialized;
|
|
};
|
|
|
|
Render_Execute_Sig(dbg_render_execute){
|
|
Dbg_Renderer_Vars *vars = (Dbg_Renderer_Vars*)target->memory;
|
|
vars->part = make_partition(target->memory, target->memory_size);
|
|
|
|
if (!vars->initialized){
|
|
vars->initialized = true;
|
|
}
|
|
|
|
Render_Command_Header *h;
|
|
|
|
for (h = (Render_Command_Header*)target->push_part.base;
|
|
h->type;
|
|
h = NextHeader(h)){
|
|
|
|
switch (h->type){
|
|
case render_dbg_parallelagram:
|
|
{
|
|
Render_Dbg_Parallelagram *r =
|
|
(Render_Dbg_Parallelagram*)(h + 1);
|
|
|
|
vec2 center = r->transform.pos;
|
|
vec2 half_x = r->transform.basis.x;
|
|
vec2 half_y = r->transform.basis.y;
|
|
vec2 p;
|
|
|
|
glBindTexture(GL_TEXTURE_2D, 0);
|
|
glColor4f(r->color.r, r->color.g, r->color.b, r->color.a);
|
|
glBegin(GL_QUADS);
|
|
{
|
|
p = center - half_x + half_y;
|
|
glVertex2f(p.x, p.y);
|
|
|
|
p = center + half_x + half_y;
|
|
glVertex2f(p.x, p.y);
|
|
|
|
p = center + half_x - half_y;
|
|
glVertex2f(p.x, p.y);
|
|
|
|
p = center - half_x - half_y;
|
|
glVertex2f(p.x, p.y);
|
|
}
|
|
glEnd();
|
|
}break;
|
|
|
|
case render_dbg_rectangle:
|
|
{
|
|
Render_Dbg_Rectangle *r =
|
|
(Render_Dbg_Rectangle*)(h + 1);
|
|
|
|
glBindTexture(GL_TEXTURE_2D, 0);
|
|
glColor4f(r->color.r, r->color.g, r->color.b, r->color.a);
|
|
glBegin(GL_QUADS);
|
|
{
|
|
glVertex2f(r->rect.x0, r->rect.y0);
|
|
glVertex2f(r->rect.x1, r->rect.y0);
|
|
glVertex2f(r->rect.x1, r->rect.y1);
|
|
glVertex2f(r->rect.x0, r->rect.y1);
|
|
}
|
|
glEnd();
|
|
}break;
|
|
|
|
case render_image:
|
|
{
|
|
Render_Image *i = (Render_Image*)(h + 1);
|
|
Image *image = get_image(bank, i->image_id);
|
|
if (image){
|
|
vec2 center = i->transform.pos;
|
|
vec2 half_x = i->transform.basis.x;
|
|
vec2 half_y = i->transform.basis.y;
|
|
f32 s = image->tex_x;
|
|
f32 t = image->tex_y;
|
|
|
|
center = do_transform(center, target->me_to_pixel_transform);
|
|
|
|
{
|
|
i32 texture_id = image->texture_id;
|
|
vec4 white = v4(1.f, 1.f, 1.f, 1.f);
|
|
|
|
glBindTexture(GL_TEXTURE_2D, texture_id);
|
|
glColor4f(white.r, white.g, white.b, white.a);
|
|
glBegin(GL_QUADS);
|
|
{
|
|
vec2 p;
|
|
|
|
p = center - half_x + half_y;
|
|
glTexCoord2f(0.f, t);
|
|
glVertex2f(p.x, p.y);
|
|
|
|
p = center + half_x + half_y;
|
|
glTexCoord2f(s, t);
|
|
glVertex2f(p.x, p.y);
|
|
|
|
p = center + half_x - half_y;
|
|
glTexCoord2f(s, 0.f);
|
|
glVertex2f(p.x, p.y);
|
|
|
|
p = center - half_x - half_y;
|
|
glTexCoord2f(0.f, 0.f);
|
|
glVertex2f(p.x, p.y);
|
|
}
|
|
glEnd();
|
|
}
|
|
}
|
|
}break;
|
|
|
|
case render_glyph:
|
|
{
|
|
Render_Glyph *g = (Render_Glyph*)(h + 1);
|
|
Font *font = get_font(bank, g->font_id);
|
|
if (font){
|
|
stbtt_aligned_quad q;
|
|
f32 y = g->pos.y;
|
|
|
|
g->pos.y = 0;
|
|
stbtt_GetBakedQuad(font->chardata, font->texture_w, font->texture_h,
|
|
g->c, &g->pos.x, &g->pos.y, &q, 1);
|
|
|
|
glBindTexture(GL_TEXTURE_2D, font->texture_id);
|
|
glColor4f(0.f, 0.f, 0.f, g->color.a);
|
|
glBegin(GL_QUADS);
|
|
{
|
|
glTexCoord2f(q.s0, q.t1); glVertex2f(q.x0 + 1, y - q.y1 - 1);
|
|
glTexCoord2f(q.s1, q.t1); glVertex2f(q.x1 + 1, y - q.y1 - 1);
|
|
glTexCoord2f(q.s1, q.t0); glVertex2f(q.x1 + 1, y - q.y0 - 1);
|
|
glTexCoord2f(q.s0, q.t0); glVertex2f(q.x0 + 1, y - q.y0 - 1);
|
|
}
|
|
glEnd();
|
|
|
|
glColor4f(g->color.r, g->color.g, g->color.b, g->color.a);
|
|
glBegin(GL_QUADS);
|
|
{
|
|
glTexCoord2f(q.s0, q.t1); glVertex2f(q.x0, y - q.y1);
|
|
glTexCoord2f(q.s1, q.t1); glVertex2f(q.x1, y - q.y1);
|
|
glTexCoord2f(q.s1, q.t0); glVertex2f(q.x1, y - q.y0);
|
|
glTexCoord2f(q.s0, q.t0); glVertex2f(q.x0, y - q.y0);
|
|
}
|
|
glEnd();
|
|
}
|
|
}break;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// BOTTOM
|
|
|