From eb9160d1cbf8cb7bcf80d5f168578c7e6ed8aa64 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Mon, 21 Oct 2024 19:28:43 +0200 Subject: [PATCH] lab fixes --- armorlab/assets/Scene.arm | Bin 148682 -> 148703 bytes armorlab/project.js | 1 + armorlab/sources/nodes/brush_output_node.ts | 3 +- armorlab/sources/nodes/image_texture_node.ts | 11 +++-- armorlab/sources/nodes/inpaint_node.ts | 12 +++--- armorlab/sources/nodes/photo_to_pbr_node.ts | 6 +-- armorlab/sources/nodes/rgb_node.ts | 5 ++- armorlab/sources/nodes/text_to_photo_node.ts | 38 +++++++++++++----- armorlab/sources/nodes/tiling_node.ts | 12 +++--- armorlab/sources/nodes/upscale_node.ts | 6 +-- armorlab/sources/nodes/variance_node.ts | 12 +++--- armorlab/sources/nodes_brush.ts | 9 +++++ armorlab/sources/render_path_paint.ts | 4 +- armorlab/sources/ui_nodes_ext.ts | 5 +++ armorpaint/sources/nodes/brush_output_node.ts | 2 +- armorpaint/sources/nodes/input_node.ts | 2 +- armorpaint/sources/nodes/tex_image_node.ts | 4 +- .../sources/nodes/brush_output_node.ts | 2 +- base/sources/base.ts | 27 ++++++++----- base/sources/export_arm.ts | 2 +- base/sources/import_arm.ts | 2 +- base/sources/logic_node.ts | 29 ++++++++----- base/sources/nodes/boolean_node.ts | 2 +- base/sources/nodes/color_node.ts | 2 +- base/sources/nodes/float_node.ts | 2 +- base/sources/nodes/integer_node.ts | 2 +- base/sources/nodes/math_node.ts | 2 +- base/sources/nodes/null_node.ts | 2 +- base/sources/nodes/random_node.ts | 2 +- base/sources/nodes/separate_vector_node.ts | 2 +- base/sources/nodes/string_node.ts | 2 +- base/sources/nodes/time_node.ts | 2 +- base/sources/nodes/vector_math_node.ts | 2 +- base/sources/nodes/vector_node.ts | 2 +- base/sources/nodes_material.ts | 1 - base/sources/parser_logic.ts | 6 +-- base/sources/ui_base.ts | 36 ++++------------- base/sources/ui_menubar.ts | 2 +- base/sources/ui_nodes.ts | 6 +-- base/sources/ui_view2d.ts | 4 +- 40 files changed, 154 insertions(+), 119 deletions(-) diff --git a/armorlab/assets/Scene.arm b/armorlab/assets/Scene.arm index 8242321fe761b557d835735e0bd6202dbbfceb7e..195c4b80b38532616a1c5b53c8e82180218e3b2a 100644 GIT binary patch delta 37 tcmX@r$$7t%v!R7?3)2^CM)B!it(i7Yf9}8}yxqi-Ns4j%0b3?6b^sj04JQBq delta 26 icmccL$$6@iv!R7?3)2^CMzQH%t(i7&-)qC9!~p=7g9;}A diff --git a/armorlab/project.js b/armorlab/project.js index 141fca44..e331ea8a 100644 --- a/armorlab/project.js +++ b/armorlab/project.js @@ -21,6 +21,7 @@ project.add_assets("../armorpaint/assets/plugins/hello_node_brush.js", { destina project.add_assets("../armorpaint/assets/plugins/import_svg.js", { destination: "data/plugins/{name}" }); project.add_assets("assets/meshes/*", { destination: "data/meshes/{name}", noembed: true }); project.add_assets("assets/models/*.onnx", { destination: "data/models/{name}" }); +project.add_assets("assets/models/*.json", { destination: "data/models/{name}" }); project.add_assets("assets/models/LICENSE.txt", { destination: "data/models/LICENSE.txt" }); project.add_assets("assets/readme/readme.txt", { destination: "{name}" }); diff --git a/armorlab/sources/nodes/brush_output_node.ts b/armorlab/sources/nodes/brush_output_node.ts index f2dd1f03..33c4cc7a 100644 --- a/armorlab/sources/nodes/brush_output_node.ts +++ b/armorlab/sources/nodes/brush_output_node.ts @@ -13,7 +13,8 @@ let brush_output_node_inst: brush_output_node_t = null; function brush_output_node_create(raw: ui_node_t, args: f32_array_t): brush_output_node_t { let n: brush_output_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); + n.base.get_as_image = brush_output_node_get_as_image; if (brush_output_node_inst == null) { { diff --git a/armorlab/sources/nodes/image_texture_node.ts b/armorlab/sources/nodes/image_texture_node.ts index 0bfd02e0..1742e2d1 100644 --- a/armorlab/sources/nodes/image_texture_node.ts +++ b/armorlab/sources/nodes/image_texture_node.ts @@ -1,20 +1,23 @@ type image_texture_node_t = { base?: logic_node_t; - file?: string; - color_space?: string; + raw?: ui_node_t; }; function image_texture_node_create(raw: ui_node_t, args: f32_array_t): image_texture_node_t { let n: image_texture_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get_as_image = image_texture_node_get_as_image; n.base.get_cached_image = image_texture_node_get_cached_image; + n.raw = raw; return n; } function image_texture_node_get_as_image(self: image_texture_node_t, from: i32): image_t { - let index: i32 = array_index_of(project_asset_names, self.file); + if (project_assets.length == 0) { + return null; + } + let index: i32 = self.raw.buttons[0].default_value[0]; let asset: asset_t = project_assets[index]; return project_get_image(asset); } diff --git a/armorlab/sources/nodes/inpaint_node.ts b/armorlab/sources/nodes/inpaint_node.ts index b6849021..42fb0c9a 100644 --- a/armorlab/sources/nodes/inpaint_node.ts +++ b/armorlab/sources/nodes/inpaint_node.ts @@ -16,7 +16,7 @@ let inpaint_node_auto: bool = true; function inpaint_node_create(raw: ui_node_t, args: f32_array_t): inpaint_node_t { let n: inpaint_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get_as_image = inpaint_node_get_as_image; n.base.get_cached_image = inpaint_node_get_cached_image; @@ -48,7 +48,9 @@ function inpaint_node_init() { } } -function inpaint_node_buttons(ui: ui_t, nodes: ui_nodes_t, node: ui_node_t) { +function inpaint_node_button(node_id: i32) { + let node: ui_node_t = ui_get_node(ui_nodes_get_canvas(true).nodes, node_id); + inpaint_node_auto = node.buttons[0].default_value == 0 ? false : true; if (!inpaint_node_auto) { @@ -163,7 +165,7 @@ function inpaint_node_sd_inpaint(image: image_t, mask: image_t): image_t { f32a[i + 512 * 512 * 2] = (u8a[i * 4 + 2] / 255.0) * 2.0 - 1.0; } - let tensors: buffer_t[] = [f32a.buffer]; + let tensors: buffer_t[] = [buffer_create_from_raw(f32a.buffer, f32a.length * 4)]; let input_shape: i32_array_t[] = []; let input_shape0: i32[] = [1, 3, 512, 512]; array_push(input_shape, input_shape0); @@ -246,10 +248,10 @@ let inpaint_node_def: ui_node_t = { height: 0 }, { - name: "inpaint_node_buttons", + name: "inpaint_node_button", type: "CUSTOM", output: -1, - default_value: null, + default_value: f32_array_create_x(0), data: null, min: 0.0, max: 1.0, diff --git a/armorlab/sources/nodes/photo_to_pbr_node.ts b/armorlab/sources/nodes/photo_to_pbr_node.ts index f5f0a8bc..da30bda0 100644 --- a/armorlab/sources/nodes/photo_to_pbr_node.ts +++ b/armorlab/sources/nodes/photo_to_pbr_node.ts @@ -14,7 +14,7 @@ let photo_to_pbr_node_tile_with_border_w: i32 = photo_to_pbr_node_tile_w + photo function photo_to_pbr_node_create(raw: ui_node_t, args: f32_array_t): photo_to_pbr_node_t { let n: photo_to_pbr_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get_as_image = photo_to_pbr_node_get_as_image; if (photo_to_pbr_node_temp == null) { @@ -78,7 +78,7 @@ function photo_to_pbr_node_get_as_image(self: photo_to_pbr_node_t, from: i32): i } let model_blob: buffer_t = data_get_blob("models/photo_to_" + photo_to_pbr_node_model_names[from] + ".quant.onnx"); - let tensors: buffer_t[] = [f32a.buffer]; + let tensors: buffer_t[] = [buffer_create_from_raw(f32a.buffer, f32a.length * 4)]; let buf: buffer_t = iron_ml_inference(model_blob, tensors, null, null, config_raw.gpu_inference); let ar: f32_array_t = f32_array_create_from_buffer(buf); u8a = u8_array_create(4 * photo_to_pbr_node_tile_w * photo_to_pbr_node_tile_w); @@ -154,7 +154,7 @@ function photo_to_pbr_node_get_as_image(self: photo_to_pbr_node_t, from: i32): i } ///end - let temp2: image_t = image_from_bytes(u8a.buffer, photo_to_pbr_node_tile_w, photo_to_pbr_node_tile_w); + let temp2: image_t = image_from_bytes(u8a, photo_to_pbr_node_tile_w, photo_to_pbr_node_tile_w); g2_begin(photo_to_pbr_node_images[from]); g2_draw_image(temp2, x * photo_to_pbr_node_tile_w, y * photo_to_pbr_node_tile_w); g2_end(); diff --git a/armorlab/sources/nodes/rgb_node.ts b/armorlab/sources/nodes/rgb_node.ts index 00ee8986..ae26182a 100644 --- a/armorlab/sources/nodes/rgb_node.ts +++ b/armorlab/sources/nodes/rgb_node.ts @@ -8,7 +8,7 @@ type rgb_node_t = { function rgb_node_create(raw: ui_node_t, args: f32_array_t): rgb_node_t { let n: rgb_node_t = {}; n.raw = raw; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get_as_image = rgb_node_get_as_image; n.base.get_cached_image = rgb_node_get_cached_image; return n; @@ -28,7 +28,8 @@ function rgb_node_get_as_image(self: rgb_node_t, from: i32): image_t { f32a[1] = default_value[1]; f32a[2] = default_value[2]; f32a[3] = default_value[3]; - self.image = image_from_bytes(f32a.buffer, 1, 1, tex_format_t.RGBA128); + let buf: buffer_t = buffer_create_from_raw(f32a.buffer, f32a.length * 4); + self.image = image_from_bytes(buf, 1, 1, tex_format_t.RGBA128); return self.image; } diff --git a/armorlab/sources/nodes/text_to_photo_node.ts b/armorlab/sources/nodes/text_to_photo_node.ts index 7f960595..ff076b0a 100644 --- a/armorlab/sources/nodes/text_to_photo_node.ts +++ b/armorlab/sources/nodes/text_to_photo_node.ts @@ -12,7 +12,7 @@ let text_to_photo_node_vae_decoder_blob: buffer_t; function text_to_photo_node_create(raw: ui_node_t, args: f32_array_t): text_to_photo_node_t { let n: text_to_photo_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get_as_image = text_to_photo_node_get_as_image; n.base.get_cached_image = text_to_photo_node_get_cached_image; return n; @@ -27,7 +27,9 @@ function text_to_photo_node_get_cached_image(self: text_to_photo_node_t): image_ return text_to_photo_node_image; } -function text_to_photo_node_buttons(ui: ui_t, nodes: ui_nodes_t, node: ui_node_t) { +function text_to_photo_node_button(node_id: i32) { + let node: ui_node_t = ui_get_node(ui_nodes_get_canvas(true).nodes, node_id); + text_to_photo_node_tiling = node.buttons[0].default_value == 0 ? false : true; text_to_photo_node_prompt = ui_text_area(ui_handle(__ID__), ui_align_t.LEFT, true, tr("prompt"), true); node.buttons[1].height = string_split(text_to_photo_node_prompt, "\n").length; @@ -57,15 +59,25 @@ function text_to_photo_node_text_encoder(prompt: string, inpaint_latents: f32_ar let words: string[] = string_split( trim_end(string_replace_all(string_replace_all(string_replace_all(prompt, "\n", " "), ",", " , "), " ", " ")), " " ); + + if (text_to_photo_node_vocab == null) { + let vocab_buffer: buffer_t = data_get_blob("models/vocab.json"); + let vocab_json: string = sys_buffer_to_string(vocab_buffer); + text_to_photo_node_vocab = json_parse_to_map(vocab_json); + } + for (let i: i32 = 0; i < words.length; ++i) { - text_to_photo_node_text_input_ids[i + 1] = map_get(text_to_photo_node_vocab, to_lower_case(words[i]) + ""); + let word: string = to_lower_case(words[i]) + ""; + let value_string: string = map_get(text_to_photo_node_vocab, word); + let value: i32 = parse_int(value_string); + text_to_photo_node_text_input_ids[i + 1] = value; } for (let i: i32 = words.length; i < (text_to_photo_node_text_input_ids.length - 1); ++i) { text_to_photo_node_text_input_ids[i + 1] = 49407; // <|endoftext|> } let i32a: i32_array_t = i32_array_create_from_array(text_to_photo_node_text_input_ids); - let tensors: buffer_t[] = [i32a.buffer]; + let tensors: buffer_t[] = [buffer_create_from_raw(i32a.buffer, i32a.length * 4)]; let input_shape: i32_array_t[] = []; let input_shape0: i32[] = [1, 77]; array_push(input_shape, input_shape0); @@ -74,7 +86,7 @@ function text_to_photo_node_text_encoder(prompt: string, inpaint_latents: f32_ar let text_embeddings: f32_array_t = f32_array_create_from_buffer(text_embeddings_buf); i32a = i32_array_create_from_array(text_to_photo_node_uncond_input_ids); - tensors = [i32a.buffer]; + tensors = [buffer_create_from_raw(i32a.buffer, i32a.length * 4)]; let uncond_embeddings_buf: buffer_t = iron_ml_inference(text_to_photo_node_text_encoder_blob, tensors, input_shape, output_shape, config_raw.gpu_inference); let uncond_embeddings: f32_array_t = f32_array_create_from_buffer(uncond_embeddings_buf); @@ -123,7 +135,11 @@ function text_to_photo_node_unet(latents: f32_array_t, text_embeddings: f32_arra let t32: i32_array_t = i32_array_create(2); t32[0] = timestep; - let tensors: buffer_t[] = [latent_model_input.buffer, t32.buffer, text_embeddings.buffer]; + let tensors: buffer_t[] = [ + buffer_create_from_raw(latent_model_input.buffer, latent_model_input.length * 4), + buffer_create_from_raw(t32.buffer, t32.length * 4), + buffer_create_from_raw(text_embeddings.buffer, text_embeddings.length * 4), + ]; let input_shape: i32_array_t[] = []; let input_shape0: i32[] = [2, 4, 64, 64]; let input_shape1: i32[] = [1]; @@ -233,7 +249,7 @@ function text_to_photo_node_vae_decoder(latents: f32_array_t, upscale: bool): im latents[i] = 1.0 / 0.18215 * latents[i]; } - let tensors: buffer_t[] = [latents.buffer]; + let tensors: buffer_t[] = [buffer_create_from_raw(latents.buffer, latents.length)]; let input_shape: i32_array_t[] = []; let input_shape0: i32[] = [1, 4, 64, 64]; array_push(input_shape, input_shape0); @@ -254,7 +270,7 @@ function text_to_photo_node_vae_decoder(latents: f32_array_t, upscale: bool): im u8a[i * 4 + 2] = math_floor(pyimage[i + 512 * 512 * 2] * 255); u8a[i * 4 + 3] = 255; } - let image: image_t = image_from_bytes(u8a.buffer, 512, 512); + let image: image_t = image_from_bytes(u8a, 512, 512); if (text_to_photo_node_tiling) { tiling_node_prompt = text_to_photo_node_prompt; @@ -312,10 +328,10 @@ let text_to_photo_node_def: ui_node_t = { height: 0 }, { - name: "text_to_photo_node_buttons", + name: "text_to_photo_node_button", type: "CUSTOM", output: -1, - default_value: null, + default_value: f32_array_create_x(0), data: null, min: 0.0, max: 1.0, @@ -518,4 +534,4 @@ let text_to_photo_node_timesteps: i32[] = [981, 961, 961, 941, 921, 901, 881, 86 641, 621, 601, 581, 561, 541, 521, 501, 481, 461, 441, 421, 401, 381, 361, 341, 321, 301, 281, 261, 241, 221, 201, 181, 161, 141, 121, 101, 81, 61, 41, 21, 1]; -let text_to_photo_node_vocab: map_t; +let text_to_photo_node_vocab: map_t = null; diff --git a/armorlab/sources/nodes/tiling_node.ts b/armorlab/sources/nodes/tiling_node.ts index 0bd2e0c6..07eaaba7 100644 --- a/armorlab/sources/nodes/tiling_node.ts +++ b/armorlab/sources/nodes/tiling_node.ts @@ -11,7 +11,7 @@ let tiling_node_auto: bool = true; function tiling_node_create(raw: ui_node_t, args: f32_array_t): tiling_node_t { let n: float_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get_as_image = tiling_node_get_as_image; n.base.get_cached_image = tiling_node_get_cached_image; tiling_node_init(); @@ -24,7 +24,9 @@ function tiling_node_init() { } } -function tiling_node_buttons(ui: ui_t, nodes: ui_nodes_t, node: ui_node_t) { +function tiling_node_button(node_id: i32) { + let node: ui_node_t = ui_get_node(ui_nodes_get_canvas(true).nodes, node_id); + tiling_node_auto = node.buttons[0].default_value == 0 ? false : true; if (!tiling_node_auto) { let tiling_node_strength_handle: ui_handle_t = ui_handle(__ID__); @@ -91,7 +93,7 @@ function tiling_node_sd_tiling(image: image_t, seed: i32): image_t { // u8a[y * 512 + x] = 0; // } // } - let mask: image_t = image_from_bytes(u8a.buffer, 512, 512, tex_format_t.R8); + let mask: image_t = image_from_bytes(u8a, 512, 512, tex_format_t.R8); inpaint_node_prompt = tiling_node_prompt; inpaint_node_strength = tiling_node_strength; @@ -149,10 +151,10 @@ let tiling_node_def: ui_node_t = { height: 0 }, { - name: "tiling_node_buttons", + name: "tiling_node_button", type: "CUSTOM", output: -1, - default_value: null, + default_value: f32_array_create_x(0), data: null, min: 0.0, max: 1.0, diff --git a/armorlab/sources/nodes/upscale_node.ts b/armorlab/sources/nodes/upscale_node.ts index 2e107eb0..3a75601f 100644 --- a/armorlab/sources/nodes/upscale_node.ts +++ b/armorlab/sources/nodes/upscale_node.ts @@ -9,7 +9,7 @@ let upscale_node_esrgan_blob: buffer_t; function upscale_node_create(raw: ui_node_t, args: f32_array_t): upscale_node_t { let n: float_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get_as_image = upscale_node_get_as_image; n.base.get_cached_image = upscale_node_get_cached_image; return n; @@ -64,7 +64,7 @@ function upscale_node_do_tile(source: image_t): image_t { f32a[i + size1w * size1w * 2] = (u8a[i * 4 + 2] / 255); } - let tensors: buffer_t[] = [f32a.buffer]; + let tensors: buffer_t[] = [buffer_create_from_raw(f32a.buffer, f32a.length)]; let input_shape: i32_array_t[] = []; let input_shape0: i32[] = [1, 3, size1w, size1h]; array_push(input_shape, input_shape0); @@ -88,7 +88,7 @@ function upscale_node_do_tile(source: image_t): image_t { u8a[i * 4 + 3] = 255; } - result = image_from_bytes(u8a.buffer, size2w, size2h); + result = image_from_bytes(u8a, size2w, size2h); return result; } diff --git a/armorlab/sources/nodes/variance_node.ts b/armorlab/sources/nodes/variance_node.ts index b6192b4c..3102b8ba 100644 --- a/armorlab/sources/nodes/variance_node.ts +++ b/armorlab/sources/nodes/variance_node.ts @@ -10,7 +10,7 @@ let variance_node_prompt: string = ""; function variance_node_create(raw: ui_node_t, args: f32_array_t): variance_node_t { let n: variance_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get_as_image = variance_node_get_as_image; n.base.get_cached_image = variance_node_get_cached_image; @@ -26,7 +26,9 @@ function variance_node_init() { } } -function variance_node_buttons(ui: ui_t, nodes: ui_nodes_t, node: ui_node_t) { +function variance_node_button(node_id: i32) { + let node: ui_node_t = ui_get_node(ui_nodes_get_canvas(true).nodes, node_id); + variance_node_prompt = ui_text_area(ui_handle(__ID__), ui_align_t.LEFT, true, tr("prompt"), true); node.buttons[0].height = string_split(variance_node_prompt, "\n").length; } @@ -53,7 +55,7 @@ function variance_node_get_as_image(self: variance_node_t, from: i32): image_t { iron_g4_swap_buffers(); let vae_encoder_blob: buffer_t = data_get_blob("models/sd_vae_encoder.quant.onnx"); - let tensors: buffer_t[] = [f32a.buffer]; + let tensors: buffer_t[] = [buffer_create_from_raw(f32a.buffer, f32a.length)]; let input_shape: i32_array_t[] = []; let input_shape0: i32[] = [1, 3, 512, 512]; array_push(input_shape, input_shape0); @@ -135,10 +137,10 @@ let variance_node_def: ui_node_t = { ], buttons: [ { - name: "variance_node_buttons", + name: "variance_node_button", type: "CUSTOM", output: -1, - default_value: null, + default_value: f32_array_create_x(0), data: null, min: 0.0, max: 1.0, diff --git a/armorlab/sources/nodes_brush.ts b/armorlab/sources/nodes_brush.ts index 5a57a60f..bbc2941e 100644 --- a/armorlab/sources/nodes_brush.ts +++ b/armorlab/sources/nodes_brush.ts @@ -22,6 +22,10 @@ function nodes_brush_init() { map_set(nodes_brush_creates, "upscale_node", upscale_node_create); map_set(nodes_brush_creates, "variance_node", variance_node_create); + map_set(nodes_brush_creates, "float_node", float_node_create); + map_set(nodes_brush_creates, "vector_node", vector_node_create); + map_set(nodes_brush_creates, "color_node", color_node_create); + nodes_brush_input = [ image_texture_node_def, rgb_node_def, @@ -40,6 +44,11 @@ function nodes_brush_init() { nodes_brush_input, nodes_brush_model ]; + + map_set(ui_nodes_custom_buttons, "inpaint_node_button", inpaint_node_button); + map_set(ui_nodes_custom_buttons, "text_to_photo_node_button", text_to_photo_node_button); + map_set(ui_nodes_custom_buttons, "tiling_node_button", tiling_node_button); + map_set(ui_nodes_custom_buttons, "variance_node_button", variance_node_button); } function nodes_brush_create_node(node_type: string): ui_node_t { diff --git a/armorlab/sources/render_path_paint.ts b/armorlab/sources/render_path_paint.ts index fd01c5b3..851e1407 100644 --- a/armorlab/sources/render_path_paint.ts +++ b/armorlab/sources/render_path_paint.ts @@ -266,9 +266,9 @@ function render_path_paint_bind_layers() { let canvas: ui_node_canvas_t = ui_nodes_get_canvas(true); if (nodes.nodes_selected_id.length > 0) { let node: ui_node_t = ui_get_node(canvas.nodes, nodes.nodes_selected_id[0]); - let brush_node: logic_node_t = parser_logic_get_logic_node(node); + let brush_node: logic_node_ext_t = parser_logic_get_logic_node(node); if (brush_node != null) { - image = logic_node_get_cached_image(brush_node); + image = logic_node_get_cached_image(brush_node.base); } } if (image != null) { diff --git a/armorlab/sources/ui_nodes_ext.ts b/armorlab/sources/ui_nodes_ext.ts index 71013da0..9096050e 100644 --- a/armorlab/sources/ui_nodes_ext.ts +++ b/armorlab/sources/ui_nodes_ext.ts @@ -124,6 +124,8 @@ function ui_nodes_ext_draw_buttons(ew: f32, start_y: f32) { ui._x += ew + 3; ui._y = 2 + start_y; + base_res_handle.position -= 4; + ///if (arm_android || arm_ios) let base_res_combo: string[] = ["2K", "4K"]; ui_combo(base_res_handle, base_res_combo, tr("Resolution")); @@ -131,6 +133,9 @@ function ui_nodes_ext_draw_buttons(ew: f32, start_y: f32) { let base_res_combo: string[] = ["2K", "4K", "8K", "16K"]; ui_combo(base_res_handle, base_res_combo, tr("Resolution")); ///end + + base_res_handle.position += 4; + if (base_res_handle.changed) { base_on_layers_resized(); } diff --git a/armorpaint/sources/nodes/brush_output_node.ts b/armorpaint/sources/nodes/brush_output_node.ts index 722bf10d..ff8ebed8 100644 --- a/armorpaint/sources/nodes/brush_output_node.ts +++ b/armorpaint/sources/nodes/brush_output_node.ts @@ -6,7 +6,7 @@ type brush_output_node_t = { function brush_output_node_create(raw: ui_node_t, args: f32_array_t): brush_output_node_t { let n: brush_output_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); context_raw.run_brush = brush_output_node_run; context_raw.parse_brush_inputs = brush_output_node_parse_inputs; context_raw.brush_output_node_inst = n; diff --git a/armorpaint/sources/nodes/input_node.ts b/armorpaint/sources/nodes/input_node.ts index 9d440382..ceeb7d6f 100644 --- a/armorpaint/sources/nodes/input_node.ts +++ b/armorpaint/sources/nodes/input_node.ts @@ -16,7 +16,7 @@ let input_node_registered: bool = false; function input_node_create(raw: ui_node_t, args: f32_array_t): input_node_t { let n: float_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = input_node_get; if (!input_node_registered) { diff --git a/armorpaint/sources/nodes/tex_image_node.ts b/armorpaint/sources/nodes/tex_image_node.ts index af742b90..ee5d9af4 100644 --- a/armorpaint/sources/nodes/tex_image_node.ts +++ b/armorpaint/sources/nodes/tex_image_node.ts @@ -6,7 +6,7 @@ type tex_image_node_t = { function tex_image_node_create(raw: ui_node_t, args: f32_array_t): tex_image_node_t { let n: tex_image_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = tex_image_node_get; n.raw = raw; return n; @@ -15,7 +15,7 @@ function tex_image_node_create(raw: ui_node_t, args: f32_array_t): tex_image_nod function tex_image_node_get(self: tex_image_node_t, from: i32): logic_node_value_t { let ar: string[] = ui_nodes_enum_texts(self.raw.type); let i: i32 = self.raw.buttons[0].default_value[0]; - let file: string = ar[i]; + let file: string = ar[i]; if (from == 0) { let v: logic_node_value_t = { _str: file + ".rgb" }; diff --git a/armorsculpt/sources/nodes/brush_output_node.ts b/armorsculpt/sources/nodes/brush_output_node.ts index b44ca64c..a11ede98 100644 --- a/armorsculpt/sources/nodes/brush_output_node.ts +++ b/armorsculpt/sources/nodes/brush_output_node.ts @@ -6,7 +6,7 @@ type brush_output_node_t = { function brush_output_node_create(arg: any): brush_output_node_t { let n: brush_output_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); context_raw.run_brush = brush_output_node_run; context_raw.parse_brush_inputs = brush_output_node_parse_inputs; context_raw.brush_output_node_inst = n; diff --git a/base/sources/base.ts b/base/sources/base.ts index 2fc0ed9e..a6fae540 100644 --- a/base/sources/base.ts +++ b/base/sources/base.ts @@ -392,7 +392,8 @@ function base_h(): i32 { ///if is_lab function base_w(): i32 { let res: i32 = 0; - if (ui_nodes_show || ui_view2d_show) { + let show2d: bool = (ui_nodes_show || ui_view2d_show) && config_raw.layout != null && config_raw.layout.length > 0; + if (show2d) { res = sys_width() - config_raw.layout[layout_size_t.NODES_W]; } else { // Distract free @@ -404,7 +405,8 @@ function base_w(): i32 { function base_h(): i32 { let res: i32 = sys_height(); - if (res > 0) { + let has_layout: bool = config_raw.layout != null && config_raw.layout.length > 0; + if (res > 0 && has_layout) { let statush: i32 = config_raw.layout[layout_size_t.STATUS_H]; res -= math_floor(ui_header_default_h * 2 * config_raw.window_scale) + statush; } @@ -913,9 +915,9 @@ function base_enum_texts(node_type: string): string[] { ///end ///if is_lab - if (node_type == "ImageTextureNode") { + if (node_type == "image_texture_node") { if (project_asset_names.length > 0) { - project_asset_names; + return project_asset_names; } else { let empty: string[] = [""]; @@ -997,9 +999,8 @@ function base_redraw_console() { } function base_init_layout() { - let show2d: bool = ui_nodes_show || ui_view2d_show; - let raw: config_t = config_raw; + let show2d: bool = (ui_nodes_show || ui_view2d_show) && raw.layout != null; raw.layout = []; ///if (is_paint || is_sculpt) @@ -1008,6 +1009,12 @@ function base_init_layout() { array_push(raw.layout, math_floor(sys_height() / 2)); // LayoutSidebarH1 ///end + ///if is_lab + array_push(raw.layout, 0); + array_push(raw.layout, 0); + array_push(raw.layout, 0); + ///end + ///if arm_ios array_push(raw.layout, show2d ? math_floor((app_w() + raw.layout[layout_size_t.NODES_W]) * 0.473) : math_floor(app_w() * 0.473)); // LayoutNodesW ///elseif arm_android @@ -1026,10 +1033,8 @@ function base_init_layout() { ///end raw.layout_tabs = [ - ///if (is_paint || is_sculpt) 0, 0, - ///end 0 ]; } @@ -2391,9 +2396,9 @@ function base_flatten(height_to_normal: bool = false): slot_layer_t { let canvas: ui_node_canvas_t = ui_nodes_get_canvas(true); if (nodes.nodes_selected_id.length > 0) { let node: ui_node_t = ui_get_node(canvas.nodes, nodes.nodes_selected_id[0]); - let brush_node: logic_node_t = parser_logic_get_logic_node(node); - if (brush_node != null && logic_node_get_cached_image(brush_node) != null) { - texpaint = logic_node_get_cached_image(brush_node); + let brush_node: logic_node_ext_t = parser_logic_get_logic_node(node); + if (brush_node != null && logic_node_get_cached_image(brush_node.base) != null) { + texpaint = logic_node_get_cached_image(brush_node.base); let texpaint_nor_rt: render_target_t = map_get(render_path_render_targets, "texpaint_nor_empty"); let texpaint_pack_rt: render_target_t = map_get(render_path_render_targets, "texpaint_pack_empty"); texpaint_nor = texpaint_nor_rt._image; diff --git a/base/sources/export_arm.ts b/base/sources/export_arm.ts index 4f5fd875..bf52fc58 100644 --- a/base/sources/export_arm.ts +++ b/base/sources/export_arm.ts @@ -231,7 +231,7 @@ function export_arm_texture_node_name(): string { ///if (is_paint || is_sculpt) return "TEX_IMAGE"; ///else - return "ImageTextureNode"; + return "image_texture_node"; ///end } diff --git a/base/sources/import_arm.ts b/base/sources/import_arm.ts index 34cdf0ab..e04179b0 100644 --- a/base/sources/import_arm.ts +++ b/base/sources/import_arm.ts @@ -647,7 +647,7 @@ function import_arm_texture_node_name(): string { ///if (is_paint || is_sculpt) return "TEX_IMAGE"; ///else - return "ImageTextureNode"; + return "image_texture_node"; ///end } diff --git a/base/sources/logic_node.ts b/base/sources/logic_node.ts index 15966543..d6575dc3 100644 --- a/base/sources/logic_node.ts +++ b/base/sources/logic_node.ts @@ -6,6 +6,7 @@ type logic_node_t = { get_as_image?: (self: any, from: i32)=>image_t; get_cached_image?: (self: any)=>image_t; set?: (self: any, value: f32_array_t)=>void; + ext?: logic_node_ext_t; }; type logic_node_ext_t = { @@ -23,14 +24,11 @@ type logic_node_input_t = { from?: i32; // Socket index }; -function logic_node_create(): logic_node_t { +function logic_node_create(ext: logic_node_ext_t): logic_node_t { let n: logic_node_t = {}; n.inputs = []; n.outputs = []; - n.get = logic_node_get; - n.get_as_image = logic_node_get_as_image; - n.get_cached_image = logic_node_get_cached_image; - n.set = logic_node_set; + n.ext = ext; return n; } @@ -43,18 +41,31 @@ function logic_node_add_outputs(self: logic_node_t, nodes: logic_node_t[]) { } function logic_node_get(self: logic_node_t, from: i32): any { + if (self.get != null) { + return self.get(self.ext, from); + } return null; } function logic_node_get_as_image(self: logic_node_t, from: i32): image_t { + if (self.get_as_image != null) { + return self.get_as_image(self.ext, from); + } return null; } function logic_node_get_cached_image(self: logic_node_t): image_t { + if (self.get_cached_image != null) { + return self.get_cached_image(self.ext); + } return null; } -function logic_node_set(self: logic_node_t, value: any) {} +function logic_node_set(self: logic_node_t, value: any) { + if (self.set != null) { + self.set(self.ext, value); + } +} function logic_node_input_create(node: logic_node_ext_t, from: i32): logic_node_input_t { let inp: logic_node_input_t = {}; @@ -64,13 +75,13 @@ function logic_node_input_create(node: logic_node_ext_t, from: i32): logic_node_ } function logic_node_input_get(self: logic_node_input_t): logic_node_value_t { - return self.node.base.get(self.node, self.from); + return logic_node_get(self.node.base, self.from); } function logic_node_input_get_as_image(self: logic_node_input_t): image_t { - return self.node.base.get_as_image(self.node, self.from); + return logic_node_get_as_image(self.node.base, self.from); } function logic_node_input_set(self: logic_node_input_t, value: f32_array_t) { - self.node.base.set(self.node, value); + logic_node_set(self.node.base, value); } diff --git a/base/sources/nodes/boolean_node.ts b/base/sources/nodes/boolean_node.ts index 57c537fb..4186a634 100644 --- a/base/sources/nodes/boolean_node.ts +++ b/base/sources/nodes/boolean_node.ts @@ -6,7 +6,7 @@ type boolean_node_t = { function boolean_node_create(raw: ui_node_t, args: f32_array_t): boolean_node_t { let n: boolean_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = boolean_node_get; n.base.set = boolean_node_set; n.value = args == null ? false : args[0] > 0.0; diff --git a/base/sources/nodes/color_node.ts b/base/sources/nodes/color_node.ts index 2aabe7fe..41b5e383 100644 --- a/base/sources/nodes/color_node.ts +++ b/base/sources/nodes/color_node.ts @@ -11,7 +11,7 @@ function color_node_create(raw: ui_node_t, args: f32_array_t): color_node_t { let b: f32 = args == null ? 0.8 : args[2]; let a: f32 = args == null ? 1.0 : args[3]; let n: color_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = color_node_get; n.base.get_as_image = color_node_get_as_image; n.base.set = color_node_set; diff --git a/base/sources/nodes/float_node.ts b/base/sources/nodes/float_node.ts index 401360d8..1400c317 100644 --- a/base/sources/nodes/float_node.ts +++ b/base/sources/nodes/float_node.ts @@ -7,7 +7,7 @@ type float_node_t = { function float_node_create(raw: ui_node_t, args: f32_array_t): float_node_t { let n: float_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = float_node_get; n.base.get_as_image = float_node_get_as_image; n.base.set = float_node_set; diff --git a/base/sources/nodes/integer_node.ts b/base/sources/nodes/integer_node.ts index c05f03d2..79364ce7 100644 --- a/base/sources/nodes/integer_node.ts +++ b/base/sources/nodes/integer_node.ts @@ -6,7 +6,7 @@ type integer_node_t = { function integer_node_create(raw: ui_node_t, args: f32_array_t): integer_node_t { let n: float_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = integer_node_get; n.base.set = integer_node_set; n.value = args == null ? 0 : args[0]; diff --git a/base/sources/nodes/math_node.ts b/base/sources/nodes/math_node.ts index 3cbe7a7b..823c8cf4 100644 --- a/base/sources/nodes/math_node.ts +++ b/base/sources/nodes/math_node.ts @@ -7,7 +7,7 @@ type math_node_t = { function math_node_create(raw: ui_node_t, args: f32_array_t): math_node_t { let n: math_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = math_node_get; return n; } diff --git a/base/sources/nodes/null_node.ts b/base/sources/nodes/null_node.ts index 9da0f54b..303d22fb 100644 --- a/base/sources/nodes/null_node.ts +++ b/base/sources/nodes/null_node.ts @@ -5,7 +5,7 @@ type null_node_t = { function null_node_create(raw: ui_node_t, args: f32_array_t): null_node_t { let n: null_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = float_node_get; return n; } diff --git a/base/sources/nodes/random_node.ts b/base/sources/nodes/random_node.ts index 34a5c621..6eb4385a 100644 --- a/base/sources/nodes/random_node.ts +++ b/base/sources/nodes/random_node.ts @@ -10,7 +10,7 @@ let random_node_d: i32 = -1; function random_node_create(raw: ui_node_t, args: f32_array_t): random_node_t { let n: random_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = random_node_get; return n; } diff --git a/base/sources/nodes/separate_vector_node.ts b/base/sources/nodes/separate_vector_node.ts index ab5626f9..abf62feb 100644 --- a/base/sources/nodes/separate_vector_node.ts +++ b/base/sources/nodes/separate_vector_node.ts @@ -5,7 +5,7 @@ type separate_vector_node_t = { function separate_vector_node_create(raw: ui_node_t, args: f32_array_t): separate_vector_node_t { let n: separate_vector_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = separate_vector_node_get; return n; } diff --git a/base/sources/nodes/string_node.ts b/base/sources/nodes/string_node.ts index 877ede7f..65cca33c 100644 --- a/base/sources/nodes/string_node.ts +++ b/base/sources/nodes/string_node.ts @@ -6,7 +6,7 @@ type string_node_t = { function string_node_create(raw: ui_node_t, args: f32_array_t): string_node_t { let n: string_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = string_node_get; n.base.set = string_node_set; n.value = args == null ? "" : sys_buffer_to_string(args.buffer); diff --git a/base/sources/nodes/time_node.ts b/base/sources/nodes/time_node.ts index 33862721..6060e87b 100644 --- a/base/sources/nodes/time_node.ts +++ b/base/sources/nodes/time_node.ts @@ -5,7 +5,7 @@ type time_node_t = { function time_node_create(raw: ui_node_t, args: f32_array_t): time_node_t { let n: time_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = time_node_get; return n; } diff --git a/base/sources/nodes/vector_math_node.ts b/base/sources/nodes/vector_math_node.ts index 34841893..c5655647 100644 --- a/base/sources/nodes/vector_math_node.ts +++ b/base/sources/nodes/vector_math_node.ts @@ -7,7 +7,7 @@ type vector_math_node_t = { function vector_math_node_create(raw: ui_node_t, args: f32_array_t): vector_math_node_t { let n: vector_math_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = vector_math_node_get; n.v = vec4_create(); return n; diff --git a/base/sources/nodes/vector_node.ts b/base/sources/nodes/vector_node.ts index 48692359..511e6356 100644 --- a/base/sources/nodes/vector_node.ts +++ b/base/sources/nodes/vector_node.ts @@ -7,7 +7,7 @@ type vector_node_t = { function vector_node_create(raw: ui_node_t, args: f32_array_t): vector_node_t { let n: vector_node_t = {}; - n.base = logic_node_create(); + n.base = logic_node_create(n); n.base.get = vector_node_get; n.base.get_as_image = vector_node_get_as_image; n.base.set = vector_node_set; diff --git a/base/sources/nodes_material.ts b/base/sources/nodes_material.ts index 49931a2b..b9507ed7 100644 --- a/base/sources/nodes_material.ts +++ b/base/sources/nodes_material.ts @@ -3842,7 +3842,6 @@ let nodes_material_list: node_list_t[] = [ ]; function nodes_material_init() { - ui_nodes_custom_buttons = map_create(); map_set(ui_nodes_custom_buttons, "nodes_material_vector_curves_button", nodes_material_vector_curves_button); map_set(ui_nodes_custom_buttons, "nodes_material_color_ramp_button", nodes_material_color_ramp_button); map_set(ui_nodes_custom_buttons, "nodes_material_new_group_button", nodes_material_new_group_button); diff --git a/base/sources/parser_logic.ts b/base/sources/parser_logic.ts index 91e683da..381b7b7c 100644 --- a/base/sources/parser_logic.ts +++ b/base/sources/parser_logic.ts @@ -210,12 +210,12 @@ function parser_logic_build_default_node(inp: ui_node_socket_t): logic_node_ext_ function parser_logic_create_node_instance(node_type: string, raw: ui_node_t, args: f32_array_t): logic_node_ext_t { if (map_get(parser_logic_custom_nodes, node_type) != null) { - let node: logic_node_t = logic_node_create(); + let node: logic_node_t = logic_node_create(null); node.get = map_get(parser_logic_custom_nodes, node_type); - let ext: logic_node_ext_t = { + node.ext = { base: node }; - return ext; + return node.ext; } if (nodes_brush_creates == null) { diff --git a/base/sources/ui_base.ts b/base/sources/ui_base.ts index a994175b..e70a6ff9 100644 --- a/base/sources/ui_base.ts +++ b/base/sources/ui_base.ts @@ -31,28 +31,12 @@ let ui_base_sidebar_mini_w: i32 = ui_base_default_sidebar_mini_w; ///end function ui_base_init_hwnds(): ui_handle_t[] { - ///if is_paint let hwnds: ui_handle_t[] = [ui_handle_create(), ui_handle_create(), ui_handle_create()]; - ///end - ///if is_sculpt - let hwnds: ui_handle_t[] = [ui_handle_create(), ui_handle_create(), ui_handle_create()]; - ///end - ///if is_lab - let hwnds: ui_handle_t[] = [ui_handle_create()]; - ///end return hwnds; } function ui_base_init_htabs(): ui_handle_t[] { - ///if is_paint let htabs: ui_handle_t[] = [ui_handle_create(), ui_handle_create(), ui_handle_create()]; - ///end - ///if is_sculpt - let htabs: ui_handle_t[] = [ui_handle_create(), ui_handle_create(), ui_handle_create()]; - ///end - ///if is_lab - let htabs: ui_handle_t[] = [ui_handle_create()]; - ///end return htabs; } @@ -62,9 +46,6 @@ function _draw_callback_create(f: (h: ui_handle_t)=>void): tab_draw_t { } function ui_base_init_hwnd_tabs(): tab_draw_array_t[] { - - let r: tab_draw_array_t[] = []; - ///if is_paint let a0: tab_draw_array_t = [ _draw_callback_create(tab_layers_draw), @@ -89,10 +70,6 @@ function ui_base_init_hwnd_tabs(): tab_draw_array_t[] { _draw_callback_create(tab_console_draw), _draw_callback_create(ui_status_draw_version_tab) ]; - - array_push(r, a0); - array_push(r, a1); - array_push(r, a2); ///end ///if is_sculpt @@ -115,14 +92,12 @@ function ui_base_init_hwnd_tabs(): tab_draw_array_t[] { _draw_callback_create(tab_console_draw), _draw_callback_create(ui_status_draw_version_tab) ]; - - array_push(r, a0); - array_push(r, a1); - array_push(r, a2); ///end ///if is_lab - let a0: tab_draw_array_t = [ + let a0: tab_draw_array_t = []; + let a1: tab_draw_array_t = []; + let a2: tab_draw_array_t = [ _draw_callback_create(tab_browser_draw), _draw_callback_create(tab_textures_draw), _draw_callback_create(tab_meshes_draw), @@ -132,9 +107,12 @@ function ui_base_init_hwnd_tabs(): tab_draw_array_t[] { _draw_callback_create(tab_console_draw), _draw_callback_create(ui_status_draw_version_tab) ]; - array_push(r, a0); ///end + let r: tab_draw_array_t[] = []; + array_push(r, a0); + array_push(r, a1); + array_push(r, a2); return r; } diff --git a/base/sources/ui_menubar.ts b/base/sources/ui_menubar.ts index 0bdfd42c..8bdf473e 100644 --- a/base/sources/ui_menubar.ts +++ b/base/sources/ui_menubar.ts @@ -147,7 +147,7 @@ function ui_menubar_render_ui() { else { // Space2D if (_ui_menubar_plane == null) { let mesh: raw_mesh_t = geom_make_plane(1, 1, 2, 2); - let raw: raw_mesh_t = { + let raw: mesh_data_t = { name: "2DView", vertex_arrays: [ { diff --git a/base/sources/ui_nodes.ts b/base/sources/ui_nodes.ts index 6894b0c2..85064e82 100644 --- a/base/sources/ui_nodes.ts +++ b/base/sources/ui_nodes.ts @@ -1031,9 +1031,9 @@ function ui_nodes_render() { ///else - let brush_node: logic_node_t = parser_logic_get_logic_node(sel); + let brush_node: logic_node_ext_t = parser_logic_get_logic_node(sel); if (brush_node != null) { - img = logic_node_get_cached_image(brush_node); + img = logic_node_get_cached_image(brush_node.base); } ///end @@ -1365,7 +1365,7 @@ function ui_nodes_accept_asset_drag(index: i32) { let n: ui_node_t = ui_nodes_canvas_type == canvas_type_t.MATERIAL ? nodes_material_create_node("TEX_IMAGE", g) : nodes_brush_create_node("TEX_IMAGE"); ///end ///if is_lab - let n: ui_node_t = nodes_brush_create_node("ImageTextureNode"); + let n: ui_node_t = nodes_brush_create_node("image_texture_node"); ///end n.buttons[0].default_value[0] = index; diff --git a/base/sources/ui_view2d.ts b/base/sources/ui_view2d.ts index e00a42c6..dfd79110 100644 --- a/base/sources/ui_view2d.ts +++ b/base/sources/ui_view2d.ts @@ -161,9 +161,9 @@ function ui_view2d_render() { let nodes: ui_nodes_t = ui_nodes_get_nodes(); if (nodes.nodes_selected_id.length > 0) { let sel: ui_node_t = ui_get_node(ui_nodes_get_canvas(true).nodes, nodes.nodes_selected_id[0]); - let brush_node: logic_node_t = parser_logic_get_logic_node(sel); + let brush_node: logic_node_ext_t = parser_logic_get_logic_node(sel); if (brush_node != null) { - tex = logic_node_get_cached_image(brush_node); + tex = logic_node_get_cached_image(brush_node.base); } }