81b009150b4791518087ad5cb130965229d6dc8f
[fishladder.git] / vg / vg_lines.h
1 // Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved
2
3 SHADER_DEFINE( vg_line_shader,
4
5 // VERTEX
6 "layout (location=0) in vec3 a_co;"
7 "layout (location=1) in vec4 a_colour;"
8 "uniform mat4 uPv;"
9 ""
10 "out vec4 s_colour;"
11 ""
12 "void main()"
13 "{"
14 " vec4 vert_pos = uPv * vec4( a_co, 1.0 );"
15 " s_colour = a_colour;"
16 " gl_Position = vert_pos;"
17 "}",
18
19 // FRAGMENT
20 "out vec4 FragColor;"
21 ""
22 "in vec4 s_colour;"
23 ""
24 "void main()"
25 "{"
26 " FragColor = s_colour;"
27 "}"
28 ,
29 UNIFORMS({ "uPv" })
30 )
31
32 struct
33 {
34 struct vg_lines_vert
35 {
36 vec3 co;
37 u32 colour;
38 }
39 *buffer;
40
41 GLuint vao, vbo;
42 u32 draw_idx, cap, buffer_size;
43
44 }
45 vg_lines;
46
47 static void vg_lines_init(void)
48 {
49 SHADER_INIT( vg_line_shader );
50
51 glGenVertexArrays( 1, &vg_lines.vao );
52 glGenBuffers( 1, &vg_lines.vbo );
53 glBindVertexArray( vg_lines.vao );
54
55 glBindBuffer( GL_ARRAY_BUFFER, vg_lines.vbo );
56
57 vg_lines.cap = 10000;
58 vg_lines.buffer_size = vg_lines.cap * sizeof( struct vg_lines_vert );
59
60 glBufferData( GL_ARRAY_BUFFER, vg_lines.buffer_size, NULL, GL_DYNAMIC_DRAW );
61 glBindVertexArray( vg_lines.vao );
62
63 glVertexAttribPointer(
64 0,
65 sizeof( vg_lines.buffer[0].co ) / sizeof(float),
66 GL_FLOAT,
67 GL_FALSE,
68 sizeof( struct vg_lines_vert ),
69 (void *)0
70 );
71 glEnableVertexAttribArray( 0 );
72
73 glVertexAttribPointer(
74 1,
75 4,
76 GL_UNSIGNED_BYTE,
77 GL_TRUE,
78 sizeof( struct vg_lines_vert ),
79 (void*)(offsetof( struct vg_lines_vert, colour ))
80 );
81 glEnableVertexAttribArray( 1 );
82 vg_lines.buffer = malloc( vg_lines.buffer_size );
83 }
84
85 static void vg_lines_free(void)
86 {
87 glDeleteVertexArrays( 1, &vg_lines.vao );
88 glDeleteBuffers( 1, &vg_lines.vbo );
89
90 free( vg_lines.buffer );
91 }
92
93 static void vg_lines_drawall(void)
94 {
95 SHADER_USE( vg_line_shader );
96 glUniformMatrix4fv( SHADER_UNIFORM( vg_line_shader, "uPv" ), 1, GL_FALSE, (float *)vg_pv );
97
98 glBindVertexArray( vg_lines.vao );
99 glBindBuffer( GL_ARRAY_BUFFER, vg_lines.vbo );
100
101 glBufferSubData( GL_ARRAY_BUFFER, 0, vg_lines.draw_idx * sizeof(struct vg_lines_vert), vg_lines.buffer );
102 glEnable( GL_BLEND );
103 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
104 glBlendEquation( GL_FUNC_ADD );
105
106 glDrawArrays( GL_LINES, 0, vg_lines.draw_idx );
107
108 glDisable( GL_BLEND );
109 vg_lines.draw_idx = 0;
110 }
111
112 static void vg_line2( vec3 from, vec3 to, u32 fc, u32 tc )
113 {
114 struct vg_lines_vert *v = vg_lines.buffer + vg_lines.draw_idx;
115 glm_vec3_copy( from, v[0].co );
116 glm_vec3_copy( to, v[1].co );
117 v[0].colour = fc;
118 v[1].colour = tc;
119
120 vg_lines.draw_idx += 2;
121 }
122
123 static void vg_line( vec3 from, vec3 to, u32 colour )
124 {
125 vg_line2( from, to, colour, colour );
126 }