shader_type canvas_item;

#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Math.gdshaderinc"
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Transform.gdshaderinc"

uniform float wipeState:hint_range(0,1) = 0;
uniform vec2 outputViewSize = vec2(1920,1080);


uniform sampler2D wipeTexture : source_color, filter_linear_mipmap, repeat_enable;
uniform vec2 wipeTextureSize = vec2( 1,1 );
uniform vec4 wipeTextureTint : source_color = vec4(0,0,0,1);

uniform float uvRotation = 0;
uniform vec2 uvRotationCenter = vec2(0 ,0);

uniform float uvScale = 1;
uniform vec2 uvScaleCenter = vec2(0 ,0);

uniform vec2 uvTranslation = vec2(0,0);

varying vec2 textureUV;
varying vec4 animatedTint;

void vertex()
{
  mat3 matrix = identity_m3();

  float textureAspect = wipeTextureSize.x / wipeTextureSize.y;
  float viewAspect = outputViewSize.x / outputViewSize.y;
  float viewRatio = viewAspect / textureAspect;

  matrix *= rotatePivotAspect_m3( uvRotation * DegreesToRadians , uvRotationCenter, textureAspect * viewRatio );

  vec2 rotatedScaleCenter = applyMatrix_m3v2( rotatePivot_m3( uvRotation, vec2( 0.5,0.5)), uvScaleCenter );
  matrix *= scalePivot_m3( uvScale * vec2( viewRatio,1), rotatedScaleCenter );


  matrix *= translate_m3( applyMatrixBase_m3v2( matrix, -uvTranslation ) );

  vec2 uv = applyMatrix_m3v2( matrix, UV );
  textureUV = uv;

  animatedTint = wipeTextureTint;
  animatedTint.a *= wipeState;
}

void fragment()
{
  COLOR = texture( wipeTexture, textureUV ) * animatedTint;
}