shaders/geo_object/geo_object.tstypescript
import { ShaderProgram } from "../../webgl/ShaderProgram";
import { stringTemplate2 } from "../../utils/shared";
import { cascadeShadowUniforms, projectorUniforms, shadowMapUniforms } from "../common/uniforms";
import type { AtmosphereParameters } from "../atmos/atmos";
import { DEFAULT_PARAMS } from "../atmos/atmos";
import geo_object_vert from "./geo_object.vert.glsl";
import geo_object_deferred_frag from "./geo_object_deferred.frag.glsl";
import geo_object_forward_frag from "./geo_object_forward.frag.glsl";
import geo_object_woit_frag from "./geo_object_woit.frag.glsl";
import geo_object_woit_atmos_frag from "./geo_object_woit_atmos.frag.glsl";
import geo_object_picking_vert from "./geo_object_picking.vert.glsl";
import geo_object_picking_frag from "./geo_object_picking.frag.glsl";
import geo_object_depth_vert from "./geo_object_depth.vert.glsl";
import geo_object_depth_frag from "./geo_object_depth.frag.glsl";
import geo_object_depth_camera_frag from "./geo_object_depth_camera.frag.glsl";

export const geo_object_deferred = (): ShaderProgram =>
    new ShaderProgram("geo_object_deferred", {
        uniforms: {
            viewMatrix: "mat4",
            normalMatrix: "mat3",
            projectionMatrix: "mat4",
            uScaleByDistance: "vec4",
            uFocusDistance: "float",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3",
            uColorTexture: "sampler2d",
            uNormalTexture: "sampler2d",
            uMetallicRoughnessTexture: "sampler2d",
            uAOTexture: "sampler2d",
            uUseColorTexture: "float",
            uUseNormalTexture: "float",
            uUseMetallicRoughnessTexture: "float",
            uUseAOTexture: "float",
            materialProperties: "vec3",
            shadeMode: "float",
            uProjectorMask: "float",
            uFrameTransparencyMask: "float",
            uShadowMask: "float"
        },
        attributes: {
            aVertexPosition: "vec3",
            aVertexNormal: "vec3",
            aTexCoord: "vec2",
            aLocalPosition: { type: "vec3", divisor: 1 },
            aRTCPositionHigh: { type: "vec3", divisor: 1 },
            aRTCPositionLow: { type: "vec3", divisor: 1 },
            aColor: { type: "vec4", divisor: 1 },
            aScale: { type: "vec3", divisor: 1 },
            aTranslate: { type: "vec3", divisor: 1 },
            aDispose: { type: "float", divisor: 1 },
            qRot: { type: "vec4", divisor: 1 }
        },
        vertexShader: geo_object_vert,
        fragmentShader: geo_object_deferred_frag
    });

export const geo_object_forward = (): ShaderProgram =>
    new ShaderProgram("geo_object_forward", {
        uniforms: {
            viewMatrix: "mat4",
            normalMatrix: "mat3",
            projectionMatrix: "mat4",
            uScaleByDistance: "vec4",
            uFocusDistance: "float",
            eyePositionHigh: "vec3",
            eyePositionLow: "vec3",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3",
            lightPosition: "vec3",
            lightAmbient: "vec3",
            lightDiffuse: "vec3",
            lightSpecular: "vec4",
            materialProperties: "vec3",
            uColorTexture: "sampler2d",
            uNormalTexture: "sampler2d",
            uMetallicRoughnessTexture: "sampler2d",
            uAOTexture: "sampler2d",
            uUseColorTexture: "float",
            uUseNormalTexture: "float",
            uUseMetallicRoughnessTexture: "float",
            uUseAOTexture: "float",
            shadeMode: "float",
            uFrameTransparencyMask: "float",
            uShadowMask: "float",
            frameOpacity: "float",
            ...shadowMapUniforms,
            ...cascadeShadowUniforms
        },
        attributes: {
            aVertexPosition: "vec3",
            aVertexNormal: "vec3",
            aTexCoord: "vec2",
            aLocalPosition: { type: "vec3", divisor: 1 },
            aRTCPositionHigh: { type: "vec3", divisor: 1 },
            aRTCPositionLow: { type: "vec3", divisor: 1 },
            aColor: { type: "vec4", divisor: 1 },
            aScale: { type: "vec3", divisor: 1 },
            aTranslate: { type: "vec3", divisor: 1 },
            aDispose: { type: "float", divisor: 1 },
            qRot: { type: "vec4", divisor: 1 }
        },
        vertexShader: geo_object_vert,
        fragmentShader: geo_object_forward_frag
    });

export const geo_object_woit = (): ShaderProgram =>
    new ShaderProgram("geo_object_woit", {
        uniforms: {
            viewMatrix: "mat4",
            normalMatrix: "mat3",
            projectionMatrix: "mat4",
            uScaleByDistance: "vec4",
            uFocusDistance: "float",
            eyePositionHigh: "vec3",
            eyePositionLow: "vec3",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3",
            lightPosition: "vec3",
            lightAmbient: "vec3",
            lightDiffuse: "vec3",
            lightSpecular: "vec4",
            materialProperties: "vec3",
            uColorTexture: "sampler2d",
            uNormalTexture: "sampler2d",
            uMetallicRoughnessTexture: "sampler2d",
            uAOTexture: "sampler2d",
            uUseColorTexture: "float",
            uUseNormalTexture: "float",
            uUseMetallicRoughnessTexture: "float",
            uUseAOTexture: "float",
            shadeMode: "float",
            uProjectorMask: "float",
            uFrameTransparencyMask: "float",
            frameOpacity: "float",
            uShadowMask: "float",
            useReverseDepth: "float",
            ...projectorUniforms,
            ...shadowMapUniforms,
            ...cascadeShadowUniforms
        },
        attributes: {
            aVertexPosition: "vec3",
            aVertexNormal: "vec3",
            aTexCoord: "vec2",
            aLocalPosition: { type: "vec3", divisor: 1 },
            aRTCPositionHigh: { type: "vec3", divisor: 1 },
            aRTCPositionLow: { type: "vec3", divisor: 1 },
            aColor: { type: "vec4", divisor: 1 },
            aScale: { type: "vec3", divisor: 1 },
            aTranslate: { type: "vec3", divisor: 1 },
            aDispose: { type: "float", divisor: 1 },
            qRot: { type: "vec4", divisor: 1 }
        },
        vertexShader: geo_object_vert,
        fragmentShader: geo_object_woit_frag
    });

export function geo_object_woit_atmos(atmosParams: AtmosphereParameters = DEFAULT_PARAMS): ShaderProgram {
    return new ShaderProgram("geo_object_woit_atmos", {
        uniforms: {
            viewMatrix: "mat4",
            normalMatrix: "mat3",
            projectionMatrix: "mat4",
            uScaleByDistance: "vec4",
            uFocusDistance: "float",
            eyePositionHigh: "vec3",
            eyePositionLow: "vec3",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3",
            lightPosition: "vec3",
            lightAmbient: "vec3",
            lightDiffuse: "vec3",
            lightSpecular: "vec4",
            materialProperties: "vec3",
            uColorTexture: "sampler2d",
            uNormalTexture: "sampler2d",
            uMetallicRoughnessTexture: "sampler2d",
            uAOTexture: "sampler2d",
            uUseColorTexture: "float",
            uUseNormalTexture: "float",
            uUseMetallicRoughnessTexture: "float",
            uUseAOTexture: "float",
            shadeMode: "float",
            uProjectorMask: "float",
            uFrameTransparencyMask: "float",
            frameOpacity: "float",
            uShadowMask: "float",
            useReverseDepth: "float",
            transmittanceTexture: "sampler2D",
            scatteringTexture: "sampler2D",
            atmosFadeDist: "vec2",
            atmosMaxMinOpacity: "vec3",
            cameraForward: "vec3",
            isOrthographic: "float",
            ...projectorUniforms,
            ...shadowMapUniforms,
            ...cascadeShadowUniforms
        },
        attributes: {
            aVertexPosition: "vec3",
            aVertexNormal: "vec3",
            aTexCoord: "vec2",
            aLocalPosition: { type: "vec3", divisor: 1 },
            aRTCPositionHigh: { type: "vec3", divisor: 1 },
            aRTCPositionLow: { type: "vec3", divisor: 1 },
            aColor: { type: "vec4", divisor: 1 },
            aScale: { type: "vec3", divisor: 1 },
            aTranslate: { type: "vec3", divisor: 1 },
            aDispose: { type: "float", divisor: 1 },
            qRot: { type: "vec4", divisor: 1 }
        },
        vertexShader: geo_object_vert,
        fragmentShader: stringTemplate2(geo_object_woit_atmos_frag, {
            ...atmosParams
        })
    });
}

export const geo_object_picking = (): ShaderProgram =>
    new ShaderProgram("geo_object_picking", {
        uniforms: {
            viewMatrix: "mat4",
            projectionMatrix: "mat4",
            uScaleByDistance: "vec4",
            uFocusDistance: "float",
            pickingScale: "vec3",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3"
        },
        attributes: {
            aVertexPosition: "vec3",
            aRTCPositionHigh: { type: "vec3", divisor: 1 },
            aRTCPositionLow: { type: "vec3", divisor: 1 },
            aPickingColor: { type: "vec3", divisor: 1 },
            aScale: { type: "vec3", divisor: 1 },
            aTranslate: { type: "vec3", divisor: 1 },
            aLocalPosition: { type: "vec3", divisor: 1 },
            aDispose: { type: "float", divisor: 1 },
            qRot: { type: "vec4", divisor: 1 }
        },
        vertexShader: geo_object_picking_vert,
        fragmentShader: geo_object_picking_frag
    });

export const geo_object_depth = (): ShaderProgram =>
    new ShaderProgram("geo_object_depth", {
        uniforms: {
            viewMatrix: "mat4",
            projectionMatrix: "mat4",
            uScaleByDistance: "vec4",
            uFocusDistance: "float",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3",
            frustumPickingColor: "float"
        },
        attributes: {
            aVertexPosition: "vec3",
            aRTCPositionHigh: { type: "vec3", divisor: 1 },
            aRTCPositionLow: { type: "vec3", divisor: 1 },
            aScale: { type: "vec3", divisor: 1 },
            aTranslate: { type: "vec3", divisor: 1 },
            aDispose: { type: "float", divisor: 1 },
            qRot: { type: "vec4", divisor: 1 },
            aLocalPosition: { type: "vec3", divisor: 1 }
        },
        vertexShader: geo_object_depth_vert,
        fragmentShader: geo_object_depth_frag
    });

export const geo_object_depth_camera = (): ShaderProgram =>
    new ShaderProgram("geo_object_depth_camera", {
        uniforms: {
            viewMatrix: "mat4",
            projectionMatrix: "mat4",
            uScaleByDistance: "vec4",
            uFocusDistance: "float",
            rtcEyePositionHigh: "vec3",
            rtcEyePositionLow: "vec3"
        },
        attributes: {
            aVertexPosition: "vec3",
            aRTCPositionHigh: { type: "vec3", divisor: 1 },
            aRTCPositionLow: { type: "vec3", divisor: 1 },
            aScale: { type: "vec3", divisor: 1 },
            aTranslate: { type: "vec3", divisor: 1 },
            aDispose: { type: "float", divisor: 1 },
            qRot: { type: "vec4", divisor: 1 },
            aLocalPosition: { type: "vec3", divisor: 1 }
        },
        vertexShader: geo_object_depth_vert,
        fragmentShader: geo_object_depth_camera_frag
    });