//#include "common.h" //#include "lmodel.h" //#include "shadow.h" #define _pp_( n ) half##n pp( float##n v ) { return v; } _pp_(1); _pp_(2); _pp_(3); _pp_(4); #undef _pp_ #define chx( v, n, a, b ) (v[n]>=0)?a[n]:b[n] #define chx4( v, a, b ) chx(v,0,a,b),chx(v,1,a,b),chx(v,2,a,b),chx(v,3,a,b) half4 cmp_pp( half4 v, half4 a, half4 b ) { return half4( chx4( v, a, b ) ); } float4 cmp( float4 v, float4 a, float4 b ) { return float4( chx4( v, a, b ) ); } #undef chx #undef chx4 float2 col( float2x4 m, const int c ) { return float2( m[0][c], m[1][c] ); } float3 col( float3x4 m, const int c ) { return float3( m[0][c], m[1][c], m[2][c] ); } float4 col( float4x4 m, const int c ) { return float4( m[0][c], m[1][c], m[2][c], m[3][c] ); } #define sc( n ) m[n][c] = v[n] float2 col( float2x4 m, const int c, float2 v ) { sc(0);sc(1); return v; } float3 col( float3x4 m, const int c, float3 v ) { sc(0);sc(1);sc(2); return v; } float4 col( float4x4 m, const int c, float4 v ) { sc(0);sc(1);sc(2);sc(3); return v; } #undef sc float2x4 cols( float4 x, float4 y ) { return float2x4( float2(x.x,y.x), float2(x.y,y.y), float2(x.z,y.z), float2(x.w,y.w) ); } float3x4 cols( float4 x, float4 y, float4 z ) { return float3x4( float3(x.x,y.x,z.x), float3(x.y,y.y,z.y), float3(x.z,y.z,z.z), float3(x.w,y.w,z.w) ); } float4x4 cols( float4 x, float4 y, float4 z, float4 w ) { return float4x4( float4(x.x,y.x,z.x,w.x), float4(x.y,y.y,z.y,w.y), float4(x.z,y.z,z.z,w.z), float4(x.w,y.w,z.w,w.w) ); } const float4 z = {0,0,0,0}; float4 Ldynamic_color; float4 Ldynamic_dir; float3 T; float4x4 m_shadow; float3x4 m_sunmask; uniform sampler2D s_accumulator; uniform sampler2D s_lmap; uniform sampler2D s_normal; uniform sampler2D s_position; uniform sampler2D s_smap; float4 main( float2 tc : TEXCOORD0 ) : COLOR { float4x4 c = float4x4( float4( 1, 3.33333325, 1.53846157, -1 ), float4( -0.000585937523, 0, 1, 1024 ), float4( 1.44269502, 0.625, 0.400000006, 0.600000024 ), float4( 0.000585937523, -0.000585937523, 0.25, 0 ) ); /* #pragma def( ps_3_0, c11, 1, 3.33333325, 1.53846157, -1 ) #pragma def( ps_3_0, c12, -0.000585937523, 0, 1, 1024 ) #pragma def( ps_3_0, c13, 1.44269502, 0.625, 0.400000006, 0.600000024 ) #pragma def( ps_3_0, c14, 0.000585937523, -0.000585937523, 0.25, 0 ) */ float4 r0=z, r1=z, r2=z, r3=z, r4=z, rs; r0 = tex2D( s_position, tc ); r1 = (r0.y) * (col( m_shadow, 1 )); r1 = ((col( m_shadow, 0 )) * (r0.x)) + (r1); r1 = ((col( m_shadow, 2 )) * (r0.z)) + (r1); r1 = (r1) + (col( m_shadow, 3 )); r0.w = 1/( r1.w ); r2.xy = ((r1) * (r0.w)) + (c[1].x); r3 = tex2D( s_smap, r2 ); r2.xy = (r2) * (c[1].w); r3 = ((r1.z) * (r0.w)) + (-r3); r3 = cmp( r3, c[1].y, c[1].z ); r2.xy = frac( r2 ); r2.zw = pp((-r2.xyxy) + (c[0].x)); r4 = pp((r2.xyyw) * (r2.wzxz)); r1.w = pp(dot( (float4) r3, r4 )); r2.xy = ((r1) * (r0.w)) + (c[3]); r3 = tex2D( s_smap, r2 ); r2.xy = (r2) * (c[1].w); r3 = ((r1.z) * (r0.w)) + (-r3); r3 = cmp( r3, c[1].y, c[1].z ); r2.xy = frac( r2 ); r2.zw = pp((-r2.xyxy) + (c[0].x)); r4 = pp((r2.xyyw) * (r2.wzxz)); r2.x = pp(dot( (float4) r3, r4 )); r1.w = pp((r1.w) + (r2.x)); r2.xy = ((r1) * (r0.w)) + (c[3].yxzw); r3 = tex2D( s_smap, r2 ); r2.xy = (r2) * (c[1].w); r3 = ((r1.z) * (r0.w)) + (-r3); r3 = cmp( r3, c[1].y, c[1].z ); r2.xy = frac( r2 ); r2.zw = pp((-r2.xyxy) + (c[0].x)); r4 = pp((r2.xyyw) * (r2.wzxz)); r2.x = pp(dot( (float4) r3, r4 )); r1.w = pp((r1.w) + (r2.x)); r1.xy = ((r1) * (r0.w)) + (-c[1].x); r2 = tex2D( s_smap, r1 ); r1.xy = (r1) * (c[1].w); r2 = ((r1.z) * (r0.w)) + (-r2); r2 = cmp( r2, c[1].y, c[1].z ); r1.xy = frac( r1 ); r3.xy = pp((-r1) + (c[0].x)); r4.xy = pp((r1) * (r3.yxzw)); r4.z = pp((r1.y) * (r1.x)); r4.w = pp((r3.y) * (r3.x)); r0.w = pp(dot( (float4) r2, r4 )); r0.w = pp((r1.w) + (r0.w)); r1.xy = (r0.y) * (col( m_sunmask, 1 )); r1.xy = ((col( m_sunmask, 0 )) * (r0.x)) + (r1); r1.xy = ((col( m_sunmask, 2 )) * (r0.z)) + (r1); r1.xy = (r1) + (col( m_sunmask, 3 )); r1 = pp(tex2D( s_normal, r1 )); r0.w = pp((r0.w) * (r1.w)); r0.w = pp((r0.w) * (c[3].z)); r1.x = pp(dot( (float3) r0, r0 )); r1.x = pp( 1/sqrt( r1.x ) ); r0.xyz = pp( ((r0) * (-r1.x)) + (-Ldynamic_dir) ); r1.x = pp(dot( (float3) r0, r0 )); r1.x = pp( 1/sqrt( r1.x ) ); r2 = pp(tex2D( s_normal, tc )); r3.xyz = pp(normalize(r2)); r1.y = pp(saturate( dot( (float3) r3, -Ldynamic_dir ) )); r2.xyz = (r3) * (r1.y); r0.xyz = ((r0) * (r1.x)) + (-r2); r2.xyz = normalize(r0); r0.x = dot( (float3) T, r2 ); r0.y = (-r0.x) + (c[0].x); r0.y = (r0.y) * (c[0].y); r0.x = ((r0.x) * (c[0].z)) + (r0.y); r0.y = (r1.y) + (c[0].w); r0.x = (r0.x) * (r0.y); r0.y = 1/( r1.y ); r0.x = (r0.x) * (r0.y); r0.x = (r0.x) * (c[2].x); r0.x = pow( 2, r0.x ); r0.x = (r1.y) * (r0.x); r0.y = (r1.y) * (r1.y); r0.x = ((r0.x) * (c[2].y)) + (r0.y); r0.y = saturate( ( (r1.y) * (c[2].z) ) + (c[2].w) ); r0.y = (r1.y) * (r0.y); r0.x = pp( ((r0.y) * (-Ldynamic_dir.w)) + (r0.x) ); r1 = (r0.x) * (Ldynamic_color); r2 = pp(tex2D( s_accumulator, tc )); rs = pp( ((r1) * (r0.w)) + (r2) ); return rs; }