Buckets:
| import Node from '../core/Node.js'; | |
| import { add } from '../math/OperatorNode.js'; | |
| import { normalLocal } from '../accessors/Normal.js'; | |
| import { positionLocal } from '../accessors/Position.js'; | |
| import { texture } from '../accessors/TextureNode.js'; | |
| import { nodeProxy, float, vec3 } from '../tsl/TSLBase.js'; | |
| /** | |
| * Can be used for triplanar texture mapping. | |
| * | |
| * ```js | |
| * material.colorNode = triplanarTexture( texture( diffuseMap ) ); | |
| * ``` | |
| * | |
| * @augments Node | |
| */ | |
| class TriplanarTexturesNode extends Node { | |
| static get type() { | |
| return 'TriplanarTexturesNode'; | |
| } | |
| /** | |
| * Constructs a new triplanar textures node. | |
| * | |
| * @param {Node} textureXNode - First texture node. | |
| * @param {?Node} [textureYNode=null] - Second texture node. When not set, the shader will sample from `textureXNode` instead. | |
| * @param {?Node} [textureZNode=null] - Third texture node. When not set, the shader will sample from `textureXNode` instead. | |
| * @param {?Node<float>} [scaleNode=float(1)] - The scale node. | |
| * @param {?Node<vec3>} [positionNode=positionLocal] - Vertex positions in local space. | |
| * @param {?Node<vec3>} [normalNode=normalLocal] - Normals in local space. | |
| */ | |
| constructor( textureXNode, textureYNode = null, textureZNode = null, scaleNode = float( 1 ), positionNode = positionLocal, normalNode = normalLocal ) { | |
| super( 'vec4' ); | |
| /** | |
| * First texture node. | |
| * | |
| * @type {Node} | |
| */ | |
| this.textureXNode = textureXNode; | |
| /** | |
| * Second texture node. When not set, the shader will sample from `textureXNode` instead. | |
| * | |
| * @type {?Node} | |
| * @default null | |
| */ | |
| this.textureYNode = textureYNode; | |
| /** | |
| * Third texture node. When not set, the shader will sample from `textureXNode` instead. | |
| * | |
| * @type {?Node} | |
| * @default null | |
| */ | |
| this.textureZNode = textureZNode; | |
| /** | |
| * The scale node. | |
| * | |
| * @type {Node<float>} | |
| * @default float(1) | |
| */ | |
| this.scaleNode = scaleNode; | |
| /** | |
| * Vertex positions in local space. | |
| * | |
| * @type {Node<vec3>} | |
| * @default positionLocal | |
| */ | |
| this.positionNode = positionNode; | |
| /** | |
| * Normals in local space. | |
| * | |
| * @type {Node<vec3>} | |
| * @default normalLocal | |
| */ | |
| this.normalNode = normalNode; | |
| } | |
| setup() { | |
| const { textureXNode, textureYNode, textureZNode, scaleNode, positionNode, normalNode } = this; | |
| // Ref: https://github.com/keijiro/StandardTriplanar | |
| // Blending factor of triplanar mapping | |
| let bf = normalNode.abs().normalize(); | |
| bf = bf.div( bf.dot( vec3( 1.0 ) ) ); | |
| // Triplanar mapping | |
| const tx = positionNode.yz.mul( scaleNode ); | |
| const ty = positionNode.zx.mul( scaleNode ); | |
| const tz = positionNode.xy.mul( scaleNode ); | |
| // Base color | |
| const textureX = textureXNode.value; | |
| const textureY = textureYNode !== null ? textureYNode.value : textureX; | |
| const textureZ = textureZNode !== null ? textureZNode.value : textureX; | |
| const cx = texture( textureX, tx ).mul( bf.x ); | |
| const cy = texture( textureY, ty ).mul( bf.y ); | |
| const cz = texture( textureZ, tz ).mul( bf.z ); | |
| return add( cx, cy, cz ); | |
| } | |
| } | |
| export default TriplanarTexturesNode; | |
| /** | |
| * TSL function for creating a triplanar textures node. | |
| * | |
| * @tsl | |
| * @function | |
| * @param {Node} textureXNode - First texture node. | |
| * @param {?Node} [textureYNode=null] - Second texture node. When not set, the shader will sample from `textureXNode` instead. | |
| * @param {?Node} [textureZNode=null] - Third texture node. When not set, the shader will sample from `textureXNode` instead. | |
| * @param {?Node<float>} [scaleNode=float(1)] - The scale node. | |
| * @param {?Node<vec3>} [positionNode=positionLocal] - Vertex positions in local space. | |
| * @param {?Node<vec3>} [normalNode=normalLocal] - Normals in local space. | |
| * @returns {TriplanarTexturesNode} | |
| */ | |
| export const triplanarTextures = /*@__PURE__*/ nodeProxy( TriplanarTexturesNode ).setParameterLength( 1, 6 ); | |
| /** | |
| * TSL function for creating a triplanar textures node. | |
| * | |
| * @tsl | |
| * @function | |
| * @param {Node} textureXNode - First texture node. | |
| * @param {?Node} [textureYNode=null] - Second texture node. When not set, the shader will sample from `textureXNode` instead. | |
| * @param {?Node} [textureZNode=null] - Third texture node. When not set, the shader will sample from `textureXNode` instead. | |
| * @param {?Node<float>} [scaleNode=float(1)] - The scale node. | |
| * @param {?Node<vec3>} [positionNode=positionLocal] - Vertex positions in local space. | |
| * @param {?Node<vec3>} [normalNode=normalLocal] - Normals in local space. | |
| * @returns {TriplanarTexturesNode} | |
| */ | |
| export const triplanarTexture = ( ...params ) => triplanarTextures( ...params ); | |
Xet Storage Details
- Size:
- 4.6 kB
- Xet hash:
- 80ebeaa39deb9b2e173466563bc0766658418c35e703517e1e2507b4d80cc896
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.