Files
armorpaint/paint/sources/render_path_raytrace_bake.ts
T

165 lines
6.9 KiB
TypeScript
Raw Normal View History

2024-03-13 23:50:11 +01:00
2025-10-15 18:39:55 +02:00
let render_path_raytrace_bake_rays_pix: i32 = 0;
let render_path_raytrace_bake_rays_sec: i32 = 0;
let render_path_raytrace_bake_current_sample: i32 = 0;
let render_path_raytrace_bake_rays_timer: f32 = 0.0;
let render_path_raytrace_bake_rays_counter: i32 = 0;
2025-06-19 19:55:16 +02:00
let render_path_raytrace_bake_last_layer: gpu_texture_t = null;
2025-10-15 18:39:55 +02:00
let render_path_raytrace_bake_last_bake_type: i32 = 0;
let render_path_raytrace_bake_last_bake_type2: i32 = 0;
2024-03-13 23:50:11 +01:00
2025-10-15 18:39:55 +02:00
function render_path_raytrace_bake_commands(parse_paint_material: (b?: bool) => void): bool {
2024-03-13 23:50:11 +01:00
2025-10-15 18:39:55 +02:00
if (!render_path_raytrace_ready || !render_path_raytrace_is_bake || render_path_raytrace_bake_last_bake_type != context_raw.bake_type) {
2025-09-15 17:47:04 +02:00
let rebuild: bool = !(render_path_raytrace_ready && render_path_raytrace_is_bake && render_path_raytrace_bake_last_bake_type != context_raw.bake_type);
render_path_raytrace_bake_last_bake_type = context_raw.bake_type;
2025-10-15 18:39:55 +02:00
render_path_raytrace_ready = true;
render_path_raytrace_is_bake = true;
render_path_raytrace_last_envmap = null;
render_path_raytrace_bake_last_layer = null;
2024-03-13 23:50:11 +01:00
2024-03-20 16:13:54 +01:00
if (map_get(render_path_render_targets, "baketex0") != null) {
2024-07-24 12:19:32 +02:00
let baketex0: render_target_t = map_get(render_path_render_targets, "baketex0");
let baketex1: render_target_t = map_get(render_path_render_targets, "baketex1");
let baketex2: render_target_t = map_get(render_path_render_targets, "baketex2");
2025-09-28 19:38:08 +02:00
gpu_delete_texture(baketex0._image);
gpu_delete_texture(baketex1._image);
gpu_delete_texture(baketex2._image);
2024-03-13 23:50:11 +01:00
}
{
let t: render_target_t = render_target_create();
2025-10-15 18:39:55 +02:00
t.name = "baketex0";
t.width = config_get_texture_res_x();
t.height = config_get_texture_res_y();
t.format = "RGBA64";
2024-03-13 23:50:11 +01:00
render_path_create_render_target(t);
}
{
let t: render_target_t = render_target_create();
2025-10-15 18:39:55 +02:00
t.name = "baketex1";
t.width = config_get_texture_res_x();
t.height = config_get_texture_res_y();
t.format = "RGBA64";
2024-03-13 23:50:11 +01:00
render_path_create_render_target(t);
}
{
let t: render_target_t = render_target_create();
2025-10-15 18:39:55 +02:00
t.name = "baketex2";
t.width = config_get_texture_res_x();
t.height = config_get_texture_res_y();
t.format = "RGBA64"; // Match raytrace_target format
2024-03-13 23:50:11 +01:00
render_path_create_render_target(t);
}
let _bake_type: bake_type_t = context_raw.bake_type;
2025-10-15 18:39:55 +02:00
context_raw.bake_type = bake_type_t.INIT;
2024-07-24 12:19:32 +02:00
parse_paint_material(true);
2025-07-01 14:46:40 +02:00
render_path_set_target("baketex0", null, null, clear_flag_t.COLOR, 0x00000000);
2025-04-24 22:19:44 +02:00
// Pixels with alpha of 0.0 are skipped during raytracing
2025-10-15 18:39:55 +02:00
let additional: string[] = [ "baketex1" ];
2024-07-24 12:19:32 +02:00
render_path_set_target("baketex0", additional);
2024-03-13 23:50:11 +01:00
render_path_draw_meshes("paint");
context_raw.bake_type = _bake_type;
2025-03-11 19:49:42 +01:00
sys_notify_on_next_frame(parse_paint_material);
2024-03-13 23:50:11 +01:00
2025-08-28 20:39:00 +02:00
render_path_raytrace_init_shader = true;
2025-08-28 19:39:03 +02:00
render_path_raytrace_raytrace_init(render_path_raytrace_bake_get_bake_shader_name(), rebuild);
2024-03-13 23:50:11 +01:00
return false;
}
if (!context_raw.envmap_loaded) {
context_load_envmap();
context_update_envmap();
}
2025-01-12 12:00:58 +01:00
2025-10-15 18:39:55 +02:00
let probe: world_data_t = scene_world;
2025-06-19 19:55:16 +02:00
let saved_envmap: gpu_texture_t = context_raw.show_envmap_blur ? probe._.radiance_mipmaps[0] : context_raw.saved_envmap;
2025-01-12 12:00:58 +01:00
2025-10-15 18:39:55 +02:00
if (render_path_raytrace_last_envmap != saved_envmap || render_path_raytrace_bake_last_layer != context_raw.layer.texpaint ||
render_path_raytrace_bake_last_bake_type2 != context_raw.bake_type) {
2025-09-15 17:47:04 +02:00
2025-10-15 18:39:55 +02:00
render_path_raytrace_last_envmap = saved_envmap;
render_path_raytrace_bake_last_layer = context_raw.layer.texpaint;
2025-09-15 17:47:04 +02:00
render_path_raytrace_bake_last_bake_type2 = context_raw.bake_type;
2024-03-13 23:50:11 +01:00
2025-10-15 18:39:55 +02:00
let bnoise_sobol: gpu_texture_t = map_get(scene_embedded, "bnoise_sobol.k");
2025-06-19 19:55:16 +02:00
let bnoise_scramble: gpu_texture_t = map_get(scene_embedded, "bnoise_scramble.k");
2025-10-15 18:39:55 +02:00
let bnoise_rank: gpu_texture_t = map_get(scene_embedded, "bnoise_rank.k");
2025-01-12 12:00:58 +01:00
let baketex0: render_target_t = map_get(render_path_render_targets, "baketex0");
let baketex1: render_target_t = map_get(render_path_render_targets, "baketex1");
2025-09-15 17:47:04 +02:00
let tex2: gpu_texture_t = null;
if (context_raw.bake_type == bake_type_t.LIGHTMAP) {
let flat: slot_layer_t = layers_flatten(true);
2025-10-15 18:39:55 +02:00
tex2 = flat.texpaint;
2025-09-15 17:47:04 +02:00
}
else {
let texpaint_undo: render_target_t = map_get(render_path_render_targets, "texpaint_undo" + history_undo_i);
2025-10-15 18:39:55 +02:00
tex2 = texpaint_undo._image;
2025-09-15 17:47:04 +02:00
}
2025-09-28 20:04:15 +02:00
gpu_raytrace_set_textures(baketex0._image, baketex1._image, tex2, saved_envmap, bnoise_sobol, bnoise_scramble, bnoise_rank);
2024-03-13 23:50:11 +01:00
}
if (context_raw.brush_time > 0) {
context_raw.pdirty = 2;
context_raw.rdirty = 2;
}
if (context_raw.pdirty > 0) {
2024-03-20 16:13:54 +01:00
let f32a: f32_array_t = render_path_raytrace_f32a;
2025-10-15 18:39:55 +02:00
f32a[0] = render_path_raytrace_frame++;
f32a[1] = context_raw.bake_ao_strength;
f32a[2] = context_raw.bake_ao_radius;
f32a[3] = context_raw.bake_ao_offset;
f32a[4] = scene_world.strength;
f32a[5] = context_raw.bake_up_axis;
f32a[6] = context_raw.envmap_angle;
2024-03-13 23:50:11 +01:00
2024-07-24 12:19:32 +02:00
let framebuffer: render_target_t = map_get(render_path_render_targets, "baketex2");
2025-09-28 20:04:15 +02:00
_gpu_raytrace_dispatch_rays(framebuffer._image, f32a);
2024-03-13 23:50:11 +01:00
2025-10-15 18:39:55 +02:00
let id: i32 = context_raw.layer.id;
2024-07-24 12:19:32 +02:00
let texpaint_id: string = "texpaint" + id;
render_path_set_target(texpaint_id);
2024-03-13 23:50:11 +01:00
render_path_bind_target("baketex2", "tex");
2025-09-23 16:57:33 +02:00
render_path_draw_shader("Scene/copy_pass/copy_pass");
2024-03-13 23:50:11 +01:00
2025-10-15 18:39:55 +02:00
/// if arm_metal
2024-03-13 23:50:11 +01:00
let samples_per_frame: i32 = 4;
2025-10-15 18:39:55 +02:00
/// else
2024-03-13 23:50:11 +01:00
let samples_per_frame: i32 = 64;
2025-10-15 18:39:55 +02:00
/// end
2024-03-13 23:50:11 +01:00
render_path_raytrace_bake_rays_pix = render_path_raytrace_frame * samples_per_frame;
render_path_raytrace_bake_rays_counter += samples_per_frame;
2025-03-11 19:49:42 +01:00
render_path_raytrace_bake_rays_timer += sys_real_delta();
2024-03-13 23:50:11 +01:00
if (render_path_raytrace_bake_rays_timer >= 1) {
2025-10-15 18:39:55 +02:00
render_path_raytrace_bake_rays_sec = render_path_raytrace_bake_rays_counter;
render_path_raytrace_bake_rays_timer = 0;
2024-03-13 23:50:11 +01:00
render_path_raytrace_bake_rays_counter = 0;
}
render_path_raytrace_bake_current_sample++;
2024-09-03 16:39:16 +02:00
iron_delay_idle_sleep();
2024-03-13 23:50:11 +01:00
return true;
}
else {
2025-10-15 18:39:55 +02:00
render_path_raytrace_frame = 0;
render_path_raytrace_bake_rays_timer = 0;
render_path_raytrace_bake_rays_counter = 0;
2024-03-13 23:50:11 +01:00
render_path_raytrace_bake_current_sample = 0;
return false;
}
}
function render_path_raytrace_bake_get_bake_shader_name(): string {
2025-10-15 18:39:55 +02:00
return context_raw.bake_type == bake_type_t.AO ? "raytrace_bake_ao" + render_path_raytrace_ext
: context_raw.bake_type == bake_type_t.LIGHTMAP ? "raytrace_bake_light" + render_path_raytrace_ext
: context_raw.bake_type == bake_type_t.BENT_NORMAL ? "raytrace_bake_bent" + render_path_raytrace_ext
: "raytrace_bake_thick" + render_path_raytrace_ext;
2024-03-13 23:50:11 +01:00
}