render_path_raytrace.ts 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. let render_path_raytrace_frame: i32 = 0;
  2. let render_path_raytrace_ready: bool = false;
  3. let render_path_raytrace_dirty: i32 = 0;
  4. let render_path_raytrace_uv_scale: f32 = 1.0;
  5. let render_path_raytrace_init_shader: bool = true;
  6. let render_path_raytrace_f32a: f32_array_t = f32_array_create(24);
  7. let render_path_raytrace_help_mat: mat4_t = mat4_identity();
  8. let render_path_raytrace_transform: mat4_t;
  9. let render_path_raytrace_vb: gpu_buffer_t;
  10. let render_path_raytrace_ib: gpu_buffer_t;
  11. let render_path_raytrace_last_envmap: gpu_texture_t = null;
  12. let render_path_raytrace_is_bake: bool = false;
  13. ///if arm_direct3d12
  14. let render_path_raytrace_ext: string = ".cso";
  15. ///elseif arm_metal
  16. let render_path_raytrace_ext: string = ".metal";
  17. ///else
  18. let render_path_raytrace_ext: string = ".spirv";
  19. ///end
  20. let render_path_raytrace_last_texpaint: gpu_texture_t = null;
  21. function render_path_raytrace_init() {
  22. }
  23. function render_path_raytrace_commands(use_live_layer: bool) {
  24. if (!render_path_raytrace_ready || render_path_raytrace_is_bake) {
  25. render_path_raytrace_ready = true;
  26. if (render_path_raytrace_is_bake) {
  27. render_path_raytrace_is_bake = false;
  28. render_path_raytrace_init_shader = true;
  29. }
  30. let ext: string = "";
  31. if (context_raw.tool == tool_type_t.GIZMO) {
  32. ext = "forge_";
  33. }
  34. let mode: string = config_raw.pathtrace_mode == pathtrace_mode_t.FAST ? "core" : "full";
  35. render_path_raytrace_raytrace_init("raytrace_brute_" + ext + mode + render_path_raytrace_ext);
  36. render_path_raytrace_last_envmap = null;
  37. }
  38. if (!context_raw.envmap_loaded) {
  39. context_load_envmap();
  40. context_update_envmap();
  41. }
  42. let probe: world_data_t = scene_world;
  43. let saved_envmap: gpu_texture_t = context_raw.show_envmap_blur ? probe._.radiance_mipmaps[0] : context_raw.saved_envmap;
  44. ////
  45. if (render_path_raytrace_last_envmap != saved_envmap) {
  46. render_path_raytrace_last_envmap = saved_envmap;
  47. let bnoise_sobol: gpu_texture_t = map_get(scene_embedded, "bnoise_sobol.k");
  48. let bnoise_scramble: gpu_texture_t = map_get(scene_embedded, "bnoise_scramble.k");
  49. let bnoise_rank: gpu_texture_t = map_get(scene_embedded, "bnoise_rank.k");
  50. let l: slot_layer_t = layers_flatten(true);
  51. iron_raytrace_set_textures(l.texpaint, l.texpaint_nor, l.texpaint_pack, saved_envmap, bnoise_sobol, bnoise_scramble, bnoise_rank);
  52. }
  53. ////
  54. ///if is_lab
  55. let l: slot_layer_t = layers_flatten(true);
  56. if (l.texpaint != render_path_raytrace_last_texpaint) {
  57. render_path_raytrace_last_texpaint = l.texpaint;
  58. let bnoise_sobol: gpu_texture_t = map_get(scene_embedded, "bnoise_sobol.k");
  59. let bnoise_scramble: gpu_texture_t = map_get(scene_embedded, "bnoise_scramble.k");
  60. let bnoise_rank: gpu_texture_t = map_get(scene_embedded, "bnoise_rank.k");
  61. iron_raytrace_set_textures(l.texpaint, l.texpaint_nor, l.texpaint_pack, saved_envmap, bnoise_sobol, bnoise_scramble, bnoise_rank);
  62. }
  63. ///end
  64. if (context_raw.pdirty > 0 || render_path_raytrace_dirty > 0) {
  65. layers_flatten(true);
  66. }
  67. let cam: camera_object_t = scene_camera;
  68. let ct: transform_t = cam.base.transform;
  69. render_path_raytrace_help_mat = mat4_clone(cam.v);
  70. render_path_raytrace_help_mat = mat4_mult_mat(render_path_raytrace_help_mat, cam.p);
  71. render_path_raytrace_help_mat = mat4_inv(render_path_raytrace_help_mat);
  72. render_path_raytrace_f32a[0] = transform_world_x(ct);
  73. render_path_raytrace_f32a[1] = transform_world_y(ct);
  74. render_path_raytrace_f32a[2] = transform_world_z(ct);
  75. render_path_raytrace_f32a[3] = render_path_raytrace_frame;
  76. ///if arm_metal
  77. // render_path_raytrace_frame = (render_path_raytrace_frame % (16)) + 1; // _PAINT
  78. render_path_raytrace_frame = render_path_raytrace_frame + 1; // _RENDER
  79. ///else
  80. render_path_raytrace_frame = (render_path_raytrace_frame % 4) + 1; // _PAINT
  81. // render_path_raytrace_frame = render_path_raytrace_frame + 1; // _RENDER
  82. ///end
  83. render_path_raytrace_f32a[4] = render_path_raytrace_help_mat.m00;
  84. render_path_raytrace_f32a[5] = render_path_raytrace_help_mat.m01;
  85. render_path_raytrace_f32a[6] = render_path_raytrace_help_mat.m02;
  86. render_path_raytrace_f32a[7] = render_path_raytrace_help_mat.m03;
  87. render_path_raytrace_f32a[8] = render_path_raytrace_help_mat.m10;
  88. render_path_raytrace_f32a[9] = render_path_raytrace_help_mat.m11;
  89. render_path_raytrace_f32a[10] = render_path_raytrace_help_mat.m12;
  90. render_path_raytrace_f32a[11] = render_path_raytrace_help_mat.m13;
  91. render_path_raytrace_f32a[12] = render_path_raytrace_help_mat.m20;
  92. render_path_raytrace_f32a[13] = render_path_raytrace_help_mat.m21;
  93. render_path_raytrace_f32a[14] = render_path_raytrace_help_mat.m22;
  94. render_path_raytrace_f32a[15] = render_path_raytrace_help_mat.m23;
  95. render_path_raytrace_f32a[16] = render_path_raytrace_help_mat.m30;
  96. render_path_raytrace_f32a[17] = render_path_raytrace_help_mat.m31;
  97. render_path_raytrace_f32a[18] = render_path_raytrace_help_mat.m32;
  98. render_path_raytrace_f32a[19] = render_path_raytrace_help_mat.m33;
  99. render_path_raytrace_f32a[20] = scene_world.strength * 1.5;
  100. if (!context_raw.show_envmap) {
  101. render_path_raytrace_f32a[20] = -render_path_raytrace_f32a[20];
  102. }
  103. render_path_raytrace_f32a[21] = context_raw.envmap_angle;
  104. render_path_raytrace_f32a[22] = render_path_raytrace_uv_scale;
  105. ///if is_lab
  106. render_path_raytrace_f32a[22] *= scene_meshes[0].data.scale_tex;
  107. ///end
  108. let framebuffer: render_target_t = map_get(render_path_render_targets, "buf");
  109. iron_raytrace_dispatch_rays(framebuffer._image, render_path_raytrace_f32a);
  110. if (context_raw.ddirty == 1 || context_raw.pdirty == 1) {
  111. ///if arm_metal
  112. context_raw.rdirty = 128;
  113. ///else
  114. context_raw.rdirty = 4;
  115. ///end
  116. }
  117. context_raw.ddirty--;
  118. context_raw.pdirty--;
  119. context_raw.rdirty--;
  120. // context_raw.ddirty = 1; // _RENDER
  121. if (context_raw.tool == tool_type_t.GIZMO) {
  122. context_raw.ddirty = 1;
  123. }
  124. }
  125. function render_path_raytrace_raytrace_init(shader_name: string, build: bool = true) {
  126. if (render_path_raytrace_init_shader) {
  127. render_path_raytrace_init_shader = false;
  128. scene_embed_data("bnoise_sobol.k");
  129. scene_embed_data("bnoise_scramble.k");
  130. scene_embed_data("bnoise_rank.k");
  131. let shader: buffer_t = data_get_blob(shader_name);
  132. iron_raytrace_init(shader);
  133. }
  134. if (build) {
  135. render_path_raytrace_build_data();
  136. }
  137. {
  138. iron_raytrace_as_init();
  139. if (context_raw.tool == tool_type_t.GIZMO) {
  140. for (let i: i32 = 0; i < project_paint_objects.length; ++i) {
  141. let po: mesh_object_t = project_paint_objects[i];
  142. if (!po.base.visible) {
  143. continue;
  144. }
  145. iron_raytrace_as_add(po.data._.vertex_buffer, po.data._.index_buffer, po.base.transform.world_unpack);
  146. }
  147. }
  148. else {
  149. iron_raytrace_as_add(render_path_raytrace_vb, render_path_raytrace_ib, render_path_raytrace_transform);
  150. }
  151. let vb_full: gpu_buffer_t = context_raw.merged_object.data._.vertex_buffer;
  152. let ib_full: gpu_buffer_t = context_raw.merged_object.data._.index_buffer;
  153. iron_raytrace_as_build(vb_full, ib_full);
  154. }
  155. }
  156. function render_path_raytrace_build_data() {
  157. if (context_raw.merged_object == null) {
  158. util_mesh_merge();
  159. }
  160. ///if is_paint
  161. let mo: mesh_object_t = !context_layer_filter_used() ? context_raw.merged_object : context_raw.paint_object;
  162. ///else
  163. let mo: mesh_object_t = scene_meshes[0];
  164. ///end
  165. if (context_raw.tool == tool_type_t.GIZMO) {
  166. render_path_raytrace_transform = mo.base.transform.world_unpack;
  167. }
  168. else {
  169. render_path_raytrace_transform = mat4_identity();
  170. }
  171. let sc: f32 = mo.base.transform.scale.x * mo.data.scale_pos;
  172. if (mo.base.parent != null) {
  173. sc *= mo.base.parent.transform.scale.x;
  174. }
  175. render_path_raytrace_transform = mat4_scale(render_path_raytrace_transform, vec4_create(sc, sc, sc));
  176. render_path_raytrace_vb = mo.data._.vertex_buffer;
  177. render_path_raytrace_ib = mo.data._.index_buffer;
  178. }
  179. function render_path_raytrace_draw(use_live_layer: bool) {
  180. let is_live: bool = config_raw.brush_live && render_path_paint_live_layer_drawn > 0;
  181. if (context_raw.ddirty > 1 || context_raw.pdirty > 0 || is_live) {
  182. render_path_raytrace_frame = 0;
  183. }
  184. ///if arm_metal
  185. // Delay path tracing additional samples while painting
  186. let down: bool = mouse_down() || pen_down();
  187. if (context_in_viewport() && down) {
  188. render_path_raytrace_frame = 0;
  189. }
  190. ///end
  191. render_path_raytrace_commands(use_live_layer);
  192. render_path_set_target("buf");
  193. render_path_draw_meshes("overlay");
  194. render_path_set_target("buf");
  195. render_path_base_draw_compass();
  196. render_path_set_target("last");
  197. render_path_bind_target("buf", "tex");
  198. render_path_draw_shader("shader_datas/compositor_pass/compositor_pass");
  199. render_path_base_draw_bloom("buf", "last");
  200. render_path_set_target("");
  201. render_path_bind_target("last", "tex");
  202. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  203. if (config_raw.brush_3d) {
  204. render_path_paint_commands_cursor();
  205. }
  206. }