Made triplanar local space by default, world space optionally, closes #10159
This commit is contained in:
parent
9c894cf550
commit
b4efb832a7
2 changed files with 28 additions and 25 deletions
|
@ -375,7 +375,7 @@ void SpatialMaterial::_update_shader() {
|
|||
code += ",vertex_lighting";
|
||||
}
|
||||
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR] || flags[FLAG_UV2_USE_TRIPLANAR]) {
|
||||
if (flags[FLAG_TRIPLANAR_USE_WORLD] && (flags[FLAG_UV1_USE_TRIPLANAR] || flags[FLAG_UV2_USE_TRIPLANAR])) {
|
||||
code += ",world_vertex_coords";
|
||||
}
|
||||
code += ";\n";
|
||||
|
@ -458,10 +458,10 @@ void SpatialMaterial::_update_shader() {
|
|||
code += "uniform int depth_max_layers;\n";
|
||||
}
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR]) {
|
||||
code += "varying vec3 uv1_world_pos;\n";
|
||||
code += "varying vec3 uv1_triplanar_pos;\n";
|
||||
}
|
||||
if (flags[FLAG_UV2_USE_TRIPLANAR]) {
|
||||
code += "varying vec3 uv2_world_pos;\n";
|
||||
code += "varying vec3 uv2_triplanar_pos;\n";
|
||||
}
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR]) {
|
||||
code += "uniform float uv1_blend_sharpness;\n";
|
||||
|
@ -570,16 +570,16 @@ void SpatialMaterial::_update_shader() {
|
|||
|
||||
code += "\tuv1_power_normal=pow(abs(NORMAL),vec3(uv1_blend_sharpness));\n";
|
||||
code += "\tuv1_power_normal/=dot(uv1_power_normal,vec3(1.0));\n";
|
||||
code += "\tuv1_world_pos = VERTEX * uv1_scale + uv1_offset;\n";
|
||||
code += "\tuv1_world_pos *= vec3(1.0,-1.0, 1.0);\n";
|
||||
code += "\tuv1_triplanar_pos = VERTEX * uv1_scale + uv1_offset;\n";
|
||||
code += "\tuv1_triplanar_pos *= vec3(1.0,-1.0, 1.0);\n";
|
||||
}
|
||||
|
||||
if (flags[FLAG_UV2_USE_TRIPLANAR]) {
|
||||
|
||||
code += "\tuv2_power_normal=pow(abs(NORMAL), vec3(uv2_blend_sharpness));\n";
|
||||
code += "\tuv2_power_normal/=dot(uv2_power_normal,vec3(1.0));\n";
|
||||
code += "\tuv2_world_pos = VERTEX * uv2_scale + uv2_offset;\n";
|
||||
code += "\tuv2_world_pos *= vec3(1.0,-1.0, 1.0);\n";
|
||||
code += "\tuv2_triplanar_pos = VERTEX * uv2_scale + uv2_offset;\n";
|
||||
code += "\tuv2_triplanar_pos *= vec3(1.0,-1.0, 1.0);\n";
|
||||
}
|
||||
|
||||
if (grow_enabled) {
|
||||
|
@ -589,11 +589,11 @@ void SpatialMaterial::_update_shader() {
|
|||
code += "}\n";
|
||||
code += "\n\n";
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR] || flags[FLAG_UV2_USE_TRIPLANAR]) {
|
||||
code += "vec4 triplanar_texture(sampler2D p_sampler,vec3 p_weights,vec3 p_world_pos) {\n";
|
||||
code += "vec4 triplanar_texture(sampler2D p_sampler,vec3 p_weights,vec3 p_triplanar_pos) {\n";
|
||||
code += "\tvec4 samp=vec4(0.0);\n";
|
||||
code += "\tsamp+= texture(p_sampler,p_world_pos.xy) * p_weights.z;\n";
|
||||
code += "\tsamp+= texture(p_sampler,p_world_pos.xz) * p_weights.y;\n";
|
||||
code += "\tsamp+= texture(p_sampler,p_world_pos.zy * vec2(-1.0,1.0)) * p_weights.x;\n";
|
||||
code += "\tsamp+= texture(p_sampler,p_triplanar_pos.xy) * p_weights.z;\n";
|
||||
code += "\tsamp+= texture(p_sampler,p_triplanar_pos.xz) * p_weights.y;\n";
|
||||
code += "\tsamp+= texture(p_sampler,p_triplanar_pos.zy * vec2(-1.0,1.0)) * p_weights.x;\n";
|
||||
code += "\treturn samp;\n";
|
||||
code += "}\n";
|
||||
}
|
||||
|
@ -649,7 +649,7 @@ void SpatialMaterial::_update_shader() {
|
|||
code += "\tvec4 albedo_tex = texture(texture_albedo,POINT_COORD);\n";
|
||||
} else {
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR]) {
|
||||
code += "\tvec4 albedo_tex = triplanar_texture(texture_albedo,uv1_power_normal,uv1_world_pos);\n";
|
||||
code += "\tvec4 albedo_tex = triplanar_texture(texture_albedo,uv1_power_normal,uv1_triplanar_pos);\n";
|
||||
} else {
|
||||
code += "\tvec4 albedo_tex = texture(texture_albedo,base_uv);\n";
|
||||
}
|
||||
|
@ -661,13 +661,13 @@ void SpatialMaterial::_update_shader() {
|
|||
|
||||
code += "\tALBEDO = albedo.rgb * albedo_tex.rgb;\n";
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR]) {
|
||||
code += "\tfloat metallic_tex = dot(triplanar_texture(texture_metallic,uv1_power_normal,uv1_world_pos),metallic_texture_channel);\n";
|
||||
code += "\tfloat metallic_tex = dot(triplanar_texture(texture_metallic,uv1_power_normal,uv1_triplanar_pos),metallic_texture_channel);\n";
|
||||
} else {
|
||||
code += "\tfloat metallic_tex = dot(texture(texture_metallic,base_uv),metallic_texture_channel);\n";
|
||||
}
|
||||
code += "\tMETALLIC = metallic_tex * metallic;\n";
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR]) {
|
||||
code += "\tfloat roughness_tex = dot(triplanar_texture(texture_roughness,uv1_power_normal,uv1_world_pos),roughness_texture_channel);\n";
|
||||
code += "\tfloat roughness_tex = dot(triplanar_texture(texture_roughness,uv1_power_normal,uv1_triplanar_pos),roughness_texture_channel);\n";
|
||||
} else {
|
||||
code += "\tfloat roughness_tex = dot(texture(texture_roughness,base_uv),roughness_texture_channel);\n";
|
||||
}
|
||||
|
@ -676,7 +676,7 @@ void SpatialMaterial::_update_shader() {
|
|||
|
||||
if (features[FEATURE_NORMAL_MAPPING]) {
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR]) {
|
||||
code += "\tNORMALMAP = triplanar_texture(texture_normal,uv1_power_normal,uv1_world_pos).rgb;\n";
|
||||
code += "\tNORMALMAP = triplanar_texture(texture_normal,uv1_power_normal,uv1_triplanar_pos).rgb;\n";
|
||||
} else {
|
||||
code += "\tNORMALMAP = texture(texture_normal,base_uv).rgb;\n";
|
||||
}
|
||||
|
@ -685,7 +685,7 @@ void SpatialMaterial::_update_shader() {
|
|||
|
||||
if (features[FEATURE_EMISSION]) {
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR]) {
|
||||
code += "\tvec3 emission_tex = triplanar_texture(texture_emission,uv1_power_normal,uv1_world_pos).rgb;\n";
|
||||
code += "\tvec3 emission_tex = triplanar_texture(texture_emission,uv1_power_normal,uv1_triplanar_pos).rgb;\n";
|
||||
} else {
|
||||
code += "\tvec3 emission_tex = texture(texture_emission,base_uv).rgb;\n";
|
||||
}
|
||||
|
@ -712,7 +712,7 @@ void SpatialMaterial::_update_shader() {
|
|||
|
||||
if (features[FEATURE_RIM]) {
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR]) {
|
||||
code += "\tvec2 rim_tex = triplanar_texture(texture_rim,uv1_power_normal,uv1_world_pos).xy;\n";
|
||||
code += "\tvec2 rim_tex = triplanar_texture(texture_rim,uv1_power_normal,uv1_triplanar_pos).xy;\n";
|
||||
} else {
|
||||
code += "\tvec2 rim_tex = texture(texture_rim,base_uv).xy;\n";
|
||||
}
|
||||
|
@ -722,7 +722,7 @@ void SpatialMaterial::_update_shader() {
|
|||
|
||||
if (features[FEATURE_CLEARCOAT]) {
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR]) {
|
||||
code += "\tvec2 clearcoat_tex = triplanar_texture(texture_clearcoat,uv1_power_normal,uv1_world_pos).xy;\n";
|
||||
code += "\tvec2 clearcoat_tex = triplanar_texture(texture_clearcoat,uv1_power_normal,uv1_triplanar_pos).xy;\n";
|
||||
} else {
|
||||
code += "\tvec2 clearcoat_tex = texture(texture_clearcoat,base_uv).xy;\n";
|
||||
}
|
||||
|
@ -732,7 +732,7 @@ void SpatialMaterial::_update_shader() {
|
|||
|
||||
if (features[FEATURE_ANISOTROPY]) {
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR]) {
|
||||
code += "\tvec3 anisotropy_tex = triplanar_texture(texture_flowmap,uv1_power_normal,uv1_world_pos).rga;\n";
|
||||
code += "\tvec3 anisotropy_tex = triplanar_texture(texture_flowmap,uv1_power_normal,uv1_triplanar_pos).rga;\n";
|
||||
} else {
|
||||
code += "\tvec3 anisotropy_tex = texture(texture_flowmap,base_uv).rga;\n";
|
||||
}
|
||||
|
@ -743,13 +743,13 @@ void SpatialMaterial::_update_shader() {
|
|||
if (features[FEATURE_AMBIENT_OCCLUSION]) {
|
||||
if (flags[FLAG_AO_ON_UV2]) {
|
||||
if (flags[FLAG_UV2_USE_TRIPLANAR]) {
|
||||
code += "\tAO = dot(triplanar_texture(texture_ambient_occlusion,uv2_power_normal,uv2_world_pos),ao_texture_channel);\n";
|
||||
code += "\tAO = dot(triplanar_texture(texture_ambient_occlusion,uv2_power_normal,uv2_triplanar_pos),ao_texture_channel);\n";
|
||||
} else {
|
||||
code += "\tAO = dot(texture(texture_ambient_occlusion,base_uv2),ao_texture_channel);\n";
|
||||
}
|
||||
} else {
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR]) {
|
||||
code += "\tAO = dot(triplanar_texture(texture_ambient_occlusion,uv1_power_normal,uv1_world_pos),ao_texture_channel);\n";
|
||||
code += "\tAO = dot(triplanar_texture(texture_ambient_occlusion,uv1_power_normal,uv1_triplanar_pos),ao_texture_channel);\n";
|
||||
} else {
|
||||
code += "\tAO = dot(texture(texture_ambient_occlusion,base_uv),ao_texture_channel);\n";
|
||||
}
|
||||
|
@ -759,7 +759,7 @@ void SpatialMaterial::_update_shader() {
|
|||
if (features[FEATURE_SUBSURACE_SCATTERING]) {
|
||||
|
||||
if (flags[FLAG_UV1_USE_TRIPLANAR]) {
|
||||
code += "\tfloat sss_tex = triplanar_texture(texture_subsurface_scattering,uv1_power_normal,uv1_world_pos).r;\n";
|
||||
code += "\tfloat sss_tex = triplanar_texture(texture_subsurface_scattering,uv1_power_normal,uv1_triplanar_pos).r;\n";
|
||||
} else {
|
||||
code += "\tfloat sss_tex = texture(texture_subsurface_scattering,base_uv).r;\n";
|
||||
}
|
||||
|
@ -772,8 +772,8 @@ void SpatialMaterial::_update_shader() {
|
|||
|
||||
if (triplanar) {
|
||||
String tp_uv = detail_uv == DETAIL_UV_1 ? "uv1" : "uv2";
|
||||
code += "\tvec4 detail_tex = triplanar_texture(texture_detail_albedo," + tp_uv + "_power_normal," + tp_uv + "_world_pos);\n";
|
||||
code += "\tvec4 detail_norm_tex = triplanar_texture(texture_detail_normal," + tp_uv + "_power_normal," + tp_uv + "_world_pos);\n";
|
||||
code += "\tvec4 detail_tex = triplanar_texture(texture_detail_albedo," + tp_uv + "_power_normal," + tp_uv + "_triplanar_pos);\n";
|
||||
code += "\tvec4 detail_norm_tex = triplanar_texture(texture_detail_normal," + tp_uv + "_power_normal," + tp_uv + "_triplanar_pos);\n";
|
||||
|
||||
} else {
|
||||
String det_uv = detail_uv == DETAIL_UV_1 ? "base_uv" : "base_uv2";
|
||||
|
@ -1635,6 +1635,7 @@ void SpatialMaterial::_bind_methods() {
|
|||
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags_vertex_lighting"), "set_flag", "get_flag", FLAG_USE_VERTEX_LIGHTING);
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags_no_depth_test"), "set_flag", "get_flag", FLAG_DISABLE_DEPTH_TEST);
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags_use_point_size"), "set_flag", "get_flag", FLAG_USE_POINT_SIZE);
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags_world_triplanar"), "set_flag", "get_flag", FLAG_TRIPLANAR_USE_WORLD);
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flags_fixed_size"), "set_flag", "get_flag", FLAG_FIXED_SIZE);
|
||||
ADD_GROUP("Vertex Color", "vertex_color");
|
||||
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "vertex_color_use_as_albedo"), "set_flag", "get_flag", FLAG_ALBEDO_FROM_VERTEX_COLOR);
|
||||
|
@ -1804,6 +1805,7 @@ void SpatialMaterial::_bind_methods() {
|
|||
BIND_ENUM_CONSTANT(FLAG_UV2_USE_TRIPLANAR);
|
||||
BIND_ENUM_CONSTANT(FLAG_AO_ON_UV2);
|
||||
BIND_ENUM_CONSTANT(FLAG_USE_ALPHA_SCISSOR);
|
||||
BIND_ENUM_CONSTANT(FLAG_TRIPLANAR_USE_WORLD);
|
||||
BIND_ENUM_CONSTANT(FLAG_MAX);
|
||||
|
||||
BIND_ENUM_CONSTANT(DIFFUSE_LAMBERT);
|
||||
|
|
|
@ -171,6 +171,7 @@ public:
|
|||
FLAG_FIXED_SIZE,
|
||||
FLAG_UV1_USE_TRIPLANAR,
|
||||
FLAG_UV2_USE_TRIPLANAR,
|
||||
FLAG_TRIPLANAR_USE_WORLD,
|
||||
FLAG_AO_ON_UV2,
|
||||
FLAG_USE_ALPHA_SCISSOR,
|
||||
FLAG_MAX
|
||||
|
@ -216,7 +217,7 @@ private:
|
|||
uint64_t blend_mode : 2;
|
||||
uint64_t depth_draw_mode : 2;
|
||||
uint64_t cull_mode : 2;
|
||||
uint64_t flags : 11;
|
||||
uint64_t flags : 12;
|
||||
uint64_t detail_blend_mode : 2;
|
||||
uint64_t diffuse_mode : 3;
|
||||
uint64_t specular_mode : 2;
|
||||
|
|
Loading…
Reference in a new issue