Add image to 3d mesh node

This commit is contained in:
luboslenco
2025-12-25 20:08:50 +01:00
parent ee6d9d917d
commit 10d178844b
4 changed files with 236 additions and 113 deletions
+10 -113
View File
@@ -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);
@@ -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
};
@@ -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
}
+3
View File
@@ -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();