module Render.Unlit.Line2d.Code
  ( vert
  , frag
  ) where

import RIO

import Render.Code (Code, glsl)
import Render.DescSets.Set0.Code (set0binding0)

vert :: Code
vert :: Code
vert = forall a. IsString a => String -> a
fromString
  [glsl|
    #version 450

    ${set0binding0}

    layout(location = 0) in vec3 vPosition;

    layout(location = 2) in vec4 iPositionA;
    layout(location = 1) in vec4 iColorA;

    layout(location = 4) in vec4 iPositionB;
    layout(location = 3) in vec4 iColorB;

    layout(location = 0) out vec4 fColor;

    void main() {
      vec2 xBasis = normalize(iPositionB.xy - iPositionA.xy);
      vec2 yBasis = vec2(-xBasis.y, xBasis.x);

      float width = mix(iPositionA.w, iPositionB.w, vPosition.z);
      fColor = mix(iColorA, iColorB, vPosition.z);

      vec2 offsetA = iPositionA.xy + width * (vPosition.x * xBasis + vPosition.y * yBasis);
      vec2 offsetB = iPositionB.xy + width * (vPosition.x * xBasis + vPosition.y * yBasis);

      vec2 point = mix(offsetA, offsetB, vPosition.z);

      vec4 fPosition = vec4(point, 0, 1);

      gl_Position
        = scene.projection
        * scene.view
        * fPosition;
    }
  |]

frag :: Code
frag :: Code
frag = forall a. IsString a => String -> a
fromString
  [glsl|
    #version 450

    layout(location = 0) in vec4 fColor;

    layout(location = 0) out vec4 oColor;

    void main() {
      oColor = fColor;
    }
  |]