|
@@ -1,17 +1,26 @@
|
|
import TempNode from '../core/TempNode.js';
|
|
import TempNode from '../core/TempNode.js';
|
|
import { mix } from '../math/MathNode.js';
|
|
import { mix } from '../math/MathNode.js';
|
|
import { addNodeClass } from '../core/Node.js';
|
|
import { addNodeClass } from '../core/Node.js';
|
|
-import { addNodeElement, ShaderNode, nodeObject, vec4 } from '../shadernode/ShaderNode.js';
|
|
|
|
|
|
+import { addNodeElement, ShaderNode, nodeObject, nodeProxy, vec4 } from '../shadernode/ShaderNode.js';
|
|
|
|
|
|
-import { LinearEncoding, LinearSRGBColorSpace, sRGBEncoding, SRGBColorSpace } from 'three';
|
|
|
|
|
|
+import { LinearSRGBColorSpace, SRGBColorSpace } from 'three';
|
|
|
|
|
|
-export const LinearToLinear = new ShaderNode( ( inputs ) => {
|
|
|
|
|
|
+const sRGBToLinearShader = new ShaderNode( ( inputs ) => {
|
|
|
|
|
|
- return inputs.value;
|
|
|
|
|
|
+ const { value } = inputs;
|
|
|
|
+ const { rgb } = value;
|
|
|
|
+
|
|
|
|
+ const a = rgb.mul( 0.9478672986 ).add( 0.0521327014 ).pow( 2.4 );
|
|
|
|
+ const b = rgb.mul( 0.0773993808 );
|
|
|
|
+ const factor = rgb.lessThanEqual( 0.04045 );
|
|
|
|
+
|
|
|
|
+ const rgbResult = mix( a, b, factor );
|
|
|
|
+
|
|
|
|
+ return vec4( rgbResult, value.a );
|
|
|
|
|
|
} );
|
|
} );
|
|
|
|
|
|
-export const LinearTosRGB = new ShaderNode( ( inputs ) => {
|
|
|
|
|
|
+const LinearTosRGBShader = new ShaderNode( ( inputs ) => {
|
|
|
|
|
|
const { value } = inputs;
|
|
const { value } = inputs;
|
|
const { rgb } = value;
|
|
const { rgb } = value;
|
|
@@ -26,62 +35,39 @@ export const LinearTosRGB = new ShaderNode( ( inputs ) => {
|
|
|
|
|
|
} );
|
|
} );
|
|
|
|
|
|
-const EncodingLib = {
|
|
|
|
- LinearToLinear,
|
|
|
|
- LinearTosRGB
|
|
|
|
-};
|
|
|
|
|
|
+const getColorSpaceMethod = ( colorSpace ) => {
|
|
|
|
|
|
-class ColorSpaceNode extends TempNode {
|
|
|
|
|
|
+ let method = null;
|
|
|
|
|
|
- constructor( method, node ) {
|
|
|
|
|
|
+ if ( colorSpace === LinearSRGBColorSpace ) {
|
|
|
|
|
|
- super( 'vec4' );
|
|
|
|
|
|
+ method = 'Linear';
|
|
|
|
|
|
- this.method = method;
|
|
|
|
|
|
+ } else if ( colorSpace === SRGBColorSpace ) {
|
|
|
|
|
|
- this.node = node;
|
|
|
|
|
|
+ method = 'sRGB';
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- fromColorSpace( colorSpace ) {
|
|
|
|
-
|
|
|
|
- let method = null;
|
|
|
|
-
|
|
|
|
- if ( colorSpace === LinearSRGBColorSpace ) {
|
|
|
|
-
|
|
|
|
- method = 'Linear';
|
|
|
|
-
|
|
|
|
- } else if ( colorSpace === SRGBColorSpace ) {
|
|
|
|
-
|
|
|
|
- method = 'sRGB';
|
|
|
|
|
|
+ return method;
|
|
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- this.method = 'LinearTo' + method;
|
|
|
|
-
|
|
|
|
- return this;
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- fromEncoding( encoding ) { // @deprecated, r152
|
|
|
|
-
|
|
|
|
- console.warn( 'THREE.ColorSpaceNode: Method .fromEncoding renamed to .fromColorSpace.' );
|
|
|
|
|
|
+};
|
|
|
|
|
|
- let method = null;
|
|
|
|
|
|
+const getMethod = ( source, target ) => {
|
|
|
|
|
|
- if ( encoding === LinearEncoding ) {
|
|
|
|
|
|
+ return getColorSpaceMethod( source ) + 'To' + getColorSpaceMethod( target );
|
|
|
|
|
|
- method = 'Linear';
|
|
|
|
|
|
+};
|
|
|
|
|
|
- } else if ( encoding === sRGBEncoding ) {
|
|
|
|
|
|
+class ColorSpaceNode extends TempNode {
|
|
|
|
|
|
- method = 'sRGB';
|
|
|
|
|
|
+ constructor( method, node ) {
|
|
|
|
|
|
- }
|
|
|
|
|
|
+ super( 'vec4' );
|
|
|
|
|
|
- this.method = 'LinearTo' + method;
|
|
|
|
|
|
+ this.method = method;
|
|
|
|
|
|
- return this;
|
|
|
|
|
|
+ this.node = node;
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -89,19 +75,35 @@ class ColorSpaceNode extends TempNode {
|
|
|
|
|
|
const { method, node } = this;
|
|
const { method, node } = this;
|
|
|
|
|
|
- return EncodingLib[ method ].call( { value: node } );
|
|
|
|
|
|
+ if ( method === ColorSpaceNode.LINEAR_TO_LINEAR )
|
|
|
|
+ return node;
|
|
|
|
+
|
|
|
|
+ return Methods[ method ].call( { value: node } );
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
ColorSpaceNode.LINEAR_TO_LINEAR = 'LinearToLinear';
|
|
ColorSpaceNode.LINEAR_TO_LINEAR = 'LinearToLinear';
|
|
-ColorSpaceNode.LINEAR_TO_SRGB = 'LinearTosRGB';
|
|
|
|
|
|
+ColorSpaceNode.LINEAR_TO_sRGB = 'LinearTosRGB';
|
|
|
|
+ColorSpaceNode.sRGB_TO_LINEAR = 'sRGBToLinear';
|
|
|
|
+
|
|
|
|
+const Methods = {
|
|
|
|
+ [ ColorSpaceNode.LINEAR_TO_sRGB ]: LinearTosRGBShader,
|
|
|
|
+ [ ColorSpaceNode.sRGB_TO_LINEAR ]: sRGBToLinearShader
|
|
|
|
+};
|
|
|
|
|
|
export default ColorSpaceNode;
|
|
export default ColorSpaceNode;
|
|
|
|
|
|
-export const colorSpace = ( node, colorSpace ) => nodeObject( new ColorSpaceNode( null, nodeObject( node ) ).fromColorSpace( colorSpace ) );
|
|
|
|
|
|
+export const linearToColorSpace = ( node, colorSpace ) => nodeObject( new ColorSpaceNode( getMethod( LinearSRGBColorSpace, colorSpace ), nodeObject( node ) ) );
|
|
|
|
+export const colorSpaceToLinear = ( node, colorSpace ) => nodeObject( new ColorSpaceNode( getMethod( colorSpace, LinearSRGBColorSpace ), nodeObject( node ) ) );
|
|
|
|
+
|
|
|
|
+export const linearTosRGB = nodeProxy( ColorSpaceNode, ColorSpaceNode.LINEAR_TO_sRGB );
|
|
|
|
+export const sRGBToLinear = nodeProxy( ColorSpaceNode, ColorSpaceNode.sRGB_TO_LINEAR );
|
|
|
|
|
|
-addNodeElement( 'colorSpace', colorSpace );
|
|
|
|
|
|
+addNodeElement( 'linearTosRGB', linearTosRGB );
|
|
|
|
+addNodeElement( 'sRGBToLinear', sRGBToLinear );
|
|
|
|
+addNodeElement( 'linearToColorSpace', linearToColorSpace );
|
|
|
|
+addNodeElement( 'colorSpaceToLinear', colorSpaceToLinear );
|
|
|
|
|
|
addNodeClass( ColorSpaceNode );
|
|
addNodeClass( ColorSpaceNode );
|