UNPKG

three

Version:

JavaScript 3D library

349 lines (291 loc) 8.54 kB
import Node from './Node.js'; import { nodeImmutable, nodeObject } from '../tsl/TSLCore.js'; /** * This class represents a shader property. It can be used * to explicitly define a property and assign a value to it. * * ```js * const threshold = property( 'float', 'threshold' ).assign( THRESHOLD ); *``` * `PropertyNode` is used by the engine to predefined common material properties * for TSL code. * * @augments Node */ class PropertyNode extends Node { static get type() { return 'PropertyNode'; } /** * Constructs a new property node. * * @param {string} nodeType - The type of the node. * @param {?string} [name=null] - The name of the property in the shader. * @param {boolean} [varying=false] - Whether this property is a varying or not. */ constructor( nodeType, name = null, varying = false ) { super( nodeType ); /** * The name of the property in the shader. If no name is defined, * the node system auto-generates one. * * @type {?string} * @default null */ this.name = name; /** * Whether this property is a varying or not. * * @type {boolean} * @default false */ this.varying = varying; /** * This flag can be used for type testing. * * @type {boolean} * @readonly * @default true */ this.isPropertyNode = true; } getHash( builder ) { return this.name || super.getHash( builder ); } /** * The method is overwritten so it always returns `true`. * * @param {NodeBuilder} builder - The current node builder. * @return {boolean} Whether this node is global or not. */ isGlobal( /*builder*/ ) { return true; } generate( builder ) { let nodeVar; if ( this.varying === true ) { nodeVar = builder.getVaryingFromNode( this, this.name ); nodeVar.needsInterpolation = true; } else { nodeVar = builder.getVarFromNode( this, this.name ); } return builder.getPropertyName( nodeVar ); } } export default PropertyNode; /** * TSL function for creating a property node. * * @tsl * @function * @param {string} type - The type of the node. * @param {?string} [name=null] - The name of the property in the shader. * @returns {PropertyNode} */ export const property = ( type, name ) => nodeObject( new PropertyNode( type, name ) ); /** * TSL function for creating a varying property node. * * @tsl * @function * @param {string} type - The type of the node. * @param {?string} [name=null] - The name of the varying in the shader. * @returns {PropertyNode} */ export const varyingProperty = ( type, name ) => nodeObject( new PropertyNode( type, name, true ) ); /** * TSL object that represents the shader variable `DiffuseColor`. * * @tsl * @type {PropertyNode<vec4>} */ export const diffuseColor = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec4', 'DiffuseColor' ); /** * TSL object that represents the shader variable `EmissiveColor`. * * @tsl * @type {PropertyNode<vec3>} */ export const emissive = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'EmissiveColor' ); /** * TSL object that represents the shader variable `Roughness`. * * @tsl * @type {PropertyNode<float>} */ export const roughness = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Roughness' ); /** * TSL object that represents the shader variable `Metalness`. * * @tsl * @type {PropertyNode<float>} */ export const metalness = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Metalness' ); /** * TSL object that represents the shader variable `Clearcoat`. * * @tsl * @type {PropertyNode<float>} */ export const clearcoat = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Clearcoat' ); /** * TSL object that represents the shader variable `ClearcoatRoughness`. * * @tsl * @type {PropertyNode<float>} */ export const clearcoatRoughness = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'ClearcoatRoughness' ); /** * TSL object that represents the shader variable `Sheen`. * * @tsl * @type {PropertyNode<vec3>} */ export const sheen = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'Sheen' ); /** * TSL object that represents the shader variable `SheenRoughness`. * * @tsl * @type {PropertyNode<float>} */ export const sheenRoughness = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'SheenRoughness' ); /** * TSL object that represents the shader variable `Iridescence`. * * @tsl * @type {PropertyNode<float>} */ export const iridescence = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Iridescence' ); /** * TSL object that represents the shader variable `IridescenceIOR`. * * @tsl * @type {PropertyNode<float>} */ export const iridescenceIOR = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'IridescenceIOR' ); /** * TSL object that represents the shader variable `IridescenceThickness`. * * @tsl * @type {PropertyNode<float>} */ export const iridescenceThickness = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'IridescenceThickness' ); /** * TSL object that represents the shader variable `AlphaT`. * * @tsl * @type {PropertyNode<float>} */ export const alphaT = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'AlphaT' ); /** * TSL object that represents the shader variable `Anisotropy`. * * @tsl * @type {PropertyNode<float>} */ export const anisotropy = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Anisotropy' ); /** * TSL object that represents the shader variable `AnisotropyT`. * * @tsl * @type {PropertyNode<vec3>} */ export const anisotropyT = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'AnisotropyT' ); /** * TSL object that represents the shader variable `AnisotropyB`. * * @tsl * @type {PropertyNode<vec3>} */ export const anisotropyB = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'AnisotropyB' ); /** * TSL object that represents the shader variable `SpecularColor`. * * @tsl * @type {PropertyNode<color>} */ export const specularColor = /*@__PURE__*/ nodeImmutable( PropertyNode, 'color', 'SpecularColor' ); /** * TSL object that represents the shader variable `SpecularF90`. * * @tsl * @type {PropertyNode<float>} */ export const specularF90 = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'SpecularF90' ); /** * TSL object that represents the shader variable `Shininess`. * * @tsl * @type {PropertyNode<float>} */ export const shininess = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Shininess' ); /** * TSL object that represents the shader variable `Output`. * * @tsl * @type {PropertyNode<vec4>} */ export const output = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec4', 'Output' ); /** * TSL object that represents the shader variable `dashSize`. * * @tsl * @type {PropertyNode<float>} */ export const dashSize = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'dashSize' ); /** * TSL object that represents the shader variable `gapSize`. * * @tsl * @type {PropertyNode<float>} */ export const gapSize = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'gapSize' ); /** * TSL object that represents the shader variable `pointWidth`. * * @tsl * @type {PropertyNode<float>} */ export const pointWidth = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'pointWidth' ); /** * TSL object that represents the shader variable `IOR`. * * @tsl * @type {PropertyNode<float>} */ export const ior = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'IOR' ); /** * TSL object that represents the shader variable `Transmission`. * * @tsl * @type {PropertyNode<float>} */ export const transmission = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Transmission' ); /** * TSL object that represents the shader variable `Thickness`. * * @tsl * @type {PropertyNode<float>} */ export const thickness = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Thickness' ); /** * TSL object that represents the shader variable `AttenuationDistance`. * * @tsl * @type {PropertyNode<float>} */ export const attenuationDistance = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'AttenuationDistance' ); /** * TSL object that represents the shader variable `AttenuationColor`. * * @tsl * @type {PropertyNode<color>} */ export const attenuationColor = /*@__PURE__*/ nodeImmutable( PropertyNode, 'color', 'AttenuationColor' ); /** * TSL object that represents the shader variable `Dispersion`. * * @tsl * @type {PropertyNode<float>} */ export const dispersion = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Dispersion' );