#include "common.sh"


struct VsInput
{
  #if INST_PARTICLE
    float2 corner    : POSITION10;
    float4 pos       : POSITION0;
    float2 param     : POSITION1;
    float4 color     : COLOR0;
    float4 tc        : TEXCOORD0;
  #else
    float4 pos       : POSITION;
    float4 color     : COLOR0;
    float2 tc        : TEXCOORD0;
  #endif
};

struct VsOutput
{
  float4 pos       : POSITION;
  float4 color     : COLOR0;
  float4 fog       : COLOR1;
  float2 tc        : TEXCOORD0;
  #if INST_PARTICLE && !BLEND_ADDITIVE
    float3 tmx       : TEXCOORD1;
    float3 tmy       : TEXCOORD2;
    float3 tmz       : TEXCOORD3;
  #endif
};


sampler tex : register(s0);

// float3 view_x : register(c16);
// float3 view_y : register(c17);
// float3 view_z : register(c18);


VsOutput vsh(VsInput I)
{
  VsOutput O;

  #if INST_PARTICLE
    float size=I.param.x;
    float angle=I.param.y;
    float sa, ca; sincos(angle*6.283185307179586, sa, ca);
    // float x=dot(float2( ca, sa), I.corner);
    // float y=dot(float2(-sa, ca), I.corner);
    float3 vz=normalize(view_pos.xyz-I.pos.xyz);
    float3 viewX=normalize(cross(view_y, vz));
    float3 viewY=normalize(cross(vz, viewX));
    float3 vx=viewX*ca+viewY*sa;
    float3 vy=viewY*ca-viewX*sa;
    float4 pos;
    pos.xyz=I.pos.xyz+(vx*I.corner.x+vy*I.corner.y-vz)*size;
    pos.w=1;
    O.tc=I.tc.xy+I.corner*I.tc.zw;
    O.color=I.color;

    #if !BLEND_ADDITIVE
      O.tmx=float3(vx.x, vy.x, vz.x);
      O.tmy=float3(vx.y, vy.y, vz.y);
      O.tmz=float3(vx.z, vy.z, vz.z);
    #endif
  #else
    float4 pos=I.pos;
    O.color=I.color;
    O.tc=I.tc;
  #endif

  O.pos=mul(globtm, pos);
  O.fog=vs_calc_fog_color(pos.xyz);

  return O;
}


#if SINGLE_RT
float4 psh(VsOutput I) : COLOR
#else
float4 psh(VsOutput I, out float4 out1:COLOR1) : COLOR
#endif
{
  float4 res=tex2D(tex, I.tc);

  #if BLEND_ADDITIVE || !INST_PARTICLE
    res*=I.color;
    unpack_color(res.rgb);
  #endif

  // fog
  #if BLEND_ADDITIVE
    res.rgb=lerp(saturate(res.rgb*2), 0, I.fog.a);
    res.a=dot(res.rgb, 0.333/1)+0.5/255;
  #else

    #if INST_PARTICLE
      res.a*=I.color.a;

      float3 lnorm=res.rgb*2-1;
      float3 norm;
      norm.x=dot(lnorm, I.tmx);
      norm.y=dot(lnorm, I.tmy);
      norm.z=dot(lnorm, I.tmz);
      norm=normalize(norm);

      res.rgb=calc_sky_light(norm);

      float nl=dot(norm, sun_dir.xyz);
      res.rgb+=sunL.rgb*saturate(nl);
      // nl=nl*0.5+0.5; res.rgb+=sunL.rgb*(nl*nl);

      float3 backLight=calc_simple_light(-float3(I.tmx.z, I.tmy.z, I.tmz.z));

      // res.rgb=lerp(backLight, res.rgb, res.a);
      res.rgb*=0.5;
      res.rgb+=backLight*(1-res.a)*(1-res.a)*2;

      res.rgb*=I.color.rgb;
    #endif

    res.rgb=lerp(res.rgb, I.fog.rgb, I.fog.a);
    res.a*=1-I.fog.a;
  #endif

  float4 r=pack_color(res.rgb, res.a);
  #if !BLEND_ADDITIVE
    r.rgb*=res.a;
  #endif

  #if SINGLE_RT
    return r;
  #else
    r/=8;
    float4 i;
    float4 f=modf(r*256, i);
    out1=f/16;
    return i/256;
  #endif
}
