paint: fix height socket parse
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user