diff --git a/src/nodes/accessors/TextureNode.js b/src/nodes/accessors/TextureNode.js index eca2e9a21aa495..8ae8942abadfae 100644 --- a/src/nodes/accessors/TextureNode.js +++ b/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 ); } diff --git a/src/nodes/display/ColorSpaceNode.js b/src/nodes/display/ColorSpaceNode.js index 25eea997f2be8d..bba80648b6aada 100644 --- a/src/nodes/display/ColorSpaceNode.js +++ b/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 ); diff --git a/src/nodes/display/RenderOutputNode.js b/src/nodes/display/RenderOutputNode.js index 2ee9e01a1da265..811dd947139a58 100644 --- a/src/nodes/display/RenderOutputNode.js +++ b/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 ); }