فهرست منبع

TSL: Add `workingToColorSpace`, `colorSpaceToWorking` (#29378)

* add `workingToColorSpace`, `colorSpaceToWorking`

* Update TextureNode.js

* Update RenderOutputNode.js

* Update RenderOutputNode.js

* update

* Update ColorSpaceNode.js
sunag 1 سال پیش
والد
کامیت
ee17decaed
3فایلهای تغییر یافته به همراه46 افزوده شده و 19 حذف شده
  1. 2 2
      src/nodes/accessors/TextureNode.js
  2. 38 12
      src/nodes/display/ColorSpaceNode.js
  3. 6 5
      src/nodes/display/RenderOutputNode.js

+ 2 - 2
src/nodes/accessors/TextureNode.js

@@ -1,7 +1,7 @@
 import UniformNode, { uniform } from '../core/UniformNode.js';
 import { uv } from './UV.js';
 import { textureSize } from './TextureSizeNode.js';
-import { toWorkingColorSpace } from '../display/ColorSpaceNode.js';
+import { colorSpaceToWorking } from '../display/ColorSpaceNode.js';
 import { expression } from '../code/ExpressionNode.js';
 import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
 import { nodeProxy, vec3, nodeObject } from '../tsl/TSLBase.js';
@@ -281,7 +281,7 @@ class TextureNode extends UniformNode {
 
 			if ( builder.needsToWorkingColorSpace( texture ) ) {
 
-				snippet = toWorkingColorSpace( expression( snippet, nodeType ), texture.colorSpace ).setup( builder ).build( builder, nodeType );
+				snippet = colorSpaceToWorking( expression( snippet, nodeType ), texture.colorSpace ).setup( builder ).build( builder, nodeType );
 
 			}
 

+ 38 - 12
src/nodes/display/ColorSpaceNode.js

@@ -2,8 +2,12 @@ import TempNode from '../core/TempNode.js';
 import { addMethodChaining, nodeObject, vec4 } from '../tsl/TSLCore.js';
 
 import { LinearSRGBColorSpace, SRGBColorSpace } from '../../constants.js';
+import { ColorManagement } from '../../math/ColorManagement.js';
 
-const getColorSpaceName = ( colorSpace ) => {
+const WORKING_COLOR_SPACE = 'WorkingColorSpace';
+const OUTPUT_COLOR_SPACE = 'OutputColorSpace';
+
+function getColorSpaceName( colorSpace ) {
 
 	let method = null;
 
@@ -19,13 +23,13 @@ const getColorSpaceName = ( colorSpace ) => {
 
 	return method;
 
-};
+}
 
-export const getColorSpaceMethod = ( source, target ) => {
+export function getColorSpaceMethod( source, target ) {
 
 	return getColorSpaceName( source ) + 'To' + getColorSpaceName( target );
 
-};
+}
 
 class ColorSpaceNode extends TempNode {
 
@@ -35,23 +39,39 @@ class ColorSpaceNode extends TempNode {
 
 	}
 
-	constructor( colorNode, target = null, source = null ) {
+	constructor( colorNode, source, target ) {
 
 		super( 'vec4' );
 
 		this.colorNode = colorNode;
-		this.target = target;
 		this.source = source;
+		this.target = target;
+
+	}
+
+	getColorSpace( builder, colorSpace ) {
+
+		if ( colorSpace === WORKING_COLOR_SPACE ) {
+
+			return ColorManagement.workingColorSpace;
+
+		} else if ( colorSpace === OUTPUT_COLOR_SPACE ) {
+
+			return builder.context.outputColorSpace || builder.renderer.outputColorSpace;
+
+		}
+
+		return colorSpace;
 
 	}
 
 	setup( builder ) {
 
-		const { renderer, context } = builder;
+		const { renderer } = builder;
+		const { colorNode } = this;
 
-		const source = this.source || context.outputColorSpace || renderer.outputColorSpace;
-		const target = this.target || context.outputColorSpace || renderer.outputColorSpace;
-		const colorNode = this.colorNode;
+		const source = this.getColorSpace( builder, this.source );
+		const target = this.getColorSpace( builder, this.target );
 
 		if ( source === target ) return colorNode;
 
@@ -81,8 +101,14 @@ class ColorSpaceNode extends TempNode {
 
 export default ColorSpaceNode;
 
-export const toOutputColorSpace = ( node, colorSpace = null ) => nodeObject( new ColorSpaceNode( nodeObject( node ), colorSpace, LinearSRGBColorSpace ) );
-export const toWorkingColorSpace = ( node, colorSpace = null ) => nodeObject( new ColorSpaceNode( nodeObject( node ), LinearSRGBColorSpace, colorSpace ) );
+export const toOutputColorSpace = ( node ) => nodeObject( new ColorSpaceNode( nodeObject( node ), WORKING_COLOR_SPACE, OUTPUT_COLOR_SPACE ) );
+export const toWorkingColorSpace = ( node ) => nodeObject( new ColorSpaceNode( nodeObject( node ), OUTPUT_COLOR_SPACE, WORKING_COLOR_SPACE ) );
+
+export const workingToColorSpace = ( node, colorSpace ) => nodeObject( new ColorSpaceNode( nodeObject( node ), WORKING_COLOR_SPACE, colorSpace ) );
+export const colorSpaceToWorking = ( node, colorSpace ) => nodeObject( new ColorSpaceNode( nodeObject( node ), colorSpace, WORKING_COLOR_SPACE ) );
 
 addMethodChaining( 'toOutputColorSpace', toOutputColorSpace );
 addMethodChaining( 'toWorkingColorSpace', toWorkingColorSpace );
+
+addMethodChaining( 'workingToColorSpace', workingToColorSpace );
+addMethodChaining( 'colorSpaceToWorking', colorSpaceToWorking );

+ 6 - 5
src/nodes/display/RenderOutputNode.js

@@ -1,7 +1,8 @@
 import TempNode from '../core/TempNode.js';
 import { addMethodChaining, nodeObject } from '../tsl/TSLCore.js';
 
-import { LinearSRGBColorSpace, SRGBColorSpace, NoToneMapping } from '../../constants.js';
+import { NoColorSpace, NoToneMapping } from '../../constants.js';
+import { ColorManagement } from '../../math/ColorManagement.js';
 
 class RenderOutputNode extends TempNode {
 
@@ -30,7 +31,7 @@ class RenderOutputNode extends TempNode {
 		// tone mapping
 
 		const toneMapping = ( this.toneMapping !== null ? this.toneMapping : context.toneMapping ) || NoToneMapping;
-		const outputColorSpace = ( this.outputColorSpace !== null ? this.outputColorSpace : context.outputColorSpace ) || LinearSRGBColorSpace;
+		const outputColorSpace = ( this.outputColorSpace !== null ? this.outputColorSpace : context.outputColorSpace ) || NoColorSpace;
 
 		if ( toneMapping !== NoToneMapping ) {
 
@@ -38,11 +39,11 @@ class RenderOutputNode extends TempNode {
 
 		}
 
-		// output color space
+		// working to output color space
 
-		if ( outputColorSpace === SRGBColorSpace ) {
+		if ( outputColorSpace !== NoColorSpace && outputColorSpace !== ColorManagement.workingColorSpace ) {
 
-			outputNode = outputNode.toOutputColorSpace( outputColorSpace );
+			outputNode = outputNode.workingToColorSpace( outputColorSpace );
 
 		}
 

粤ICP备19079148号