threejs-post-processing-3dlut.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. {
  2. class Waiter {
  3. constructor() {
  4. this.promise = new Promise( ( resolve ) => {
  5. this.resolve = resolve;
  6. } );
  7. }
  8. }
  9. async function getSVGDocument( elem ) {
  10. const data = elem.data;
  11. elem.data = '';
  12. elem.data = data;
  13. const waiter = new Waiter();
  14. elem.addEventListener( 'load', waiter.resolve );
  15. await waiter.promise;
  16. return elem.getSVGDocument();
  17. }
  18. const diagrams = {
  19. lookup: {
  20. async init( elem ) {
  21. const svg = await getSVGDocument( elem );
  22. const partsByName = {};
  23. [
  24. '[id$=-Input]',
  25. '[id$=-Output]',
  26. '[id$=-Result]',
  27. ].forEach( ( selector ) => {
  28. [ ...svg.querySelectorAll( '[id^=Effect]' ) ].forEach( ( elem ) => {
  29. // because affinity designer doesn't export blend modes (T_T)
  30. // and because I'd prefer not to have to manually fix things as I edit.
  31. // I suppose I could add a build process.
  32. elem.style.mixBlendMode = elem.id.split( '-' )[ 1 ];
  33. } );
  34. [ ...svg.querySelectorAll( selector ) ].forEach( ( elem ) => {
  35. const [ name, type ] = elem.id.split( '-' );
  36. partsByName[ name ] = partsByName[ name ] || {};
  37. partsByName[ name ][ type ] = elem;
  38. elem.style.visibility = 'hidden';
  39. } );
  40. } );
  41. const parts = Object.keys( partsByName ).sort().map( k => partsByName[ k ] );
  42. let ndx = 0;
  43. let step = 0;
  44. let delay = 0;
  45. setInterval( () => {
  46. const part = parts[ ndx ];
  47. switch ( step ) {
  48. case 0:
  49. part.Input.style.visibility = '';
  50. ++ step;
  51. break;
  52. case 1:
  53. part.Output.style.visibility = '';
  54. ++ step;
  55. break;
  56. case 2:
  57. part.Result.style.visibility = '';
  58. ++ step;
  59. break;
  60. case 3:
  61. part.Input.style.visibility = 'hidden';
  62. part.Output.style.visibility = 'hidden';
  63. ndx = ( ndx + 1 ) % parts.length;
  64. if ( ndx === 0 ) {
  65. step = 4;
  66. delay = 4;
  67. } else {
  68. step = 0;
  69. }
  70. break;
  71. case 4:
  72. -- delay;
  73. if ( delay <= 0 ) {
  74. for ( const part of parts ) {
  75. for ( const elem of Object.values( part ) ) {
  76. elem.style.visibility = 'hidden';
  77. }
  78. }
  79. step = 0;
  80. }
  81. break;
  82. }
  83. }, 500 );
  84. },
  85. },
  86. };
  87. [ ...document.querySelectorAll( '[data-diagram]' ) ].forEach( createDiagram );
  88. function createDiagram( base ) {
  89. const name = base.dataset.diagram;
  90. const info = diagrams[ name ];
  91. if ( ! info ) {
  92. throw new Error( `no diagram ${name}` );
  93. }
  94. info.init( base );
  95. }
  96. }