bad char
[vg.git] / src / vg / vg_lines.h
1 /* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
2
3 static int debug_lines_enable = 1;
4
5 #ifdef VG_3D
6 typedef v3f line_co;
7 #else
8 typedef v2f line_co;
9 #endif
10
11 static struct vg_shader _shader_lines =
12 {
13 .name = "[vg] lines",
14 .link = NULL,
15 .vs =
16 {
17 .orig_file = NULL,
18 .static_src =
19
20 #ifdef VG_3D
21 "uniform mat4 uPv;"
22 "layout (location=0) in vec3 a_co;"
23 #else
24 "uniform mat3 uPv;"
25 "layout (location=0) in vec2 a_co;"
26 #endif
27 "layout (location=1) in vec4 a_colour;"
28 ""
29 "out vec4 s_colour;"
30 ""
31 "void main()"
32 "{"
33 #ifdef VG_3D
34 " vec4 vert_pos = uPv * vec4( a_co, 1.0 );"
35 #else
36 " vec4 vert_pos = vec4( uPv * vec3( a_co, 1.0 ), 1.0 );"
37 #endif
38 " s_colour = a_colour;"
39 " gl_Position = vert_pos;"
40 "}"
41 },
42 .fs =
43 {
44 .orig_file = NULL,
45 .static_src =
46
47 "out vec4 FragColor;"
48 ""
49 "in vec4 s_colour;"
50 ""
51 "void main()"
52 "{"
53 " FragColor = s_colour;"
54 "}"
55 }
56 };
57
58 struct
59 {
60 struct vg_lines_vert
61 {
62 #ifdef VG_3D
63 v3f co;
64 #else
65 v2f co;
66 #endif
67
68 u32 colour;
69 }
70 *buffer;
71
72 GLuint vao, vbo;
73 u32 draw_idx, cap, buffer_size;
74 }
75 vg_lines;
76
77 static void vg_lines_init(void)
78 {
79 vg_convar_push( (struct vg_convar){
80 .name = "debug_lines",
81 .data = &debug_lines_enable,
82 .data_type = k_convar_dtype_i32,
83 .opt_i32 = { .min=0, .max=1, .clamp=1 },
84 .persistent = 1
85 });
86
87 vg_shader_register( &_shader_lines );
88
89 glGenVertexArrays( 1, &vg_lines.vao );
90 glGenBuffers( 1, &vg_lines.vbo );
91 glBindVertexArray( vg_lines.vao );
92
93 glBindBuffer( GL_ARRAY_BUFFER, vg_lines.vbo );
94
95 vg_lines.cap = 50000;
96 vg_lines.buffer_size = vg_lines.cap * sizeof( struct vg_lines_vert );
97
98 glBufferData( GL_ARRAY_BUFFER, vg_lines.buffer_size, NULL, GL_DYNAMIC_DRAW );
99 glBindVertexArray( vg_lines.vao );
100
101 glVertexAttribPointer(
102 0,
103 sizeof( vg_lines.buffer[0].co ) / sizeof(float),
104 GL_FLOAT,
105 GL_FALSE,
106 sizeof( struct vg_lines_vert ),
107 (void *)0
108 );
109 glEnableVertexAttribArray( 0 );
110
111 glVertexAttribPointer(
112 1,
113 4,
114 GL_UNSIGNED_BYTE,
115 GL_TRUE,
116 sizeof( struct vg_lines_vert ),
117 (void*)(offsetof( struct vg_lines_vert, colour ))
118 );
119 glEnableVertexAttribArray( 1 );
120 vg_lines.buffer = malloc( vg_lines.buffer_size );
121 }
122
123 static void vg_lines_free(void)
124 {
125 glDeleteVertexArrays( 1, &vg_lines.vao );
126 glDeleteBuffers( 1, &vg_lines.vbo );
127
128 free( vg_lines.buffer );
129 }
130
131 static void vg_lines_drawall( float* projection )
132 {
133 glUseProgram( _shader_lines.id );
134
135 #ifdef VG_3D
136 glUniformMatrix4fv
137 #else
138 glUniformMatrix3fv
139 #endif
140 ( glGetUniformLocation( _shader_lines.id, "uPv" ), 1, GL_FALSE, projection );
141
142 glBindVertexArray( vg_lines.vao );
143 glBindBuffer( GL_ARRAY_BUFFER, vg_lines.vbo );
144
145 glBufferSubData( GL_ARRAY_BUFFER, 0, vg_lines.draw_idx *
146 sizeof(struct vg_lines_vert), vg_lines.buffer );
147
148 glEnable( GL_BLEND );
149 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
150 glBlendEquation( GL_FUNC_ADD );
151
152 if( debug_lines_enable )
153 glDrawArrays( GL_LINES, 0, vg_lines.draw_idx );
154
155 glDisable( GL_BLEND );
156 vg_lines.draw_idx = 0;
157 }
158
159 static void vg_line2( line_co from, line_co to, u32 fc, u32 tc )
160 {
161 struct vg_lines_vert *v = &vg_lines.buffer[vg_lines.draw_idx];
162
163 #ifdef VG_3D
164 v3_copy( from, v[0].co );
165 v3_copy( to, v[1].co );
166 #else
167 v2_copy( from, v[0].co );
168 v2_copy( to, v[1].co );
169 #endif
170
171 v[0].colour = fc;
172 v[1].colour = tc;
173
174 vg_lines.draw_idx += 2;
175 }
176
177 static void vg_line( line_co from, line_co to, u32 colour )
178 {
179 vg_line2( from, to, colour, colour );
180 }
181
182 static void vg_line_box( line_co min, line_co max, u32 colour )
183 {
184 #ifdef VG_3D
185 /* TODO... */
186 #else
187 vg_line( min, (v2f){min[0],max[1]}, colour );
188 vg_line( (v2f){min[0],max[1]}, max, colour );
189 vg_line( max, (v2f){max[0],min[1]}, colour );
190 vg_line( (v2f){max[0],min[1]}, min, colour );
191 #endif
192 }
193
194 static void vg_line_boxf( boxf box, u32 colour )
195 {
196 v3f p000, p001, p010, p011, p100, p101, p110, p111;
197
198 p000[0]=box[0][0];p000[1]=box[0][1];p000[2]=box[0][2];
199 p001[0]=box[0][0];p001[1]=box[0][1];p001[2]=box[1][2];
200 p010[0]=box[0][0];p010[1]=box[1][1];p010[2]=box[0][2];
201 p011[0]=box[0][0];p011[1]=box[1][1];p011[2]=box[1][2];
202
203 p100[0]=box[1][0];p100[1]=box[0][1];p100[2]=box[0][2];
204 p101[0]=box[1][0];p101[1]=box[0][1];p101[2]=box[1][2];
205 p110[0]=box[1][0];p110[1]=box[1][1];p110[2]=box[0][2];
206 p111[0]=box[1][0];p111[1]=box[1][1];p111[2]=box[1][2];
207
208 vg_line( p000, p001, colour );
209 vg_line( p001, p011, colour );
210 vg_line( p011, p010, colour );
211 vg_line( p010, p000, colour );
212
213 vg_line( p100, p101, colour );
214 vg_line( p101, p111, colour );
215 vg_line( p111, p110, colour );
216 vg_line( p110, p100, colour );
217
218 vg_line( p100, p000, colour );
219 vg_line( p101, p001, colour );
220 vg_line( p110, p010, colour );
221 vg_line( p111, p011, colour );
222 }
223
224 static void vg_line_boxf_transformed( m4x3f m, boxf box, u32 colour )
225 {
226 v3f p000, p001, p010, p011, p100, p101, p110, p111;
227
228 p000[0]=box[0][0];p000[1]=box[0][1];p000[2]=box[0][2];
229 p001[0]=box[0][0];p001[1]=box[0][1];p001[2]=box[1][2];
230 p010[0]=box[0][0];p010[1]=box[1][1];p010[2]=box[0][2];
231 p011[0]=box[0][0];p011[1]=box[1][1];p011[2]=box[1][2];
232
233 p100[0]=box[1][0];p100[1]=box[0][1];p100[2]=box[0][2];
234 p101[0]=box[1][0];p101[1]=box[0][1];p101[2]=box[1][2];
235 p110[0]=box[1][0];p110[1]=box[1][1];p110[2]=box[0][2];
236 p111[0]=box[1][0];p111[1]=box[1][1];p111[2]=box[1][2];
237
238 m4x3_mulv( m, p000, p000 );
239 m4x3_mulv( m, p001, p001 );
240 m4x3_mulv( m, p010, p010 );
241 m4x3_mulv( m, p011, p011 );
242 m4x3_mulv( m, p100, p100 );
243 m4x3_mulv( m, p101, p101 );
244 m4x3_mulv( m, p110, p110 );
245 m4x3_mulv( m, p111, p111 );
246
247 vg_line( p000, p001, colour );
248 vg_line( p001, p011, colour );
249 vg_line( p011, p010, colour );
250 vg_line( p010, p000, colour );
251
252 vg_line( p100, p101, colour );
253 vg_line( p101, p111, colour );
254 vg_line( p111, p110, colour );
255 vg_line( p110, p100, colour );
256
257 vg_line( p100, p000, colour );
258 vg_line( p101, p001, colour );
259 vg_line( p110, p010, colour );
260 vg_line( p111, p011, colour );
261
262 vg_line( p000, p110, colour );
263 vg_line( p100, p010, colour );
264 }
265
266 static void vg_line_pt3( v3f pt, float size, u32 colour )
267 {
268 boxf box =
269 {
270 { pt[0]-size, pt[1]-size, pt[2]-size },
271 { pt[0]+size, pt[1]+size, pt[2]+size }
272 };
273
274 vg_line_boxf( box, colour );
275 }