|
|
@@ -1,36 +1,14 @@
|
|
|
import TempNode from '../core/TempNode.js';
|
|
|
-import { addMethodChaining, nodeObject, vec4 } from '../tsl/TSLCore.js';
|
|
|
+import { addMethodChaining, mat3, nodeObject, vec4 } from '../tsl/TSLCore.js';
|
|
|
|
|
|
-import { LinearSRGBColorSpace, SRGBColorSpace } from '../../constants.js';
|
|
|
+import { SRGBTransfer } from '../../constants.js';
|
|
|
import { ColorManagement } from '../../math/ColorManagement.js';
|
|
|
+import { sRGBTransferEOTF, sRGBTransferOETF } from './ColorSpaceFunctions.js';
|
|
|
+import { Matrix3 } from '../../math/Matrix3.js';
|
|
|
|
|
|
const WORKING_COLOR_SPACE = 'WorkingColorSpace';
|
|
|
const OUTPUT_COLOR_SPACE = 'OutputColorSpace';
|
|
|
|
|
|
-function getColorSpaceName( colorSpace ) {
|
|
|
-
|
|
|
- let method = null;
|
|
|
-
|
|
|
- if ( colorSpace === LinearSRGBColorSpace ) {
|
|
|
-
|
|
|
- method = 'Linear';
|
|
|
-
|
|
|
- } else if ( colorSpace === SRGBColorSpace ) {
|
|
|
-
|
|
|
- method = 'sRGB';
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- return method;
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-export function getColorSpaceMethod( source, target ) {
|
|
|
-
|
|
|
- return getColorSpaceName( source ) + 'To' + getColorSpaceName( target );
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
class ColorSpaceNode extends TempNode {
|
|
|
|
|
|
static get type() {
|
|
|
@@ -49,7 +27,7 @@ class ColorSpaceNode extends TempNode {
|
|
|
|
|
|
}
|
|
|
|
|
|
- getColorSpace( builder, colorSpace ) {
|
|
|
+ resolveColorSpace( builder, colorSpace ) {
|
|
|
|
|
|
if ( colorSpace === WORKING_COLOR_SPACE ) {
|
|
|
|
|
|
@@ -67,29 +45,37 @@ class ColorSpaceNode extends TempNode {
|
|
|
|
|
|
setup( builder ) {
|
|
|
|
|
|
- const { renderer } = builder;
|
|
|
const { colorNode } = this;
|
|
|
|
|
|
- const source = this.getColorSpace( builder, this.source );
|
|
|
- const target = this.getColorSpace( builder, this.target );
|
|
|
+ const source = this.resolveColorSpace( builder, this.source );
|
|
|
+ const target = this.resolveColorSpace( builder, this.target );
|
|
|
|
|
|
- if ( source === target ) return colorNode;
|
|
|
+ let outputNode = colorNode;
|
|
|
|
|
|
- const colorSpace = getColorSpaceMethod( source, target );
|
|
|
+ if ( ColorManagement.enabled === false || source === target || ! source || ! target ) {
|
|
|
|
|
|
- let outputNode = null;
|
|
|
+ return outputNode;
|
|
|
|
|
|
- const colorSpaceFn = renderer.library.getColorSpaceFunction( colorSpace );
|
|
|
+ }
|
|
|
|
|
|
- if ( colorSpaceFn !== null ) {
|
|
|
+ if ( ColorManagement.getTransfer( source ) === SRGBTransfer ) {
|
|
|
|
|
|
- outputNode = vec4( colorSpaceFn( colorNode.rgb ), colorNode.a );
|
|
|
+ outputNode = vec4( sRGBTransferEOTF( outputNode.rgb ), outputNode.a );
|
|
|
|
|
|
- } else {
|
|
|
+ }
|
|
|
|
|
|
- console.error( 'ColorSpaceNode: Unsupported Color Space configuration.', colorSpace );
|
|
|
+ if ( ColorManagement.getPrimaries( source ) !== ColorManagement.getPrimaries( target ) ) {
|
|
|
|
|
|
- outputNode = colorNode;
|
|
|
+ outputNode = vec4(
|
|
|
+ mat3( ColorManagement._getMatrix( new Matrix3(), source, target ) ).mul( outputNode.rgb ),
|
|
|
+ outputNode.a
|
|
|
+ );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( ColorManagement.getTransfer( target ) === SRGBTransfer ) {
|
|
|
+
|
|
|
+ outputNode = vec4( sRGBTransferOETF( outputNode.rgb ), outputNode.a );
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -107,6 +93,8 @@ export const toWorkingColorSpace = ( node ) => nodeObject( new ColorSpaceNode( n
|
|
|
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 ) );
|
|
|
|
|
|
+export const convertColorSpace = ( node, sourceColorSpace, targetColorSpace ) => nodeObject( new ColorSpaceNode( nodeObject( node ), sourceColorSpace, targetColorSpace ) );
|
|
|
+
|
|
|
addMethodChaining( 'toOutputColorSpace', toOutputColorSpace );
|
|
|
addMethodChaining( 'toWorkingColorSpace', toWorkingColorSpace );
|
|
|
|