#include "common.h" uniform float4 consts; // {1/quant,1/quant,diffusescale,ambient} uniform float4 wave; // cx,cy,cz,tm uniform float4 dir2D; //uniform float4 array [200] : register(c12); //tbuffer DetailsData //{ uniform float4 array[61*4]; //} v2p_flat main (v_detail v) { v2p_flat O; // index int i = v.misc.w; float4 m0 = array[i+0]; float4 m1 = array[i+1]; float4 m2 = array[i+2]; float4 c0 = array[i+3]; // Transform pos to world coords float4 pos; pos.x = dot (m0, v.pos); pos.y = dot (m1, v.pos); pos.z = dot (m2, v.pos); pos.w = 1; // float base = m1.w; float dp = calc_cyclic (dot(pos,wave)); float H = pos.y - base; // height of vertex (scaled) float frac = v.misc.z*consts.x; // fractional float inten = H * dp; float2 result = calc_xz_wave (dir2D.xz*inten,frac); pos = float4(pos.x+result.x, pos.y, pos.z+result.y, 1); // Normal in world coords float3 norm; // = float3(0,1,0); norm.x = pos.x - m0.w ; norm.y = pos.y - m1.w + .75f; // avoid zero norm.z = pos.z - m2.w ; // Final out float4 Pp = mul (m_WVP, pos ); O.hpos = Pp; O.N = mul (m_WV, normalize(norm) ); float3 Pe = mul (m_WV, pos ); // O.tcdh = float4 ((v.misc * consts).xy ); O.tcdh = float4 ((v.misc * consts).xyyy ); # if defined(USE_R2_STATIC_SUN) O.tcdh.w = c0.x; // (,,,dir-occlusion) # endif //#ifdef USE_GRASS_WAVE float _dp = calc_cyclic (dot(pos,wave*GRASS_WAVE_FREQ)); O.tcdh.z = consts.w+consts.z*max(0.f, _dp)*frac*GRASS_WAVE_POWER; //#endif O.position = float4 (Pe, c0.w ); return O; } FXVS;