Skip to content

Commit 0417ecd

Browse files
committed
Improve line_draw
1 parent 088b398 commit 0417ecd

File tree

4 files changed

+92
-25
lines changed

4 files changed

+92
-25
lines changed

base/shaders/line.frag.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#version 450
22

3-
in vec3 color;
3+
uniform vec3 color;
44
out vec4 frag_color[2];
55

66
void main() {

base/shaders/line.vert.glsl

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
#version 450
22

33
uniform mat4 VP;
4-
54
in vec3 pos;
6-
in vec3 col;
7-
out vec3 color;
85

96
void main() {
10-
color = col;
117
gl_Position = mul(vec4(pos, 1.0), VP);
128
}

base/shaders/line_overlay.frag.glsl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#version 450
2+
3+
uniform vec3 color;
4+
out vec4 fragColor;
5+
6+
void main() {
7+
fragColor = vec4(color, 1.0);
8+
}

base/sources/line_draw.ts

Lines changed: 83 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ let line_draw_dim: vec4_t = vec4_nan();
77
let line_draw_vertex_buffer: vertex_buffer_t;
88
let line_draw_index_buffer: index_buffer_t;
99
let line_draw_pipeline: pipeline_t = null;
10+
let line_draw_overlay_pipeline: pipeline_t = null;
1011

1112
let line_draw_vp: mat4_t;
1213
let line_draw_vp_loc: kinc_const_loc_t;
14+
let line_draw_color_loc: kinc_const_loc_t;
1315

1416
let line_draw_vb_data: buffer_t;
1517
let line_draw_ib_data: u32_array_t;
@@ -40,7 +42,6 @@ function line_draw_init() {
4042
if (line_draw_pipeline == null) {
4143
let structure: vertex_struct_t = g4_vertex_struct_create();
4244
g4_vertex_struct_add(structure, "pos", vertex_data_t.F32_3X);
43-
g4_vertex_struct_add(structure, "col", vertex_data_t.F32_3X);
4445
line_draw_pipeline = g4_pipeline_create();
4546
line_draw_pipeline.input_layout = [structure];
4647
line_draw_pipeline.fragment_shader = sys_get_shader("line.frag");
@@ -54,11 +55,26 @@ function line_draw_init() {
5455
line_draw_pipeline.color_attachments[2] = tex_format_t.RGBA64;
5556
line_draw_pipeline.depth_attachment = depth_format_t.DEPTH24;
5657
g4_pipeline_compile(line_draw_pipeline);
58+
line_draw_color_loc = g4_pipeline_get_const_loc(line_draw_pipeline, "color");
5759
line_draw_vp_loc = g4_pipeline_get_const_loc(line_draw_pipeline, "VP");
5860
line_draw_vp = mat4_identity();
5961
line_draw_vertex_buffer = g4_vertex_buffer_create(line_draw_max_vertices, structure, usage_t.DYNAMIC);
6062
line_draw_index_buffer = g4_index_buffer_create(line_draw_max_indices);
6163
}
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+
}
6278
}
6379

6480
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) {
135151
line_draw_t = vec4_mult(line_draw_t, f);
136152
line_draw_v2 = vec4_add(line_draw_v2, line_draw_t);
137153

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);
139156
}
140157

141158
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) {
170187
line_draw_corner4 = vec4_create(x2, y2, z2);
171188
line_draw_corner4 = vec4_add(line_draw_corner4, line_width);
172189

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);
176195

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);
180200

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);
184205

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);
188210

189211
i = line_draw_lines * 6;
190212
line_draw_ib_data[i ] = line_draw_lines * 4;
@@ -204,22 +226,63 @@ function line_draw_begin() {
204226
line_draw_ib_data = g4_index_buffer_lock(line_draw_index_buffer);
205227
}
206228

207-
function line_draw_end() {
229+
function line_draw_end(overlay: bool = false) {
208230
g4_vertex_buffer_unlock(line_draw_vertex_buffer);
209231
g4_index_buffer_unlock(line_draw_index_buffer);
210232

211233
g4_set_vertex_buffer(line_draw_vertex_buffer);
212234
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);
214236
let camera: camera_object_t = scene_camera;
215237
line_draw_vp = mat4_clone(camera.v);
216238
line_draw_vp = mat4_mult_mat(line_draw_vp, camera.p);
217239
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+
));
218245
g4_draw(0, line_draw_lines * 6);
219246
}
220247

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];
224270
}
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

Comments
 (0)