All Downloads are FREE. Search and download functionalities are using the official Maven repository.

indigo.shared.shader.library.BlendEffects.scala Maven / Gradle / Ivy

The newest version!
package indigo.shared.shader.library

import indigo.shared.shader.library.IndigoUV.*
import ultraviolet.syntax.*

object BlendEffects:

  trait Env extends BlendFragmentEnvReference {
    val ALPHA_SATURATION_OVERLAYTYPE_BG: highp[vec4] = vec4(0.0f)
    val TINT: vec4                                   = vec4(0.0f)
    val GRADIENT_FROM_TO: vec4                       = vec4(0.0f)
    val GRADIENT_FROM_COLOR: vec4                    = vec4(0.0f)
    val GRADIENT_TO_COLOR: vec4                      = vec4(0.0f)
  }
  object Env:
    val reference: Env = new Env {}

  case class IndigoBlendEffectsData(
      ALPHA_SATURATION_OVERLAYTYPE_BG: highp[vec4],
      TINT: vec4,
      GRADIENT_FROM_TO: vec4,
      GRADIENT_FROM_COLOR: vec4,
      GRADIENT_TO_COLOR: vec4
  )

  inline def fragment =
    Shader[Env] { env =>
      import ImageEffectFunctions.*

      ubo[IndigoBlendEffectsData]

      def fragment(color: vec4): vec4 =

        // Delegates
        val _applyBasicEffects: (vec4, Float, vec3) => vec4 =
          applyBasicEffects
        val _calculateColorOverlay: (vec4, vec4) => vec4 =
          calculateColorOverlay
        val _calculateLinearGradientOverlay: (vec4, vec2, vec2, vec2, vec4, vec4) => vec4 =
          calculateLinearGradientOverlay
        val _calculateRadialGradientOverlay: (vec4, vec2, vec2, vec2, vec4, vec4) => vec4 =
          calculateRadialGradientOverlay
        val _calculateSaturation: (vec4, Float) => vec4 =
          calculateSaturation

        val effectsBg: Int = round(env.ALPHA_SATURATION_OVERLAYTYPE_BG.w).toInt

        val effects: vec4 =
          effectsBg match
            case 0 => env.SRC
            case 1 => mix(env.DST, env.SRC, env.SRC.w)
            case _ => env.SRC

        val alpha: Float    = env.ALPHA_SATURATION_OVERLAYTYPE_BG.x
        val baseColor: vec4 = _applyBasicEffects(effects, alpha, env.TINT.xyz)

        // 0 = color 1 = linear gradient 2 = radial gradient
        val overlayType: Int = round(env.ALPHA_SATURATION_OVERLAYTYPE_BG.z).toInt
        val overlay: vec4 =
          overlayType match
            case 0 =>
              _calculateColorOverlay(baseColor, env.GRADIENT_FROM_COLOR)

            case 1 =>
              _calculateLinearGradientOverlay(
                baseColor,
                vec2(env.GRADIENT_FROM_TO.x, env.SIZE.y - env.GRADIENT_FROM_TO.y),
                vec2(env.GRADIENT_FROM_TO.z, env.SIZE.y - env.GRADIENT_FROM_TO.w),
                env.UV * env.SIZE,
                env.GRADIENT_FROM_COLOR,
                env.GRADIENT_TO_COLOR
              )

            case 2 =>
              _calculateRadialGradientOverlay(
                baseColor,
                vec2(env.GRADIENT_FROM_TO.x, env.SIZE.y - env.GRADIENT_FROM_TO.y),
                vec2(env.GRADIENT_FROM_TO.z, env.SIZE.y - env.GRADIENT_FROM_TO.w),
                env.UV * env.SIZE,
                env.GRADIENT_FROM_COLOR,
                env.GRADIENT_TO_COLOR
              )

            case _ =>
              _calculateColorOverlay(baseColor, env.GRADIENT_FROM_COLOR)

        _calculateSaturation(overlay, env.ALPHA_SATURATION_OVERLAYTYPE_BG.y)
    }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy