Files
armorpaint/paint/sources/render_path_raytrace.ts
T

223 lines
8.0 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_frame: i32 = 0;
let render_path_raytrace_ready: bool = false;
let render_path_raytrace_dirty: i32 = 0;
let render_path_raytrace_uv_scale: f32 = 1.0;
2025-08-28 20:39:00 +02:00
let render_path_raytrace_init_shader: bool = true;
2024-03-20 16:13:54 +01:00
let render_path_raytrace_f32a: f32_array_t = f32_array_create(24);
2025-10-15 18:39:55 +02:00
let render_path_raytrace_help_mat: mat4_t = mat4_identity();
2024-11-25 19:27:39 +01:00
let render_path_raytrace_transform: mat4_t;
2025-06-19 19:55:16 +02:00
let render_path_raytrace_vb: gpu_buffer_t;
let render_path_raytrace_ib: gpu_buffer_t;
2024-03-13 23:50:11 +01:00
2025-06-19 19:55:16 +02:00
let render_path_raytrace_last_envmap: gpu_texture_t = null;
2025-10-15 18:39:55 +02:00
let render_path_raytrace_is_bake: bool = false;
2024-03-13 23:50:11 +01:00
2025-10-15 18:39:55 +02:00
/// if arm_direct3d12
2024-03-13 23:50:11 +01:00
let render_path_raytrace_ext: string = ".cso";
2025-10-15 18:39:55 +02:00
/// elseif arm_metal
2024-03-13 23:50:11 +01:00
let render_path_raytrace_ext: string = ".metal";
2025-10-15 18:39:55 +02:00
/// else
2024-03-13 23:50:11 +01:00
let render_path_raytrace_ext: string = ".spirv";
2025-10-15 18:39:55 +02:00
/// end
2024-03-13 23:50:11 +01:00
2025-06-19 19:55:16 +02:00
let render_path_raytrace_last_texpaint: gpu_texture_t = null;
2024-03-13 23:50:11 +01:00
2025-10-15 18:39:55 +02:00
function render_path_raytrace_init() {}
2024-03-13 23:50:11 +01:00
function render_path_raytrace_commands(use_live_layer: bool) {
if (!render_path_raytrace_ready || render_path_raytrace_is_bake) {
render_path_raytrace_ready = true;
2025-08-28 20:39:00 +02:00
if (render_path_raytrace_is_bake) {
2025-10-15 18:39:55 +02:00
render_path_raytrace_is_bake = false;
2025-08-28 20:39:00 +02:00
render_path_raytrace_init_shader = true;
}
2024-12-10 22:26:17 +01:00
let ext: string = "";
2025-08-14 21:45:07 +02:00
if (context_raw.tool == tool_type_t.GIZMO) {
ext = "forge_";
}
2025-01-10 18:25:45 +01:00
let mode: string = config_raw.pathtrace_mode == pathtrace_mode_t.FAST ? "core" : "full";
2024-12-10 22:26:17 +01:00
render_path_raytrace_raytrace_init("raytrace_brute_" + ext + mode + render_path_raytrace_ext);
2024-03-13 23:50:11 +01:00
render_path_raytrace_last_envmap = null;
}
if (!context_raw.envmap_loaded) {
context_load_envmap();
context_update_envmap();
}
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;
2024-03-13 23:50:11 +01:00
2025-06-20 23:53:10 +02:00
////
2024-03-13 23:50:11 +01:00
if (render_path_raytrace_last_envmap != saved_envmap) {
render_path_raytrace_last_envmap = saved_envmap;
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");
2024-03-13 23:50:11 +01:00
2024-11-10 16:53:36 +01:00
let l: slot_layer_t = layers_flatten(true);
2025-09-28 20:04:15 +02:00
gpu_raytrace_set_textures(l.texpaint, l.texpaint_nor, l.texpaint_pack, saved_envmap, bnoise_sobol, bnoise_scramble, bnoise_rank);
2024-03-13 23:50:11 +01:00
}
2025-06-20 23:53:10 +02:00
////
2024-03-13 23:50:11 +01:00
if (context_raw.pdirty > 0 || render_path_raytrace_dirty > 0) {
2024-11-10 16:53:36 +01:00
layers_flatten(true);
2024-03-13 23:50:11 +01:00
}
2025-10-15 18:39:55 +02:00
let cam: camera_object_t = scene_camera;
let ct: transform_t = cam.base.transform;
2024-09-08 21:53:39 +02:00
render_path_raytrace_help_mat = mat4_clone(cam.v);
render_path_raytrace_help_mat = mat4_mult_mat(render_path_raytrace_help_mat, cam.p);
2024-09-15 21:40:04 +02:00
render_path_raytrace_help_mat = mat4_inv(render_path_raytrace_help_mat);
2025-10-15 18:39:55 +02:00
render_path_raytrace_f32a[0] = transform_world_x(ct);
render_path_raytrace_f32a[1] = transform_world_y(ct);
render_path_raytrace_f32a[2] = transform_world_z(ct);
render_path_raytrace_f32a[3] = render_path_raytrace_frame;
/// if arm_metal
2024-11-29 17:35:26 +01:00
// render_path_raytrace_frame = (render_path_raytrace_frame % (16)) + 1; // _PAINT
2024-03-13 23:50:11 +01:00
render_path_raytrace_frame = render_path_raytrace_frame + 1; // _RENDER
2025-10-15 18:39:55 +02:00
/// else
2024-03-13 23:50:11 +01:00
render_path_raytrace_frame = (render_path_raytrace_frame % 4) + 1; // _PAINT
2024-11-25 19:27:39 +01:00
// render_path_raytrace_frame = render_path_raytrace_frame + 1; // _RENDER
2025-10-15 18:39:55 +02:00
/// end
render_path_raytrace_f32a[4] = render_path_raytrace_help_mat.m00;
render_path_raytrace_f32a[5] = render_path_raytrace_help_mat.m01;
render_path_raytrace_f32a[6] = render_path_raytrace_help_mat.m02;
render_path_raytrace_f32a[7] = render_path_raytrace_help_mat.m03;
render_path_raytrace_f32a[8] = render_path_raytrace_help_mat.m10;
render_path_raytrace_f32a[9] = render_path_raytrace_help_mat.m11;
2024-09-08 21:53:39 +02:00
render_path_raytrace_f32a[10] = render_path_raytrace_help_mat.m12;
render_path_raytrace_f32a[11] = render_path_raytrace_help_mat.m13;
render_path_raytrace_f32a[12] = render_path_raytrace_help_mat.m20;
render_path_raytrace_f32a[13] = render_path_raytrace_help_mat.m21;
render_path_raytrace_f32a[14] = render_path_raytrace_help_mat.m22;
render_path_raytrace_f32a[15] = render_path_raytrace_help_mat.m23;
render_path_raytrace_f32a[16] = render_path_raytrace_help_mat.m30;
render_path_raytrace_f32a[17] = render_path_raytrace_help_mat.m31;
render_path_raytrace_f32a[18] = render_path_raytrace_help_mat.m32;
render_path_raytrace_f32a[19] = render_path_raytrace_help_mat.m33;
2025-11-28 21:54:07 +01:00
render_path_raytrace_f32a[20] = scene_world.strength;
2024-03-20 16:13:54 +01:00
if (!context_raw.show_envmap) {
render_path_raytrace_f32a[20] = -render_path_raytrace_f32a[20];
}
2024-03-13 23:50:11 +01:00
render_path_raytrace_f32a[21] = context_raw.envmap_angle;
render_path_raytrace_f32a[22] = render_path_raytrace_uv_scale;
2025-11-28 21:54:07 +01:00
if (render_path_base_buf_swapped) {
render_path_base_swap_buf("buf");
}
2024-07-24 12:19:32 +02:00
let framebuffer: render_target_t = map_get(render_path_render_targets, "buf");
2025-09-28 20:04:15 +02:00
_gpu_raytrace_dispatch_rays(framebuffer._image, render_path_raytrace_f32a);
2024-03-13 23:50:11 +01:00
if (context_raw.ddirty == 1 || context_raw.pdirty == 1) {
2025-10-15 18:39:55 +02:00
/// if arm_metal
2024-03-13 23:50:11 +01:00
context_raw.rdirty = 128;
2025-10-15 18:39:55 +02:00
/// else
2024-03-13 23:50:11 +01:00
context_raw.rdirty = 4;
2025-10-15 18:39:55 +02:00
/// end
2024-03-13 23:50:11 +01:00
}
context_raw.ddirty--;
context_raw.pdirty--;
context_raw.rdirty--;
2024-11-27 00:26:07 +01:00
// context_raw.ddirty = 1; // _RENDER
2025-08-14 21:45:07 +02:00
if (context_raw.tool == tool_type_t.GIZMO) {
context_raw.ddirty = 1;
}
2024-03-13 23:50:11 +01:00
}
2025-08-28 19:39:03 +02:00
function render_path_raytrace_raytrace_init(shader_name: string, build: bool = true) {
2025-08-28 20:39:00 +02:00
if (render_path_raytrace_init_shader) {
render_path_raytrace_init_shader = false;
2024-03-13 23:50:11 +01:00
scene_embed_data("bnoise_sobol.k");
scene_embed_data("bnoise_scramble.k");
scene_embed_data("bnoise_rank.k");
2024-11-29 17:35:26 +01:00
let shader: buffer_t = data_get_blob(shader_name);
2025-09-28 20:04:15 +02:00
_gpu_raytrace_init(shader);
2024-03-13 23:50:11 +01:00
}
2024-03-20 16:13:54 +01:00
if (build) {
2025-08-28 19:39:03 +02:00
render_path_raytrace_build_data();
2024-03-20 16:13:54 +01:00
}
2024-11-29 17:35:26 +01:00
{
2025-09-28 20:04:15 +02:00
_gpu_raytrace_as_init();
2024-11-29 17:35:26 +01:00
2025-08-14 21:45:07 +02:00
if (context_raw.tool == tool_type_t.GIZMO) {
for (let i: i32 = 0; i < project_paint_objects.length; ++i) {
let po: mesh_object_t = project_paint_objects[i];
if (!po.base.visible) {
continue;
}
2025-09-28 20:04:15 +02:00
_gpu_raytrace_as_add(po.data._.vertex_buffer, po.data._.index_buffer, po.base.transform.world_unpack);
2024-12-04 19:22:30 +01:00
}
2024-11-29 17:35:26 +01:00
}
2025-08-14 21:45:07 +02:00
else {
2025-09-28 20:04:15 +02:00
_gpu_raytrace_as_add(render_path_raytrace_vb, render_path_raytrace_ib, render_path_raytrace_transform);
2025-08-14 21:45:07 +02:00
}
2024-11-29 17:35:26 +01:00
2025-06-19 19:55:16 +02:00
let vb_full: gpu_buffer_t = context_raw.merged_object.data._.vertex_buffer;
2025-08-12 20:59:34 +02:00
let ib_full: gpu_buffer_t = context_raw.merged_object.data._.index_buffer;
2024-11-29 17:35:26 +01:00
2025-09-28 20:04:15 +02:00
_gpu_raytrace_as_build(vb_full, ib_full);
2024-11-29 17:35:26 +01:00
}
2024-03-13 23:50:11 +01:00
}
2025-08-28 19:39:03 +02:00
function render_path_raytrace_build_data() {
2024-03-20 16:13:54 +01:00
if (context_raw.merged_object == null) {
util_mesh_merge();
}
2024-11-25 19:27:39 +01:00
2024-03-13 23:50:11 +01:00
let mo: mesh_object_t = !context_layer_filter_used() ? context_raw.merged_object : context_raw.paint_object;
2024-11-25 19:27:39 +01:00
2025-08-14 21:45:07 +02:00
if (context_raw.tool == tool_type_t.GIZMO) {
render_path_raytrace_transform = mo.base.transform.world_unpack;
}
else {
render_path_raytrace_transform = mat4_identity();
}
2025-01-02 16:32:43 +01:00
2025-08-28 19:39:03 +02:00
let sc: f32 = mo.base.transform.scale.x * mo.data.scale_pos;
if (mo.base.parent != null) {
sc *= mo.base.parent.transform.scale.x;
2025-01-02 16:32:43 +01:00
}
2025-08-28 19:39:03 +02:00
render_path_raytrace_transform = mat4_scale(render_path_raytrace_transform, vec4_create(sc, sc, sc));
2025-01-02 16:32:43 +01:00
2024-11-25 19:27:39 +01:00
render_path_raytrace_vb = mo.data._.vertex_buffer;
2025-08-12 20:59:34 +02:00
render_path_raytrace_ib = mo.data._.index_buffer;
2024-03-13 23:50:11 +01:00
}
2024-11-29 17:35:26 +01:00
function render_path_raytrace_draw(use_live_layer: bool) {
2024-03-14 15:31:22 +01:00
let is_live: bool = config_raw.brush_live && render_path_paint_live_layer_drawn > 0;
2024-03-20 16:13:54 +01:00
if (context_raw.ddirty > 1 || context_raw.pdirty > 0 || is_live) {
render_path_raytrace_frame = 0;
}
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
// Delay path tracing additional samples while painting
let down: bool = mouse_down() || pen_down();
2025-09-20 11:03:59 +02:00
if (context_in_3d_view() && down) {
2024-03-20 16:13:54 +01:00
render_path_raytrace_frame = 0;
}
2025-10-15 18:39:55 +02:00
/// end
2024-03-13 23:50:11 +01:00
2024-11-29 17:35:26 +01:00
render_path_raytrace_commands(use_live_layer);
2024-03-13 23:50:11 +01:00
render_path_set_target("buf");
render_path_draw_meshes("overlay");
render_path_set_target("buf");
render_path_base_draw_compass();
2025-03-25 16:26:22 +01:00
render_path_set_target("last");
2024-03-13 23:50:11 +01:00
render_path_bind_target("buf", "tex");
2025-09-23 16:57:33 +02:00
render_path_draw_shader("Scene/compositor_pass/compositor_pass");
2025-08-08 22:40:21 +02:00
render_path_base_draw_bloom("buf", "last");
2024-03-13 23:50:11 +01:00
render_path_set_target("");
2025-03-25 16:26:22 +01:00
render_path_bind_target("last", "tex");
2025-09-23 16:57:33 +02:00
render_path_draw_shader("Scene/copy_pass/copy_pass");
2025-09-16 20:44:07 +02:00
render_path_paint_commands_cursor();
2024-03-13 23:50:11 +01:00
}