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

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