95 lines
1.7 KiB
JavaScript
95 lines
1.7 KiB
JavaScript
import TempNode from '../core/Node.js';
|
|
import ShaderNode from '../shadernode/ShaderNode.js';
|
|
import { vec3, pow, mul, sub, mix, join, lessThanEqual } from '../shadernode/ShaderNodeElements.js';
|
|
|
|
import { LinearEncoding, sRGBEncoding } from 'three';
|
|
|
|
export const LinearToLinear = new ShaderNode( ( inputs ) => {
|
|
|
|
return inputs.value;
|
|
|
|
} );
|
|
|
|
export const LinearTosRGB = new ShaderNode( ( inputs ) => {
|
|
|
|
const { value } = inputs;
|
|
|
|
const rgb = value.rgb;
|
|
|
|
const a = sub( mul( pow( value.rgb, vec3( 0.41666 ) ), 1.055 ), vec3( 0.055 ) );
|
|
const b = mul( rgb, 12.92 );
|
|
const factor = vec3( lessThanEqual( rgb, vec3( 0.0031308 ) ) );
|
|
|
|
const rgbResult = mix( a, b, factor );
|
|
|
|
return join( rgbResult.r, rgbResult.g, rgbResult.b, value.a );
|
|
|
|
} );
|
|
|
|
const EncodingLib = {
|
|
LinearToLinear,
|
|
LinearTosRGB
|
|
};
|
|
|
|
class ColorSpaceNode extends TempNode {
|
|
|
|
static LINEAR_TO_LINEAR = 'LinearToLinear';
|
|
static LINEAR_TO_SRGB = 'LinearTosRGB';
|
|
|
|
constructor( method, node ) {
|
|
|
|
super( 'vec4' );
|
|
|
|
this.method = method;
|
|
|
|
this.node = node;
|
|
|
|
}
|
|
|
|
fromEncoding( encoding ) {
|
|
|
|
let method = null;
|
|
|
|
if ( encoding === LinearEncoding ) {
|
|
|
|
method = 'Linear';
|
|
|
|
} else if ( encoding === sRGBEncoding ) {
|
|
|
|
method = 'sRGB';
|
|
|
|
}
|
|
|
|
this.method = 'LinearTo' + method;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
generate( builder ) {
|
|
|
|
const type = this.getNodeType( builder );
|
|
|
|
const method = this.method;
|
|
const node = this.node;
|
|
|
|
if ( method !== ColorSpaceNode.LINEAR_TO_LINEAR ) {
|
|
|
|
const encodingFunctionNode = EncodingLib[ method ];
|
|
|
|
return encodingFunctionNode( {
|
|
value: node
|
|
} ).build( builder, type );
|
|
|
|
} else {
|
|
|
|
return node.build( builder, type );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
export default ColorSpaceNode;
|