UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

38 lines (37 loc) 1.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _Position = require("../../accessors/Position.js"); var _TSLBase = require("../../tsl/TSLBase.js"); /** * This computes a parallax corrected normal which is used for box-projected cube mapping (BPCEM). * * Reference: {@link https://devlog-martinsh.blogspot.com/2011/09/box-projected-cube-environment-mapping.html} * * ```js * const uvNode = getParallaxCorrectNormal( reflectVector, vec3( 200, 100, 100 ), vec3( 0, - 50, 0 ) ); * material.envNode = pmremTexture( renderTarget.texture, uvNode ); * ``` * * @tsl * @function * @param {Node<vec3>} normal - The normal to correct. * @param {Node<vec3>} cubeSize - The cube size should reflect the size of the environment (BPCEM is usually applied in closed environments like rooms). * @param {Node<vec3>} cubePos - The cube position. * @return {Node<vec3>} The parallax corrected normal. */ const getParallaxCorrectNormal = /*@__PURE__*/(0, _TSLBase.Fn)(([normal, cubeSize, cubePos]) => { const nDir = (0, _TSLBase.normalize)(normal).toVar(); const rbmax = (0, _TSLBase.sub)((0, _TSLBase.float)(0.5).mul(cubeSize.sub(cubePos)), _Position.positionWorld).div(nDir).toVar(); const rbmin = (0, _TSLBase.sub)((0, _TSLBase.float)(-0.5).mul(cubeSize.sub(cubePos)), _Position.positionWorld).div(nDir).toVar(); const rbminmax = (0, _TSLBase.vec3)().toVar(); rbminmax.x = nDir.x.greaterThan((0, _TSLBase.float)(0)).select(rbmax.x, rbmin.x); rbminmax.y = nDir.y.greaterThan((0, _TSLBase.float)(0)).select(rbmax.y, rbmin.y); rbminmax.z = nDir.z.greaterThan((0, _TSLBase.float)(0)).select(rbmax.z, rbmin.z); const correction = (0, _TSLBase.min)((0, _TSLBase.min)(rbminmax.x, rbminmax.y), rbminmax.z).toVar(); const boxIntersection = _Position.positionWorld.add(nDir.mul(correction)).toVar(); return boxIntersection.sub(cubePos); }); var _default = exports.default = getParallaxCorrectNormal;