|
|
@@ -5,12 +5,13 @@ import { colorSpaceToWorking } from '../display/ColorSpaceNode.js';
|
|
|
import { expression } from '../code/ExpressionNode.js';
|
|
|
import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
|
|
|
import { nodeProxy, vec3, nodeObject, int, Fn } from '../tsl/TSLBase.js';
|
|
|
+import { step } from '../math/MathNode.js';
|
|
|
import { NodeUpdateType } from '../core/constants.js';
|
|
|
|
|
|
-import { IntType, NearestFilter, UnsignedIntType } from '../../constants.js';
|
|
|
+import { Compatibility, IntType, LessCompare, NearestFilter, UnsignedIntType } from '../../constants.js';
|
|
|
|
|
|
import { Texture } from '../../textures/Texture.js';
|
|
|
-import { warn } from '../../utils.js';
|
|
|
+import { warn, warnOnce } from '../../utils.js';
|
|
|
|
|
|
const EmptyTexture = /*@__PURE__*/ new Texture();
|
|
|
|
|
|
@@ -391,10 +392,34 @@ class TextureNode extends UniformNode {
|
|
|
|
|
|
//
|
|
|
|
|
|
+ let compareNode = null;
|
|
|
+ let compareStepNode = null;
|
|
|
+
|
|
|
+ if ( this.compareNode !== null ) {
|
|
|
+
|
|
|
+ if ( builder.renderer.hasCompatibility( Compatibility.TEXTURE_COMPARE ) ) {
|
|
|
+
|
|
|
+ compareNode = this.compareNode;
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if ( this.value.compareFunction !== null && this.value.compareFunction !== LessCompare ) {
|
|
|
+
|
|
|
+ warnOnce( 'TSL: Only "LessCompare" is supported for depth texture comparison fallback.' );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ compareStepNode = this.compareNode;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
properties.uvNode = uvNode;
|
|
|
properties.levelNode = levelNode;
|
|
|
properties.biasNode = this.biasNode;
|
|
|
- properties.compareNode = this.compareNode;
|
|
|
+ properties.compareNode = compareNode;
|
|
|
+ properties.compareStepNode = compareStepNode;
|
|
|
properties.gradNode = this.gradNode;
|
|
|
properties.depthNode = this.depthNode;
|
|
|
properties.offsetNode = this.offsetNode;
|
|
|
@@ -503,17 +528,20 @@ class TextureNode extends UniformNode {
|
|
|
|
|
|
const nodeData = builder.getDataFromNode( this );
|
|
|
|
|
|
+ const nodeType = this.getNodeType( builder );
|
|
|
+
|
|
|
let propertyName = nodeData.propertyName;
|
|
|
|
|
|
if ( propertyName === undefined ) {
|
|
|
|
|
|
- const { uvNode, levelNode, biasNode, compareNode, depthNode, gradNode, offsetNode } = properties;
|
|
|
+ const { uvNode, levelNode, biasNode, compareNode, compareStepNode, depthNode, gradNode, offsetNode } = properties;
|
|
|
|
|
|
const uvSnippet = this.generateUV( builder, uvNode );
|
|
|
const levelSnippet = levelNode ? levelNode.build( builder, 'float' ) : null;
|
|
|
const biasSnippet = biasNode ? biasNode.build( builder, 'float' ) : null;
|
|
|
const depthSnippet = depthNode ? depthNode.build( builder, 'int' ) : null;
|
|
|
const compareSnippet = compareNode ? compareNode.build( builder, 'float' ) : null;
|
|
|
+ const compareStepSnippet = compareStepNode ? compareStepNode.build( builder, 'float' ) : null;
|
|
|
const gradSnippet = gradNode ? [ gradNode[ 0 ].build( builder, 'vec2' ), gradNode[ 1 ].build( builder, 'vec2' ) ] : null;
|
|
|
const offsetSnippet = offsetNode ? this.generateOffset( builder, offsetNode ) : null;
|
|
|
|
|
|
@@ -521,7 +549,13 @@ class TextureNode extends UniformNode {
|
|
|
|
|
|
propertyName = builder.getPropertyName( nodeVar );
|
|
|
|
|
|
- const snippet = this.generateSnippet( builder, textureProperty, uvSnippet, levelSnippet, biasSnippet, depthSnippet, compareSnippet, gradSnippet, offsetSnippet );
|
|
|
+ let snippet = this.generateSnippet( builder, textureProperty, uvSnippet, levelSnippet, biasSnippet, depthSnippet, compareSnippet, gradSnippet, offsetSnippet );
|
|
|
+
|
|
|
+ if ( compareStepSnippet !== null ) {
|
|
|
+
|
|
|
+ snippet = step( expression( compareStepSnippet, 'float' ), expression( snippet, nodeType ) ).build( builder, nodeType );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
builder.addLineFlowCode( `${propertyName} = ${snippet}`, this );
|
|
|
|
|
|
@@ -531,7 +565,6 @@ class TextureNode extends UniformNode {
|
|
|
}
|
|
|
|
|
|
let snippet = propertyName;
|
|
|
- const nodeType = this.getNodeType( builder );
|
|
|
|
|
|
if ( builder.needsToWorkingColorSpace( texture ) ) {
|
|
|
|