ColorSpaceNode.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import TempNode from '../core/TempNode.js';
  2. import { mix } from '../math/MathNode.js';
  3. import { addNodeClass } from '../core/Node.js';
  4. import { addNodeElement, ShaderNode, nodeObject, vec4 } from '../shadernode/ShaderNode.js';
  5. import { LinearEncoding, LinearSRGBColorSpace, sRGBEncoding, SRGBColorSpace } from 'three';
  6. export const LinearToLinear = new ShaderNode( ( inputs ) => {
  7. return inputs.value;
  8. } );
  9. export const LinearTosRGB = new ShaderNode( ( inputs ) => {
  10. const { value } = inputs;
  11. const { rgb } = value;
  12. const a = rgb.pow( 0.41666 ).mul( 1.055 ).sub( 0.055 );
  13. const b = rgb.mul( 12.92 );
  14. const factor = rgb.lessThanEqual( 0.0031308 );
  15. const rgbResult = mix( a, b, factor );
  16. return vec4( rgbResult, value.a );
  17. } );
  18. const EncodingLib = {
  19. LinearToLinear,
  20. LinearTosRGB
  21. };
  22. class ColorSpaceNode extends TempNode {
  23. constructor( method, node ) {
  24. super( 'vec4' );
  25. this.method = method;
  26. this.node = node;
  27. }
  28. fromColorSpace( colorSpace ) {
  29. let method = null;
  30. if ( colorSpace === LinearSRGBColorSpace ) {
  31. method = 'Linear';
  32. } else if ( colorSpace === SRGBColorSpace ) {
  33. method = 'sRGB';
  34. }
  35. this.method = 'LinearTo' + method;
  36. return this;
  37. }
  38. fromEncoding( encoding ) { // @deprecated, r152
  39. console.warn( 'THREE.ColorSpaceNode: Method .fromEncoding renamed to .fromColorSpace.' );
  40. let method = null;
  41. if ( encoding === LinearEncoding ) {
  42. method = 'Linear';
  43. } else if ( encoding === sRGBEncoding ) {
  44. method = 'sRGB';
  45. }
  46. this.method = 'LinearTo' + method;
  47. return this;
  48. }
  49. construct() {
  50. const { method, node } = this;
  51. return EncodingLib[ method ].call( { value: node } );
  52. }
  53. }
  54. ColorSpaceNode.LINEAR_TO_LINEAR = 'LinearToLinear';
  55. ColorSpaceNode.LINEAR_TO_SRGB = 'LinearTosRGB';
  56. export default ColorSpaceNode;
  57. export const colorSpace = ( node, colorSpace ) => nodeObject( new ColorSpaceNode( null, nodeObject( node ) ).fromColorSpace( colorSpace ) );
  58. addNodeElement( 'colorSpace', colorSpace );
  59. addNodeClass( ColorSpaceNode );