paint: separate sculpt layers stack

This commit is contained in:
luboslenco
2026-05-28 13:36:11 +02:00
parent 581bdcf56c
commit 1d9e1111c6
3 changed files with 46 additions and 3 deletions
+34
View File
@@ -410,6 +410,7 @@ void base_render(void *_) {
util_render_make_material_preview();
ui_base_hwnds->buffer[TAB_AREA_SIDEBAR1]->redraws = 2;
base_init_undo_layers();
make_material_parse_mesh_material();
make_material_parse_paint_material(true);
g_context->ddirty = 0;
@@ -2353,6 +2354,13 @@ void base_update_workspace() {
base_resize();
}
void base_update_workflow_create_sculpt_layer(void *_) {
if (history_undo_layers != NULL) {
sculpt_layers_create_sculpt_layer();
sys_remove_update(base_update_workflow_create_sculpt_layer);
}
}
void base_update_workflow() {
// Update Material Output nodes
for (i32 i = 0; i < project_materials->length; ++i) {
@@ -2364,6 +2372,32 @@ void base_update_workflow() {
}
}
}
if (g_config->workflow == WORKFLOW_SCULPT) {
slot_layer_t *first_sculpt = NULL;
for (i32 i = project_layers->length - 1; i >= 0; --i) {
if (project_layers->buffer[i]->texpaint_sculpt != NULL) {
first_sculpt = project_layers->buffer[i];
break;
}
}
if (first_sculpt == NULL) {
sys_remove_update(base_update_workflow_create_sculpt_layer);
sys_notify_on_update(base_update_workflow_create_sculpt_layer, NULL);
}
else {
context_set_layer(first_sculpt);
}
}
else {
for (i32 i = project_layers->length - 1; i >= 0; --i) {
slot_layer_t *l = project_layers->buffer[i];
if (l->texpaint_sculpt == NULL && slot_layer_is_layer(l)) {
context_set_layer(l);
break;
}
}
}
}
void base_run_in_player() {
+4 -3
View File
@@ -213,7 +213,7 @@ node_shader_context_t *sculpt_make_sculpt_run(material_t *data, material_context
void sculpt_make_mesh_run(node_shader_t *kong, slot_layer_t *l) {
node_shader_add_constant(kong, "WVP: float4x4", "_world_view_proj_matrix");
i32 lid = l->id;
i32 lid = array_index_of(project_layers, l);
node_shader_add_texture(kong, "texpaint_sculpt", string("_texpaint_sculpt%s", i32_to_string(lid)));
node_shader_add_constant(kong, "texpaint_sculpt_size: float2", string("_size(_texpaint_sculpt%s)", i32_to_string(lid)));
// node_shader_write_vert(kong, "var meshpos: float3 = sample_lod(texpaint_sculpt, sampler_linear, uint2(vertex_id() % constants.texpaint_sculpt_size.x,
@@ -337,8 +337,9 @@ void sculpt_init() {
}
void sculpt_layers_create_sculpt_layer() {
slot_layer_t *l = layers_new_layer(true, -1, NULL);
mesh_data_t *md = g_context->paint_object->data;
slot_layer_t *l = layers_new_layer(true, -1, NULL);
l->name = string("Sculpt %d", l->id + 1);
mesh_data_t *md = g_context->paint_object->data;
sculpt_init_sculpt_texture(l, md);
sculpt_init();
}
+8
View File
@@ -914,6 +914,14 @@ void tab_layers_draw_layer_slot(slot_layer_t *l, i32 i, bool mini) {
return;
}
bool is_sculpt_layer = l->texpaint_sculpt != NULL;
if (g_config->workflow == WORKFLOW_SCULPT && !is_sculpt_layer) {
return;
}
if (g_config->workflow != WORKFLOW_SCULPT && is_sculpt_layer) {
return;
}
if (l->parent != NULL && !l->parent->show_panel) { // Group closed
return;
}