paint: repeat and save image node test

This commit is contained in:
luboslenco
2026-05-26 17:59:14 +02:00
parent bf3bd1596f
commit e20737fa9e
5 changed files with 82 additions and 41 deletions
+5
View File
@@ -681,6 +681,11 @@ void rgb_node_init();
void rgb_to_bw_node_init();
void attribute_node_init();
void shader_node_init();
void save_image_node_init();
void save_image_node_run(ui_node_t *node, gpu_texture_t *result);
void repeat_node_init();
void neural_node_load_result(ui_node_t *node);
void text_to_image_node_run(ui_node_t *node, void (*callback)(ui_node_t *));
void upscale_image_node_init();
void image_to_pbr_node_init();
void inpaint_image_node_init();
+2
View File
@@ -86,6 +86,8 @@
#include "neural_nodes/neural_node.c"
#include "neural_nodes/neural_node_models.c"
#include "neural_nodes/outpaint_image_node.c"
#include "neural_nodes/repeat_node.c"
#include "neural_nodes/save_image_node.c"
#include "neural_nodes/text_to_image_node.c"
#include "neural_nodes/text_to_text_node.c"
#include "neural_nodes/tile_image_node.c"
+23 -8
View File
@@ -51,7 +51,7 @@ bool neural_node_button(ui_node_t *node, char *model) {
if (node != neural_node_current) {
ui->enabled = false;
}
ui_button(tr("Processing..."), UI_ALIGN_CENTER, "");
ui_button(tr("Running..."), UI_ALIGN_CENTER, "");
if (node != neural_node_current) {
ui->enabled = true;
}
@@ -65,19 +65,34 @@ bool neural_node_button(ui_node_t *node, char *model) {
return false;
}
void neural_node_load_result(ui_node_t *node) {
char *file = string("%s%soutput.png", neural_node_dir(), PATH_SEP);
if (iron_file_exists(file)) {
gpu_texture_t *result = iron_load_texture(file);
any_imap_set(neural_node_results, node->id, result);
ui_nodes_hwnd->redraws = 2;
ui_view2d_hwnd->redraws = 2;
ui_node_canvas_t *canvas = ui_nodes_get_canvas(true);
for (i32 i = 0; i < canvas->links->length; ++i) {
ui_node_link_t *l = canvas->links->buffer[i];
if (l->from_id == node->id) {
ui_node_t *to_node = ui_get_node(canvas->nodes, l->to_id);
if (to_node != NULL && string_equals(to_node->type, "NEURAL_SAVE_IMAGE")) {
save_image_node_run(node, result);
break;
}
}
}
}
}
void neural_node_check_result(ui_node_t *node) {
gc_unroot(neural_node_current);
neural_node_current = node;
gc_root(neural_node_current);
iron_delay_idle_sleep();
if (iron_exec_async_done == 1) {
char *file = string("%s%soutput.png", neural_node_dir(), PATH_SEP);
if (iron_file_exists(file)) {
gpu_texture_t *result = iron_load_texture(file);
any_imap_set(neural_node_results, node->id, result);
ui_nodes_hwnd->redraws = 2;
ui_view2d_hwnd->redraws = 2;
}
neural_node_load_result(node);
sys_remove_update(neural_node_check_result);
}
}
+50 -33
View File
@@ -130,6 +130,35 @@ string_array_t *text_to_image_node_wan_args(char *dir, char *prompt) {
return argv;
}
void text_to_image_node_run(ui_node_t *node, void (*callback)(ui_node_t *)) {
char *node_name = parser_material_node_name(node, NULL);
ui_handle_t *h = ui_handle(node_name);
i32 model = ui_nest(h, 0)->i;
char *prompt = ui_nest(h, 1)->text;
char *dir = neural_node_dir();
if (prompt == NULL || string_equals(prompt, "")) {
prompt = ".";
}
string_array_t *argv;
if (model == 0) {
argv = text_to_image_node_sd_args(dir, prompt);
}
else if (model == 1) {
argv = text_to_image_node_zimage_args(dir, prompt);
}
else if (model == 2) {
argv = text_to_image_node_qwen_args(dir, prompt);
}
else {
argv = text_to_image_node_wan_args(dir, prompt);
}
if (node->buttons->buffer[1]->default_value->buffer[0] > 0.0) {
array_insert(argv, argv->length - 1, "--circular");
}
iron_exec_async(argv->buffer[0], argv->buffer);
sys_notify_on_update(callback, node);
}
void text_to_image_node_button(i32 node_id) {
ui_node_t *node = ui_get_node(ui_nodes_get_canvas(true)->nodes, node_id);
char *node_name = parser_material_node_name(node, NULL);
@@ -147,45 +176,33 @@ void text_to_image_node_button(i32 node_id) {
node->buttons->buffer[0]->height = string_split(prompt, "\n")->length + 2;
if (neural_node_button(node, models->buffer[model])) {
char *dir = neural_node_dir();
if (string_equals(prompt, "")) {
prompt = ".";
}
string_array_t *argv;
if (model == 0) {
argv = text_to_image_node_sd_args(dir, prompt);
}
else if (model == 1) {
argv = text_to_image_node_zimage_args(dir, prompt);
}
else if (model == 2) {
argv = text_to_image_node_qwen_args(dir, prompt);
}
else {
argv = text_to_image_node_wan_args(dir, prompt);
}
if (node->buttons->buffer[1]->default_value->buffer[0] > 0.0) {
array_insert(argv, argv->length - 1, "--circular");
}
iron_exec_async(argv->buffer[0], argv->buffer);
sys_notify_on_update(neural_node_check_result, node);
text_to_image_node_run(node, neural_node_check_result);
}
}
void text_to_image_node_init() {
ui_node_t *text_to_image_node_def =
GC_ALLOC_INIT(ui_node_t, {.id = 0,
.name = _tr("Text to Image"),
.type = "NEURAL_TEXT_TO_IMAGE",
.x = 0,
.y = 0,
.color = 0xff4982a0,
.inputs = any_array_create_from_raw((void *[]){}, 0),
GC_ALLOC_INIT(ui_node_t, {.id = 0,
.name = _tr("Text to Image"),
.type = "NEURAL_TEXT_TO_IMAGE",
.x = 0,
.y = 0,
.color = 0xff4982a0,
.inputs = any_array_create_from_raw(
(void *[]){
GC_ALLOC_INIT(ui_node_socket_t, {.id = 0,
.node_id = 0,
.name = _tr("In"),
.type = "BOOL",
.color = 0xff6363c7,
.default_value = f32_array_create_xyz(0.0, 0.0, 0.0),
.min = 0.0,
.max = 1.0,
.precision = 100,
.display = 0}),
},
1),
.outputs = any_array_create_from_raw(
(void *[]){
GC_ALLOC_INIT(ui_node_socket_t, {.id = 0,
+2
View File
@@ -93,6 +93,8 @@ void nodes_material_init() {
image_to_pbr_node_init();
inpaint_image_node_init();
outpaint_image_node_init();
repeat_node_init();
save_image_node_init();
text_to_image_node_init();
tile_image_node_init();
upscale_image_node_init();