| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- import { UVMapping } from '../../constants.js';
- import { Euler } from '../../math/Euler.js';
- import { Matrix4 } from '../../math/Matrix4.js';
- import Node from '../core/Node.js';
- import { renderGroup } from '../core/UniformGroupNode.js';
- import { nodeImmutable, uniform } from '../tsl/TSLBase.js';
- import { reference } from './ReferenceNode.js';
- import { error } from '../../utils.js';
- const _e1 = /*@__PURE__*/ new Euler();
- const _m1 = /*@__PURE__*/ new Matrix4();
- /**
- * This module allows access to a collection of scene properties. The following predefined TSL objects
- * are available for easier use:
- *
- * - `backgroundBlurriness`: A node that represents the scene's background blurriness.
- * - `backgroundIntensity`: A node that represents the scene's background intensity.
- * - `backgroundRotation`: A node that represents the scene's background rotation.
- *
- * @augments Node
- */
- class SceneNode extends Node {
- static get type() {
- return 'SceneNode';
- }
- /**
- * Constructs a new scene node.
- *
- * @param {('backgroundBlurriness'|'backgroundIntensity'|'backgroundRotation')} scope - The scope defines the type of scene property that is accessed.
- * @param {?Scene} [scene=null] - A reference to the scene.
- */
- constructor( scope = SceneNode.BACKGROUND_BLURRINESS, scene = null ) {
- super();
- /**
- * The scope defines the type of scene property that is accessed.
- *
- * @type {('backgroundBlurriness'|'backgroundIntensity'|'backgroundRotation')}
- */
- this.scope = scope;
- /**
- * A reference to the scene that is going to be accessed.
- *
- * @type {?Scene}
- * @default null
- */
- this.scene = scene;
- }
- /**
- * Depending on the scope, the method returns a different type of node that represents
- * the respective scene property.
- *
- * @param {NodeBuilder} builder - The current node builder.
- * @return {Node} The output node.
- */
- setup( builder ) {
- const scope = this.scope;
- const scene = this.scene !== null ? this.scene : builder.scene;
- let output;
- if ( scope === SceneNode.BACKGROUND_BLURRINESS ) {
- output = reference( 'backgroundBlurriness', 'float', scene );
- } else if ( scope === SceneNode.BACKGROUND_INTENSITY ) {
- output = reference( 'backgroundIntensity', 'float', scene );
- } else if ( scope === SceneNode.BACKGROUND_ROTATION ) {
- output = uniform( 'mat4' ).setName( 'backgroundRotation' ).setGroup( renderGroup ).onRenderUpdate( () => {
- const background = scene.background;
- if ( background !== null && background.isTexture && background.mapping !== UVMapping ) {
- _e1.copy( scene.backgroundRotation );
- // accommodate left-handed frame
- _e1.x *= - 1; _e1.y *= - 1; _e1.z *= - 1;
- _m1.makeRotationFromEuler( _e1 );
- } else {
- _m1.identity();
- }
- return _m1;
- } );
- } else {
- error( 'SceneNode: Unknown scope:', scope );
- }
- return output;
- }
- }
- SceneNode.BACKGROUND_BLURRINESS = 'backgroundBlurriness';
- SceneNode.BACKGROUND_INTENSITY = 'backgroundIntensity';
- SceneNode.BACKGROUND_ROTATION = 'backgroundRotation';
- export default SceneNode;
- /**
- * TSL object that represents the scene's background blurriness.
- *
- * @tsl
- * @type {SceneNode}
- */
- export const backgroundBlurriness = /*@__PURE__*/ nodeImmutable( SceneNode, SceneNode.BACKGROUND_BLURRINESS );
- /**
- * TSL object that represents the scene's background intensity.
- *
- * @tsl
- * @type {SceneNode}
- */
- export const backgroundIntensity = /*@__PURE__*/ nodeImmutable( SceneNode, SceneNode.BACKGROUND_INTENSITY );
- /**
- * TSL object that represents the scene's background rotation.
- *
- * @tsl
- * @type {SceneNode}
- */
- export const backgroundRotation = /*@__PURE__*/ nodeImmutable( SceneNode, SceneNode.BACKGROUND_ROTATION );
|