c0da5b308dd3d313da4b6bb4eeb8912bbb873d35
1 /* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
10 static struct vg_shader _shader_lines
=
20 "layout (location=0) in vec3 a_co;"
21 "layout (location=1) in vec4 a_colour;"
27 " vec4 vert_pos = uPv * vec4( a_co, 1.0 );"
28 " s_colour = a_colour;"
29 " gl_Position = vert_pos;"
43 " FragColor = s_colour;"
64 VG_STATIC
void vg_lines_init(void)
66 vg_info( "vg_lines_init\n" );
68 vg_convar_push( (struct vg_convar
){
70 .data
= &vg_lines
.draw
,
71 .data_type
= k_convar_dtype_i32
,
72 .opt_i32
= { .min
=0, .max
=1, .clamp
=1 },
76 vg_shader_register( &_shader_lines
);
78 vg_acquire_thread_sync();
80 glGenVertexArrays( 1, &vg_lines
.vao
);
81 glGenBuffers( 1, &vg_lines
.vbo
);
82 glBindVertexArray( vg_lines
.vao
);
83 glBindBuffer( GL_ARRAY_BUFFER
, vg_lines
.vbo
);
85 u32 size
= 50000 * sizeof( struct vg_lines_vert
);
87 vg_lines
.vertex_buffer
=
88 vg_create_linear_allocator(vg_mem
.rtmemory
, size
, VG_MEMORY_REALTIME
);
90 glBufferData( GL_ARRAY_BUFFER
, size
, NULL
, GL_DYNAMIC_DRAW
);
91 glBindVertexArray( vg_lines
.vao
);
95 glVertexAttribPointer(
100 sizeof( struct vg_lines_vert
),
103 glEnableVertexAttribArray( 0 );
105 glVertexAttribPointer(
110 sizeof( struct vg_lines_vert
),
111 (void*)(offsetof( struct vg_lines_vert
, colour
))
113 glEnableVertexAttribArray( 1 );
116 vg_success( "done\n" );
119 vg_release_thread_sync();
122 VG_STATIC
void vg_lines_drawall( float* projection
)
124 glUseProgram( _shader_lines
.id
);
127 ( glGetUniformLocation( _shader_lines
.id
, "uPv" ), 1, GL_FALSE
, projection
);
129 glBindVertexArray( vg_lines
.vao
);
130 glBindBuffer( GL_ARRAY_BUFFER
, vg_lines
.vbo
);
132 u32 bufusage
= vg_linear_get_cur(vg_lines
.vertex_buffer
);
134 glBufferSubData( GL_ARRAY_BUFFER
, 0, bufusage
, vg_lines
.vertex_buffer
);
136 glEnable( GL_BLEND
);
137 glBlendFunc( GL_SRC_ALPHA
, GL_ONE_MINUS_SRC_ALPHA
);
138 glBlendEquation( GL_FUNC_ADD
);
141 glDrawArrays( GL_LINES
, 0, bufusage
/ sizeof(struct vg_lines_vert
) );
143 glDisable( GL_BLEND
);
144 vg_linear_clear( vg_lines
.vertex_buffer
);
147 VG_STATIC
void vg_line2( line_co from
, line_co to
, u32 fc
, u32 tc
)
149 u32 size
= 2 * sizeof(struct vg_lines_vert
);
150 struct vg_lines_vert
*v
= vg_linear_alloc( vg_lines
.vertex_buffer
, size
);
152 v3_copy( from
, v
[0].co
);
153 v3_copy( to
, v
[1].co
);
159 VG_STATIC
void vg_line( line_co from
, line_co to
, u32 colour
)
161 vg_line2( from
, to
, colour
, colour
);
164 VG_STATIC
void vg_line_boxf( boxf box
, u32 colour
)
166 v3f p000
, p001
, p010
, p011
, p100
, p101
, p110
, p111
;
168 p000
[0]=box
[0][0];p000
[1]=box
[0][1];p000
[2]=box
[0][2];
169 p001
[0]=box
[0][0];p001
[1]=box
[0][1];p001
[2]=box
[1][2];
170 p010
[0]=box
[0][0];p010
[1]=box
[1][1];p010
[2]=box
[0][2];
171 p011
[0]=box
[0][0];p011
[1]=box
[1][1];p011
[2]=box
[1][2];
173 p100
[0]=box
[1][0];p100
[1]=box
[0][1];p100
[2]=box
[0][2];
174 p101
[0]=box
[1][0];p101
[1]=box
[0][1];p101
[2]=box
[1][2];
175 p110
[0]=box
[1][0];p110
[1]=box
[1][1];p110
[2]=box
[0][2];
176 p111
[0]=box
[1][0];p111
[1]=box
[1][1];p111
[2]=box
[1][2];
178 vg_line( p000
, p001
, colour
);
179 vg_line( p001
, p011
, colour
);
180 vg_line( p011
, p010
, colour
);
181 vg_line( p010
, p000
, colour
);
183 vg_line( p100
, p101
, colour
);
184 vg_line( p101
, p111
, colour
);
185 vg_line( p111
, p110
, colour
);
186 vg_line( p110
, p100
, colour
);
188 vg_line( p100
, p000
, colour
);
189 vg_line( p101
, p001
, colour
);
190 vg_line( p110
, p010
, colour
);
191 vg_line( p111
, p011
, colour
);
194 VG_STATIC
void vg_line_boxf_transformed( m4x3f m
, boxf box
, u32 colour
)
196 v3f p000
, p001
, p010
, p011
, p100
, p101
, p110
, p111
;
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];
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];
208 m4x3_mulv( m
, p000
, p000
);
209 m4x3_mulv( m
, p001
, p001
);
210 m4x3_mulv( m
, p010
, p010
);
211 m4x3_mulv( m
, p011
, p011
);
212 m4x3_mulv( m
, p100
, p100
);
213 m4x3_mulv( m
, p101
, p101
);
214 m4x3_mulv( m
, p110
, p110
);
215 m4x3_mulv( m
, p111
, p111
);
217 vg_line( p000
, p001
, colour
);
218 vg_line( p001
, p011
, colour
);
219 vg_line( p011
, p010
, colour
);
220 vg_line( p010
, p000
, colour
);
222 vg_line( p100
, p101
, colour
);
223 vg_line( p101
, p111
, colour
);
224 vg_line( p111
, p110
, colour
);
225 vg_line( p110
, p100
, colour
);
227 vg_line( p100
, p000
, colour
);
228 vg_line( p101
, p001
, colour
);
229 vg_line( p110
, p010
, colour
);
230 vg_line( p111
, p011
, colour
);
232 vg_line( p000
, p110
, colour
);
233 vg_line( p100
, p010
, colour
);
236 VG_STATIC
void vg_line_cross(v3f pos
,u32 colour
, float scale
)
239 v3_add( (v3f
){ scale
,0.0f
,0.0f
}, pos
, p0
);
240 v3_add( (v3f
){-scale
,0.0f
,0.0f
}, pos
, p1
);
241 vg_line( p0
, p1
, colour
);
242 v3_add( (v3f
){0.0f
, scale
,0.0f
}, pos
, p0
);
243 v3_add( (v3f
){0.0f
,-scale
,0.0f
}, pos
, p1
);
244 vg_line( p0
, p1
, colour
);
245 v3_add( (v3f
){0.0f
,0.0f
, scale
}, pos
, p0
);
246 v3_add( (v3f
){0.0f
,0.0f
,-scale
}, pos
, p1
);
247 vg_line( p0
, p1
, colour
);
250 VG_STATIC
void vg_line_pt3( v3f pt
, float size
, u32 colour
)
254 { pt
[0]-size
, pt
[1]-size
, pt
[2]-size
},
255 { pt
[0]+size
, pt
[1]+size
, pt
[2]+size
}
258 vg_line_boxf( box
, colour
);
261 #endif /* VG_LINES_H */