render_path_raytrace_bake.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. ///if (krom_direct3d12 || krom_vulkan || krom_metal)
  2. let render_path_raytrace_bake_rays_pix: i32 = 0;
  3. let render_path_raytrace_bake_rays_sec: i32 = 0;
  4. let render_path_raytrace_bake_current_sample: i32 = 0;
  5. let render_path_raytrace_bake_rays_timer: f32 = 0.0;
  6. let render_path_raytrace_bake_rays_counter: i32 = 0;
  7. let render_path_raytrace_bake_last_layer: image_t = null;
  8. let render_path_raytrace_bake_last_bake: i32 = 0;
  9. function render_path_raytrace_bake_commands(parse_paint_material: (b?: bool)=>void): bool {
  10. if (!render_path_raytrace_ready || !render_path_raytrace_is_bake || render_path_raytrace_bake_last_bake != context_raw.bake_type) {
  11. let rebuild: bool = !(render_path_raytrace_ready && render_path_raytrace_is_bake && render_path_raytrace_bake_last_bake != context_raw.bake_type);
  12. render_path_raytrace_bake_last_bake = context_raw.bake_type;
  13. render_path_raytrace_ready = true;
  14. render_path_raytrace_is_bake = true;
  15. render_path_raytrace_last_envmap = null;
  16. render_path_raytrace_bake_last_layer = null;
  17. if (map_get(render_path_render_targets, "baketex0") != null) {
  18. image_unload(map_get(render_path_render_targets, "baketex0")._image);
  19. image_unload(map_get(render_path_render_targets, "baketex1")._image);
  20. image_unload(map_get(render_path_render_targets, "baketex2")._image);
  21. }
  22. {
  23. let t: render_target_t = render_target_create();
  24. t.name = "baketex0";
  25. t.width = config_get_texture_res_x();
  26. t.height = config_get_texture_res_y();
  27. t.format = "RGBA64";
  28. render_path_create_render_target(t);
  29. }
  30. {
  31. let t: render_target_t = render_target_create();
  32. t.name = "baketex1";
  33. t.width = config_get_texture_res_x();
  34. t.height = config_get_texture_res_y();
  35. t.format = "RGBA64";
  36. render_path_create_render_target(t);
  37. }
  38. {
  39. let t: render_target_t = render_target_create();
  40. t.name = "baketex2";
  41. t.width = config_get_texture_res_x();
  42. t.height = config_get_texture_res_y();
  43. t.format = "RGBA64"; // Match raytrace_target format
  44. render_path_create_render_target(t);
  45. }
  46. let _bake_type: bake_type_t = context_raw.bake_type;
  47. context_raw.bake_type = bake_type_t.INIT;
  48. parse_paint_material();
  49. render_path_set_target("baketex0");
  50. render_path_clear_target(0x00000000); // Pixels with alpha of 0.0 are skipped during raytracing
  51. render_path_set_target("baketex0", ["baketex1"]);
  52. render_path_draw_meshes("paint");
  53. context_raw.bake_type = _bake_type;
  54. app_notify_on_next_frame(parse_paint_material);
  55. render_path_raytrace_raytrace_init(render_path_raytrace_bake_get_bake_shader_name(), rebuild);
  56. return false;
  57. }
  58. if (!context_raw.envmap_loaded) {
  59. context_load_envmap();
  60. context_update_envmap();
  61. }
  62. let probe: world_data_t = scene_world;
  63. let saved_envmap: image_t = context_raw.show_envmap_blur ? probe._.radiance_mipmaps[0] : context_raw.saved_envmap;
  64. if (render_path_raytrace_last_envmap != saved_envmap || render_path_raytrace_bake_last_layer != context_raw.layer.texpaint) {
  65. render_path_raytrace_last_envmap = saved_envmap;
  66. render_path_raytrace_bake_last_layer = context_raw.layer.texpaint;
  67. let baketex0: image_t = map_get(render_path_render_targets, "baketex0")._image;
  68. let baketex1: image_t = map_get(render_path_render_targets, "baketex1")._image;
  69. let bnoise_sobol: image_t = map_get(scene_embedded, "bnoise_sobol.k");
  70. let bnoise_scramble: image_t = map_get(scene_embedded, "bnoise_scramble.k");
  71. let bnoise_rank: image_t = map_get(scene_embedded, "bnoise_rank.k");
  72. let texpaint_undo: image_t = map_get(render_path_render_targets, "texpaint_undo" + history_undo_i)._image;
  73. krom_raytrace_set_textures(baketex0, baketex1, texpaint_undo, saved_envmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
  74. }
  75. if (context_raw.brush_time > 0) {
  76. context_raw.pdirty = 2;
  77. context_raw.rdirty = 2;
  78. }
  79. if (context_raw.pdirty > 0) {
  80. let f32a: f32_array_t = render_path_raytrace_f32a;
  81. f32a[0] = render_path_raytrace_frame++;
  82. f32a[1] = context_raw.bake_ao_strength;
  83. f32a[2] = context_raw.bake_ao_radius;
  84. f32a[3] = context_raw.bake_ao_offset;
  85. f32a[4] = scene_world.strength;
  86. f32a[5] = context_raw.bake_up_axis;
  87. f32a[6] = context_raw.envmap_angle;
  88. let framebuffer: image_t = map_get(render_path_render_targets, "baketex2")._image;
  89. krom_raytrace_dispatch_rays(framebuffer.render_target_, f32a.buffer);
  90. render_path_set_target("texpaint" + context_raw.layer.id);
  91. render_path_bind_target("baketex2", "tex");
  92. render_path_draw_shader("shader_datas/copy_pass/copy_pass");
  93. ///if krom_metal
  94. let samples_per_frame: i32 = 4;
  95. ///else
  96. let samples_per_frame: i32 = 64;
  97. ///end
  98. render_path_raytrace_bake_rays_pix = render_path_raytrace_frame * samples_per_frame;
  99. render_path_raytrace_bake_rays_counter += samples_per_frame;
  100. render_path_raytrace_bake_rays_timer += time_real_delta();
  101. if (render_path_raytrace_bake_rays_timer >= 1) {
  102. render_path_raytrace_bake_rays_sec = render_path_raytrace_bake_rays_counter;
  103. render_path_raytrace_bake_rays_timer = 0;
  104. render_path_raytrace_bake_rays_counter = 0;
  105. }
  106. render_path_raytrace_bake_current_sample++;
  107. krom_delay_idle_sleep();
  108. return true;
  109. }
  110. else {
  111. render_path_raytrace_frame = 0;
  112. render_path_raytrace_bake_rays_timer = 0;
  113. render_path_raytrace_bake_rays_counter = 0;
  114. render_path_raytrace_bake_current_sample = 0;
  115. return false;
  116. }
  117. }
  118. function render_path_raytrace_bake_get_bake_shader_name(): string {
  119. return context_raw.bake_type == bake_type_t.AO ? "raytrace_bake_ao" + render_path_raytrace_ext :
  120. context_raw.bake_type == bake_type_t.LIGHTMAP ? "raytrace_bake_light" + render_path_raytrace_ext :
  121. context_raw.bake_type == bake_type_t.BENT_NORMAL ? "raytrace_bake_bent" + render_path_raytrace_ext :
  122. "raytrace_bake_thick" + render_path_raytrace_ext;
  123. }
  124. ///end