UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

123 lines (114 loc) 4.14 kB
import { uniform } from '../core/UniformNode.js'; import { renderGroup, sharedUniformGroup } from '../core/UniformGroupNode.js'; import { Vector3 } from '../../math/Vector3.js'; import { Fn } from '../tsl/TSLBase.js'; import { uniformArray } from './UniformArrayNode.js'; /** * TSL object that represents the current `index` value of the camera if used ArrayCamera. * * @tsl * @type {UniformNode<uint>} */ export const cameraIndex = /*@__PURE__*/uniform(0, 'uint').setGroup(sharedUniformGroup('cameraIndex')).toVarying('v_cameraIndex'); /** * TSL object that represents the `near` value of the camera used for the current render. * * @tsl * @type {UniformNode<float>} */ export const cameraNear = /*@__PURE__*/uniform('float').label('cameraNear').setGroup(renderGroup).onRenderUpdate(({ camera }) => camera.near); /** * TSL object that represents the `far` value of the camera used for the current render. * * @tsl * @type {UniformNode<float>} */ export const cameraFar = /*@__PURE__*/uniform('float').label('cameraFar').setGroup(renderGroup).onRenderUpdate(({ camera }) => camera.far); /** * TSL object that represents the projection matrix of the camera used for the current render. * * @tsl * @type {UniformNode<mat4>} */ export const cameraProjectionMatrix = /*@__PURE__*/Fn(({ camera }) => { let cameraProjectionMatrix; if (camera.isArrayCamera && camera.cameras.length > 0) { const matrices = []; for (const subCamera of camera.cameras) { matrices.push(subCamera.projectionMatrix); } const cameraProjectionMatrices = uniformArray(matrices).setGroup(renderGroup).label('cameraProjectionMatrices'); cameraProjectionMatrix = cameraProjectionMatrices.element(cameraIndex).toVar('cameraProjectionMatrix'); } else { cameraProjectionMatrix = uniform('mat4').label('cameraProjectionMatrix').setGroup(renderGroup).onRenderUpdate(({ camera }) => camera.projectionMatrix); } return cameraProjectionMatrix; }).once()(); /** * TSL object that represents the inverse projection matrix of the camera used for the current render. * * @tsl * @type {UniformNode<mat4>} */ export const cameraProjectionMatrixInverse = /*@__PURE__*/uniform('mat4').label('cameraProjectionMatrixInverse').setGroup(renderGroup).onRenderUpdate(({ camera }) => camera.projectionMatrixInverse); /** * TSL object that represents the view matrix of the camera used for the current render. * * @tsl * @type {UniformNode<mat4>} */ export const cameraViewMatrix = /*@__PURE__*/Fn(({ camera }) => { let cameraViewMatrix; if (camera.isArrayCamera && camera.cameras.length > 0) { const matrices = []; for (const subCamera of camera.cameras) { matrices.push(subCamera.matrixWorldInverse); } const cameraViewMatrices = uniformArray(matrices).setGroup(renderGroup).label('cameraViewMatrices'); cameraViewMatrix = cameraViewMatrices.element(cameraIndex).toVar('cameraViewMatrix'); } else { cameraViewMatrix = uniform('mat4').label('cameraViewMatrix').setGroup(renderGroup).onRenderUpdate(({ camera }) => camera.matrixWorldInverse); } return cameraViewMatrix; }).once()(); /** * TSL object that represents the world matrix of the camera used for the current render. * * @tsl * @type {UniformNode<mat4>} */ export const cameraWorldMatrix = /*@__PURE__*/uniform('mat4').label('cameraWorldMatrix').setGroup(renderGroup).onRenderUpdate(({ camera }) => camera.matrixWorld); /** * TSL object that represents the normal matrix of the camera used for the current render. * * @tsl * @type {UniformNode<mat3>} */ export const cameraNormalMatrix = /*@__PURE__*/uniform('mat3').label('cameraNormalMatrix').setGroup(renderGroup).onRenderUpdate(({ camera }) => camera.normalMatrix); /** * TSL object that represents the position in world space of the camera used for the current render. * * @tsl * @type {UniformNode<vec3>} */ export const cameraPosition = /*@__PURE__*/uniform(new Vector3()).label('cameraPosition').setGroup(renderGroup).onRenderUpdate(({ camera }, self) => self.value.setFromMatrixPosition(camera.matrixWorld));