diff --git a/paint/sources/functions.h b/paint/sources/functions.h index 0b3004aa..a4423212 100644 --- a/paint/sources/functions.h +++ b/paint/sources/functions.h @@ -475,6 +475,8 @@ void make_material_parse_mesh_material(); void make_material_parse_depth_material(); void make_material_parse_mesh_preview_material(); void make_material_parse_paint_material(bool bake_previews); +void make_material_save_paint_material(); +void make_material_restore_paint_material(); parse_node_preview_result_t *make_material_parse_node_preview_material(ui_node_t *node, ui_node_canvas_t *group, ui_node_t_array_t *parents); void make_material_parse_brush(); char *make_material_blend_mode(node_shader_t *kong, i32 blending, char *cola, char *colb, char *opac); diff --git a/paint/sources/make_material.c b/paint/sources/make_material.c index 1ed2ec7a..ebdaba00 100644 --- a/paint/sources/make_material.c +++ b/paint/sources/make_material.c @@ -3,6 +3,8 @@ shader_context_t *make_material_default_scon = NULL; material_context_t *make_material_default_mcon = NULL; +static shader_context_t *make_material_saved_scon = NULL; +static material_context_t *make_material_saved_mcon = NULL; bool make_material_get_mout() { for (i32 i = 0; i < g_context->material->canvas->nodes->length; ++i) { @@ -296,7 +298,7 @@ void make_material_parse_paint_material(bool bake_previews) { shader_context_t *c = m->_->shader->contexts->buffer[i]; if (string_equals(c->name, "paint")) { array_remove(m->_->shader->contexts, c); - if (c != make_material_default_scon) { + if (c != make_material_default_scon && c != make_material_saved_scon) { make_material_delete_context(c); } break; @@ -342,6 +344,58 @@ void make_material_parse_paint_material(bool bake_previews) { } } +void make_material_save_paint_material() { + material_data_t *m = project_materials->buffer[0]->data; + for (i32 i = 0; i < m->_->shader->contexts->length; ++i) { + shader_context_t *c = m->_->shader->contexts->buffer[i]; + if (string_equals(c->name, "paint")) { + gc_unroot(make_material_saved_scon); + make_material_saved_scon = c; + gc_root(make_material_saved_scon); + break; + } + } + for (i32 i = 0; i < m->contexts->length; ++i) { + material_context_t *c = m->contexts->buffer[i]; + if (string_equals(c->name, "paint")) { + gc_unroot(make_material_saved_mcon); + make_material_saved_mcon = c; + gc_root(make_material_saved_mcon); + break; + } + } +} + +void make_material_restore_paint_material() { + if (make_material_saved_scon == NULL) { + return; + } + material_data_t *m = project_materials->buffer[0]->data; + for (i32 i = 0; i < m->_->shader->contexts->length; ++i) { + shader_context_t *c = m->_->shader->contexts->buffer[i]; + if (string_equals(c->name, "paint")) { + array_remove(m->_->shader->contexts, c); + if (c != make_material_default_scon && c != make_material_saved_scon) { + make_material_delete_context(c); + } + break; + } + } + for (i32 i = 0; i < m->contexts->length; ++i) { + material_context_t *c = m->contexts->buffer[i]; + if (string_equals(c->name, "paint")) { + array_remove(m->contexts, c); + break; + } + } + any_array_push(m->_->shader->contexts, make_material_saved_scon); + any_array_push(m->contexts, make_material_saved_mcon); + gc_unroot(make_material_saved_scon); + gc_unroot(make_material_saved_mcon); + make_material_saved_scon = NULL; + make_material_saved_mcon = NULL; +} + parse_node_preview_result_t *make_material_parse_node_preview_material(ui_node_t *node, ui_node_canvas_t *group, ui_node_t_array_t *parents) { if (node->outputs->length == 0) { return NULL; diff --git a/paint/sources/util_layer.c b/paint/sources/util_layer.c index a7e7b870..a1fedee3 100644 --- a/paint/sources/util_layer.c +++ b/paint/sources/util_layer.c @@ -266,6 +266,7 @@ static void path_repaint(slot_layer_t *l) { g_context->material = l->path_material; g_context->tool = l->path_tool; + make_material_save_paint_material(); make_material_parse_paint_material(false); layers_set_object_mask(); @@ -308,7 +309,7 @@ static void path_repaint(slot_layer_t *l) { g_context->last_paint_vec_x = _last_x; g_context->last_paint_vec_y = _last_y; g_context->paint_vec = _paint_vec; - make_material_parse_paint_material(false); + make_material_restore_paint_material(); } void util_layer_clear_path_points(slot_layer_t *l) { diff --git a/paint/sources/util_render.c b/paint/sources/util_render.c index 4ad809d0..2fca407f 100644 --- a/paint/sources/util_render.c +++ b/paint/sources/util_render.c @@ -536,7 +536,8 @@ void util_render_pick_pos_nor_tex() { g_context->pdirty = 1; tool_type_t _tool = g_context->tool; g_context->tool = TOOL_TYPE_PICKER; - make_material_parse_paint_material(true); + make_material_save_paint_material(); + make_material_parse_paint_material(false); if (g_context->paint2d) { render_path_paint_set_plane_mesh(); } @@ -546,7 +547,7 @@ void util_render_pick_pos_nor_tex() { } g_context->tool = _tool; g_context->pick_pos_nor_tex = false; - make_material_parse_paint_material(true); + make_material_restore_paint_material(); g_context->pdirty = 0; }