paint: compile shaders faster

This commit is contained in:
luboslenco
2026-05-17 14:07:36 +02:00
parent 03ee5c7e8d
commit 58a5f0361a
4 changed files with 62 additions and 4 deletions
+2
View File
@@ -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);
+55 -1
View File
@@ -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;
+2 -1
View File
@@ -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) {
+3 -2
View File
@@ -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;
}