Explorar el Código

ReflectNode: Fix and improve (#24265)

* remove ReflectNode params

* move flip reflect to CubeTextureNode

* cleanup

* rename ReflectNode to ReflectVectorNode
sunag hace 3 años
padre
commit
1bf474b031

+ 3 - 3
examples/jsm/nodes/Nodes.js

@@ -39,7 +39,7 @@ import Object3DNode from './accessors/Object3DNode.js';
 import PointUVNode from './accessors/PointUVNode.js';
 import PositionNode from './accessors/PositionNode.js';
 import ReferenceNode from './accessors/ReferenceNode.js';
-import ReflectNode from './accessors/ReflectNode.js';
+import ReflectVectorNode from './accessors/ReflectVectorNode.js';
 import SkinningNode from './accessors/SkinningNode.js';
 import TextureNode from './accessors/TextureNode.js';
 import UVNode from './accessors/UVNode.js';
@@ -153,7 +153,7 @@ const nodeLib = {
 	PointUVNode,
 	PositionNode,
 	ReferenceNode,
-	ReflectNode,
+	ReflectVectorNode,
 	SkinningNode,
 	TextureNode,
 	UVNode,
@@ -260,7 +260,7 @@ export {
 	PointUVNode,
 	PositionNode,
 	ReferenceNode,
-	ReflectNode,
+	ReflectVectorNode,
 	SkinningNode,
 	TextureNode,
 	UVNode,

+ 7 - 3
examples/jsm/nodes/accessors/CubeTextureNode.js

@@ -1,6 +1,8 @@
 import TextureNode from './TextureNode.js';
 import UniformNode from '../core/UniformNode.js';
-import ReflectNode from './ReflectNode.js';
+import ReflectVectorNode from './ReflectVectorNode.js';
+
+import { negate, vec3, nodeObject } from '../shadernode/ShaderNodeBaseElements.js';
 
 class CubeTextureNode extends TextureNode {
 
@@ -28,7 +30,7 @@ class CubeTextureNode extends TextureNode {
 
 		const properties = builder.getNodeProperties( this );
 
-		const uvNode = this.uvNode || builder.context.uvNode || new ReflectNode();
+		const uvNode = this.uvNode || builder.context.uvNode || new ReflectVectorNode();
 		let levelNode = this.levelNode || builder.context.levelNode;
 
 		if ( levelNode?.isNode === true ) {
@@ -74,7 +76,9 @@ class CubeTextureNode extends TextureNode {
 
 			if ( snippet === undefined || builder.context.tempRead === false ) {
 
-				const uvSnippet = uvNode.build( builder, 'vec3' );
+				const uvNodeObject = nodeObject( uvNode );
+				const cubeUV = vec3( negate( uvNodeObject.x ), uvNodeObject.yz );
+				const uvSnippet = cubeUV.build( builder, 'vec3' );
 
 				if ( levelNode ) {
 

+ 0 - 70
examples/jsm/nodes/accessors/ReflectNode.js

@@ -1,70 +0,0 @@
-import Node from '../core/Node.js';
-import {
-	nodeObject, transformedNormalView, positionViewDirection,
-	transformDirection, negate, reflect, vec3, cameraViewMatrix
-} from '../shadernode/ShaderNodeBaseElements.js';
-
-class ReflectNode extends Node {
-
-	static VECTOR = 'vector';
-	static CUBE = 'cube';
-
-	constructor( scope = ReflectNode.CUBE ) {
-
-		super( 'vec3' );
-
-		this.scope = scope;
-
-	}
-
-	getHash( /*builder*/ ) {
-
-		return `reflect-${this.scope}`;
-
-	}
-
-	construct() {
-
-		const scope = this.scope;
-
-		let outputNode = null;
-
-		if ( scope === ReflectNode.VECTOR ) {
-
-			const reflectView = reflect( negate( positionViewDirection ), transformedNormalView );
-			const reflectVec = transformDirection( reflectView, cameraViewMatrix );
-
-			outputNode = reflectVec;
-
-		} else if ( scope === ReflectNode.CUBE ) {
-
-			const reflectVec = nodeObject( new ReflectNode( ReflectNode.VECTOR ) );
-			const cubeUV = vec3( negate( reflectVec.x ), reflectVec.yz );
-
-			outputNode = cubeUV;
-
-		}
-
-		return outputNode;
-
-	}
-
-	serialize( data ) {
-
-		super.serialize( data );
-
-		data.scope = this.scope;
-
-	}
-
-	deserialize( data ) {
-
-		super.deserialize( data );
-
-		this.scope = data.scope;
-
-	}
-
-}
-
-export default ReflectNode;

+ 31 - 0
examples/jsm/nodes/accessors/ReflectVectorNode.js

@@ -0,0 +1,31 @@
+import Node from '../core/Node.js';
+import {
+	transformedNormalView, positionViewDirection,
+	transformDirection, negate, reflect, cameraViewMatrix
+} from '../shadernode/ShaderNodeBaseElements.js';
+
+class ReflectVectorNode extends Node {
+
+	constructor() {
+
+		super( 'vec3' );
+
+	}
+
+	getHash( /*builder*/ ) {
+
+		return `reflectVector`;
+
+	}
+
+	construct() {
+
+		const reflectView = reflect( negate( positionViewDirection ), transformedNormalView );
+
+		return transformDirection( reflectView, cameraViewMatrix );
+
+	}
+
+}
+
+export default ReflectVectorNode;

+ 2 - 5
examples/jsm/nodes/lighting/EnvironmentNode.js

@@ -1,7 +1,7 @@
 import LightingNode from './LightingNode.js';
 import ContextNode from '../core/ContextNode.js';
 import MaxMipLevelNode from '../utils/MaxMipLevelNode.js';
-import { ShaderNode, float, add, mul, div, log2, clamp, roughness, reflect, mix, vec3, positionViewDirection, negate, normalize, transformedNormalView, transformedNormalWorld, transformDirection, cameraViewMatrix } from '../shadernode/ShaderNodeElements.js';
+import { ShaderNode, float, add, mul, div, log2, clamp, roughness, reflect, mix, positionViewDirection, negate, normalize, transformedNormalView, transformedNormalWorld, transformDirection, cameraViewMatrix } from '../shadernode/ShaderNodeElements.js';
 
 // taken from here: http://casual-effects.blogspot.ca/2011/08/plausible-environment-lighting-in-two.html
 const getSpecularMIPLevel = new ShaderNode( ( { texture, levelNode } ) => {
@@ -30,12 +30,9 @@ class EnvironmentNode extends LightingNode {
 		const envNode = this.envNode;
 		const properties = builder.getNodeProperties( this );
 
-		const flipNormalWorld = vec3( negate( transformedNormalWorld.x ), transformedNormalWorld.yz );
-
 		let reflectVec = reflect( negate( positionViewDirection ), transformedNormalView );
 		reflectVec = normalize( mix( reflectVec, transformedNormalView, mul( roughness, roughness ) ) );
 		reflectVec = transformDirection( reflectVec, cameraViewMatrix );
-		reflectVec = vec3( negate( reflectVec.x ), reflectVec.yz );
 
 		const radianceContext = new ContextNode( envNode, {
 			tempRead: false,
@@ -46,7 +43,7 @@ class EnvironmentNode extends LightingNode {
 
 		const irradianceContext = new ContextNode( envNode, {
 			tempRead: false,
-			uvNode: flipNormalWorld,
+			uvNode: transformedNormalWorld,
 			levelNode: float( 1 ),
 			levelShaderNode: getSpecularMIPLevel
 		} );

+ 2 - 3
examples/jsm/nodes/shadernode/ShaderNodeElements.js

@@ -1,7 +1,7 @@
 // accessors
 import CubeTextureNode from '../accessors/CubeTextureNode.js';
 import InstanceNode from '../accessors/InstanceNode.js';
-import ReflectNode from '../accessors/ReflectNode.js';
+import ReflectVectorNode from '../accessors/ReflectVectorNode.js';
 import SkinningNode from '../accessors/SkinningNode.js';
 
 // display
@@ -65,8 +65,7 @@ export const cubeTexture = nodeProxy( CubeTextureNode );
 
 export const instance = nodeProxy( InstanceNode );
 
-export const reflectVector = nodeImmutable( ReflectNode, ReflectNode.VECTOR );
-export const reflectCube = nodeImmutable( ReflectNode, ReflectNode.CUBE );
+export const reflectVector = nodeImmutable( ReflectVectorNode );
 
 export const skinning = nodeProxy( SkinningNode );
 

+ 2 - 2
examples/webgpu_cubemap_adjustments.html

@@ -32,7 +32,7 @@
 			import * as THREE from 'three';
 			import * as Nodes from 'three-nodes/Nodes.js';
 
-			import { uniform, mix, cubeTexture, mul, reference, add, positionWorld, normalWorld, modelWorldMatrix, transformDirection, saturate, saturation, hue, reflectCube, context } from 'three-nodes/Nodes.js';
+			import { uniform, mix, cubeTexture, mul, reference, add, positionWorld, normalWorld, modelWorldMatrix, transformDirection, saturate, saturation, hue, reflectVector, context } from 'three-nodes/Nodes.js';
 
 			import WebGPU from './jsm/capabilities/WebGPU.js';
 			import WebGPURenderer from './jsm/renderers/webgpu/WebGPURenderer.js';
@@ -122,7 +122,7 @@
 
 				const blurNode = uniform( 0 );
 
-				scene.environmentNode = getEnvironmentNode( reflectCube );
+				scene.environmentNode = getEnvironmentNode( reflectVector );
 
 				scene.backgroundNode = context( getEnvironmentNode( transformDirection( positionWorld, modelWorldMatrix ) ), {
 					levelNode : blurNode // @TODO: currently it uses mipmaps value, I think it should be replaced for [0,1]