// luma.gl // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors export const lightingUniformsGLSL = /* glsl */ `\ precision highp int; // #if (defined(SHADER_TYPE_FRAGMENT) && defined(LIGHTING_FRAGMENT)) || (defined(SHADER_TYPE_VERTEX) && defined(LIGHTING_VERTEX)) struct AmbientLight { vec3 color; }; struct PointLight { vec3 color; vec3 position; vec3 attenuation; // 2nd order x:Constant-y:Linear-z:Exponential }; struct SpotLight { vec3 color; vec3 position; vec3 direction; vec3 attenuation; vec2 coneCos; }; struct DirectionalLight { vec3 color; vec3 direction; }; struct UniformLight { vec3 color; vec3 position; vec3 direction; vec3 attenuation; vec2 coneCos; }; layout(std140) uniform lightingUniforms { int enabled; int directionalLightCount; int pointLightCount; int spotLightCount; vec3 ambientColor; UniformLight lights[5]; } lighting; PointLight lighting_getPointLight(int index) { UniformLight light = lighting.lights[index]; return PointLight(light.color, light.position, light.attenuation); } SpotLight lighting_getSpotLight(int index) { UniformLight light = lighting.lights[lighting.pointLightCount + index]; return SpotLight(light.color, light.position, light.direction, light.attenuation, light.coneCos); } DirectionalLight lighting_getDirectionalLight(int index) { UniformLight light = lighting.lights[lighting.pointLightCount + lighting.spotLightCount + index]; return DirectionalLight(light.color, light.direction); } float getPointLightAttenuation(PointLight pointLight, float distance) { return pointLight.attenuation.x + pointLight.attenuation.y * distance + pointLight.attenuation.z * distance * distance; } float getSpotLightAttenuation(SpotLight spotLight, vec3 positionWorldspace) { vec3 light_direction = normalize(positionWorldspace - spotLight.position); float coneFactor = smoothstep( spotLight.coneCos.y, spotLight.coneCos.x, dot(normalize(spotLight.direction), light_direction) ); float distanceAttenuation = getPointLightAttenuation( PointLight(spotLight.color, spotLight.position, spotLight.attenuation), distance(spotLight.position, positionWorldspace) ); return distanceAttenuation / max(coneFactor, 0.0001); } // #endif `;