// luma.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors

// shadertools exports

/**
 * Marks GLSL shaders for syntax highlighting: glsl`...`
 * Install https://marketplace.visualstudio.com/items?itemName=boyswan.glsl-literal
 */
export type {PlatformInfo} from './lib/shader-assembly/platform-info';
export type {ShaderBindingDebugRow} from './lib/shader-assembly/wgsl-binding-debug';

// ShaderModules

export type {ShaderModule} from './lib/shader-module/shader-module';
export type {ShaderPass} from './lib/shader-module/shader-pass';
export type {ShaderModuleUniformValue, UniformTypes} from './lib/utils/uniform-types';

export {initializeShaderModule, initializeShaderModules} from './lib/shader-module/shader-module';
export {getShaderModuleUniforms} from './lib/shader-module/shader-module';
export {getShaderModuleDependencies} from './lib/shader-module/shader-module-dependencies';
export {checkShaderModuleDeprecations} from './lib/shader-module/shader-module';
export type {
  GLSLUniformBlockInfo,
  ShaderModuleUniformLayoutStage,
  ShaderModuleUniformLayoutValidationResult
} from './lib/shader-module/shader-module-uniform-layout';
export {
  getGLSLUniformBlocks,
  getShaderModuleUniformBlockFields,
  getShaderModuleUniformBlockName,
  getShaderModuleUniformLayoutValidationResult,
  validateShaderModuleUniformLayout,
  warnIfGLSLUniformBlocksAreNotStd140
} from './lib/shader-module/shader-module-uniform-layout';

export {getShaderModuleSource} from './lib/shader-assembly/assemble-shaders';

export {resolveModules as _resolveModules} from './lib/shader-module/shader-module-dependencies';
export {getDependencyGraph as _getDependencyGraph} from './lib/shader-module/shader-module-dependencies';

// ShaderAssembler
export {ShaderAssembler} from './lib/shader-assembler';
export type {ShaderHook} from './lib/shader-assembly/shader-hooks';
export type {ShaderInjection} from './lib/shader-assembly/shader-injections';

// SHADER HELPERS

// Shader source introspection
export {getShaderInfo} from './lib/glsl-utils/get-shader-info';
export {
  getQualifierDetails,
  getPassthroughFS,
  typeToChannelSuffix,
  typeToChannelCount,
  convertToVec4
} from './lib/glsl-utils/shader-utils';

// EXPERIMENTAL - Do not use in production applications
export type {ShaderGenerationOptions} from './lib/shader-generator/generate-shader';
export {generateShaderForModule} from './lib/shader-generator/generate-shader';
export {capitalize} from './lib/shader-generator/utils/capitalize';

// TEST EXPORTS - Do not use in production applications
export {preprocess} from './lib/preprocessor/preprocessor';
export {assembleGLSLShaderPair} from './lib/shader-assembly/assemble-shaders';
export {combineInjects} from './lib/shader-assembly/shader-injections';

// data utils
export {toHalfFloat, fromHalfFloat} from './modules/math/fp16/fp16-utils';
export {fp64ify, fp64LowPart, fp64ifyMatrix4} from './modules/math/fp64/fp64-utils';
export {
  normalizeByteColor3,
  normalizeByteColor4,
  resolveUseByteColors
} from './lib/color/normalize-byte-colors';

// math libraries
export {random} from './modules/math/random/random';

export {fp32} from './modules/math/fp32/fp32';
export {fp64, fp64arithmetic} from './modules/math/fp64/fp64';
export type {FloatColorsProps, FloatColorsUniforms} from './modules/color/float-colors';
export {floatColors} from './modules/color/float-colors';

// engine shader modules

//  projection
// export type {ProjectionUniforms} from './modules/engine/project/project';
// export {projection} from './modules/engine/project/project';
export type {PickingProps, PickingUniforms} from './modules/engine/picking/picking';
export {picking} from './modules/engine/picking/picking';
export {skin} from './modules/engine/skin/skin';

// lighting
export {
  type Light,
  type AmbientLight,
  type PointLight,
  type SpotLight,
  type DirectionalLight,
  type LightingLightUniform
} from './modules/lighting/lights/lighting';

export type {LightingProps, LightingUniforms} from './modules/lighting/lights/lighting';
export {lighting} from './modules/lighting/lights/lighting';
export type {IBLBindings} from './modules/lighting/ibl/ibl';
export {ibl} from './modules/lighting/ibl/ibl';
export {dirlight} from './modules/lighting/no-material/dirlight';
export type {LambertMaterialProps} from './modules/lighting/lambert-material/lambert-material';
export {lambertMaterial} from './modules/lighting/lambert-material/lambert-material';
export type {GouraudMaterialProps} from './modules/lighting/gouraud-material/gouraud-material';
export {gouraudMaterial} from './modules/lighting/gouraud-material/gouraud-material';
export type {PhongMaterialProps} from './modules/lighting/phong-material/phong-material';
export {phongMaterial} from './modules/lighting/phong-material/phong-material';
export type {
  PBRMaterialBindings,
  PBRMaterialProps,
  PBRMaterialUniforms
} from './modules/lighting/pbr-material/pbr-material';
export type {
  PBRSceneBindings,
  PBRSceneProps,
  PBRSceneUniforms
} from './modules/lighting/pbr-material/pbr-scene';
export type {PBRProjectionProps} from './modules/lighting/pbr-material/pbr-projection';

export {pbrMaterial} from './modules/lighting/pbr-material/pbr-material';
export {pbrScene} from './modules/lighting/pbr-material/pbr-scene';
