diff --git a/paint/sources/box_preferences.ts b/paint/sources/box_preferences.ts index 6cacbdca..99ba1252 100644 --- a/paint/sources/box_preferences.ts +++ b/paint/sources/box_preferences.ts @@ -10,17 +10,6 @@ let _box_preferences_f: string; let _box_preferences_h: ui_handle_t; let _box_preferences_i: i32; -type box_preferneces_model_t = { - name?: string; - memory?: string; - size?: string; - nodes?: string; - urls?: string[]; - web?: string; - license?: string; -}; -let box_preferences_models: box_preferneces_model_t[] = null; - function box_preferences_interface_tab() { if (box_preferences_locales == null) { box_preferences_locales = translator_get_supported_locales(); @@ -703,98 +692,6 @@ function box_preferences_keymap_tab() { } } -function box_preferences_init_models() { - box_preferences_models = [ - { - name : "Stable Diffusion", - memory : "4GB", - size : "4.3GB", - 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 : "Z-Image-Turbo", - memory : "4GB", - size : "6.7GB", - nodes : "Text to Image", - urls : [ - "https://huggingface.co/armory3d/z_image_turbo/resolve/main/Qwen3-4B-Instruct-2507-Q4_K_S.gguf", - "https://huggingface.co/armory3d/z_image_turbo/resolve/main/ae.safetensors", - "https://huggingface.co/armory3d/z_image_turbo/resolve/main/z_image_turbo-Q4_K.gguf" - ], - web : "https://huggingface.co/armory3d/z_image_turbo", - license : "apache-2.0" - }, - { - name : "Qwen Image", - memory : "13GB", - size : "16.9GB", - 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" - }, - { - name : "Qwen Image Edit", - memory : "13GB", - size : "18.3GB", - 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" - }, - { - name : "Wan", - memory : "10GB", - size : "21.3GB", - 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" - }, - { - name : "Marigold", - memory : "6GB", - size : "13.7GB", - nodes : "Image to Depth, Image to Normal Map Node, Image to PBR", - 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" - }, - { - name : "Real-ESRGAN", - memory : "1GB", - size : "0.07GB", - 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 -} - function box_preferences_neural_tab() { ui_text(tr("All processing is done locally on device")); @@ -817,12 +714,12 @@ function box_preferences_neural_tab() { ui_text(tr("Models")); - if (box_preferences_models == null) { - box_preferences_init_models(); + if (neural_node_models == null) { + neural_node_models_init(); } - for (let i: i32 = 0; i < box_preferences_models.length; ++i) { - box_preferences_model_panel(box_preferences_models[i]); + for (let i: i32 = 0; i < neural_node_models.length; ++i) { + box_preferences_model_panel(neural_node_models[i]); } let row: f32[] = [ 1 / 4 ]; @@ -844,19 +741,19 @@ function box_preferences_file_name_from_url(url: string): string { } function box_preferneces_model_url_from_name(name: string): string { - if (box_preferences_models == null) { - box_preferences_init_models(); + if (neural_node_models == null) { + neural_node_models_init(); } - for (let i: i32 = 0; i < box_preferences_models.length; ++i) { - if (box_preferences_models[i].name == name) { - return box_preferences_models[i].urls[0]; + for (let i: i32 = 0; i < neural_node_models.length; ++i) { + if (neural_node_models[i].name == name) { + return neural_node_models[i].urls[0]; } } return null; } -function box_preferences_model_panel(m: box_preferneces_model_t) { +function box_preferences_model_panel(m: neural_node_model_t) { if (ui_panel(ui_handle(m.name), m.name)) { if (ui_text(tr("source") + ": " + m.web + " (" + m.license + ")") == UI_STATE_RELEASED) { iron_load_url(m.web); diff --git a/paint/sources/neural_nodes/image_to_3d_mesh.ts b/paint/sources/neural_nodes/image_to_3d_mesh.ts new file mode 100644 index 00000000..fd6e7e87 --- /dev/null +++ b/paint/sources/neural_nodes/image_to_3d_mesh.ts @@ -0,0 +1,110 @@ + +function image_to_3d_mesh_node_init() { + array_push(nodes_material_neural, image_to_3d_mesh_node_def); + map_set(parser_material_node_values, "NEURAL_IMAGE_TO_3D_MESH", neural_node_value); + map_set(ui_nodes_custom_buttons, "image_to_3d_mesh_node_button", image_to_3d_mesh_node_button); +} + +function image_to_3d_mesh_node_remove_background(buffer: buffer_t): buffer_t { + for (let i: i32 = 0; i < math_floor((buffer.length) / 4); ++i) { + if (buffer[i * 4] <= 16 && buffer[i * 4 + 1] <= 16 && buffer[i * 4 + 2] <= 16) { + buffer[i * 4 + 3] = 0; + } + } + return buffer; +} + +function image_to_3d_mesh_node_button(node_id: i32) { + let canvas: ui_node_canvas_t = ui_nodes_get_canvas(true); + let node: ui_node_t = ui_get_node(canvas.nodes, node_id); + let node_name: string = parser_material_node_name(node); + let h: ui_handle_t = ui_handle(node_name); + + let models: string[] = [ "Hunyuan3D" ]; + let model: i32 = ui_combo(ui_nest(h, 0), models, tr("Model")); + + if (neural_node_button(node, models[model])) { + let from_node: ui_node_t = neural_from_node(node.inputs[0], 0); + let input: gpu_texture_t = ui_nodes_get_node_preview_image(from_node); + if (input != null) { + let dir: string = neural_node_dir(); + let input_buf: buffer_t = image_to_3d_mesh_node_remove_background(gpu_get_texture_pixels(input)); + iron_write_png(dir + path_sep + "input.png", input_buf, input.width, input.height, 0); + + dir = string_replace_all(dir, "\\", "/"); + let argv: string[] = [ + dir + "/Hunyuan3D_win64/python/python.exe", + "-s", + "-B", + "-c", + "from hy3dshape.pipelines import Hunyuan3DDiTFlowMatchingPipeline; shape_pipeline = Hunyuan3DDiTFlowMatchingPipeline.from_pretrained('" + dir + "/Hunyuan3D_win64/Hunyuan3D-2.1'); mesh = shape_pipeline(image='" + dir + "/input.png', octree_resolution=512, num_chunks=64000)[0]; mesh.export('" + dir + "/output.obj')", + null + ]; + + iron_exec_async(argv[0], argv.buffer); + sys_notify_on_update(image_to_3d_mesh_node_check_result, node); + } + } +} + +function image_to_3d_mesh_node_check_result(node: ui_node_t) { + neural_node_current = node; + iron_delay_idle_sleep(); + if (iron_exec_async_done == 1) { + let file: string = neural_node_dir() + path_sep + "output.obj"; + if (iron_file_exists(file)) { + // let result: gpu_texture_t = ; + // map_set(neural_node_results, node.id, result); + ui_nodes_hwnd.redraws = 2; + ui_view2d_hwnd.redraws = 2; + project_import_mesh_box(file, true, true, null); + } + sys_remove_update(image_to_3d_mesh_node_check_result); + } +} + +let image_to_3d_mesh_node_def: ui_node_t = { + id : 0, + name : _tr("Image to 3D Mesh"), + type : "NEURAL_IMAGE_TO_3D_MESH", + x : 0, + y : 0, + color : 0xff4982a0, + inputs : [ { + id : 0, + node_id : 0, + name : _tr("Color"), + type : "RGBA", + color : 0xffc7c729, + default_value : f32_array_create_xyzw(0.0, 0.0, 0.0, 1.0), + min : 0.0, + max : 1.0, + precision : 100, + display : 0 + } ], + outputs : [ { + id : 0, + node_id : 0, + name : _tr("Mesh"), + type : "VALUE", + color : 0xffa1a1a1, + default_value : f32_array_create_x(1.0), + min : 0.0, + max : 1.0, + precision : 100, + display : 0 + } ], + buttons : [ { + name : "image_to_3d_mesh_node_button", + type : "CUSTOM", + output : -1, + default_value : f32_array_create_x(0), + data : null, + min : 0.0, + max : 1.0, + precision : 100, + height : 2 + } ], + width : 0, + flags : 0 +}; diff --git a/paint/sources/neural_nodes/neural_node_models.ts b/paint/sources/neural_nodes/neural_node_models.ts new file mode 100644 index 00000000..4a3fe2bc --- /dev/null +++ b/paint/sources/neural_nodes/neural_node_models.ts @@ -0,0 +1,113 @@ + +type neural_node_model_t = { + name?: string; + memory?: string; + size?: string; + nodes?: string; + urls?: string[]; + web?: string; + license?: string; +}; +let neural_node_models: neural_node_model_t[] = null; + +function neural_node_models_init() { + neural_node_models = [ + { + name : "Stable Diffusion", + memory : "4GB", + size : "4.3GB", + 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 : "Z-Image-Turbo", + memory : "4GB", + size : "6.7GB", + nodes : "Text to Image", + urls : [ + "https://huggingface.co/armory3d/z_image_turbo/resolve/main/Qwen3-4B-Instruct-2507-Q4_K_S.gguf", + "https://huggingface.co/armory3d/z_image_turbo/resolve/main/ae.safetensors", + "https://huggingface.co/armory3d/z_image_turbo/resolve/main/z_image_turbo-Q4_K.gguf" + ], + web : "https://huggingface.co/armory3d/z_image_turbo", + license : "apache-2.0" + }, + { + name : "Qwen Image", + memory : "13GB", + size : "16.9GB", + 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" + }, + { + name : "Qwen Image Edit", + memory : "13GB", + size : "18.3GB", + 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" + }, + { + name : "Wan", + memory : "10GB", + size : "21.3GB", + 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" + }, + { + name : "Marigold", + memory : "6GB", + size : "13.7GB", + nodes : "Image to Depth, Image to Normal Map Node, Image to PBR", + 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" + }, + { + name : "Real-ESRGAN", + memory : "1GB", + size : "0.07GB", + 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 : "Hunyuan3D", + memory : "12GB", + size : "12.6GB", + nodes : "Image to 3D Mesh", + urls : [ "https://huggingface.co/armory3d/hunyuan3d21_portable/resolve/main/Hunyuan3D_win64.tar" ], + web : "https://huggingface.co/armory3d/hunyuan3d21_portable", + license : "hunyuan3d" + } + ]; + // https://huggingface.co/webui/stable-diffusion-inpainting/resolve/main/sd-v1-5-inpainting.safetensors +} diff --git a/paint/sources/nodes_material.ts b/paint/sources/nodes_material.ts index 3a75c599..c16a7ecd 100644 --- a/paint/sources/nodes_material.ts +++ b/paint/sources/nodes_material.ts @@ -90,6 +90,9 @@ function nodes_material_init() { nodes_material_neural = []; edit_image_node_init(); + /// if arm_windows + image_to_3d_mesh_node_init(); + /// end image_to_depth_node_init(); image_to_normal_map_node_init(); image_to_pbr_node_init();