Add image to 3d mesh node
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user