trueno/src/arbtri.jai
2025-04-26 10:51:41 +03:00

62 lines
1.7 KiB
Plaintext

Arb_Tri :: struct {
pos: [3]Vector3;
col: [3]Vector4;
uv: [3]Vector2;
}
Arb_Tri_State :: struct {
active : bool = false;
trilist : [..]Arb_Tri;
}
arbTriState : Arb_Tri_State;
arb_tri_add :: (tri: Arb_Tri) {
if !arbTriState.active {
array_reset_keeping_memory(*arbTriState.trilist);
arbTriState.active = true;
}
array_add(*arbTriState.trilist, tri);
}
arb_tri_flush :: () {
if !arbTriState.active {
return;
}
transform_to_screen_x :: (coord: float) -> float {
w, h := get_window_size();
return (coord / cast(float) w) * 2.0 - 1.0;
}
transform_to_screen_y :: (coord: float) -> float {
w, h := get_window_size();
return (coord / cast(float) h) * 2.0 - 1.0;
}
arbTriState.active = false;
for tri, i : arbTriState.trilist {
bgn := i * 3 * 9;
for 0..2 {
gArbtriMem[bgn + it * 9 + 0] = transform_to_screen_x(tri.pos[it].x);
gArbtriMem[bgn + it * 9 + 1] = transform_to_screen_y(tri.pos[it].y) * -1.0;
gArbtriMem[bgn + it * 9 + 2] = 0;
gArbtriMem[bgn + it * 9 + 3] = tri.col[it].x;
gArbtriMem[bgn + it * 9 + 4] = tri.col[it].y;
gArbtriMem[bgn + it * 9 + 5] = tri.col[it].z;
gArbtriMem[bgn + it * 9 + 6] = tri.col[it].w;
gArbtriMem[bgn + it * 9 + 7] = tri.uv[it].x;
gArbtriMem[bgn + it * 9 + 8] = tri.uv[it].y;
}
}
sg_update_buffer(gPipelines.arbtri.bind.vertex_buffers[0], *(sg_range.{ ptr = gArbtriMem.data, size = size_of(type_of(gArbtriMem)) }));
sg_apply_pipeline(gPipelines.arbtri.pipeline);
sg_apply_bindings(*gPipelines.arbtri.bind);
sg_draw(0, xx (arbTriState.trilist.count * 3), 1);
}