11import TempNode from '../core/TempNode.js' ;
2- import { addMethodChaining , nodeObject , vec4 } from '../tsl/TSLCore.js' ;
2+ import { addMethodChaining , mat3 , nodeObject , vec4 } from '../tsl/TSLCore.js' ;
33
4- import { LinearSRGBColorSpace , SRGBColorSpace } from '../../constants.js' ;
4+ import { SRGBTransfer } from '../../constants.js' ;
55import { ColorManagement } from '../../math/ColorManagement.js' ;
6+ import { sRGBTransferEOTF , sRGBTransferOETF } from './ColorSpaceFunctions.js' ;
7+ import { Matrix3 } from '../../math/Matrix3.js' ;
68
79const WORKING_COLOR_SPACE = 'WorkingColorSpace' ;
810const OUTPUT_COLOR_SPACE = 'OutputColorSpace' ;
911
10- function getColorSpaceName ( colorSpace ) {
11-
12- let method = null ;
13-
14- if ( colorSpace === LinearSRGBColorSpace ) {
15-
16- method = 'Linear' ;
17-
18- } else if ( colorSpace === SRGBColorSpace ) {
19-
20- method = 'sRGB' ;
21-
22- }
23-
24- return method ;
25-
26- }
27-
28- export function getColorSpaceMethod ( source , target ) {
29-
30- return getColorSpaceName ( source ) + 'To' + getColorSpaceName ( target ) ;
31-
32- }
33-
3412class ColorSpaceNode extends TempNode {
3513
3614 static get type ( ) {
@@ -49,7 +27,7 @@ class ColorSpaceNode extends TempNode {
4927
5028 }
5129
52- getColorSpace ( builder , colorSpace ) {
30+ resolveColorSpace ( builder , colorSpace ) {
5331
5432 if ( colorSpace === WORKING_COLOR_SPACE ) {
5533
@@ -67,29 +45,37 @@ class ColorSpaceNode extends TempNode {
6745
6846 setup ( builder ) {
6947
70- const { renderer } = builder ;
7148 const { colorNode } = this ;
7249
73- const source = this . getColorSpace ( builder , this . source ) ;
74- const target = this . getColorSpace ( builder , this . target ) ;
50+ const source = this . resolveColorSpace ( builder , this . source ) ;
51+ const target = this . resolveColorSpace ( builder , this . target ) ;
7552
76- if ( source === target ) return colorNode ;
53+ let outputNode = colorNode ;
7754
78- const colorSpace = getColorSpaceMethod ( source , target ) ;
55+ if ( ColorManagement . enabled === false || source === target || ! source || ! target ) {
7956
80- let outputNode = null ;
57+ return outputNode ;
8158
82- const colorSpaceFn = renderer . library . getColorSpaceFunction ( colorSpace ) ;
59+ }
8360
84- if ( colorSpaceFn !== null ) {
61+ if ( ColorManagement . getTransfer ( source ) === SRGBTransfer ) {
8562
86- outputNode = vec4 ( colorSpaceFn ( colorNode . rgb ) , colorNode . a ) ;
63+ outputNode = vec4 ( sRGBTransferEOTF ( outputNode . rgb ) , outputNode . a ) ;
8764
88- } else {
65+ }
8966
90- console . error ( 'ColorSpaceNode: Unsupported Color Space configuration.' , colorSpace ) ;
67+ if ( ColorManagement . getPrimaries ( source ) !== ColorManagement . getPrimaries ( target ) ) {
9168
92- outputNode = colorNode ;
69+ outputNode = vec4 (
70+ mat3 ( ColorManagement . _getMatrix ( new Matrix3 ( ) , source , target ) ) . mul ( outputNode . rgb ) ,
71+ outputNode . a
72+ ) ;
73+
74+ }
75+
76+ if ( ColorManagement . getTransfer ( target ) === SRGBTransfer ) {
77+
78+ outputNode = vec4 ( sRGBTransferOETF ( outputNode . rgb ) , outputNode . a ) ;
9379
9480 }
9581
@@ -107,6 +93,8 @@ export const toWorkingColorSpace = ( node ) => nodeObject( new ColorSpaceNode( n
10793export const workingToColorSpace = ( node , colorSpace ) => nodeObject ( new ColorSpaceNode ( nodeObject ( node ) , WORKING_COLOR_SPACE , colorSpace ) ) ;
10894export const colorSpaceToWorking = ( node , colorSpace ) => nodeObject ( new ColorSpaceNode ( nodeObject ( node ) , colorSpace , WORKING_COLOR_SPACE ) ) ;
10995
96+ export const convertColorSpace = ( node , sourceColorSpace , targetColorSpace ) => nodeObject ( new ColorSpaceNode ( nodeObject ( node ) , sourceColorSpace , targetColorSpace ) ) ;
97+
11098addMethodChaining ( 'toOutputColorSpace' , toOutputColorSpace ) ;
11199addMethodChaining ( 'toWorkingColorSpace' , toWorkingColorSpace ) ;
112100
0 commit comments