render_path_raytrace.ts 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. ///if (krom_direct3d12 || krom_vulkan || krom_metal)
  2. let render_path_raytrace_frame: i32 = 0;
  3. let render_path_raytrace_ready: bool = false;
  4. let render_path_raytrace_dirty: i32 = 0;
  5. let render_path_raytrace_uv_scale: f32 = 1.0;
  6. let render_path_raytrace_first: bool = true;
  7. let render_path_raytrace_f32a: f32_array_t = f32_array_create(24);
  8. let render_path_raytrace_help_mat: mat4_t = mat4_identity();
  9. let render_path_raytrace_vb_scale: f32 = 1.0;
  10. let render_path_raytrace_vb: vertex_buffer_t;
  11. let render_path_raytrace_ib: index_buffer_t;
  12. let render_path_raytrace_last_envmap: image_t = null;
  13. let render_path_raytrace_is_bake: bool = false;
  14. ///if krom_direct3d12
  15. let render_path_raytrace_ext: string = ".cso";
  16. ///elseif krom_metal
  17. let render_path_raytrace_ext: string = ".metal";
  18. ///else
  19. let render_path_raytrace_ext: string = ".spirv";
  20. ///end
  21. ///if is_lab
  22. let render_path_raytrace_last_texpaint: image_t = null;
  23. ///end
  24. function render_path_raytrace_init() {
  25. }
  26. function render_path_raytrace_commands(use_live_layer: bool) {
  27. if (!render_path_raytrace_ready || render_path_raytrace_is_bake) {
  28. render_path_raytrace_ready = true;
  29. render_path_raytrace_is_bake = false;
  30. let mode: string = context_raw.pathtrace_mode == path_trace_mode_t.CORE ? "core" : "full";
  31. render_path_raytrace_raytrace_init("raytrace_brute_" + mode + render_path_raytrace_ext);
  32. render_path_raytrace_last_envmap = null;
  33. }
  34. if (!context_raw.envmap_loaded) {
  35. context_load_envmap();
  36. context_update_envmap();
  37. }
  38. let probe: world_data_t = scene_world;
  39. let saved_envmap: image_t = context_raw.show_envmap_blur ? probe._.radiance_mipmaps[0] : context_raw.saved_envmap;
  40. if (render_path_raytrace_last_envmap != saved_envmap) {
  41. render_path_raytrace_last_envmap = saved_envmap;
  42. let bnoise_sobol: image_t = map_get(scene_embedded, "bnoise_sobol.k");
  43. let bnoise_scramble: image_t = map_get(scene_embedded, "bnoise_scramble.k");
  44. let bnoise_rank: image_t = map_get(scene_embedded, "bnoise_rank.k");
  45. let l: any = base_flatten(true);
  46. krom_raytrace_set_textures(l.texpaint, l.texpaint_nor, l.texpaint_pack, saved_envmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
  47. }
  48. ///if is_lab
  49. let l: any = base_flatten(true);
  50. if (l.texpaint != render_path_raytrace_last_texpaint) {
  51. render_path_raytrace_last_texpaint = l.texpaint;
  52. let bnoise_sobol: image_t = map_get(scene_embedded, "bnoise_sobol.k");
  53. let bnoise_scramble: image_t = map_get(scene_embedded, "bnoise_scramble.k");
  54. let bnoise_rank: image_t = map_get(scene_embedded, "bnoise_rank.k");
  55. krom_raytrace_set_textures(l.texpaint, l.texpaint_nor, l.texpaint_pack, saved_envmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
  56. }
  57. ///end
  58. if (context_raw.pdirty > 0 || render_path_raytrace_dirty > 0) {
  59. base_flatten(true);
  60. }
  61. let cam: camera_object_t = scene_camera;
  62. let ct: transform_t = cam.base.transform;
  63. mat4_set_from(render_path_raytrace_help_mat, cam.v);
  64. mat4_mult_mat(render_path_raytrace_help_mat, cam.p);
  65. mat4_get_inv(render_path_raytrace_help_mat, render_path_raytrace_help_mat);
  66. render_path_raytrace_f32a[0] = transform_world_x(ct);
  67. render_path_raytrace_f32a[1] = transform_world_y(ct);
  68. render_path_raytrace_f32a[2] = transform_world_z(ct);
  69. render_path_raytrace_f32a[3] = render_path_raytrace_frame;
  70. ///if krom_metal
  71. // frame = (frame % (16)) + 1; // _PAINT
  72. render_path_raytrace_frame = render_path_raytrace_frame + 1; // _RENDER
  73. ///else
  74. render_path_raytrace_frame = (render_path_raytrace_frame % 4) + 1; // _PAINT
  75. // frame = frame + 1; // _RENDER
  76. ///end
  77. render_path_raytrace_f32a[4] = render_path_raytrace_help_mat.m[0];
  78. render_path_raytrace_f32a[5] = render_path_raytrace_help_mat.m[1];
  79. render_path_raytrace_f32a[6] = render_path_raytrace_help_mat.m[2];
  80. render_path_raytrace_f32a[7] = render_path_raytrace_help_mat.m[3];
  81. render_path_raytrace_f32a[8] = render_path_raytrace_help_mat.m[4];
  82. render_path_raytrace_f32a[9] = render_path_raytrace_help_mat.m[5];
  83. render_path_raytrace_f32a[10] = render_path_raytrace_help_mat.m[6];
  84. render_path_raytrace_f32a[11] = render_path_raytrace_help_mat.m[7];
  85. render_path_raytrace_f32a[12] = render_path_raytrace_help_mat.m[8];
  86. render_path_raytrace_f32a[13] = render_path_raytrace_help_mat.m[9];
  87. render_path_raytrace_f32a[14] = render_path_raytrace_help_mat.m[10];
  88. render_path_raytrace_f32a[15] = render_path_raytrace_help_mat.m[11];
  89. render_path_raytrace_f32a[16] = render_path_raytrace_help_mat.m[12];
  90. render_path_raytrace_f32a[17] = render_path_raytrace_help_mat.m[13];
  91. render_path_raytrace_f32a[18] = render_path_raytrace_help_mat.m[14];
  92. render_path_raytrace_f32a[19] = render_path_raytrace_help_mat.m[15];
  93. render_path_raytrace_f32a[20] = scene_world.strength * 1.5;
  94. if (!context_raw.show_envmap) {
  95. render_path_raytrace_f32a[20] = -render_path_raytrace_f32a[20];
  96. }
  97. render_path_raytrace_f32a[21] = context_raw.envmap_angle;
  98. render_path_raytrace_f32a[22] = render_path_raytrace_uv_scale;
  99. ///if is_lab
  100. render_path_raytrace_f32a[22] *= scene_meshes[0].data.scale_tex;
  101. ///end
  102. let framebuffer: image_t = map_get(render_path_render_targets, "buf")._image;
  103. krom_raytrace_dispatch_rays(framebuffer.render_target_, render_path_raytrace_f32a.buffer);
  104. if (context_raw.ddirty == 1 || context_raw.pdirty == 1) {
  105. ///if krom_metal
  106. context_raw.rdirty = 128;
  107. ///else
  108. context_raw.rdirty = 4;
  109. ///end
  110. }
  111. context_raw.ddirty--;
  112. context_raw.pdirty--;
  113. context_raw.rdirty--;
  114. // raw.ddirty = 1; // _RENDER
  115. }
  116. function render_path_raytrace_raytrace_init(shader_name: string, build: bool = true) {
  117. if (render_path_raytrace_first) {
  118. render_path_raytrace_first = false;
  119. scene_embed_data("bnoise_sobol.k");
  120. scene_embed_data("bnoise_scramble.k");
  121. scene_embed_data("bnoise_rank.k");
  122. }
  123. let shader: buffer_t = data_get_blob(shader_name);
  124. if (build) {
  125. render_path_raytrace_build_data();
  126. }
  127. krom_raytrace_init(shader, render_path_raytrace_vb.buffer_, render_path_raytrace_ib.buffer_, render_path_raytrace_vb_scale);
  128. }
  129. function render_path_raytrace_build_data() {
  130. if (context_raw.merged_object == null) {
  131. util_mesh_merge();
  132. }
  133. ///if is_paint
  134. let mo: mesh_object_t = !context_layer_filter_used() ? context_raw.merged_object : context_raw.paint_object;
  135. ///else
  136. let mo: mesh_object_t = scene_meshes[0];
  137. ///end
  138. let md: mesh_data_t = mo.data;
  139. let mo_scale: f32 = mo.base.transform.scale.x; // Uniform scale only
  140. render_path_raytrace_vb_scale = md.scale_pos * mo_scale;
  141. if (mo.base.parent != null) {
  142. render_path_raytrace_vb_scale *= mo.base.parent.transform.scale.x;
  143. }
  144. render_path_raytrace_vb = md._.vertex_buffer;
  145. render_path_raytrace_ib = md._.index_buffers[0];
  146. }
  147. function render_path_raytrace_draw(useLiveLayer: bool) {
  148. let is_live: bool = config_raw.brush_live && render_path_paint_live_layer_drawn > 0;
  149. if (context_raw.ddirty > 1 || context_raw.pdirty > 0 || is_live) {
  150. render_path_raytrace_frame = 0;
  151. }
  152. ///if krom_metal
  153. // Delay path tracing additional samples while painting
  154. let down: bool = mouse_down() || pen_down();
  155. if (context_in_viewport() && down) {
  156. render_path_raytrace_frame = 0;
  157. }
  158. ///end
  159. render_path_raytrace_commands(useLiveLayer);
  160. if (config_raw.rp_bloom != false) {
  161. render_path_base_draw_bloom("buf");
  162. }
  163. render_path_set_target("buf");
  164. render_path_draw_meshes("overlay");
  165. render_path_set_target("buf");
  166. render_path_base_draw_compass();
  167. render_path_set_target("taa");
  168. render_path_bind_target("buf", "tex");
  169. render_path_draw_shader("shader_datas/compositor_pass/compositor_pass");
  170. render_path_set_target("");
  171. render_path_bind_target("taa", "tex");
  172. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  173. if (config_raw.brush_3d) {
  174. render_path_paint_commands_cursor();
  175. }
  176. }
  177. ///end