line_draw.ts 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. let line_draw_color: color_t = 0xffff0000;
  2. let line_draw_strength: f32 = 0.005;
  3. let line_draw_mat: mat4_t = null;
  4. let line_draw_dim: vec4_t = null;
  5. let line_draw_vertex_buffer: vertex_buffer_t;
  6. let line_draw_index_buffer: index_buffer_t;
  7. let line_draw_pipeline: pipeline_t = null;
  8. let line_draw_vp: mat4_t;
  9. let line_draw_vp_loc: kinc_const_loc_t;
  10. let line_draw_vb_data: buffer_view_t;
  11. let line_draw_ib_data: u32_array_t;
  12. let line_draw_max_lines: i32 = 300;
  13. let line_draw_max_vertices: i32 = line_draw_max_lines * 4;
  14. let line_draw_max_indices: i32 = line_draw_max_lines * 6;
  15. let line_draw_lines: i32 = 0;
  16. let line_draw_wpos: vec4_t;
  17. let line_draw_vx: vec4_t = vec4_create();
  18. let line_draw_vy: vec4_t = vec4_create();
  19. let line_draw_vz: vec4_t = vec4_create();
  20. let line_draw_v1: vec4_t = vec4_create();
  21. let line_draw_v2: vec4_t = vec4_create();
  22. let line_draw_t: vec4_t = vec4_create();
  23. let line_draw_mid_point: vec4_t = vec4_create();
  24. let line_draw_mid_line: vec4_t = vec4_create();
  25. let line_draw_corner1: vec4_t = vec4_create();
  26. let line_draw_corner2: vec4_t = vec4_create();
  27. let line_draw_corner3: vec4_t = vec4_create();
  28. let line_draw_corner4: vec4_t = vec4_create();
  29. let line_draw_camera_look: vec4_t = vec4_create();
  30. function line_draw_render(matrix: mat4_t) {
  31. line_draw_mat = matrix;
  32. line_draw_dim = mat4_get_scale(matrix);
  33. if (line_draw_pipeline == null) {
  34. let structure: vertex_struct_t = g4_vertex_struct_create();
  35. g4_vertex_struct_add(structure, "pos", vertex_data_t.F32_3X);
  36. g4_vertex_struct_add(structure, "col", vertex_data_t.F32_3X);
  37. line_draw_pipeline = g4_pipeline_create();
  38. line_draw_pipeline.input_layout = [structure];
  39. line_draw_pipeline.fragment_shader = sys_get_shader("line.frag");
  40. line_draw_pipeline.vertex_shader = sys_get_shader("line.vert");
  41. line_draw_pipeline.depth_write = true;
  42. line_draw_pipeline.depth_mode = compare_mode_t.LESS;
  43. line_draw_pipeline.cull_mode = cull_mode_t.NONE;
  44. line_draw_pipeline.color_attachment_count = 3;
  45. line_draw_pipeline.color_attachments[0] = tex_format_t.RGBA64;
  46. line_draw_pipeline.color_attachments[1] = tex_format_t.RGBA64;
  47. line_draw_pipeline.color_attachments[2] = tex_format_t.RGBA64;
  48. line_draw_pipeline.depth_attachment = depth_format_t.DEPTH24;
  49. g4_pipeline_compile(line_draw_pipeline);
  50. line_draw_vp_loc = g4_pipeline_get_const_loc(line_draw_pipeline, "VP");
  51. line_draw_vp = mat4_identity();
  52. line_draw_vertex_buffer = g4_vertex_buffer_create(line_draw_max_vertices, structure, usage_t.DYNAMIC);
  53. line_draw_index_buffer = g4_index_buffer_create(line_draw_max_indices);
  54. }
  55. line_draw_begin();
  56. line_draw_bounds(line_draw_mat, line_draw_dim);
  57. line_draw_end();
  58. }
  59. function line_draw_bounds(mat: mat4_t, dim: vec4_t) {
  60. line_draw_wpos = mat4_get_loc(mat);
  61. let dx: f32 = dim.x / 2;
  62. let dy: f32 = dim.y / 2;
  63. let dz: f32 = dim.z / 2;
  64. let up: vec4_t = mat4_up(mat);
  65. let look: vec4_t = mat4_look(mat);
  66. let right: vec4_t = mat4_right(mat);
  67. vec4_normalize(up);
  68. vec4_normalize(look);
  69. vec4_normalize(right);
  70. vec4_set_from(line_draw_vx, right);
  71. vec4_mult(line_draw_vx, dx);
  72. vec4_set_from(line_draw_vy, look);
  73. vec4_mult(line_draw_vy, dy);
  74. vec4_set_from(line_draw_vz, up);
  75. vec4_mult(line_draw_vz, dz);
  76. line_draw_lineb(-1, -1, -1, 1, -1, -1);
  77. line_draw_lineb(-1, 1, -1, 1, 1, -1);
  78. line_draw_lineb(-1, -1, 1, 1, -1, 1);
  79. line_draw_lineb(-1, 1, 1, 1, 1, 1);
  80. line_draw_lineb(-1, -1, -1, -1, 1, -1);
  81. line_draw_lineb(-1, -1, 1, -1, 1, 1);
  82. line_draw_lineb( 1, -1, -1, 1, 1, -1);
  83. line_draw_lineb( 1, -1, 1, 1, 1, 1);
  84. line_draw_lineb(-1, -1, -1, -1, -1, 1);
  85. line_draw_lineb(-1, 1, -1, -1, 1, 1);
  86. line_draw_lineb( 1, -1, -1, 1, -1, 1);
  87. line_draw_lineb( 1, 1, -1, 1, 1, 1);
  88. }
  89. function line_draw_lineb(a: i32, b: i32, c: i32, d: i32, e: i32, f: i32) {
  90. vec4_set_from(line_draw_v1, line_draw_wpos);
  91. vec4_set_from(line_draw_t, line_draw_vx); vec4_mult(line_draw_t, a); vec4_add(line_draw_v1, line_draw_t);
  92. vec4_set_from(line_draw_t, line_draw_vy); vec4_mult(line_draw_t, b); vec4_add(line_draw_v1, line_draw_t);
  93. vec4_set_from(line_draw_t, line_draw_vz); vec4_mult(line_draw_t, c); vec4_add(line_draw_v1, line_draw_t);
  94. vec4_set_from(line_draw_v2, line_draw_wpos);
  95. vec4_set_from(line_draw_t, line_draw_vx); vec4_mult(line_draw_t, d); vec4_add(line_draw_v2, line_draw_t);
  96. vec4_set_from(line_draw_t, line_draw_vy); vec4_mult(line_draw_t, e); vec4_add(line_draw_v2, line_draw_t);
  97. vec4_set_from(line_draw_t, line_draw_vz); vec4_mult(line_draw_t, f); vec4_add(line_draw_v2, line_draw_t);
  98. 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);
  99. }
  100. function line_draw_line(x1: f32, y1: f32, z1: f32, x2: f32, y2: f32, z2: f32) {
  101. if (line_draw_lines >= line_draw_max_lines) {
  102. line_draw_end();
  103. line_draw_begin();
  104. }
  105. vec4_set(line_draw_mid_point, x1 + x2, y1 + y2, z1 + z2);
  106. vec4_mult(line_draw_mid_point, 0.5);
  107. vec4_set(line_draw_mid_line, x1, y1, z1);
  108. vec4_sub(line_draw_mid_line, line_draw_mid_point);
  109. let camera: camera_object_t = scene_camera;
  110. line_draw_camera_look = mat4_get_loc(camera.base.transform.world);
  111. vec4_sub(line_draw_camera_look, line_draw_mid_point);
  112. let line_width: vec4_t = vec4_cross(line_draw_camera_look, line_draw_mid_line);
  113. vec4_normalize(line_width);
  114. vec4_mult(line_width, line_draw_strength);
  115. vec4_add(vec4_set(line_draw_corner1, x1, y1, z1), line_width);
  116. vec4_sub(vec4_set(line_draw_corner2, x1, y1, z1), line_width);
  117. vec4_sub(vec4_set(line_draw_corner3, x2, y2, z2), line_width);
  118. vec4_add(vec4_set(line_draw_corner4, x2, y2, z2), line_width);
  119. let i: i32 = line_draw_lines * 24; // 4 * 6 (structure len)
  120. line_draw_add_vb_data(i, [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_ab(line_draw_color) / 255]);
  121. i += 6;
  122. line_draw_add_vb_data(i, [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_ab(line_draw_color) / 255]);
  123. i += 6;
  124. line_draw_add_vb_data(i, [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_ab(line_draw_color) / 255]);
  125. i += 6;
  126. line_draw_add_vb_data(i, [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_ab(line_draw_color) / 255]);
  127. i = line_draw_lines * 6;
  128. line_draw_ib_data[i ] = line_draw_lines * 4;
  129. line_draw_ib_data[i + 1] = line_draw_lines * 4 + 1;
  130. line_draw_ib_data[i + 2] = line_draw_lines * 4 + 2;
  131. line_draw_ib_data[i + 3] = line_draw_lines * 4 + 2;
  132. line_draw_ib_data[i + 4] = line_draw_lines * 4 + 3;
  133. line_draw_ib_data[i + 5] = line_draw_lines * 4;
  134. line_draw_lines++;
  135. }
  136. function line_draw_begin() {
  137. line_draw_lines = 0;
  138. line_draw_vb_data = g4_vertex_buffer_lock(line_draw_vertex_buffer);
  139. line_draw_ib_data = g4_index_buffer_lock(line_draw_index_buffer);
  140. }
  141. function line_draw_end() {
  142. g4_vertex_buffer_unlock(line_draw_vertex_buffer);
  143. g4_index_buffer_unlock(line_draw_index_buffer);
  144. g4_set_vertex_buffer(line_draw_vertex_buffer);
  145. g4_set_index_buffer(line_draw_index_buffer);
  146. g4_set_pipeline(line_draw_pipeline);
  147. let camera: camera_object_t = scene_camera;
  148. mat4_set_from(line_draw_vp, camera.v);
  149. mat4_mult_mat(line_draw_vp, camera.p);
  150. g4_set_mat(line_draw_vp_loc, line_draw_vp);
  151. g4_draw(0, line_draw_lines * 6);
  152. }
  153. function line_draw_add_vb_data(i: i32, data: f32[]) {
  154. for (let offset: i32 = 0; offset < 6; ++offset) {
  155. buffer_view_set_f32(line_draw_vb_data, (i + offset) * 4, data[offset]);
  156. }
  157. }