Files
armorpaint/paint/sources/slot_material.c
T

80 lines
2.3 KiB
C
Raw Normal View History

2026-03-09 13:17:15 +01:00
#include "global.h"
2026-04-05 16:09:00 +02:00
buffer_t *slot_material_default_canvas = NULL;
2026-03-06 12:56:38 +01:00
slot_material_t *slot_material_create(material_data_t *m, ui_node_canvas_t *c) {
2026-08-21 22:35:41 +02:00
slot_material_t *raw = ALLOC_INIT(slot_material_t, {0});
2026-03-06 12:56:38 +01:00
raw->nodes = ui_nodes_create();
raw->preview_ready = false;
raw->id = 0;
raw->paint_base = true;
raw->paint_opac = true;
raw->paint_opac_mode = OPACITY_MODE_ALPHA;
2026-03-06 12:56:38 +01:00
raw->paint_occ = true;
raw->paint_rough = true;
raw->paint_met = true;
raw->paint_nor = true;
raw->paint_height = true;
raw->paint_emis = true;
raw->paint_subs = true;
2026-06-05 20:34:10 +02:00
for (i32 i = 0; i < g_project->_->materials->length; ++i) {
slot_material_t *mat = g_project->_->materials->buffer[i];
2026-03-06 12:56:38 +01:00
if (mat->id >= raw->id) {
raw->id = mat->id + 1;
}
}
2026-03-10 21:00:00 +01:00
raw->data = m;
2026-03-06 12:56:38 +01:00
i32 w = util_render_material_preview_size;
i32 w_icon = 50;
raw->image = gpu_create_render_target(w, w, GPU_TEXTURE_FORMAT_RGBA64);
raw->image_icon = gpu_create_render_target(w_icon, w_icon, GPU_TEXTURE_FORMAT_RGBA64);
2026-03-07 21:12:59 +01:00
if (c == NULL) {
if (slot_material_default_canvas == NULL) { // Synchronous
2026-08-21 22:40:25 +02:00
buffer_t *b = data_get_blob("default_material.arm");
2026-03-06 12:56:38 +01:00
slot_material_default_canvas = b;
}
2026-08-21 22:35:41 +02:00
ui_node_canvas_t *decoded = armpack_decode(slot_material_default_canvas);
raw->canvas = util_clone_canvas(decoded);
free(decoded);
2026-03-06 12:56:38 +01:00
i32 id = (raw->id + 1);
2026-03-10 21:00:00 +01:00
raw->canvas->name = string("Material %d", id);
2026-03-06 12:56:38 +01:00
}
else {
raw->canvas = util_clone_canvas(c);
}
2026-04-05 16:41:00 +02:00
if (g_config->node_previews) {
2026-03-06 12:56:38 +01:00
for (i32 i = 0; i < raw->canvas->nodes->length; ++i) {
ui_node_t *n = raw->canvas->nodes->buffer[i];
n->flags |= UI_NODE_FLAG_PREVIEW;
}
}
2026-03-10 21:00:00 +01:00
#if defined(IRON_ANDROID) || defined(IRON_IOS)
2026-03-06 12:56:38 +01:00
raw->nodes->pan_x -= 50; // Center initial position
2026-03-10 21:00:00 +01:00
#else
2026-03-06 12:56:38 +01:00
raw->nodes->pan_x += 110;
2026-03-10 21:00:00 +01:00
#endif
2026-03-06 12:56:38 +01:00
raw->nodes->pan_y += 120;
return raw;
}
void slot_material_unload(slot_material_t *raw) {
gpu_delete_texture(raw->image);
gpu_delete_texture(raw->image_icon);
}
void slot_material_delete(slot_material_t *raw) {
slot_material_unload(raw);
2026-06-05 20:34:10 +02:00
i32 mpos = array_index_of(g_project->_->materials, raw);
array_remove(g_project->_->materials, raw);
if (g_project->_->materials->length > 0) {
context_set_material(g_project->_->materials->buffer[mpos > 0 ? mpos - 1 : 0]);
2026-03-06 12:56:38 +01:00
}
}