make arbitrary triangles work with a command queue
This commit is contained in:
parent
0d3c8106cf
commit
b0045107cb
@ -1,20 +1,51 @@
|
|||||||
Arb_Tri :: struct {
|
Arb_Tri :: struct {
|
||||||
pos: [3]Vector3;
|
pos : [3]Vector3;
|
||||||
col: [3]Vector4;
|
col : [3]Vector4;
|
||||||
uv: [3]Vector2;
|
uv : [3]Vector2;
|
||||||
|
}
|
||||||
|
|
||||||
|
Arb_Draw_Command_Type :: enum {
|
||||||
|
INVALID;
|
||||||
|
FLUSH_TRI;
|
||||||
|
SET_TEXTURE;
|
||||||
|
REMOVE_TEXTURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Arb_Draw_Command :: struct {
|
||||||
|
type : Arb_Draw_Command_Type = .INVALID;
|
||||||
|
tri_offset : int = 0;
|
||||||
|
tri_count : int = 0;
|
||||||
|
texture : *Ui_Texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
Arb_Tri_State :: struct {
|
Arb_Tri_State :: struct {
|
||||||
active : bool = false;
|
active : bool = false;
|
||||||
trilist : [..]Arb_Tri;
|
trilist : [..]Arb_Tri;
|
||||||
|
command_list : [..]Arb_Draw_Command;
|
||||||
|
latest_flush : int = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
arbTriState : Arb_Tri_State;
|
arbTriState : Arb_Tri_State;
|
||||||
|
|
||||||
|
init_arb_state :: () {
|
||||||
|
gPipelines.arbtri.bind.images[0] = default_texture.tex;
|
||||||
|
array_reset_keeping_memory(*arbTriState.trilist);
|
||||||
|
array_reset_keeping_memory(*arbTriState.command_list);
|
||||||
|
arbTriState.active = true;
|
||||||
|
arbTriState.latest_flush = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
arb_tri_command_add :: (command: Arb_Draw_Command) {
|
||||||
|
if !arbTriState.active {
|
||||||
|
init_arb_state();
|
||||||
|
}
|
||||||
|
|
||||||
|
array_add(*arbTriState.command_list, command);
|
||||||
|
}
|
||||||
|
|
||||||
arb_tri_add :: (tri: Arb_Tri) {
|
arb_tri_add :: (tri: Arb_Tri) {
|
||||||
if !arbTriState.active {
|
if !arbTriState.active {
|
||||||
array_reset_keeping_memory(*arbTriState.trilist);
|
init_arb_state();
|
||||||
arbTriState.active = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
array_add(*arbTriState.trilist, tri);
|
array_add(*arbTriState.trilist, tri);
|
||||||
@ -55,7 +86,21 @@ arb_tri_flush :: () {
|
|||||||
|
|
||||||
sg_update_buffer(gPipelines.arbtri.bind.vertex_buffers[0], *(sg_range.{ ptr = gArbtriMem.data, size = size_of(type_of(gArbtriMem)) }));
|
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);
|
flush_arb_commands();
|
||||||
sg_apply_bindings(*gPipelines.arbtri.bind);
|
}
|
||||||
sg_draw(0, xx (arbTriState.trilist.count * 3), 1);
|
|
||||||
|
flush_arb_commands :: () {
|
||||||
|
for arbTriState.command_list {
|
||||||
|
if it.type == {
|
||||||
|
case .SET_TEXTURE;
|
||||||
|
gPipelines.arbtri.bind.images[0] = it.texture.tex;
|
||||||
|
gCurrentTexture = it.texture;
|
||||||
|
case .REMOVE_TEXTURE;
|
||||||
|
gCurrentTexture = null;
|
||||||
|
case .FLUSH_TRI;
|
||||||
|
sg_apply_pipeline(gPipelines.arbtri.pipeline);
|
||||||
|
sg_apply_bindings(*gPipelines.arbtri.bind);
|
||||||
|
sg_draw(xx (it.tri_offset * 3), xx (it.tri_count * 3), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
GR :: #import "GetRect_LeftHanded"()(Type_Indicator = Ui_Type_Indicator);
|
GR :: #import "GetRect_LeftHanded"()(Type_Indicator = Ui_Type_Indicator);
|
||||||
Input :: #import "Input";
|
Input :: #import "Input";
|
||||||
|
|
||||||
|
default_texture : *Ui_Texture = null;
|
||||||
|
|
||||||
Ui_Font_Glyph :: struct {
|
Ui_Font_Glyph :: struct {
|
||||||
advance : u32 = 1;
|
advance : u32 = 1;
|
||||||
@ -76,6 +77,7 @@ texture_load_from_memory :: (texture: *Ui_Texture, memory: []u8, srgb: bool, bui
|
|||||||
|
|
||||||
stbi.stbi_image_free(data);
|
stbi.stbi_image_free(data);
|
||||||
texture.tex = img;
|
texture.tex = img;
|
||||||
|
if !default_texture then default_texture = texture;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,15 +98,22 @@ clear_scissor :: () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
gCurrentTexture : *Ui_Texture = null;
|
gCurrentTexture : *Ui_Texture = null;
|
||||||
|
add_uvs : bool = false;
|
||||||
|
|
||||||
set_shader_for_color :: (enable_blend := false) {
|
set_shader_for_color :: (enable_blend := false) {
|
||||||
gCurrentTexture = null;
|
arb_tri_command_add(.{
|
||||||
|
type = .REMOVE_TEXTURE
|
||||||
|
});
|
||||||
|
add_uvs = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
set_shader_for_images :: (texture: *Ui_Texture) {
|
set_shader_for_images :: (texture: *Ui_Texture) {
|
||||||
gPipelines.arbtri.bind.images[0] = texture.tex;
|
arb_tri_command_add(.{
|
||||||
gCurrentTexture = texture;
|
type = .SET_TEXTURE,
|
||||||
|
texture = texture
|
||||||
|
});
|
||||||
|
add_uvs = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
gPreppedText: string;
|
gPreppedText: string;
|
||||||
@ -163,7 +172,7 @@ immediate_triangle :: (p0: Vector3, p1: Vector3, p2: Vector3, c0 := Vector4.{1,1
|
|||||||
// This UV symbolizes that the sampler should not be used.
|
// This UV symbolizes that the sampler should not be used.
|
||||||
nullUV : Vector2 = .{-4, -2};
|
nullUV : Vector2 = .{-4, -2};
|
||||||
|
|
||||||
if gCurrentTexture == null {
|
if !add_uvs {
|
||||||
tri.uv[0] = nullUV;
|
tri.uv[0] = nullUV;
|
||||||
tri.uv[1] = nullUV;
|
tri.uv[1] = nullUV;
|
||||||
tri.uv[2] = nullUV;
|
tri.uv[2] = nullUV;
|
||||||
@ -185,7 +194,12 @@ immediate_quad :: (p0: Vector2, p1: Vector2, p2: Vector2, p3: Vector2, color :=
|
|||||||
}
|
}
|
||||||
|
|
||||||
immediate_flush :: () {
|
immediate_flush :: () {
|
||||||
// arb_tri_flush();
|
arb_tri_command_add(.{
|
||||||
|
type = .FLUSH_TRI,
|
||||||
|
tri_offset = arbTriState.latest_flush,
|
||||||
|
tri_count = arbTriState.trilist.count - arbTriState.latest_flush
|
||||||
|
});
|
||||||
|
arbTriState.latest_flush = arbTriState.trilist.count;
|
||||||
}
|
}
|
||||||
|
|
||||||
init_ui :: () {
|
init_ui :: () {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user