// luma.gl // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors import type {NumberArray3} from '@math.gl/core'; import {ShaderModule} from '../../../lib/shader-module/shader-module'; export type DirlightProps = { lightDirection?: NumberArray3; }; export type DirlightUniforms = DirlightProps; // TODO export const SOURCE_WGSL = /* WGSL */ `\ struct dirlightUniforms { lightDirection: vec3, }; alias DirlightNormal = vec3; struct DirlightInputs { normal: DirlightNormal, }; @group(2) @binding(auto) var dirlight : dirlightUniforms; // For vertex fn dirlight_setNormal(normal: vec3) -> DirlightNormal { return normalize(normal); } // Returns color attenuated by angle from light source fn dirlight_filterColor(color: vec4, inputs: DirlightInputs) -> vec4 { // TODO - fix default light direction // let lightDirection = dirlight.lightDirection; let lightDirection = vec3(1, 1, 1); let d: f32 = abs(dot(inputs.normal, normalize(lightDirection))); return vec4(color.rgb * d, color.a); } `; const VS_GLSL = /* glsl */ `\ out vec3 dirlight_vNormal; void dirlight_setNormal(vec3 normal) { dirlight_vNormal = normalize(normal); } `; const FS_GLSL = /* glsl */ `\ layout(std140) uniform dirlightUniforms { vec3 lightDirection; } dirlight; in vec3 dirlight_vNormal; // Returns color attenuated by angle from light source vec4 dirlight_filterColor(vec4 color) { float d = abs(dot(dirlight_vNormal, normalize(dirlight.lightDirection))); return vec4(color.rgb * d, color.a); } `; /** * Cheap lighting - single directional light, single dot product, one uniform */ export const dirlight = { props: {} as DirlightProps, uniforms: {} as DirlightUniforms, name: 'dirlight', bindingLayout: [{name: 'dirlight', group: 2}], firstBindingSlot: 16, dependencies: [], source: SOURCE_WGSL, vs: VS_GLSL, fs: FS_GLSL, // fragmentInputs: [ // { // name: 'dirlight_vNormal', // type: 'vec3' // } // ], uniformTypes: { lightDirection: 'vec3' }, defaultUniforms: { lightDirection: [1, 1, 2] }, getUniforms } as const satisfies ShaderModule; function getUniforms(opts: DirlightProps = dirlight.defaultUniforms): DirlightUniforms { const uniforms: DirlightUniforms = {}; if (opts.lightDirection) { uniforms.lightDirection = opts.lightDirection; } return uniforms; }