diff --git a/paint/sources/box_preferences.ts b/paint/sources/box_preferences.ts index ad22df15..d0b002f8 100644 --- a/paint/sources/box_preferences.ts +++ b/paint/sources/box_preferences.ts @@ -510,7 +510,7 @@ function box_preferences_pen_tab() { config_raw.pressure_angle = ui_check(h_pressure_angle, tr("Brush Angle")); ui_end_element(); - let row: f32[] = [ 0.5 ]; + let row: f32[] = [ 1 / 4 ]; ui_row(row); if (ui_button(tr("Help"))) { let url: string = "https://github.com/armory3d/"; @@ -701,77 +701,77 @@ function box_preferences_keymap_tab() { function box_preferences_init_models() { box_preferences_models = [ { - name: "Stable Diffusion", - memory: "4GB", - size: "4.2GB", - nodes: "Inpaint Image, Outpaint Image, Text to Image, Tile Image, Vary Image", - urls: ["https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors"], - web: "https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5", - license: "openrail" + name : "Stable Diffusion", + memory : "4GB", + size : "4.2GB", + nodes : "Inpaint Image, Outpaint Image, Text to Image, Tile Image, Vary Image", + urls : [ "https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors" ], + web : "https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5", + license : "openrail" }, { - name: "Qwen Image", - memory: "13GB", - size: "15.7GB", - nodes: "Text to Image", - urls: [ + name : "Qwen Image", + memory : "13GB", + size : "15.7GB", + nodes : "Text to Image", + urls : [ "https://huggingface.co/QuantStack/Qwen-Image-GGUF/resolve/main/Qwen_Image-Q4_K_S.gguf", "https://huggingface.co/QuantStack/Qwen-Image-GGUF/resolve/main/VAE/Qwen_Image-VAE.safetensors", "https://huggingface.co/unsloth/Qwen2.5-VL-7B-Instruct-GGUF/resolve/main/Qwen2.5-VL-7B-Instruct-Q4_K_S.gguf" ], - web: "https://huggingface.co/QuantStack/Qwen-Image-GGUF", - license: "apache-2.0" + web : "https://huggingface.co/QuantStack/Qwen-Image-GGUF", + license : "apache-2.0" }, { - name: "Qwen Image Edit", - memory: "13GB", - size: "17.0GB", - nodes: "Edit Image, Inpaint Image, Outpaint Image, Tile Image, Vary Image", - urls: [ + name : "Qwen Image Edit", + memory : "13GB", + size : "17.0GB", + nodes : "Edit Image, Inpaint Image, Outpaint Image, Tile Image, Vary Image", + urls : [ "https://huggingface.co/QuantStack/Qwen-Image-Edit-2509-GGUF/resolve/main/Qwen-Image-Edit-2509-Q4_K_S.gguf", "https://huggingface.co/QuantStack/Qwen-Image-GGUF/resolve/main/VAE/Qwen_Image-VAE.safetensors", "https://huggingface.co/unsloth/Qwen2.5-VL-7B-Instruct-GGUF/resolve/main/Qwen2.5-VL-7B-Instruct-Q4_K_S.gguf", "https://huggingface.co/unsloth/Qwen2.5-VL-7B-Instruct-GGUF/resolve/main/mmproj-F16.gguf" ], - web: "https://huggingface.co/QuantStack/Qwen-Image-Edit-2509-GGUF", - license: "apache-2.0" + web : "https://huggingface.co/QuantStack/Qwen-Image-Edit-2509-GGUF", + license : "apache-2.0" }, { - name: "Wan", - memory: "10GB", - size: "19.8GB", - nodes: "Text to Image", - urls: [ + name : "Wan", + memory : "10GB", + size : "19.8GB", + nodes : "Text to Image", + urls : [ "https://huggingface.co/QuantStack/Wan2.2-T2V-A14B-GGUF/resolve/main/LowNoise/Wan2.2-T2V-A14B-LowNoise-Q4_K_S.gguf", "https://huggingface.co/QuantStack/Wan2.2-T2V-A14B-GGUF/resolve/main/HighNoise/Wan2.2-T2V-A14B-HighNoise-Q4_K_S.gguf", "https://huggingface.co/QuantStack/Wan2.2-T2V-A14B-GGUF/resolve/main/VAE/Wan2.1_VAE.safetensors", "https://huggingface.co/city96/umt5-xxl-encoder-gguf/resolve/main/umt5-xxl-encoder-Q4_K_S.gguf" ], - web: "https://huggingface.co/QuantStack/Wan2.2-T2V-A14B-GGUF", - license: "apache-2.0" + web : "https://huggingface.co/QuantStack/Wan2.2-T2V-A14B-GGUF", + license : "apache-2.0" }, { - name: "Marigold", - memory: "6GB", - size: "9.6GB", - nodes: "Text to Image", - urls: [ + name : "Marigold", + memory : "6GB", + size : "9.6GB", + nodes : "Text to Image", + urls : [ "https://huggingface.co/armory3d/marigold-v1-1-gguf/resolve/main/marigold-depth-v1-1.q8_0.gguf", "https://huggingface.co/armory3d/marigold-v1-1-gguf/resolve/main/marigold-normals-v1-1.q8_0.gguf", "https://huggingface.co/armory3d/marigold-v1-1-gguf/resolve/main/marigold-iid-appearance-v1-1.q8_0.gguf", "https://huggingface.co/armory3d/marigold-v1-1-gguf/resolve/main/marigold-iid-lighting-v1-1.q8_0.gguf" ], - web: "https://huggingface.co/armory3d/marigold-v1-1-gguf", - license: "openrail" + web : "https://huggingface.co/armory3d/marigold-v1-1-gguf", + license : "openrail" }, { - name: "Real-ESRGAN", - memory: "1GB", - size: "0.06GB", - nodes: "Upscale Image", - urls: ["https://huggingface.co/armory3d/Real-ESRGAN/resolve/main/RealESRGAN_x4plus.pth"], - web: "https://huggingface.co/armory3d/Real-ESRGAN", - license: "bsd-3-clause" + name : "Real-ESRGAN", + memory : "1GB", + size : "0.06GB", + nodes : "Upscale Image", + urls : [ "https://huggingface.co/armory3d/Real-ESRGAN/resolve/main/RealESRGAN_x4plus.pth" ], + web : "https://huggingface.co/armory3d/Real-ESRGAN", + license : "bsd-3-clause" } ]; // https://huggingface.co/webui/stable-diffusion-inpainting/resolve/main/sd-v1-5-inpainting.safetensors @@ -802,6 +802,15 @@ function box_preferences_neural_tab() { for (let i: i32 = 0; i < box_preferences_models.length; ++i) { box_preferences_model_panel(box_preferences_models[i]); } + + let row: f32[] = [ 1 / 4 ]; + ui_row(row); + if (ui_button(tr("Models Directory..."))) { + if (file_read_directory(neural_node_dir())[0] == "") { + file_create_directory(neural_node_dir()); + } + file_start(neural_node_dir()); + } } function box_preferences_model_exists(file_name: string): bool { @@ -833,22 +842,30 @@ function box_preferences_model_panel(m: box_preferneces_model_t) { ui_text(tr("gpu memory") + ": " + m.memory); ui_text(tr("nodes") + ": " + m.nodes); - let url: string = m.urls[0]; + let url: string = m.urls[0]; let file_name: string = box_preferences_file_name_from_url(url); - let found: bool = box_preferences_model_exists(file_name); + let found: bool = box_preferences_model_exists(file_name); if (neural_node_downloading > 0) { ui.enabled = false; - let u: u64 = iron_net_bytes_downloaded; - let i: i32 = (u / 1000000000) * 10; - let f: f32 = i / 10; - let downloaded: string = f + "GB"; - ui_box_hwnd.redraws = 2; + let u: u64 = iron_net_bytes_downloaded; + let i: i32 = (u / 1000000000) * 100; + let f: f32 = i / 100; + let downloaded: string = f + "GB"; + ui_box_hwnd.redraws = 2; box_preferences_htab.redraws = 2; iron_delay_idle_sleep(); - ui_button(tr("Downloading") + "..." + "(" + downloaded + " / " + m.size + ")"); + let _BUTTON_COL: i32 = ui.ops.theme.BUTTON_COL; + ui.ops.theme.BUTTON_COL = ui.ops.theme.HIGHLIGHT_COL; + + let h: ui_handle_t = ui_handle(__ID__); + h.f = f / parse_float(m.size); + ui_slider(h, downloaded + " / " + m.size, 0.0, 1.0, true, 100, false, ui_align_t.CENTER); + + ui.ops.theme.BUTTON_COL = _BUTTON_COL; + ui.enabled = true; } else if (!found && ui_button(tr("Download") + " (" + m.size + ")")) { @@ -857,7 +874,7 @@ function box_preferences_model_panel(m: box_preferneces_model_t) { } else if (found && ui_button(tr("Remove") + " (" + m.size + ")")) { for (let i: i32 = 0; i < m.urls.length; ++i) { - let url: string = m.urls[i]; + let url: string = m.urls[i]; let file_name: string = box_preferences_file_name_from_url(url); iron_delete_file(neural_node_dir() + path_sep + file_name); } @@ -997,9 +1014,11 @@ function box_preferences_show() { if (ui_tab(box_preferences_htab, tr("Keymap"), true)) { box_preferences_keymap_tab(); } - if (ui_tab(box_preferences_htab, tr("Neural"), true)) { - box_preferences_neural_tab(); - } + /// if (arm_windows || arm_linux || arm_macos) + if (ui_tab(box_preferences_htab, tr("Neural"), true)) { + box_preferences_neural_tab(); + } + /// end if (ui_tab(box_preferences_htab, tr("Plugins"), true)) { box_preferences_plugins_tab(); } diff --git a/paint/sources/neural_nodes/neural_node.ts b/paint/sources/neural_nodes/neural_node.ts index 1ec0da04..2154ad7a 100644 --- a/paint/sources/neural_nodes/neural_node.ts +++ b/paint/sources/neural_nodes/neural_node.ts @@ -54,8 +54,10 @@ function neural_node_button(node: ui_node_t, model: string): bool { } } else if (!found && ui_button(tr("Setup"))) { - box_preferences_htab.i = preference_tab_t.NEURAL; - box_preferences_show(); + sys_notify_on_next_frame(function() { + box_preferences_htab.i = preference_tab_t.NEURAL; + box_preferences_show(); + }); } else if (found && ui_button(tr("Run"))) { return true; @@ -97,7 +99,10 @@ function neural_node_download(url: string) { } neural_node_downloading++; - file_download_to(url, file_path, function (url: string) { neural_node_downloading--; }); + file_download_to(url, file_path, function (url: string) { + neural_node_downloading--; + console_log(tr("Downloaded model from") + " " + url); + }); } function neural_node_download_models(models: string[]) { @@ -117,6 +122,8 @@ function neural_node_download_models(models: string[]) { neural_node_download("https://github.com/armory3d/armortools/raw/refs/heads/main/base/assets/bin/macos/sd_vulkan"); /// end + iron_net_bytes_downloaded = 0; + for (let i: i32 = 0; i < models.length; ++i) { neural_node_download(models[i]); } diff --git a/paint/sources/nodes_material.ts b/paint/sources/nodes_material.ts index 39c907fc..3a75c599 100644 --- a/paint/sources/nodes_material.ts +++ b/paint/sources/nodes_material.ts @@ -1,6 +1,14 @@ +/// if (arm_windows || arm_linux || arm_macos) + let nodes_material_categories: string[] = [ _tr("Input"), _tr("Texture"), _tr("Color"), _tr("Utilities"), _tr("Neural"), _tr("Group") ]; +/// else + +let nodes_material_categories: string[] = [ _tr("Input"), _tr("Texture"), _tr("Color"), _tr("Utilities"), _tr("Group") ]; + +/// end + let nodes_material_input: ui_node_t[]; let nodes_material_texture: ui_node_t[]; let nodes_material_color: ui_node_t[]; @@ -78,6 +86,8 @@ function nodes_material_init() { separate_xyz_node_init(); vector_math2_node_init(); + /// if (arm_windows || arm_linux || arm_macos) + nodes_material_neural = []; edit_image_node_init(); image_to_depth_node_init(); @@ -90,11 +100,21 @@ function nodes_material_init() { upscale_image_node_init(); vary_image_node_init(); + /// end + nodes_material_group = []; group_node_init(); + /// if (arm_windows || arm_linux || arm_macos) + nodes_material_list = [ nodes_material_input, nodes_material_texture, nodes_material_color, nodes_material_utilities, nodes_material_neural, nodes_material_group ]; + + /// else + + nodes_material_list = [ nodes_material_input, nodes_material_texture, nodes_material_color, nodes_material_utilities, nodes_material_group ]; + + /// end } function nodes_material_get_node_t(node_type: string): ui_node_t {