paint: fix height socket parse

This commit is contained in:
luboslenco
2026-07-16 21:31:56 +02:00
parent 2eb65704ee
commit 7d900e9d07
5 changed files with 32 additions and 74 deletions
-1
View File
@@ -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;
+25 -67
View File
@@ -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);
}
-2
View File
@@ -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;
+7 -3
View File
@@ -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);
-1
View File
@@ -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;