@luma.gl/shadertools
Version:
Shader module system for luma.gl
109 lines • 9.27 kB
TypeScript
import type { NumberArray3 } from '@math.gl/core';
/** Shader type field for lights */
export declare enum LIGHT_TYPE {
POINT = 0,
DIRECTIONAL = 1
}
/** Lighting helper types */
export type Light = AmbientLight | PointLight | DirectionalLight;
export type AmbientLight = {
type: 'ambient';
color?: Readonly<NumberArray3>;
intensity?: number;
};
export type PointLight = {
type: 'point';
position: Readonly<NumberArray3>;
color?: Readonly<NumberArray3>;
intensity?: number;
attenuation?: Readonly<NumberArray3>;
};
export type DirectionalLight = {
type: 'directional';
direction: Readonly<NumberArray3>;
color?: Readonly<NumberArray3>;
intensity?: number;
};
export type LightingProps = {
enabled?: boolean;
lights?: Light[];
/** @deprecated */
ambientLight?: AmbientLight;
/** @deprecated */
pointLights?: PointLight[];
/** @deprecated */
directionalLights?: DirectionalLight[];
};
export type LightingUniforms = {
enabled: number;
ambientLightColor: Readonly<NumberArray3>;
directionalLightCount: number;
pointLightCount: number;
lightType: number;
lightColor0: Readonly<NumberArray3>;
lightPosition0: Readonly<NumberArray3>;
lightDirection0: Readonly<NumberArray3>;
lightAttenuation0: Readonly<NumberArray3>;
lightColor1: Readonly<NumberArray3>;
lightPosition1: Readonly<NumberArray3>;
lightDirection1: Readonly<NumberArray3>;
lightAttenuation1: Readonly<NumberArray3>;
lightColor2: Readonly<NumberArray3>;
lightPosition2: Readonly<NumberArray3>;
lightDirection2: Readonly<NumberArray3>;
lightAttenuation2: Readonly<NumberArray3>;
};
/** UBO ready lighting module */
export declare const lighting: {
readonly props: LightingProps;
readonly uniforms: LightingUniforms;
readonly name: "lighting";
readonly defines: {
readonly MAX_LIGHTS: 3;
};
readonly uniformTypes: {
readonly enabled: "i32";
readonly lightType: "i32";
readonly directionalLightCount: "i32";
readonly pointLightCount: "i32";
readonly ambientLightColor: "vec3<f32>";
readonly lightColor0: "vec3<f32>";
readonly lightPosition0: "vec3<f32>";
readonly lightDirection0: "vec3<f32>";
readonly lightAttenuation0: "vec3<f32>";
readonly lightColor1: "vec3<f32>";
readonly lightPosition1: "vec3<f32>";
readonly lightDirection1: "vec3<f32>";
readonly lightAttenuation1: "vec3<f32>";
readonly lightColor2: "vec3<f32>";
readonly lightPosition2: "vec3<f32>";
readonly lightDirection2: "vec3<f32>";
readonly lightAttenuation2: "vec3<f32>";
};
readonly defaultUniforms: {
readonly enabled: 1;
readonly lightType: LIGHT_TYPE.POINT;
readonly directionalLightCount: 0;
readonly pointLightCount: 0;
readonly ambientLightColor: readonly [0.1, 0.1, 0.1];
readonly lightColor0: readonly [1, 1, 1];
readonly lightPosition0: readonly [1, 1, 2];
readonly lightDirection0: readonly [1, 1, 1];
readonly lightAttenuation0: readonly [1, 0, 0];
readonly lightColor1: readonly [1, 1, 1];
readonly lightPosition1: readonly [1, 1, 2];
readonly lightDirection1: readonly [1, 1, 1];
readonly lightAttenuation1: readonly [1, 0, 0];
readonly lightColor2: readonly [1, 1, 1];
readonly lightPosition2: readonly [1, 1, 2];
readonly lightDirection2: readonly [1, 1, 1];
readonly lightAttenuation2: readonly [1, 0, 0];
};
readonly source: "// #if (defined(SHADER_TYPE_FRAGMENT) && defined(LIGHTING_FRAGMENT)) || (defined(SHADER_TYPE_VERTEX) && defined(LIGHTING_VERTEX))\nstruct AmbientLight {\n color: vec3<f32>,\n};\n\nstruct PointLight {\n color: vec3<f32>,\n position: vec3<f32>,\n attenuation: vec3<f32>, // 2nd order x:Constant-y:Linear-z:Exponential\n};\n\nstruct DirectionalLight {\n color: vec3<f32>,\n direction: vec3<f32>,\n};\n\nstruct lightingUniforms {\n enabled: i32,\n pointLightCount: i32,\n directionalLightCount: i32,\n\n ambientColor: vec3<f32>,\n\n // TODO - support multiple lights by uncommenting arrays below\n lightType: i32,\n lightColor: vec3<f32>,\n lightDirection: vec3<f32>,\n lightPosition: vec3<f32>,\n lightAttenuation: vec3<f32>,\n\n // AmbientLight ambientLight;\n // PointLight pointLight[MAX_LIGHTS];\n // DirectionalLight directionalLight[MAX_LIGHTS];\n};\n\n// Binding 0:1 is reserved for lighting (Note: could go into separate bind group as it is stable across draw calls)\n@binding(1) @group(0) var<uniform> lighting : lightingUniforms;\n\nfn lighting_getPointLight(index: i32) -> PointLight {\n return PointLight(lighting.lightColor, lighting.lightPosition, lighting.lightAttenuation);\n}\n\nfn lighting_getDirectionalLight(index: i32) -> DirectionalLight {\n return DirectionalLight(lighting.lightColor, lighting.lightDirection);\n} \n\nfn getPointLightAttenuation(pointLight: PointLight, distance: f32) -> f32 {\n return pointLight.attenuation.x\n + pointLight.attenuation.y * distance\n + pointLight.attenuation.z * distance * distance;\n}\n";
readonly vs: "precision highp int;\n\n// #if (defined(SHADER_TYPE_FRAGMENT) && defined(LIGHTING_FRAGMENT)) || (defined(SHADER_TYPE_VERTEX) && defined(LIGHTING_VERTEX))\nstruct AmbientLight {\n vec3 color;\n};\n\nstruct PointLight {\n vec3 color;\n vec3 position;\n vec3 attenuation; // 2nd order x:Constant-y:Linear-z:Exponential\n};\n\nstruct DirectionalLight {\n vec3 color;\n vec3 direction;\n};\n\nuniform lightingUniforms {\n int enabled;\n int lightType;\n\n int directionalLightCount;\n int pointLightCount;\n\n vec3 ambientColor;\n\n vec3 lightColor0;\n vec3 lightPosition0;\n vec3 lightDirection0;\n vec3 lightAttenuation0;\n\n vec3 lightColor1;\n vec3 lightPosition1;\n vec3 lightDirection1;\n vec3 lightAttenuation1;\n\n vec3 lightColor2;\n vec3 lightPosition2;\n vec3 lightDirection2;\n vec3 lightAttenuation2;\n} lighting;\n\nPointLight lighting_getPointLight(int index) {\n switch (index) {\n case 0:\n return PointLight(lighting.lightColor0, lighting.lightPosition0, lighting.lightAttenuation0);\n case 1:\n return PointLight(lighting.lightColor1, lighting.lightPosition1, lighting.lightAttenuation1);\n case 2:\n default: \n return PointLight(lighting.lightColor2, lighting.lightPosition2, lighting.lightAttenuation2);\n }\n}\n\nDirectionalLight lighting_getDirectionalLight(int index) {\n switch (index) {\n case 0:\n return DirectionalLight(lighting.lightColor0, lighting.lightDirection0);\n case 1:\n return DirectionalLight(lighting.lightColor1, lighting.lightDirection1);\n case 2:\n default: \n return DirectionalLight(lighting.lightColor2, lighting.lightDirection2);\n }\n} \n\nfloat getPointLightAttenuation(PointLight pointLight, float distance) {\n return pointLight.attenuation.x\n + pointLight.attenuation.y * distance\n + pointLight.attenuation.z * distance * distance;\n}\n\n// #endif\n";
readonly fs: "precision highp int;\n\n// #if (defined(SHADER_TYPE_FRAGMENT) && defined(LIGHTING_FRAGMENT)) || (defined(SHADER_TYPE_VERTEX) && defined(LIGHTING_VERTEX))\nstruct AmbientLight {\n vec3 color;\n};\n\nstruct PointLight {\n vec3 color;\n vec3 position;\n vec3 attenuation; // 2nd order x:Constant-y:Linear-z:Exponential\n};\n\nstruct DirectionalLight {\n vec3 color;\n vec3 direction;\n};\n\nuniform lightingUniforms {\n int enabled;\n int lightType;\n\n int directionalLightCount;\n int pointLightCount;\n\n vec3 ambientColor;\n\n vec3 lightColor0;\n vec3 lightPosition0;\n vec3 lightDirection0;\n vec3 lightAttenuation0;\n\n vec3 lightColor1;\n vec3 lightPosition1;\n vec3 lightDirection1;\n vec3 lightAttenuation1;\n\n vec3 lightColor2;\n vec3 lightPosition2;\n vec3 lightDirection2;\n vec3 lightAttenuation2;\n} lighting;\n\nPointLight lighting_getPointLight(int index) {\n switch (index) {\n case 0:\n return PointLight(lighting.lightColor0, lighting.lightPosition0, lighting.lightAttenuation0);\n case 1:\n return PointLight(lighting.lightColor1, lighting.lightPosition1, lighting.lightAttenuation1);\n case 2:\n default: \n return PointLight(lighting.lightColor2, lighting.lightPosition2, lighting.lightAttenuation2);\n }\n}\n\nDirectionalLight lighting_getDirectionalLight(int index) {\n switch (index) {\n case 0:\n return DirectionalLight(lighting.lightColor0, lighting.lightDirection0);\n case 1:\n return DirectionalLight(lighting.lightColor1, lighting.lightDirection1);\n case 2:\n default: \n return DirectionalLight(lighting.lightColor2, lighting.lightDirection2);\n }\n} \n\nfloat getPointLightAttenuation(PointLight pointLight, float distance) {\n return pointLight.attenuation.x\n + pointLight.attenuation.y * distance\n + pointLight.attenuation.z * distance * distance;\n}\n\n// #endif\n";
readonly getUniforms: typeof getUniforms;
};
declare function getUniforms(props?: LightingProps, prevUniforms?: Partial<LightingUniforms>): LightingUniforms;
export {};
//# sourceMappingURL=lighting.d.ts.map