@openhps/core
Version:
Open Hybrid Positioning System - Core component
38 lines (37 loc) • 1.97 kB
JavaScript
;
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;