diff options
| author | Juan Linietsky | 2014-10-03 08:58:41 -0300 |
|---|---|---|
| committer | Juan Linietsky | 2014-10-03 08:58:41 -0300 |
| commit | af4a97bef9bfb06e2737ad709dde157688a94daf (patch) | |
| tree | d3c6471da30a8d6c20d10858e78907edd9c886e8 /servers/visual/rasterizer.cpp | |
| parent | 1b3a10891ebdc6e76a81c8915ba08065311e17d3 (diff) | |
| download | godot-af4a97bef9bfb06e2737ad709dde157688a94daf.tar.gz godot-af4a97bef9bfb06e2737ad709dde157688a94daf.tar.zst godot-af4a97bef9bfb06e2737ad709dde157688a94daf.zip | |
Diffstat (limited to 'servers/visual/rasterizer.cpp')
| -rw-r--r-- | servers/visual/rasterizer.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/servers/visual/rasterizer.cpp b/servers/visual/rasterizer.cpp index e160b4dcc..95746b767 100644 --- a/servers/visual/rasterizer.cpp +++ b/servers/visual/rasterizer.cpp @@ -96,7 +96,12 @@ RID Rasterizer::_create_shader(const FixedMaterialShaderKey& p_key) { } else { uv_str=_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_NORMAL); } - scode+="vec3 normal=tex( fmp_normal_tex,"+uv_str+").xyz * vec3(2.0,2.0,1.0) - vec3(1.0,1.0,0.0);\n"; + if (p_key.use_xy_normalmap) { + scode+="vec2 ywnormal=tex( fmp_normal_tex,"+uv_str+").wy * vec2(2.0,2.0) - vec2(1.0,1.0);\n"; + scode+="vec3 normal=vec3(ywnormal,sqrt(1 - (ywnormal.x * ywnormal.x) - (ywnormal.y * ywnormal.y) ));\n"; + } else { + scode+="vec3 normal=tex( fmp_normal_tex,"+uv_str+").xyz * vec3(2.0,2.0,1.0) - vec3(1.0,1.0,0.0);\n"; + } scode+="NORMAL = mix( NORMAL,mat3(TANGENT,BINORMAL,NORMAL) * normal, fmp_normal);\n"; code+=scode; } @@ -323,6 +328,7 @@ void Rasterizer::fixed_material_set_flag(RID p_material, VS::FixedMaterialFlags case VS::FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY: fm.use_color_array=p_enabled; break; case VS::FIXED_MATERIAL_FLAG_USE_POINT_SIZE: fm.use_pointsize=p_enabled; break; case VS::FIXED_MATERIAL_FLAG_DISCARD_ALPHA: fm.discard_alpha=p_enabled; break; + case VS::FIXED_MATERIAL_FLAG_USE_XY_NORMALMAP: fm.use_xy_normalmap=p_enabled; break; } if (!fm.dirty_list.in_list()) @@ -341,6 +347,8 @@ bool Rasterizer::fixed_material_get_flag(RID p_material, VS::FixedMaterialFlags case VS::FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY: return fm.use_color_array;; break; case VS::FIXED_MATERIAL_FLAG_USE_POINT_SIZE: return fm.use_pointsize;; break; case VS::FIXED_MATERIAL_FLAG_DISCARD_ALPHA: return fm.discard_alpha;; break; + case VS::FIXED_MATERIAL_FLAG_USE_XY_NORMALMAP: return fm.use_xy_normalmap;; break; + } @@ -610,6 +618,8 @@ Rasterizer::Rasterizer() { _fixed_material_uv_xform_name="fmp_uv_xform"; _fixed_material_point_size_name="fmp_point_size"; + ERR_FAIL_COND( sizeof(FixedMaterialShaderKey)!=4); + } RID Rasterizer::create_overdraw_debug_material() { |
