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

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