Improve line_draw

This commit is contained in:
luboslenco
2025-01-19 20:14:47 +01:00
parent 088b398b3f
commit 0417ecd5d1
4 changed files with 92 additions and 25 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
#version 450
in vec3 color;
uniform vec3 color;
out vec4 frag_color[2];
void main() {
-4
View File
@@ -1,12 +1,8 @@
#version 450
uniform mat4 VP;
in vec3 pos;
in vec3 col;
out vec3 color;
void main() {
color = col;
gl_Position = mul(vec4(pos, 1.0), VP);
}
+8
View File
@@ -0,0 +1,8 @@
#version 450
uniform vec3 color;
out vec4 fragColor;
void main() {
fragColor = vec4(color, 1.0);
}
+83 -20
View File
@@ -7,9 +7,11 @@ let line_draw_dim: vec4_t = vec4_nan();
let line_draw_vertex_buffer: vertex_buffer_t;
let line_draw_index_buffer: index_buffer_t;
let line_draw_pipeline: pipeline_t = null;
let line_draw_overlay_pipeline: pipeline_t = null;
let line_draw_vp: mat4_t;
let line_draw_vp_loc: kinc_const_loc_t;
let line_draw_color_loc: kinc_const_loc_t;
let line_draw_vb_data: buffer_t;
let line_draw_ib_data: u32_array_t;
@@ -40,7 +42,6 @@ function line_draw_init() {
if (line_draw_pipeline == null) {
let structure: vertex_struct_t = g4_vertex_struct_create();
g4_vertex_struct_add(structure, "pos", vertex_data_t.F32_3X);
g4_vertex_struct_add(structure, "col", vertex_data_t.F32_3X);
line_draw_pipeline = g4_pipeline_create();
line_draw_pipeline.input_layout = [structure];
line_draw_pipeline.fragment_shader = sys_get_shader("line.frag");
@@ -54,11 +55,26 @@ function line_draw_init() {
line_draw_pipeline.color_attachments[2] = tex_format_t.RGBA64;
line_draw_pipeline.depth_attachment = depth_format_t.DEPTH24;
g4_pipeline_compile(line_draw_pipeline);
line_draw_color_loc = g4_pipeline_get_const_loc(line_draw_pipeline, "color");
line_draw_vp_loc = g4_pipeline_get_const_loc(line_draw_pipeline, "VP");
line_draw_vp = mat4_identity();
line_draw_vertex_buffer = g4_vertex_buffer_create(line_draw_max_vertices, structure, usage_t.DYNAMIC);
line_draw_index_buffer = g4_index_buffer_create(line_draw_max_indices);
}
if (line_draw_overlay_pipeline == null) {
let structure: vertex_struct_t = g4_vertex_struct_create();
g4_vertex_struct_add(structure, "pos", vertex_data_t.F32_3X);
line_draw_overlay_pipeline = g4_pipeline_create();
line_draw_overlay_pipeline.input_layout = [structure];
line_draw_overlay_pipeline.fragment_shader = sys_get_shader("line_overlay.frag");
line_draw_overlay_pipeline.vertex_shader = sys_get_shader("line.vert");
line_draw_overlay_pipeline.depth_write = true;
line_draw_overlay_pipeline.depth_mode = compare_mode_t.LESS;
line_draw_overlay_pipeline.cull_mode = cull_mode_t.NONE;
line_draw_overlay_pipeline.color_attachment_count = 1;
line_draw_overlay_pipeline.color_attachments[0] = tex_format_t.RGBA64;
g4_pipeline_compile(line_draw_overlay_pipeline);
}
}
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) {
line_draw_t = vec4_mult(line_draw_t, f);
line_draw_v2 = vec4_add(line_draw_v2, line_draw_t);
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);
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);
}
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) {
line_draw_corner4 = vec4_create(x2, y2, z2);
line_draw_corner4 = vec4_add(line_draw_corner4, line_width);
let i: i32 = line_draw_lines * 24; // 4 * 6 (structure len)
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];
line_draw_add_vb_data(i, data);
let i: i32 = line_draw_lines * 12; // 4 * 3 (structure len)
i += 6;
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];
line_draw_add_vb_data(i, data);
buffer_set_f32(line_draw_vb_data, (i + 0) * 4, line_draw_corner1.x);
buffer_set_f32(line_draw_vb_data, (i + 1) * 4, line_draw_corner1.y);
buffer_set_f32(line_draw_vb_data, (i + 2) * 4, line_draw_corner1.z);
i += 6;
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];
line_draw_add_vb_data(i, data);
i += 3;
buffer_set_f32(line_draw_vb_data, (i + 0) * 4, line_draw_corner2.x);
buffer_set_f32(line_draw_vb_data, (i + 1) * 4, line_draw_corner2.y);
buffer_set_f32(line_draw_vb_data, (i + 2) * 4, line_draw_corner2.z);
i += 6;
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];
line_draw_add_vb_data(i, data);
i += 3;
buffer_set_f32(line_draw_vb_data, (i + 0) * 4, line_draw_corner3.x);
buffer_set_f32(line_draw_vb_data, (i + 1) * 4, line_draw_corner3.y);
buffer_set_f32(line_draw_vb_data, (i + 2) * 4, line_draw_corner3.z);
i += 3;
buffer_set_f32(line_draw_vb_data, (i + 0) * 4, line_draw_corner4.x);
buffer_set_f32(line_draw_vb_data, (i + 1) * 4, line_draw_corner4.y);
buffer_set_f32(line_draw_vb_data, (i + 2) * 4, line_draw_corner4.z);
i = line_draw_lines * 6;
line_draw_ib_data[i ] = line_draw_lines * 4;
@@ -204,22 +226,63 @@ function line_draw_begin() {
line_draw_ib_data = g4_index_buffer_lock(line_draw_index_buffer);
}
function line_draw_end() {
function line_draw_end(overlay: bool = false) {
g4_vertex_buffer_unlock(line_draw_vertex_buffer);
g4_index_buffer_unlock(line_draw_index_buffer);
g4_set_vertex_buffer(line_draw_vertex_buffer);
g4_set_index_buffer(line_draw_index_buffer);
g4_set_pipeline(line_draw_pipeline);
g4_set_pipeline(overlay ? line_draw_overlay_pipeline : line_draw_pipeline);
let camera: camera_object_t = scene_camera;
line_draw_vp = mat4_clone(camera.v);
line_draw_vp = mat4_mult_mat(line_draw_vp, camera.p);
g4_set_mat(line_draw_vp_loc, line_draw_vp);
g4_set_vec3(line_draw_color_loc, vec4_create(
color_get_rb(line_draw_color) / 255,
color_get_gb(line_draw_color) / 255,
color_get_bb(line_draw_color) / 255
));
g4_draw(0, line_draw_lines * 6);
}
function line_draw_add_vb_data(i: i32, data: f32[]) {
for (let offset: i32 = 0; offset < 6; ++offset) {
buffer_set_f32(line_draw_vb_data, (i + offset) * 4, data[offset]);
let _shape_draw_sphere_vb: vertex_buffer_t = null;
let _shape_draw_sphere_ib: index_buffer_t = null;
function shape_draw_sphere(mat: mat4_t) {
line_draw_init();
if (_shape_draw_sphere_vb == null) {
let sphere: mesh_object_t = scene_get_child(".Sphere").ext;
let md: mesh_data_t = sphere.data;
let posa: i16_array_t = md.vertex_arrays[0].values;
let structure: vertex_struct_t = g4_vertex_struct_create();
g4_vertex_struct_add(structure, "pos", vertex_data_t.F32_3X);
_shape_draw_sphere_vb = g4_vertex_buffer_create(posa.length, structure, usage_t.STATIC);
let data: buffer_t = g4_vertex_buffer_lock(_shape_draw_sphere_vb);
for (let i: i32 = 0; i < posa.length / 4; ++i) {
buffer_set_f32(data, (i * 3 + 0) * 4, posa[i * 4 + 0] / 32767);
buffer_set_f32(data, (i * 3 + 1) * 4, posa[i * 4 + 1] / 32767);
buffer_set_f32(data, (i * 3 + 2) * 4, posa[i * 4 + 2] / 32767);
}
g4_vertex_buffer_unlock(_shape_draw_sphere_vb);
_shape_draw_sphere_ib = md._.index_buffers[0];
}
}
g4_set_vertex_buffer(_shape_draw_sphere_vb);
g4_set_index_buffer(_shape_draw_sphere_ib);
g4_set_pipeline(line_draw_overlay_pipeline);
let camera: camera_object_t = scene_camera;
line_draw_vp = mat4_clone(mat);
let f: f32 = line_draw_strength * 50;
line_draw_vp = mat4_scale(line_draw_vp, vec4_create(f, f, f));
line_draw_vp = mat4_mult_mat(line_draw_vp, camera.v);
line_draw_vp = mat4_mult_mat(line_draw_vp, camera.p);
g4_set_mat(line_draw_vp_loc, line_draw_vp);
g4_set_vec3(line_draw_color_loc, vec4_create(
color_get_rb(line_draw_color) / 255,
color_get_gb(line_draw_color) / 255,
color_get_bb(line_draw_color) / 255
));
g4_draw();
}