render_path_raytrace_bake.ts 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. let render_path_raytrace_bake_rays_pix: i32 = 0;
  2. let render_path_raytrace_bake_rays_sec: i32 = 0;
  3. let render_path_raytrace_bake_current_sample: i32 = 0;
  4. let render_path_raytrace_bake_rays_timer: f32 = 0.0;
  5. let render_path_raytrace_bake_rays_counter: i32 = 0;
  6. let render_path_raytrace_bake_last_layer: gpu_texture_t = null;
  7. let render_path_raytrace_bake_last_bake_type: i32 = 0;
  8. let render_path_raytrace_bake_last_bake_type2: 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_type != context_raw.bake_type) {
  11. let rebuild: bool = !(render_path_raytrace_ready && render_path_raytrace_is_bake && render_path_raytrace_bake_last_bake_type != context_raw.bake_type);
  12. render_path_raytrace_bake_last_bake_type = 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. let baketex0: render_target_t = map_get(render_path_render_targets, "baketex0");
  19. let baketex1: render_target_t = map_get(render_path_render_targets, "baketex1");
  20. let baketex2: render_target_t = map_get(render_path_render_targets, "baketex2");
  21. gpu_delete_texture(baketex0._image);
  22. gpu_delete_texture(baketex1._image);
  23. gpu_delete_texture(baketex2._image);
  24. }
  25. {
  26. let t: render_target_t = render_target_create();
  27. t.name = "baketex0";
  28. t.width = config_get_texture_res_x();
  29. t.height = config_get_texture_res_y();
  30. t.format = "RGBA64";
  31. render_path_create_render_target(t);
  32. }
  33. {
  34. let t: render_target_t = render_target_create();
  35. t.name = "baketex1";
  36. t.width = config_get_texture_res_x();
  37. t.height = config_get_texture_res_y();
  38. t.format = "RGBA64";
  39. render_path_create_render_target(t);
  40. }
  41. {
  42. let t: render_target_t = render_target_create();
  43. t.name = "baketex2";
  44. t.width = config_get_texture_res_x();
  45. t.height = config_get_texture_res_y();
  46. t.format = "RGBA64"; // Match raytrace_target format
  47. render_path_create_render_target(t);
  48. }
  49. let _bake_type: bake_type_t = context_raw.bake_type;
  50. context_raw.bake_type = bake_type_t.INIT;
  51. parse_paint_material(true);
  52. render_path_set_target("baketex0", null, null, gpu_clear_t.COLOR, 0x00000000);
  53. // Pixels with alpha of 0.0 are skipped during raytracing
  54. let additional: string[] = [ "baketex1" ];
  55. render_path_set_target("baketex0", additional);
  56. render_path_draw_meshes("paint");
  57. context_raw.bake_type = _bake_type;
  58. sys_notify_on_next_frame(parse_paint_material);
  59. render_path_raytrace_init_shader = true;
  60. render_path_raytrace_raytrace_init(render_path_raytrace_bake_get_bake_shader_name(), rebuild);
  61. return false;
  62. }
  63. if (!context_raw.envmap_loaded) {
  64. context_load_envmap();
  65. context_update_envmap();
  66. }
  67. let probe: world_data_t = scene_world;
  68. let saved_envmap: gpu_texture_t = context_raw.show_envmap_blur ? probe._.radiance_mipmaps[0] : context_raw.saved_envmap;
  69. if (render_path_raytrace_last_envmap != saved_envmap || render_path_raytrace_bake_last_layer != context_raw.layer.texpaint ||
  70. render_path_raytrace_bake_last_bake_type2 != context_raw.bake_type) {
  71. render_path_raytrace_last_envmap = saved_envmap;
  72. render_path_raytrace_bake_last_layer = context_raw.layer.texpaint;
  73. render_path_raytrace_bake_last_bake_type2 = context_raw.bake_type;
  74. let bnoise_sobol: gpu_texture_t = map_get(scene_embedded, "bnoise_sobol.k");
  75. let bnoise_scramble: gpu_texture_t = map_get(scene_embedded, "bnoise_scramble.k");
  76. let bnoise_rank: gpu_texture_t = map_get(scene_embedded, "bnoise_rank.k");
  77. let baketex0: render_target_t = map_get(render_path_render_targets, "baketex0");
  78. let baketex1: render_target_t = map_get(render_path_render_targets, "baketex1");
  79. let tex2: gpu_texture_t = null;
  80. if (context_raw.bake_type == bake_type_t.LIGHTMAP) {
  81. let flat: slot_layer_t = layers_flatten(true);
  82. tex2 = flat.texpaint;
  83. }
  84. else {
  85. let texpaint_undo: render_target_t = map_get(render_path_render_targets, "texpaint_undo" + history_undo_i);
  86. tex2 = texpaint_undo._image;
  87. }
  88. gpu_raytrace_set_textures(baketex0._image, baketex1._image, tex2, saved_envmap, bnoise_sobol, bnoise_scramble, bnoise_rank);
  89. }
  90. if (context_raw.brush_time > 0) {
  91. context_raw.pdirty = 2;
  92. context_raw.rdirty = 2;
  93. }
  94. if (context_raw.pdirty > 0) {
  95. let f32a: f32_array_t = render_path_raytrace_f32a;
  96. f32a[0] = render_path_raytrace_frame++;
  97. f32a[1] = context_raw.bake_ao_strength;
  98. f32a[2] = context_raw.bake_ao_radius;
  99. f32a[3] = context_raw.bake_ao_offset;
  100. f32a[4] = scene_world.strength;
  101. f32a[5] = context_raw.bake_up_axis;
  102. f32a[6] = context_raw.envmap_angle;
  103. let framebuffer: render_target_t = map_get(render_path_render_targets, "baketex2");
  104. _gpu_raytrace_dispatch_rays(framebuffer._image, f32a);
  105. let id: i32 = context_raw.layer.id;
  106. let texpaint_id: string = "texpaint" + id;
  107. render_path_set_target(texpaint_id);
  108. render_path_bind_target("baketex2", "tex");
  109. render_path_draw_shader("Scene/copy_pass/copy_pass");
  110. /// if arm_metal
  111. let samples_per_frame: i32 = 4;
  112. /// else
  113. let samples_per_frame: i32 = 64;
  114. /// end
  115. render_path_raytrace_bake_rays_pix = render_path_raytrace_frame * samples_per_frame;
  116. render_path_raytrace_bake_rays_counter += samples_per_frame;
  117. render_path_raytrace_bake_rays_timer += sys_real_delta();
  118. if (render_path_raytrace_bake_rays_timer >= 1) {
  119. render_path_raytrace_bake_rays_sec = render_path_raytrace_bake_rays_counter;
  120. render_path_raytrace_bake_rays_timer = 0;
  121. render_path_raytrace_bake_rays_counter = 0;
  122. }
  123. render_path_raytrace_bake_current_sample++;
  124. iron_delay_idle_sleep();
  125. return true;
  126. }
  127. else {
  128. render_path_raytrace_frame = 0;
  129. render_path_raytrace_bake_rays_timer = 0;
  130. render_path_raytrace_bake_rays_counter = 0;
  131. render_path_raytrace_bake_current_sample = 0;
  132. return false;
  133. }
  134. }
  135. function render_path_raytrace_bake_get_bake_shader_name(): string {
  136. return context_raw.bake_type == bake_type_t.AO ? "raytrace_bake_ao" + render_path_raytrace_ext
  137. : context_raw.bake_type == bake_type_t.LIGHTMAP ? "raytrace_bake_light" + render_path_raytrace_ext
  138. : context_raw.bake_type == bake_type_t.BENT_NORMAL ? "raytrace_bake_bent" + render_path_raytrace_ext
  139. : "raytrace_bake_thick" + render_path_raytrace_ext;
  140. }