1 /* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
8 static int debug_lines_enable
= 1;
16 static struct vg_shader _shader_lines
=
27 "layout (location=0) in vec3 a_co;"
30 "layout (location=0) in vec2 a_co;"
32 "layout (location=1) in vec4 a_colour;"
39 " vec4 vert_pos = uPv * vec4( a_co, 1.0 );"
41 " vec4 vert_pos = vec4( uPv * vec3( a_co, 1.0 ), 1.0 );"
43 " s_colour = a_colour;"
44 " gl_Position = vert_pos;"
58 " FragColor = s_colour;"
78 u32 draw_idx
, cap
, buffer_size
;
82 static int vg_lines_init(void)
84 vg_info( "vg_lines_init\n" );
86 vg_convar_push( (struct vg_convar
){
87 .name
= "debug_lines",
88 .data
= &debug_lines_enable
,
89 .data_type
= k_convar_dtype_i32
,
90 .opt_i32
= { .min
=0, .max
=1, .clamp
=1 },
94 vg_shader_register( &_shader_lines
);
97 if( vg_acquire_thread_sync(1) )
99 glGenVertexArrays( 1, &vg_lines
.vao
);
100 glGenBuffers( 1, &vg_lines
.vbo
);
101 glBindVertexArray( vg_lines
.vao
);
102 glBindBuffer( GL_ARRAY_BUFFER
, vg_lines
.vbo
);
104 vg_lines
.cap
= 50000;
105 vg_lines
.buffer_size
= vg_lines
.cap
* sizeof( struct vg_lines_vert
);
107 glBufferData( GL_ARRAY_BUFFER
, vg_lines
.buffer_size
,
108 NULL
, GL_DYNAMIC_DRAW
);
109 glBindVertexArray( vg_lines
.vao
);
111 if( VG_CHECK_GL_ERR() )
113 vg_release_thread_sync(1);
114 vg_error( "Failed\n" );
118 glVertexAttribPointer(
120 sizeof( vg_lines
.buffer
[0].co
) / sizeof(float),
123 sizeof( struct vg_lines_vert
),
126 glEnableVertexAttribArray( 0 );
128 glVertexAttribPointer(
133 sizeof( struct vg_lines_vert
),
134 (void*)(offsetof( struct vg_lines_vert
, colour
))
136 glEnableVertexAttribArray( 1 );
138 if( VG_CHECK_GL_ERR() )
139 goto il_delete_buffers_and_fail
;
142 vg_lines
.buffer
= malloc( vg_lines
.buffer_size
);
143 if( vg_lines
.buffer
)
145 vg_success( "done\n" );
146 vg_release_thread_sync(1);
150 il_delete_buffers_and_fail
:
151 glDeleteBuffers( 1, &vg_lines
.vbo
);
152 glDeleteVertexArrays( 1, &vg_lines
.vao
);
153 vg_release_thread_sync(1);
160 static void vg_lines_free(void *nothing
)
162 glDeleteVertexArrays( 1, &vg_lines
.vao
);
163 glDeleteBuffers( 1, &vg_lines
.vbo
);
164 free( vg_lines
.buffer
);
167 static void vg_lines_drawall( float* projection
)
169 glUseProgram( _shader_lines
.id
);
176 ( glGetUniformLocation( _shader_lines
.id
, "uPv" ), 1, GL_FALSE
, projection
);
178 glBindVertexArray( vg_lines
.vao
);
179 glBindBuffer( GL_ARRAY_BUFFER
, vg_lines
.vbo
);
181 glBufferSubData( GL_ARRAY_BUFFER
, 0, vg_lines
.draw_idx
*
182 sizeof(struct vg_lines_vert
), vg_lines
.buffer
);
184 glEnable( GL_BLEND
);
185 glBlendFunc( GL_SRC_ALPHA
, GL_ONE_MINUS_SRC_ALPHA
);
186 glBlendEquation( GL_FUNC_ADD
);
188 if( debug_lines_enable
)
189 glDrawArrays( GL_LINES
, 0, vg_lines
.draw_idx
);
191 glDisable( GL_BLEND
);
192 vg_lines
.draw_idx
= 0;
195 static void vg_line2( line_co from
, line_co to
, u32 fc
, u32 tc
)
197 struct vg_lines_vert
*v
= &vg_lines
.buffer
[vg_lines
.draw_idx
];
200 v3_copy( from
, v
[0].co
);
201 v3_copy( to
, v
[1].co
);
203 v2_copy( from
, v
[0].co
);
204 v2_copy( to
, v
[1].co
);
210 vg_lines
.draw_idx
+= 2;
213 static void vg_line( line_co from
, line_co to
, u32 colour
)
215 vg_line2( from
, to
, colour
, colour
);
218 static void vg_line_box( line_co min
, line_co max
, u32 colour
)
223 vg_line( min
, (v2f
){min
[0],max
[1]}, colour
);
224 vg_line( (v2f
){min
[0],max
[1]}, max
, colour
);
225 vg_line( max
, (v2f
){max
[0],min
[1]}, colour
);
226 vg_line( (v2f
){max
[0],min
[1]}, min
, colour
);
230 static void vg_line_boxf( boxf box
, u32 colour
)
232 v3f p000
, p001
, p010
, p011
, p100
, p101
, p110
, p111
;
234 p000
[0]=box
[0][0];p000
[1]=box
[0][1];p000
[2]=box
[0][2];
235 p001
[0]=box
[0][0];p001
[1]=box
[0][1];p001
[2]=box
[1][2];
236 p010
[0]=box
[0][0];p010
[1]=box
[1][1];p010
[2]=box
[0][2];
237 p011
[0]=box
[0][0];p011
[1]=box
[1][1];p011
[2]=box
[1][2];
239 p100
[0]=box
[1][0];p100
[1]=box
[0][1];p100
[2]=box
[0][2];
240 p101
[0]=box
[1][0];p101
[1]=box
[0][1];p101
[2]=box
[1][2];
241 p110
[0]=box
[1][0];p110
[1]=box
[1][1];p110
[2]=box
[0][2];
242 p111
[0]=box
[1][0];p111
[1]=box
[1][1];p111
[2]=box
[1][2];
244 vg_line( p000
, p001
, colour
);
245 vg_line( p001
, p011
, colour
);
246 vg_line( p011
, p010
, colour
);
247 vg_line( p010
, p000
, colour
);
249 vg_line( p100
, p101
, colour
);
250 vg_line( p101
, p111
, colour
);
251 vg_line( p111
, p110
, colour
);
252 vg_line( p110
, p100
, colour
);
254 vg_line( p100
, p000
, colour
);
255 vg_line( p101
, p001
, colour
);
256 vg_line( p110
, p010
, colour
);
257 vg_line( p111
, p011
, colour
);
260 static void vg_line_boxf_transformed( m4x3f m
, boxf box
, u32 colour
)
262 v3f p000
, p001
, p010
, p011
, p100
, p101
, p110
, p111
;
264 p000
[0]=box
[0][0];p000
[1]=box
[0][1];p000
[2]=box
[0][2];
265 p001
[0]=box
[0][0];p001
[1]=box
[0][1];p001
[2]=box
[1][2];
266 p010
[0]=box
[0][0];p010
[1]=box
[1][1];p010
[2]=box
[0][2];
267 p011
[0]=box
[0][0];p011
[1]=box
[1][1];p011
[2]=box
[1][2];
269 p100
[0]=box
[1][0];p100
[1]=box
[0][1];p100
[2]=box
[0][2];
270 p101
[0]=box
[1][0];p101
[1]=box
[0][1];p101
[2]=box
[1][2];
271 p110
[0]=box
[1][0];p110
[1]=box
[1][1];p110
[2]=box
[0][2];
272 p111
[0]=box
[1][0];p111
[1]=box
[1][1];p111
[2]=box
[1][2];
274 m4x3_mulv( m
, p000
, p000
);
275 m4x3_mulv( m
, p001
, p001
);
276 m4x3_mulv( m
, p010
, p010
);
277 m4x3_mulv( m
, p011
, p011
);
278 m4x3_mulv( m
, p100
, p100
);
279 m4x3_mulv( m
, p101
, p101
);
280 m4x3_mulv( m
, p110
, p110
);
281 m4x3_mulv( m
, p111
, p111
);
283 vg_line( p000
, p001
, colour
);
284 vg_line( p001
, p011
, colour
);
285 vg_line( p011
, p010
, colour
);
286 vg_line( p010
, p000
, colour
);
288 vg_line( p100
, p101
, colour
);
289 vg_line( p101
, p111
, colour
);
290 vg_line( p111
, p110
, colour
);
291 vg_line( p110
, p100
, colour
);
293 vg_line( p100
, p000
, colour
);
294 vg_line( p101
, p001
, colour
);
295 vg_line( p110
, p010
, colour
);
296 vg_line( p111
, p011
, colour
);
298 vg_line( p000
, p110
, colour
);
299 vg_line( p100
, p010
, colour
);
302 static void vg_line_cross(v3f pos
,u32 colour
, float scale
)
305 v3_add( (v3f
){ scale
,0.0f
,0.0f
}, pos
, p0
);
306 v3_add( (v3f
){-scale
,0.0f
,0.0f
}, pos
, p1
);
307 vg_line( p0
, p1
, colour
);
308 v3_add( (v3f
){0.0f
, scale
,0.0f
}, pos
, p0
);
309 v3_add( (v3f
){0.0f
,-scale
,0.0f
}, pos
, p1
);
310 vg_line( p0
, p1
, colour
);
311 v3_add( (v3f
){0.0f
,0.0f
, scale
}, pos
, p0
);
312 v3_add( (v3f
){0.0f
,0.0f
,-scale
}, pos
, p1
);
313 vg_line( p0
, p1
, colour
);
316 static void vg_line_pt3( v3f pt
, float size
, u32 colour
)
320 { pt
[0]-size
, pt
[1]-size
, pt
[2]-size
},
321 { pt
[0]+size
, pt
[1]+size
, pt
[2]+size
}
324 vg_line_boxf( box
, colour
);
327 #endif /* VG_LINES_H */