// luma.gl // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors import {ShaderModule} from '../../lib/shader-module/shader-module'; export type FloatColorsProps = { /** * When true, semantic colors are interpreted as 0-255 byte-style values and normalized in shader code. * When false, semantic colors are interpreted directly as floats. */ useByteColors?: boolean; }; export type FloatColorsUniforms = { /** Controls whether shader helpers normalize semantic colors from byte space. */ useByteColors: boolean; }; const GLSL_UNIFORMS = /* glsl */ `\ layout(std140) uniform floatColorsUniforms { float useByteColors; } floatColors; vec3 floatColors_normalize(vec3 inputColor) { return floatColors.useByteColors > 0.5 ? inputColor / 255.0 : inputColor; } vec4 floatColors_normalize(vec4 inputColor) { return floatColors.useByteColors > 0.5 ? inputColor / 255.0 : inputColor; } vec4 floatColors_premultiplyAlpha(vec4 inputColor) { return vec4(inputColor.rgb * inputColor.a, inputColor.a); } vec4 floatColors_unpremultiplyAlpha(vec4 inputColor) { return inputColor.a > 0.0 ? vec4(inputColor.rgb / inputColor.a, inputColor.a) : vec4(0.0); } vec4 floatColors_premultiply_alpha(vec4 inputColor) { return floatColors_premultiplyAlpha(inputColor); } vec4 floatColors_unpremultiply_alpha(vec4 inputColor) { return floatColors_unpremultiplyAlpha(inputColor); } `; const WGSL_UNIFORMS = /* wgsl */ `\ struct floatColorsUniforms { useByteColors: f32 }; @group(0) @binding(auto) var floatColors : floatColorsUniforms; fn floatColors_normalize(inputColor: vec3) -> vec3 { return select(inputColor, inputColor / 255.0, floatColors.useByteColors > 0.5); } fn floatColors_normalize4(inputColor: vec4) -> vec4 { return select(inputColor, inputColor / 255.0, floatColors.useByteColors > 0.5); } fn floatColors_premultiplyAlpha(inputColor: vec4) -> vec4 { return vec4(inputColor.rgb * inputColor.a, inputColor.a); } fn floatColors_unpremultiplyAlpha(inputColor: vec4) -> vec4 { return select( vec4(0.0), vec4(inputColor.rgb / inputColor.a, inputColor.a), inputColor.a > 0.0 ); } fn floatColors_premultiply_alpha(inputColor: vec4) -> vec4 { return floatColors_premultiplyAlpha(inputColor); } fn floatColors_unpremultiply_alpha(inputColor: vec4) -> vec4 { return floatColors_unpremultiplyAlpha(inputColor); } `; export const floatColors = { name: 'floatColors', props: {} as FloatColorsProps, uniforms: {} as FloatColorsUniforms, vs: GLSL_UNIFORMS, fs: GLSL_UNIFORMS, source: WGSL_UNIFORMS, uniformTypes: { useByteColors: 'f32' }, defaultUniforms: { useByteColors: true } } as const satisfies ShaderModule;