Files
armorpaint/lab/sources/render_path_paint.ts
T

298 lines
10 KiB
TypeScript
Raw Normal View History

2024-03-14 15:31:22 +01:00
2024-11-06 20:01:05 +01:00
let render_path_paint_live_layer: slot_layer_t = null;
let render_path_paint_live_layer_locked: bool = false;
2024-03-14 15:31:22 +01:00
let render_path_paint_live_layer_drawn: i32 = 0; ////
function render_path_paint_init() {
{
2024-08-31 17:24:01 +02:00
let t: render_target_t = render_target_create();
2024-03-14 15:31:22 +01:00
t.name = "texpaint_blend0";
t.width = config_get_texture_res_x();
t.height = config_get_texture_res_y();
t.format = "R8";
render_path_create_render_target(t);
}
{
2024-08-31 17:24:01 +02:00
let t: render_target_t = render_target_create();
2024-03-14 15:31:22 +01:00
t.name = "texpaint_blend1";
t.width = config_get_texture_res_x();
t.height = config_get_texture_res_y();
t.format = "R8";
render_path_create_render_target(t);
}
{
2024-08-31 17:24:01 +02:00
let t: render_target_t = render_target_create();
2024-03-14 15:31:22 +01:00
t.name = "texpaint_picker";
t.width = 1;
t.height = 1;
t.format = "RGBA32";
render_path_create_render_target(t);
}
{
2024-08-31 17:24:01 +02:00
let t: render_target_t = render_target_create();
2024-03-14 15:31:22 +01:00
t.name = "texpaint_nor_picker";
t.width = 1;
t.height = 1;
t.format = "RGBA32";
render_path_create_render_target(t);
}
{
2024-08-31 17:24:01 +02:00
let t: render_target_t = render_target_create();
2024-03-14 15:31:22 +01:00
t.name = "texpaint_pack_picker";
t.width = 1;
t.height = 1;
t.format = "RGBA32";
render_path_create_render_target(t);
}
{
2024-08-31 17:24:01 +02:00
let t: render_target_t = render_target_create();
2024-03-14 15:31:22 +01:00
t.name = "texpaint_uv_picker";
t.width = 1;
t.height = 1;
t.format = "RGBA32";
render_path_create_render_target(t);
}
render_path_load_shader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
}
function render_path_paint_commands_paint(dilation: bool = true) {
2024-08-31 17:24:01 +02:00
let tid: string = "";
2024-03-14 15:31:22 +01:00
if (context_raw.pdirty > 0) {
if (context_raw.tool == workspace_tool_t.PICKER) {
2024-10-19 19:44:38 +02:00
let additional: string[] = ["texpaint_nor_picker", "texpaint_pack_picker", "texpaint_uv_picker"];
render_path_set_target("texpaint_picker", additional);
2024-03-14 15:31:22 +01:00
render_path_bind_target("gbuffer2", "gbuffer2");
// tid = context_raw.layer.id;
render_path_bind_target("texpaint" + tid, "texpaint");
render_path_bind_target("texpaint_nor" + tid, "texpaint_nor");
render_path_bind_target("texpaint_pack" + tid, "texpaint_pack");
render_path_draw_meshes("paint");
ui_header_handle.redraws = 2;
2024-10-19 19:44:38 +02:00
let texpaint_picker: render_target_t = map_get(render_path_render_targets, "texpaint_picker");
let texpaint_nor_picker: render_target_t = map_get(render_path_render_targets, "texpaint_nor_picker");
let texpaint_pack_picker: render_target_t = map_get(render_path_render_targets, "texpaint_pack_picker");
let texpaint_uv_picker: render_target_t = map_get(render_path_render_targets, "texpaint_uv_picker");
2025-03-10 20:38:53 +01:00
let a: buffer_t = gpu_get_texture_pixels(texpaint_picker._image);
let b: buffer_t = gpu_get_texture_pixels(texpaint_nor_picker._image);
let c: buffer_t = gpu_get_texture_pixels(texpaint_pack_picker._image);
let d: buffer_t = gpu_get_texture_pixels(texpaint_uv_picker._image);
2024-03-14 15:31:22 +01:00
if (context_raw.color_picker_callback != null) {
context_raw.color_picker_callback(context_raw.picked_color);
}
// Picked surface values
2024-09-06 21:11:46 +02:00
// ///if (arm_metal || arm_vulkan)
2025-01-02 16:32:43 +01:00
// context_raw.picked_color.base.Rb = a.get(2);
// context_raw.picked_color.base.Gb = a.get(1);
// context_raw.picked_color.base.Bb = a.get(0);
// context_raw.picked_color.normal.Rb = b.get(2);
// context_raw.picked_color.normal.Gb = b.get(1);
// context_raw.picked_color.normal.Bb = b.get(0);
// context_raw.picked_color.occlusion = c.get(2) / 255;
// context_raw.picked_color.roughness = c.get(1) / 255;
// context_raw.picked_color.metallic = c.get(0) / 255;
// context_raw.picked_color.height = c.get(3) / 255;
// context_raw.picked_color.opacity = a.get(3) / 255;
// context_raw.uvx_picked = d.get(2) / 255;
// context_raw.uvy_picked = d.get(1) / 255;
2024-03-14 15:31:22 +01:00
// ///else
2025-01-02 16:32:43 +01:00
// context_raw.picked_color.base.Rb = a.get(0);
// context_raw.picked_color.base.Gb = a.get(1);
// context_raw.picked_color.base.Bb = a.get(2);
// context_raw.picked_color.normal.Rb = b.get(0);
// context_raw.picked_color.normal.Gb = b.get(1);
// context_raw.picked_color.normal.Bb = b.get(2);
// context_raw.picked_color.occlusion = c.get(0) / 255;
// context_raw.picked_color.roughness = c.get(1) / 255;
// context_raw.picked_color.metallic = c.get(2) / 255;
// context_raw.picked_color.height = c.get(3) / 255;
// context_raw.picked_color.opacity = a.get(3) / 255;
// context_raw.uvx_picked = d.get(0) / 255;
// context_raw.uvy_picked = d.get(1) / 255;
2024-03-14 15:31:22 +01:00
// ///end
}
else {
2024-08-31 17:24:01 +02:00
let texpaint: string = "texpaint_node_target";
2024-03-14 15:31:22 +01:00
render_path_set_target("texpaint_blend1");
render_path_bind_target("texpaint_blend0", "tex");
render_path_draw_shader("shader_datas/copy_pass/copyR8_pass");
2024-10-19 19:44:38 +02:00
let additional: string[] = ["texpaint_nor" + tid, "texpaint_pack" + tid, "texpaint_blend0"];
render_path_set_target(texpaint, additional);
2024-03-14 15:31:22 +01:00
2025-07-01 14:46:40 +02:00
render_path_bind_target("main", "gbufferD");
2024-03-14 15:31:22 +01:00
render_path_bind_target("texpaint_blend1", "paintmask");
// Read texcoords from gbuffer
2024-08-31 17:24:01 +02:00
let read_tc: bool = context_raw.tool == workspace_tool_t.CLONE ||
context_raw.tool == workspace_tool_t.BLUR ||
context_raw.tool == workspace_tool_t.SMUDGE;
if (read_tc) {
2024-03-14 15:31:22 +01:00
render_path_bind_target("gbuffer2", "gbuffer2");
}
render_path_draw_meshes("paint");
}
}
}
function render_path_paint_commands_cursor() {
2024-08-31 17:24:01 +02:00
let tool: workspace_tool_t = context_raw.tool;
2024-03-14 15:31:22 +01:00
if (tool != workspace_tool_t.ERASER &&
tool != workspace_tool_t.CLONE &&
tool != workspace_tool_t.BLUR &&
tool != workspace_tool_t.SMUDGE) {
return;
}
2024-09-03 15:52:05 +02:00
let nodes: ui_nodes_t = ui_nodes_get_nodes();
let canvas: ui_node_canvas_t = ui_nodes_get_canvas(true);
2024-10-26 15:17:05 +02:00
let inpaint: bool = nodes.nodes_selected_id.length > 0 && ui_get_node(canvas.nodes, nodes.nodes_selected_id[0]).type == "inpaint_node";
2024-03-14 15:31:22 +01:00
if (!base_ui_enabled || base_is_dragging || !inpaint) {
return;
}
2024-08-31 17:24:01 +02:00
let mx: f32 = context_raw.paint_vec.x;
let my: f32 = 1.0 - context_raw.paint_vec.y;
2024-03-14 15:31:22 +01:00
if (context_raw.brush_locked) {
2025-03-11 19:49:42 +01:00
mx = (context_raw.lock_started_x - sys_x()) / sys_w();
my = 1.0 - (context_raw.lock_started_y - sys_y()) / sys_h();
2024-03-14 15:31:22 +01:00
}
2024-08-31 17:24:01 +02:00
let radius: f32 = context_raw.brush_radius;
2024-03-14 15:31:22 +01:00
render_path_paint_draw_cursor(mx, my, radius / 3.4);
}
function render_path_paint_draw_cursor(mx: f32, my: f32, radius: f32, tint_r: f32 = 1.0, tint_g: f32 = 1.0, tint_b: f32 = 1.0) {
2024-08-31 17:24:01 +02:00
let plane: mesh_object_t = scene_get_child(".Plane").ext;
let geom: mesh_data_t = plane.data;
2024-03-14 15:31:22 +01:00
render_path_set_target("");
2025-06-19 19:55:16 +02:00
gpu_set_pipeline(pipes_cursor);
2025-07-01 14:46:40 +02:00
let rt: render_target_t = map_get(render_path_render_targets, "main");
let main: gpu_texture_t = rt._image;
gpu_set_texture(pipes_cursor_gbufferd, main);
2025-03-18 12:14:21 +01:00
gpu_set_float2(pipes_cursor_mouse, mx, my);
2025-07-01 14:46:40 +02:00
gpu_set_float2(pipes_cursor_tex_step, 1 / main.width, 1 / main.height);
2025-03-18 12:14:21 +01:00
gpu_set_float(pipes_cursor_radius, radius);
2024-09-08 21:53:39 +02:00
let right: vec4_t = vec4_norm(camera_object_right_world(scene_camera));
2025-03-18 12:14:21 +01:00
gpu_set_float3(pipes_cursor_camera_right, right.x, right.y, right.z);
gpu_set_float3(pipes_cursor_tint, tint_r, tint_g, tint_b);
gpu_set_matrix4(pipes_cursor_vp, scene_camera.vp);
2025-04-21 19:38:23 +02:00
let inv_vp: mat4_t = mat4_inv(scene_camera.vp);
gpu_set_matrix4(pipes_cursor_inv_vp, inv_vp);
2025-06-19 19:55:16 +02:00
gpu_set_vertex_buffer(geom._.vertex_buffer);
gpu_set_index_buffer(geom._.index_buffers[0]);
2025-04-24 22:19:44 +02:00
gpu_draw();
2024-03-14 15:31:22 +01:00
render_path_end();
}
function render_path_paint_paint_enabled(): bool {
return !context_raw.foreground_event;
}
function render_path_paint_begin() {
2024-03-20 16:13:54 +01:00
if (!render_path_paint_paint_enabled()) {
return;
}
2024-03-14 15:31:22 +01:00
}
function render_path_paint_end() {
context_raw.ddirty--;
context_raw.rdirty--;
2024-03-20 16:13:54 +01:00
if (!render_path_paint_paint_enabled()) {
return;
}
2024-03-14 15:31:22 +01:00
context_raw.pdirty--;
}
function render_path_paint_draw() {
2024-03-20 16:13:54 +01:00
if (!render_path_paint_paint_enabled()) {
return;
}
2024-03-14 15:31:22 +01:00
render_path_paint_commands_paint();
if (context_raw.brush_blend_dirty) {
context_raw.brush_blend_dirty = false;
2025-07-01 14:46:40 +02:00
render_path_set_target("texpaint_blend0", null, null, clear_flag_t.COLOR, 0x00000000);
render_path_set_target("texpaint_blend1", null, null, clear_flag_t.COLOR, 0x00000000);
2025-07-12 15:21:08 +02:00
render_path_end();
2024-03-14 15:31:22 +01:00
}
}
function render_path_paint_bind_layers() {
2025-06-19 19:55:16 +02:00
let image: gpu_texture_t = null;
2024-09-03 15:52:05 +02:00
let nodes: ui_nodes_t = ui_nodes_get_nodes();
let canvas: ui_node_canvas_t = ui_nodes_get_canvas(true);
2024-03-14 15:31:22 +01:00
if (nodes.nodes_selected_id.length > 0) {
2024-09-03 15:52:05 +02:00
let node: ui_node_t = ui_get_node(canvas.nodes, nodes.nodes_selected_id[0]);
2024-10-21 19:28:43 +02:00
let brush_node: logic_node_ext_t = parser_logic_get_logic_node(node);
2024-04-15 21:28:01 +02:00
if (brush_node != null) {
2024-10-21 19:28:43 +02:00
image = logic_node_get_cached_image(brush_node.base);
2024-03-14 15:31:22 +01:00
}
}
if (image != null) {
2024-03-20 16:13:54 +01:00
if (map_get(render_path_render_targets, "texpaint_node") == null) {
2024-08-31 17:24:01 +02:00
let t: render_target_t = render_target_create();
2024-03-14 15:31:22 +01:00
t.name = "texpaint_node";
t.width = config_get_texture_res_x();
t.height = config_get_texture_res_y();
t.format = "RGBA32";
2024-03-20 16:13:54 +01:00
map_set(render_path_render_targets, t.name, t);
2024-03-14 15:31:22 +01:00
}
2024-03-20 16:13:54 +01:00
if (map_get(render_path_render_targets, "texpaint_node_target") == null) {
2024-08-31 17:24:01 +02:00
let t: render_target_t = render_target_create();
2024-03-14 15:31:22 +01:00
t.name = "texpaint_node_target";
t.width = config_get_texture_res_x();
t.height = config_get_texture_res_y();
t.format = "RGBA32";
2024-03-20 16:13:54 +01:00
map_set(render_path_render_targets, t.name, t);
2024-03-14 15:31:22 +01:00
}
2024-10-19 19:44:38 +02:00
let texpaint_node_rt: render_target_t = map_get(render_path_render_targets, "texpaint_node");
texpaint_node_rt._image = image;
2024-03-14 15:31:22 +01:00
render_path_bind_target("texpaint_node", "texpaint");
render_path_bind_target("texpaint_nor_empty", "texpaint_nor");
render_path_bind_target("texpaint_pack_empty", "texpaint_pack");
2024-09-03 15:52:05 +02:00
let nodes: ui_nodes_t = ui_nodes_get_nodes();
let canvas: ui_node_canvas_t = ui_nodes_get_canvas(true);
let node: ui_node_t = ui_get_node(canvas.nodes, nodes.nodes_selected_id[0]);
2024-10-26 15:17:05 +02:00
let inpaint: bool = node.type == "inpaint_node";
2024-03-14 15:31:22 +01:00
if (inpaint) {
2024-10-19 19:44:38 +02:00
let texpaint_node_target_rt: render_target_t = map_get(render_path_render_targets, "texpaint_node_target");
texpaint_node_target_rt._image = inpaint_node_get_target();
2024-03-14 15:31:22 +01:00
}
}
else {
render_path_bind_target("texpaint", "texpaint");
render_path_bind_target("texpaint_nor", "texpaint_nor");
render_path_bind_target("texpaint_pack", "texpaint_pack");
}
}
function render_path_paint_unbind_layers() {
}
2024-11-06 20:01:05 +01:00
function render_path_paint_use_live_layer(use: bool) {
}
function render_path_paint_set_plane_mesh() {
}
function render_path_paint_restore_plane_mesh() {
}
2024-11-07 18:15:01 +01:00
function render_path_paint_dilate(base: bool, nor_pack: bool) {
}