paint: compile shaders faster
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user