#include "common.hlsli"

struct av
{
    float4 pos : POSITION; // (float,float,float,1)
    float4 nc : NORMAL; // (float,float,float,clr)
    float4 misc : TEXCOORD0; // (u(Q),v(Q),frac,???)
};

uniform float3x4 m_xform;
uniform float4 consts; // {1/quant,1/quant,???,???}
uniform float4 wave; // cx,cy,cz,tm
uniform float4 wind; // direction2D
uniform float4 c_bias; // + color
uniform float4 c_scale; // * color
uniform float2 c_sun; // x=*, y=+

vf_point main(av v)
{
    vf_point o;

    // Transform to world coords
    float3 pos = mul(m_xform, v.pos);

    //
    float base = m_xform._24; // take base height from matrix
    float dp = calc_cyclic(wave.w + dot(pos, (float3)wave));
    float H = pos.y - base; // height of vertex (scaled, rotated, etc.)
    float frac = v.misc.z * consts.x; // fractional (or rigidity)
    float inten = H * dp; // intensity
    float2 result = calc_xz_wave(wind.xz * inten, frac);
    float4 f_pos = float4(pos.x + result.x, pos.y, pos.z + result.y, 1);
    float3 f_N = normalize(mul(m_xform, unpack_normal(v.nc)));

    // Final xform
    o.hpos = mul(m_VP, f_pos);
    o.tc0 = (v.misc * consts).xy;
    o.color = calc_point(o.tc1, o.tc2, f_pos, f_N);

    return o;
}
