Improve line_draw
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
#version 450
|
||||
|
||||
in vec3 color;
|
||||
uniform vec3 color;
|
||||
out vec4 frag_color[2];
|
||||
|
||||
void main() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#version 450
|
||||
|
||||
uniform vec3 color;
|
||||
out vec4 fragColor;
|
||||
|
||||
void main() {
|
||||
fragColor = vec4(color, 1.0);
|
||||
}
|
||||
+83
-20
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user