diff --git a/paint/sources/globals.h b/paint/sources/globals.h index b8b8f1dc..9ba815fe 100644 --- a/paint/sources/globals.h +++ b/paint/sources/globals.h @@ -216,7 +216,6 @@ any_map_t *parser_material_node_values; any_map_t *parser_material_node_vectors; any_map_t *parser_material_custom_nodes; bool parser_material_parse_height = false; -bool parser_material_parse_height_as_channel = false; bool parser_material_parse_emission = false; bool parser_material_parse_subsurface = false; bool parser_material_parsing_basecolor = false; diff --git a/paint/sources/parser_material.c b/paint/sources/parser_material.c index f9276884..d9b6dcaf 100644 --- a/paint/sources/parser_material.c +++ b/paint/sources/parser_material.c @@ -1,11 +1,6 @@ #include "global.h" -bool parser_material_cotangent_frame_written; -bool parser_material_parse_surface = true; -bool parser_material_parse_opacity = true; -bool parser_material_arm_export_tangents = true; - ui_node_t *parser_material_get_node(i32 id) { for (i32 i = 0; i < parser_material_nodes->length; ++i) { ui_node_t *n = parser_material_nodes->buffer[i]; @@ -41,8 +36,6 @@ void parser_material_init() { parser_material_parents = any_array_create_from_raw((void *[]){}, 0); gc_root(parser_material_parents); - parser_material_cotangent_frame_written = false; - gc_unroot(parser_material_out_normaltan); parser_material_out_normaltan = "float3(0.5, 0.5, 1.0)"; gc_root(parser_material_out_normaltan); @@ -59,18 +52,7 @@ void parse_normal_map_color_input(ui_node_socket_t *inp) { gc_root(parser_material_out_normaltan); bool _parser_material_is_frag = parser_material_is_frag; parser_material_is_frag = true; - if (!parser_material_arm_export_tangents) { - parser_material_write(parser_material_kong, string("var texn: float3 = (%s) * 2.0 - 1.0;", parser_material_out_normaltan)); - parser_material_write(parser_material_kong, "texn.y = -texn.y;"); - if (!parser_material_cotangent_frame_written) { - parser_material_cotangent_frame_written = true; - node_shader_add_function(parser_material_kong, str_cotangent_frame); - } - parser_material_kong->frag_n = true; - parser_material_write(parser_material_kong, "var TBN: float3x3 = cotangent_frame(n, vvec, tex_coord);"); - parser_material_write(parser_material_kong, "n = TBN * normalize(texn);"); - } - parser_material_is_frag = _parser_material_is_frag; + parser_material_is_frag = _parser_material_is_frag; parser_material_kong->frag_write_normal--; } @@ -84,42 +66,32 @@ shader_out_t *parser_material_parse_shader(ui_node_t *node, ui_node_socket_t *so .out_emission = "0.0", .out_subsurface = "0.0"}); if (string_equals(node->type, "OUTPUT_MATERIAL_PBR")) { - if (parser_material_parse_surface) { - // Normal - parsed first to retrieve uv coords - parse_normal_map_color_input(node->inputs->buffer[5]); - // Base color - parser_material_parsing_basecolor = true; - sout->out_basecol = string_copy(parser_material_parse_vector_input(node->inputs->buffer[0])); - parser_material_parsing_basecolor = false; - // Occlusion - sout->out_occlusion = string_copy(parser_material_parse_value_input(node->inputs->buffer[2], false)); - // Roughness - sout->out_roughness = string_copy(parser_material_parse_value_input(node->inputs->buffer[3], false)); - // Metallic - sout->out_metallic = string_copy(parser_material_parse_value_input(node->inputs->buffer[4], false)); - // Emission - if (parser_material_parse_emission) { - sout->out_emission = string_copy(parser_material_parse_value_input(node->inputs->buffer[6], false)); - } - // Subsurface - if (parser_material_parse_subsurface) { - sout->out_subsurface = string_copy(parser_material_parse_value_input(node->inputs->buffer[8], false)); - } - } - if (parser_material_parse_opacity) { - sout->out_opacity = string_copy(parser_material_parse_value_input(node->inputs->buffer[1], false)); + // Normal - parsed first to retrieve uv coords + parse_normal_map_color_input(node->inputs->buffer[5]); + // Base color + parser_material_parsing_basecolor = true; + sout->out_basecol = string_copy(parser_material_parse_vector_input(node->inputs->buffer[0])); + parser_material_parsing_basecolor = false; + // Occlusion + sout->out_occlusion = string_copy(parser_material_parse_value_input(node->inputs->buffer[2], false)); + // Roughness + sout->out_roughness = string_copy(parser_material_parse_value_input(node->inputs->buffer[3], false)); + // Metallic + sout->out_metallic = string_copy(parser_material_parse_value_input(node->inputs->buffer[4], false)); + // Emission + if (parser_material_parse_emission) { + sout->out_emission = string_copy(parser_material_parse_value_input(node->inputs->buffer[6], false)); } - - // Displacement / Height + // Subsurface + if (parser_material_parse_subsurface) { + sout->out_subsurface = string_copy(parser_material_parse_value_input(node->inputs->buffer[8], false)); + } + // Opacity + sout->out_opacity = string_copy(parser_material_parse_value_input(node->inputs->buffer[1], false)); + // Height if (parser_material_parse_height) { - if (!parser_material_parse_height_as_channel) { - parser_material_is_frag = false; - } sout->out_height = string_copy(parser_material_parse_value_input(node->inputs->buffer[7], false)); - if (!parser_material_parse_height_as_channel) { - parser_material_is_frag = true; - } } } return sout; @@ -144,18 +116,8 @@ shader_out_t *parser_material_parse_shader_input(ui_node_socket_t *inp) { } } -shader_out_t *parser_material_parse_output(ui_node_t *node) { - if (parser_material_parse_surface || parser_material_parse_opacity) { - return parser_material_parse_shader_input(node->inputs->buffer[0]); - } - return NULL; -} - shader_out_t *parser_material_parse_output_pbr(ui_node_t *node) { - if (parser_material_parse_surface || parser_material_parse_opacity) { - return parser_material_parse_shader(node, NULL); - } - return NULL; + return parser_material_parse_shader(node, NULL); } shader_out_t *parser_material_parse(ui_node_canvas_t *canvas, node_shader_context_t *_con, node_shader_t *_kong, material_context_t *_matcon) { @@ -205,11 +167,7 @@ shader_out_t *parser_material_parse(ui_node_canvas_t *canvas, node_shader_contex return sout; } - ui_node_t *output_node = parser_material_node_by_type(parser_material_nodes, "OUTPUT_MATERIAL"); - if (output_node != NULL) { - return parser_material_parse_output(output_node); - } - output_node = parser_material_node_by_type(parser_material_nodes, "OUTPUT_MATERIAL_PBR"); + ui_node_t *output_node = parser_material_node_by_type(parser_material_nodes, "OUTPUT_MATERIAL_PBR"); if (output_node != NULL) { return parser_material_parse_output_pbr(output_node); } diff --git a/paint/sources/render/make_mesh_preview.c b/paint/sources/render/make_mesh_preview.c index 43ffd914..fdfbe78a 100644 --- a/paint/sources/render/make_mesh_preview.c +++ b/paint/sources/render/make_mesh_preview.c @@ -46,10 +46,8 @@ node_shader_context_t *make_mesh_preview_run(material_t *data, material_context_ parser_material_sample_uv_scale = string_copy(brush_scale); gc_root(parser_material_sample_uv_scale); parser_material_parse_height = make_material_height_used; - parser_material_parse_height_as_channel = true; shader_out_t *sout = parser_material_parse(g_context->material->canvas, con_mesh, kong, matcon); parser_material_parse_height = false; - parser_material_parse_height_as_channel = false; parser_material_sample_keep_aspect = false; char *base = sout->out_basecol; char *rough = sout->out_roughness; diff --git a/paint/sources/render/make_paint.c b/paint/sources/render/make_paint.c index e0e6de82..5f7b53b7 100644 --- a/paint/sources/render/make_paint.c +++ b/paint/sources/render/make_paint.c @@ -5,6 +5,12 @@ bool make_paint_is_raytraced_bake() { return g_context->bake_type == BAKE_TYPE_INIT; } +bool make_paint_is_zero_constant(char *s) { + char *end; + f32 f = strtof(s, &end); + return end != s && *end == '\0' && f == 0.0; +} + string_array_t *make_paint_color_attachments() { if (g_context->tool == TOOL_TYPE_COLORID || g_context->tool == TOOL_TYPE_CURSOR) { string_array_t *res = any_array_create_from_raw( @@ -319,7 +325,6 @@ node_shader_context_t *make_paint_run(material_t *data, material_context_t *matc parser_material_parse_emission = g_context->material->paint_emis; parser_material_parse_subsurface = g_context->material->paint_subs; parser_material_parse_height = g_context->material->paint_height; - parser_material_parse_height_as_channel = true; uv_type_t uv_type = g_context->layer->fill_material != NULL ? g_context->layer->uv_type : g_context->brush_paint; parser_material_triplanar = uv_type == UV_TYPE_TRIPLANAR && !decal; parser_material_sample_keep_aspect = decal; @@ -329,7 +334,6 @@ node_shader_context_t *make_paint_run(material_t *data, material_context_t *matc shader_out_t *sout = parser_material_parse(g_context->material->canvas, con_paint, kong, matcon); parser_material_parse_emission = false; parser_material_parse_subsurface = false; - parser_material_parse_height_as_channel = false; parser_material_parse_height = false; char *base = sout->out_basecol; char *rough = sout->out_roughness; @@ -365,7 +369,7 @@ node_shader_context_t *make_paint_run(material_t *data, material_context_t *matc if (g_context->material->paint_subs) { node_shader_write_frag(kong, string("var subs: float = %s;", subs)); } - if (!make_material_height_used && parse_float(height) != 0.0) { + if (!make_material_height_used && !make_paint_is_zero_constant(height)) { make_material_height_used = true; // Height used for the first time, also rebuild vertex shader return make_paint_run(data, matcon); diff --git a/paint/sources/render/make_sculpt.c b/paint/sources/render/make_sculpt.c index 31bc1c33..4a7725fc 100644 --- a/paint/sources/render/make_sculpt.c +++ b/paint/sources/render/make_sculpt.c @@ -482,7 +482,6 @@ node_shader_context_t *sculpt_make_sculpt_run(material_t *data, material_context // parser_material_parse may add vertex elements i32 velen = con_paint->data->vertex_elements->length; // parser_material_parse_height = true; - // parser_material_parse_height_as_channel = true; shader_out_t *sout = parser_material_parse(g_context->material->canvas, con_paint, kong, matcon); con_paint->data->vertex_elements->length = velen; parser_material_triplanar = false;