shaders/segment/segment.tstypescript
import { AtmosphereParameters, DEFAULT_PARAMS } from "../atmos/atmos";
import { ShaderProgram } from "../../webgl/ShaderProgram";

import segment_screen_wl from "./segment_screen_wl.vert.glsl";

import segment_screen_wl_atmos_forward_frag from "./segment_screen_wl_atmos_forward.frag.glsl";
import segment_screen_wl_noatmos_forward_frag from "./segment_screen_wl_noatmos_forward.frag.glsl";

import segment_screen_deferred_frag from "./segment_screen_deferred.frag.glsl";

import segment_colorPicking_vert from "./segment_colorPicking.vert.glsl";
import segment_colorPicking_frag from "./segment_colorPicking.frag.glsl";

import segment_depth_vert from "./segment_depth.vert.glsl";
import segment_depth_frag from "./segment_depth.frag.glsl";
import { stringTemplate2 } from "../../utils/shared";
import { cascadeShadowUniforms, projectorUniforms, shadowMapUniforms } from "../common/uniforms";

// REMEMBER!
// src*(1)+dest*(1-src.alpha)
// glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
// src*(src.alpha)+dest*(1-src.alpha)
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// const NIGHT = `const vec3 nightStep = 10.0 * vec3(0.58, 0.48, 0.25);`;
//
// const DEF_BLEND = `#define blend(DEST, SAMPLER, OFFSET, OPACITY) \
//                     src = texture( SAMPLER, OFFSET.xy + vTextureCoord.xy * OFFSET.zw );\
//                     DEST = DEST * (1.0 - src.a * OPACITY) + src * OPACITY;`;
//
// const SLICE_SIZE = 4;

export function segment_screen_deferred(): ShaderProgram {
    return new ShaderProgram("segment_screen_deferred", {
        uniforms: {
            projectionMatrix: "mat4",
            viewMatrix: "mat4",
            cameraPosition: "vec3",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3",
            height: "float",
            uGlobalTextureCoord: "vec4",
            uNormalMapBias: "vec3",
            samplerCount: "int",
            tileOffsetArr: "vec4",
            layerOpacityArr: "float",
            samplerArr: "sampler2darraylegacy",
            defaultTexture: "sampler2d",
            uNormalMap: "sampler2d",
            nightTexture: "sampler2d",
            specularTexture: "sampler2d",
            lightPosition: "vec3",
            shadeMode: "float",
            camHeight: "float",
            nightTextureCoefficient: "float"
        },
        attributes: {
            aVertexPositionHigh: "vec3",
            aVertexPositionLow: "vec3",
            aTextureCoord: "vec2"
        },
        vertexShader: segment_screen_wl,
        fragmentShader: segment_screen_deferred_frag
    });
}

export function segment_screen_wl_forward_noatmos(): ShaderProgram {
    return new ShaderProgram("segment_screen_wl_forward", {
        uniforms: {
            projectionMatrix: "mat4",
            viewMatrix: "mat4",
            cameraPosition: "vec3",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3",
            height: "float",
            uGlobalTextureCoord: "vec4",
            uNormalMapBias: "vec3",
            samplerCount: "int",
            tileOffsetArr: "vec4",
            layerOpacityArr: "float",
            samplerArr: "sampler2darraylegacy",
            defaultTexture: "sampler2d",
            uNormalMap: "sampler2d",
            nightTexture: "sampler2d",
            specularTexture: "sampler2d",
            lightPosition: "vec3",
            diffuse: "vec3",
            ambient: "vec3",
            specular: "vec4",
            camHeight: "float",
            nightTextureCoefficient: "float",
            transitionOpacity: "float",
            shadeMode: "float",
            frameOpacity: "float",
            ...projectorUniforms,
            ...shadowMapUniforms,
            ...cascadeShadowUniforms
        },
        attributes: {
            aVertexPositionHigh: "vec3",
            aVertexPositionLow: "vec3",
            aTextureCoord: "vec2"
        },
        vertexShader: segment_screen_wl,
        fragmentShader: segment_screen_wl_noatmos_forward_frag
    });
}

export function segment_screen_wl_forward_atmos(atmosParams: AtmosphereParameters = DEFAULT_PARAMS): ShaderProgram {
    return new ShaderProgram("segment_screen_wl_forward", {
        uniforms: {
            projectionMatrix: "mat4",
            viewMatrix: "mat4",
            cameraPosition: "vec3",
            cameraForward: "vec3",
            isOrthographic: "float",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3",
            height: "float",
            uGlobalTextureCoord: "vec4",
            uNormalMapBias: "vec3",
            samplerCount: "int",
            tileOffsetArr: "vec4",
            layerOpacityArr: "float",
            samplerArr: "sampler2darraylegacy",
            defaultTexture: "sampler2d",
            uNormalMap: "sampler2d",
            nightTexture: "sampler2d",
            specularTexture: "sampler2d",
            lightPosition: "vec3",
            diffuse: "vec3",
            ambient: "vec3",
            specular: "vec4",
            transmittanceTexture: "sampler2D",
            scatteringTexture: "sampler2D",
            atmosFadeDist: "vec2",
            atmosMaxMinOpacity: "vec3",
            camHeight: "float",
            nightTextureCoefficient: "float",
            transitionOpacity: "float",
            shadeMode: "float",
            frameOpacity: "float",
            ...projectorUniforms,
            ...shadowMapUniforms,
            ...cascadeShadowUniforms
        },
        attributes: {
            aVertexPositionHigh: "vec3",
            aVertexPositionLow: "vec3",
            aTextureCoord: "vec2"
        },
        vertexShader: segment_screen_wl,
        fragmentShader: stringTemplate2(segment_screen_wl_atmos_forward_frag, atmosParams)
    });
}

export function segment_colorPicking(): ShaderProgram {
    return new ShaderProgram("segment_colorPicking", {
        uniforms: {
            projectionMatrix: "mat4",
            viewMatrix: "mat4",
            cameraPosition: "vec3",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3",
            samplerCount: "int",
            tileOffsetArr: "vec4",
            samplerArr: "sampler2darraylegacy",
            pickingMaskArr: "sampler2darraylegacy",
            pickingColorArr: "vec4",
            height: "float"
        },
        attributes: {
            aVertexPositionHigh: "vec3",
            aVertexPositionLow: "vec3",
            aTextureCoord: "vec2"
        },
        vertexShader: segment_colorPicking_vert,
        fragmentShader: segment_colorPicking_frag
    });
}

export function segment_depth(): ShaderProgram {
    return new ShaderProgram("segment_depth", {
        uniforms: {
            projectionMatrix: "mat4",
            viewMatrix: "mat4",
            height: "float",
            cameraPosition: "vec3",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3",
            frustumPickingColor: "float"
        },
        attributes: {
            aVertexPositionHigh: "vec3",
            aVertexPositionLow: "vec3"
        },
        vertexShader: segment_depth_vert,
        fragmentShader: segment_depth_frag
    });
}