#version 330 core

out vec4 FragColor;

in vec3 ourColor;
in vec2 TexCoord;

uniform float time;
uniform bool fusion;
uniform sampler2D bgMap;
uniform sampler2D maskMap;
uniform sampler2D sourceMap;
uniform sampler2D colorMaskMap;

void main()
{
   vec3 bgColor = texture2D( bgMap, TexCoord ).rgb;
   vec3 frgColor = vec3(0.0);
   if (fusion) {
      vec2 normalizedTexCoord = TexCoord - vec2(0.5);
      float angle = time ;
      mat2 rotationMatrix = mat2(cos(radians(angle)), -sin(radians(angle)), sin(radians(angle)), cos(radians(angle)));
      vec2 rotatedTexCoord = rotationMatrix * normalizedTexCoord;
      vec2 finalTexCoord = rotatedTexCoord + vec2(0.5);

      vec3 sourceColor = texture2D(sourceMap, finalTexCoord).rgb;
      
      //vec3 sourceColor = texture2D(sourceMap, TexCoord).rgb;
      vec3 colorMaskColor = texture2D(colorMaskMap, TexCoord).rgb;
      vec3 maskColor = texture2D(maskMap, TexCoord).rgb;
      
      float gray = dot(sourceColor, vec3(0.299, 0.587, 0.114));
      vec3 grayColor = vec3(gray);
      
      vec3 color = maskColor * grayColor;

      vec3 invBaseColor = 1 - maskColor;
      
      vec2 offsetTexcoord = TexCoord ;
      vec3 maskOffsetColor = texture2D(maskMap, offsetTexcoord).rgb;
      vec3 offsetColor = maskOffsetColor * sourceColor;

      vec3 maskGrayColor = grayColor + invBaseColor;
      vec3 maskColorColor = colorMaskColor * sourceColor;

      frgColor = mix(bgColor, mix(maskGrayColor, maskColorColor, colorMaskColor), maskColor);
   } else {
      frgColor = bgColor;
   }
   
   FragColor = vec4(frgColor, 1.0);
}