@@ -7,9 +7,11 @@ let line_draw_dim: vec4_t = vec4_nan();
7
7
let line_draw_vertex_buffer : vertex_buffer_t ;
8
8
let line_draw_index_buffer : index_buffer_t ;
9
9
let line_draw_pipeline : pipeline_t = null ;
10
+ let line_draw_overlay_pipeline : pipeline_t = null ;
10
11
11
12
let line_draw_vp : mat4_t ;
12
13
let line_draw_vp_loc : kinc_const_loc_t ;
14
+ let line_draw_color_loc : kinc_const_loc_t ;
13
15
14
16
let line_draw_vb_data : buffer_t ;
15
17
let line_draw_ib_data : u32_array_t ;
@@ -40,7 +42,6 @@ function line_draw_init() {
40
42
if ( line_draw_pipeline == null ) {
41
43
let structure : vertex_struct_t = g4_vertex_struct_create ( ) ;
42
44
g4_vertex_struct_add ( structure , "pos" , vertex_data_t . F32_3X ) ;
43
- g4_vertex_struct_add ( structure , "col" , vertex_data_t . F32_3X ) ;
44
45
line_draw_pipeline = g4_pipeline_create ( ) ;
45
46
line_draw_pipeline . input_layout = [ structure ] ;
46
47
line_draw_pipeline . fragment_shader = sys_get_shader ( "line.frag" ) ;
@@ -54,11 +55,26 @@ function line_draw_init() {
54
55
line_draw_pipeline . color_attachments [ 2 ] = tex_format_t . RGBA64 ;
55
56
line_draw_pipeline . depth_attachment = depth_format_t . DEPTH24 ;
56
57
g4_pipeline_compile ( line_draw_pipeline ) ;
58
+ line_draw_color_loc = g4_pipeline_get_const_loc ( line_draw_pipeline , "color" ) ;
57
59
line_draw_vp_loc = g4_pipeline_get_const_loc ( line_draw_pipeline , "VP" ) ;
58
60
line_draw_vp = mat4_identity ( ) ;
59
61
line_draw_vertex_buffer = g4_vertex_buffer_create ( line_draw_max_vertices , structure , usage_t . DYNAMIC ) ;
60
62
line_draw_index_buffer = g4_index_buffer_create ( line_draw_max_indices ) ;
61
63
}
64
+ if ( line_draw_overlay_pipeline == null ) {
65
+ let structure : vertex_struct_t = g4_vertex_struct_create ( ) ;
66
+ g4_vertex_struct_add ( structure , "pos" , vertex_data_t . F32_3X ) ;
67
+ line_draw_overlay_pipeline = g4_pipeline_create ( ) ;
68
+ line_draw_overlay_pipeline . input_layout = [ structure ] ;
69
+ line_draw_overlay_pipeline . fragment_shader = sys_get_shader ( "line_overlay.frag" ) ;
70
+ line_draw_overlay_pipeline . vertex_shader = sys_get_shader ( "line.vert" ) ;
71
+ line_draw_overlay_pipeline . depth_write = true ;
72
+ line_draw_overlay_pipeline . depth_mode = compare_mode_t . LESS ;
73
+ line_draw_overlay_pipeline . cull_mode = cull_mode_t . NONE ;
74
+ line_draw_overlay_pipeline . color_attachment_count = 1 ;
75
+ line_draw_overlay_pipeline . color_attachments [ 0 ] = tex_format_t . RGBA64 ;
76
+ g4_pipeline_compile ( line_draw_overlay_pipeline ) ;
77
+ }
62
78
}
63
79
64
80
function line_draw_render ( matrix : mat4_t ) {
@@ -135,7 +151,8 @@ function line_draw_lineb(a: i32, b: i32, c: i32, d: i32, e: i32, f: i32) {
135
151
line_draw_t = vec4_mult ( line_draw_t , f ) ;
136
152
line_draw_v2 = vec4_add ( line_draw_v2 , line_draw_t ) ;
137
153
138
- line_draw_line ( line_draw_v1 . x , line_draw_v1 . y , line_draw_v1 . z , line_draw_v2 . x , line_draw_v2 . y , line_draw_v2 . z ) ;
154
+ line_draw_line ( line_draw_v1 . x , line_draw_v1 . y , line_draw_v1 . z ,
155
+ line_draw_v2 . x , line_draw_v2 . y , line_draw_v2 . z ) ;
139
156
}
140
157
141
158
function line_draw_line ( x1 : f32 , y1 : f32 , z1 : f32 , x2 : f32 , y2 : f32 , z2 : f32 ) {
@@ -170,21 +187,26 @@ function line_draw_line(x1: f32, y1: f32, z1: f32, x2: f32, y2: f32, z2: f32) {
170
187
line_draw_corner4 = vec4_create ( x2 , y2 , z2 ) ;
171
188
line_draw_corner4 = vec4_add ( line_draw_corner4 , line_width ) ;
172
189
173
- let i : i32 = line_draw_lines * 24 ; // 4 * 6 (structure len)
174
- let data : f32 [ ] = [ line_draw_corner1 . x , line_draw_corner1 . y , line_draw_corner1 . z , color_get_rb ( line_draw_color ) / 255 , color_get_gb ( line_draw_color ) / 255 , color_get_bb ( line_draw_color ) / 255 ] ;
175
- line_draw_add_vb_data ( i , data ) ;
190
+ let i : i32 = line_draw_lines * 12 ; // 4 * 3 (structure len)
191
+
192
+ buffer_set_f32 ( line_draw_vb_data , ( i + 0 ) * 4 , line_draw_corner1 . x ) ;
193
+ buffer_set_f32 ( line_draw_vb_data , ( i + 1 ) * 4 , line_draw_corner1 . y ) ;
194
+ buffer_set_f32 ( line_draw_vb_data , ( i + 2 ) * 4 , line_draw_corner1 . z ) ;
176
195
177
- i += 6 ;
178
- data = [ line_draw_corner2 . x , line_draw_corner2 . y , line_draw_corner2 . z , color_get_rb ( line_draw_color ) / 255 , color_get_gb ( line_draw_color ) / 255 , color_get_bb ( line_draw_color ) / 255 ] ;
179
- line_draw_add_vb_data ( i , data ) ;
196
+ i += 3 ;
197
+ buffer_set_f32 ( line_draw_vb_data , ( i + 0 ) * 4 , line_draw_corner2 . x ) ;
198
+ buffer_set_f32 ( line_draw_vb_data , ( i + 1 ) * 4 , line_draw_corner2 . y ) ;
199
+ buffer_set_f32 ( line_draw_vb_data , ( i + 2 ) * 4 , line_draw_corner2 . z ) ;
180
200
181
- i += 6 ;
182
- data = [ line_draw_corner3 . x , line_draw_corner3 . y , line_draw_corner3 . z , color_get_rb ( line_draw_color ) / 255 , color_get_gb ( line_draw_color ) / 255 , color_get_bb ( line_draw_color ) / 255 ] ;
183
- line_draw_add_vb_data ( i , data ) ;
201
+ i += 3 ;
202
+ buffer_set_f32 ( line_draw_vb_data , ( i + 0 ) * 4 , line_draw_corner3 . x ) ;
203
+ buffer_set_f32 ( line_draw_vb_data , ( i + 1 ) * 4 , line_draw_corner3 . y ) ;
204
+ buffer_set_f32 ( line_draw_vb_data , ( i + 2 ) * 4 , line_draw_corner3 . z ) ;
184
205
185
- i += 6 ;
186
- data = [ line_draw_corner4 . x , line_draw_corner4 . y , line_draw_corner4 . z , color_get_rb ( line_draw_color ) / 255 , color_get_gb ( line_draw_color ) / 255 , color_get_bb ( line_draw_color ) / 255 ] ;
187
- line_draw_add_vb_data ( i , data ) ;
206
+ i += 3 ;
207
+ buffer_set_f32 ( line_draw_vb_data , ( i + 0 ) * 4 , line_draw_corner4 . x ) ;
208
+ buffer_set_f32 ( line_draw_vb_data , ( i + 1 ) * 4 , line_draw_corner4 . y ) ;
209
+ buffer_set_f32 ( line_draw_vb_data , ( i + 2 ) * 4 , line_draw_corner4 . z ) ;
188
210
189
211
i = line_draw_lines * 6 ;
190
212
line_draw_ib_data [ i ] = line_draw_lines * 4 ;
@@ -204,22 +226,63 @@ function line_draw_begin() {
204
226
line_draw_ib_data = g4_index_buffer_lock ( line_draw_index_buffer ) ;
205
227
}
206
228
207
- function line_draw_end ( ) {
229
+ function line_draw_end ( overlay : bool = false ) {
208
230
g4_vertex_buffer_unlock ( line_draw_vertex_buffer ) ;
209
231
g4_index_buffer_unlock ( line_draw_index_buffer ) ;
210
232
211
233
g4_set_vertex_buffer ( line_draw_vertex_buffer ) ;
212
234
g4_set_index_buffer ( line_draw_index_buffer ) ;
213
- g4_set_pipeline ( line_draw_pipeline ) ;
235
+ g4_set_pipeline ( overlay ? line_draw_overlay_pipeline : line_draw_pipeline ) ;
214
236
let camera : camera_object_t = scene_camera ;
215
237
line_draw_vp = mat4_clone ( camera . v ) ;
216
238
line_draw_vp = mat4_mult_mat ( line_draw_vp , camera . p ) ;
217
239
g4_set_mat ( line_draw_vp_loc , line_draw_vp ) ;
240
+ g4_set_vec3 ( line_draw_color_loc , vec4_create (
241
+ color_get_rb ( line_draw_color ) / 255 ,
242
+ color_get_gb ( line_draw_color ) / 255 ,
243
+ color_get_bb ( line_draw_color ) / 255
244
+ ) ) ;
218
245
g4_draw ( 0 , line_draw_lines * 6 ) ;
219
246
}
220
247
221
- function line_draw_add_vb_data ( i : i32 , data : f32 [ ] ) {
222
- for ( let offset : i32 = 0 ; offset < 6 ; ++ offset ) {
223
- buffer_set_f32 ( line_draw_vb_data , ( i + offset ) * 4 , data [ offset ] ) ;
248
+ let _shape_draw_sphere_vb : vertex_buffer_t = null ;
249
+ let _shape_draw_sphere_ib : index_buffer_t = null ;
250
+
251
+ function shape_draw_sphere ( mat : mat4_t ) {
252
+ line_draw_init ( ) ;
253
+
254
+ if ( _shape_draw_sphere_vb == null ) {
255
+ let sphere : mesh_object_t = scene_get_child ( ".Sphere" ) . ext ;
256
+ let md : mesh_data_t = sphere . data ;
257
+
258
+ let posa : i16_array_t = md . vertex_arrays [ 0 ] . values ;
259
+ let structure : vertex_struct_t = g4_vertex_struct_create ( ) ;
260
+ g4_vertex_struct_add ( structure , "pos" , vertex_data_t . F32_3X ) ;
261
+ _shape_draw_sphere_vb = g4_vertex_buffer_create ( posa . length , structure , usage_t . STATIC ) ;
262
+ let data : buffer_t = g4_vertex_buffer_lock ( _shape_draw_sphere_vb ) ;
263
+ for ( let i : i32 = 0 ; i < posa . length / 4 ; ++ i ) {
264
+ buffer_set_f32 ( data , ( i * 3 + 0 ) * 4 , posa [ i * 4 + 0 ] / 32767 ) ;
265
+ buffer_set_f32 ( data , ( i * 3 + 1 ) * 4 , posa [ i * 4 + 1 ] / 32767 ) ;
266
+ buffer_set_f32 ( data , ( i * 3 + 2 ) * 4 , posa [ i * 4 + 2 ] / 32767 ) ;
267
+ }
268
+ g4_vertex_buffer_unlock ( _shape_draw_sphere_vb ) ;
269
+ _shape_draw_sphere_ib = md . _ . index_buffers [ 0 ] ;
224
270
}
225
- }
271
+
272
+ g4_set_vertex_buffer ( _shape_draw_sphere_vb ) ;
273
+ g4_set_index_buffer ( _shape_draw_sphere_ib ) ;
274
+ g4_set_pipeline ( line_draw_overlay_pipeline ) ;
275
+ let camera : camera_object_t = scene_camera ;
276
+ line_draw_vp = mat4_clone ( mat ) ;
277
+ let f : f32 = line_draw_strength * 50 ;
278
+ line_draw_vp = mat4_scale ( line_draw_vp , vec4_create ( f , f , f ) ) ;
279
+ line_draw_vp = mat4_mult_mat ( line_draw_vp , camera . v ) ;
280
+ line_draw_vp = mat4_mult_mat ( line_draw_vp , camera . p ) ;
281
+ g4_set_mat ( line_draw_vp_loc , line_draw_vp ) ;
282
+ g4_set_vec3 ( line_draw_color_loc , vec4_create (
283
+ color_get_rb ( line_draw_color ) / 255 ,
284
+ color_get_gb ( line_draw_color ) / 255 ,
285
+ color_get_bb ( line_draw_color ) / 255
286
+ ) ) ;
287
+ g4_draw ( ) ;
288
+ }
0 commit comments