cubing 0.31.6 → 0.31.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/esm/.DS_Store +0 -0
  2. package/dist/esm/alg/index.js +1 -1
  3. package/dist/esm/bluetooth/index.js +5 -5
  4. package/dist/esm/bluetooth/index.js.map +2 -2
  5. package/dist/esm/{chunk-NIDW7PCY.js → chunk-2EYZN4E3.js} +7 -7
  6. package/dist/esm/{chunk-NIDW7PCY.js.map → chunk-2EYZN4E3.js.map} +0 -0
  7. package/dist/esm/{chunk-6CRQ3Z75.js → chunk-ASTDBI25.js} +3 -3
  8. package/dist/esm/chunk-ASTDBI25.js.map +7 -0
  9. package/dist/esm/{chunk-LGJ4AXVG.js → chunk-AUF56UEH.js} +2 -2
  10. package/dist/esm/{chunk-LGJ4AXVG.js.map → chunk-AUF56UEH.js.map} +0 -0
  11. package/dist/esm/{chunk-YM4RYQQM.js → chunk-CQII4VKQ.js} +3 -3
  12. package/dist/esm/{chunk-YM4RYQQM.js.map → chunk-CQII4VKQ.js.map} +0 -0
  13. package/dist/esm/{chunk-K6RENDGG.js → chunk-H5Q6ZTRP.js} +4 -4
  14. package/dist/esm/{chunk-K6RENDGG.js.map → chunk-H5Q6ZTRP.js.map} +0 -0
  15. package/dist/esm/{chunk-23PDUZN6.js → chunk-IJP4IAGZ.js} +1 -1
  16. package/dist/esm/chunk-IJP4IAGZ.js.map +7 -0
  17. package/dist/esm/{chunk-Z4UAFYMU.js → chunk-NOAOLQ25.js} +2 -2
  18. package/dist/esm/{chunk-Z4UAFYMU.js.map → chunk-NOAOLQ25.js.map} +0 -0
  19. package/dist/esm/{chunk-KSPS7U45.js → chunk-OGXWZ6ER.js} +2 -2
  20. package/dist/esm/{chunk-KSPS7U45.js.map → chunk-OGXWZ6ER.js.map} +0 -0
  21. package/dist/esm/{chunk-YVIUZYDL.js → chunk-SPJL6GKQ.js} +10 -354
  22. package/dist/esm/chunk-SPJL6GKQ.js.map +7 -0
  23. package/dist/esm/{chunk-TUETQPSZ.js → chunk-W6D5GKZQ.js} +478 -56
  24. package/dist/esm/chunk-W6D5GKZQ.js.map +7 -0
  25. package/dist/esm/kpuzzle/index.js +2 -2
  26. package/dist/esm/notation/index.js +2 -2
  27. package/dist/esm/protocol/index.js +4 -4
  28. package/dist/esm/puzzle-geometry/index.js +1 -1
  29. package/dist/esm/puzzle-geometry/index.js.map +2 -2
  30. package/dist/esm/puzzles/index.js +4 -4
  31. package/dist/esm/scramble/index.js +2 -2
  32. package/dist/esm/search/index.js +6 -7
  33. package/dist/esm/{search-dynamic-sgs-side-events-LNK5H654.js → search-dynamic-sgs-side-events-LDZZKKJE.js} +6 -6
  34. package/dist/esm/{search-dynamic-sgs-side-events-LNK5H654.js.map → search-dynamic-sgs-side-events-LDZZKKJE.js.map} +0 -0
  35. package/dist/esm/{search-dynamic-sgs-unofficial-V6KHVP33.js → search-dynamic-sgs-unofficial-LB26IV7B.js} +6 -6
  36. package/dist/esm/{search-dynamic-sgs-unofficial-V6KHVP33.js.map → search-dynamic-sgs-unofficial-LB26IV7B.js.map} +0 -0
  37. package/dist/esm/{search-dynamic-solve-4x4x4-OGUGCJII.js → search-dynamic-solve-4x4x4-IIOB4BKQ.js} +6 -7
  38. package/dist/esm/{search-dynamic-solve-4x4x4-OGUGCJII.js.map → search-dynamic-solve-4x4x4-IIOB4BKQ.js.map} +1 -1
  39. package/dist/esm/{search-dynamic-solve-kilominx-NGTYP5YN.js → search-dynamic-solve-kilominx-KOBSWYM6.js} +2 -2
  40. package/dist/esm/{search-dynamic-solve-kilominx-NGTYP5YN.js.map → search-dynamic-solve-kilominx-KOBSWYM6.js.map} +0 -0
  41. package/dist/esm/{search-worker-inside-generated-string-PM5MPECU.js → search-worker-inside-generated-string-5LNQXZJU.js} +29 -29
  42. package/dist/esm/search-worker-inside-generated-string-5LNQXZJU.js.map +7 -0
  43. package/dist/esm/{search-worker-js-entry-BLPSRSPB.js → search-worker-js-entry-5CNMPBYP.js} +14 -15
  44. package/dist/esm/{search-worker-js-entry-BLPSRSPB.js.map → search-worker-js-entry-5CNMPBYP.js.map} +1 -1
  45. package/dist/esm/{search-worker-ts-entry-63LKRWMR.js → search-worker-ts-entry-WM7R5RWW.js} +2 -2
  46. package/dist/esm/{search-worker-ts-entry-63LKRWMR.js.map → search-worker-ts-entry-WM7R5RWW.js.map} +0 -0
  47. package/dist/esm/stream/index.js +1 -1
  48. package/dist/esm/twisty/index.js +40 -13
  49. package/dist/esm/twisty/index.js.map +3 -3
  50. package/dist/esm/{twisty-dynamic-3d-K4BNTWDJ.js → twisty-dynamic-3d-Q54GMZJG.js} +41 -29
  51. package/dist/esm/twisty-dynamic-3d-Q54GMZJG.js.map +7 -0
  52. package/dist/types/{TwizzleLink-4d656916.d.ts → TwizzleLink-b28e5d4f.d.ts} +36 -23
  53. package/dist/types/puzzles/index.d.ts +2 -2
  54. package/dist/types/twisty/index.d.ts +2 -2
  55. package/package.json +1 -1
  56. package/dist/esm/chunk-23PDUZN6.js.map +0 -7
  57. package/dist/esm/chunk-6CRQ3Z75.js.map +0 -7
  58. package/dist/esm/chunk-QHWK5RXN.js +0 -42
  59. package/dist/esm/chunk-QHWK5RXN.js.map +0 -7
  60. package/dist/esm/chunk-TUETQPSZ.js.map +0 -7
  61. package/dist/esm/chunk-YVIUZYDL.js.map +0 -7
  62. package/dist/esm/search-worker-inside-generated-string-PM5MPECU.js.map +0 -7
  63. package/dist/esm/twisty-dynamic-3d-K4BNTWDJ.js.map +0 -7
@@ -3,18 +3,17 @@ import {
3
3
  THREEJS,
4
4
  haveStartedSharingRenderers,
5
5
  hintFaceletStyles
6
- } from "./chunk-6CRQ3Z75.js";
7
- import "./chunk-QHWK5RXN.js";
6
+ } from "./chunk-ASTDBI25.js";
8
7
  import {
9
8
  cube3x3x3
10
- } from "./chunk-YVIUZYDL.js";
9
+ } from "./chunk-SPJL6GKQ.js";
11
10
  import {
12
11
  getFaceletStickeringMask
13
- } from "./chunk-TUETQPSZ.js";
14
- import "./chunk-LGJ4AXVG.js";
12
+ } from "./chunk-W6D5GKZQ.js";
13
+ import "./chunk-AUF56UEH.js";
15
14
  import {
16
15
  Move
17
- } from "./chunk-23PDUZN6.js";
16
+ } from "./chunk-IJP4IAGZ.js";
18
17
 
19
18
  // src/cubing/twisty/views/3D/puzzles/Cube3D.ts
20
19
  import {
@@ -193,7 +192,6 @@ var familyToAxis = {
193
192
  E: face.D
194
193
  };
195
194
  var cubieDimensions = {
196
- stickerWidth: 0.85,
197
195
  stickerElevation: 0.503,
198
196
  foundationWidth: 1,
199
197
  hintStickerElevation: 1.45
@@ -206,8 +204,16 @@ var cube3DOptionsDefaults = {
206
204
  experimentalStickeringMask: void 0,
207
205
  foundationSprite: null,
208
206
  hintSprite: null,
209
- initialHintFaceletsAnimation: "auto"
207
+ initialHintFaceletsAnimation: "auto",
208
+ faceletScale: "auto"
210
209
  };
210
+ var DEFAULT_STICKER_SCALE = 0.85;
211
+ function getFaceletScale(options) {
212
+ if (typeof options.faceletScale === "undefined" || options.faceletScale === "auto") {
213
+ return DEFAULT_STICKER_SCALE;
214
+ }
215
+ return options.faceletScale;
216
+ }
211
217
  var blackMesh = new MeshBasicMaterial({
212
218
  color: 0,
213
219
  opacity: 1,
@@ -413,7 +419,7 @@ function sharedCubieFoundationGeometry() {
413
419
  }
414
420
  function newStickerGeometry() {
415
421
  const r2 = new BufferGeometry();
416
- const half = 0.5 * cubieDimensions.stickerWidth;
422
+ const half = 0.5;
417
423
  r2.setAttribute(
418
424
  "position",
419
425
  new BufferAttribute(
@@ -523,6 +529,9 @@ var Cube3D = class extends Object3D {
523
529
  this.setStickeringMask(this.options.experimentalStickeringMask);
524
530
  }
525
531
  this.#animateRaiseHintFacelets();
532
+ if (this.options.faceletScale) {
533
+ this.experimentalSetFaceletScale(this.options.faceletScale);
534
+ }
526
535
  }
527
536
  setSprite(texture) {
528
537
  this.sprite = texture;
@@ -535,7 +544,7 @@ var Cube3D = class extends Object3D {
535
544
  return this.#sharedHintStickerGeometryCache ?? (this.#sharedHintStickerGeometryCache = newStickerGeometry());
536
545
  }
537
546
  #animateRaiseHintFacelets() {
538
- if (this.options.initialHintFaceletsAnimation === "none" || haveStartedSharingRenderers()) {
547
+ if (this.options.initialHintFaceletsAnimation === "none" || this.options.initialHintFaceletsAnimation !== "always" && haveStartedSharingRenderers()) {
539
548
  return;
540
549
  }
541
550
  const translationRange = cubieDimensions.hintStickerElevation - cubieDimensions.stickerElevation;
@@ -637,6 +646,10 @@ var Cube3D = class extends Object3D {
637
646
  this.setStickeringMask(experimentalStickeringMask);
638
647
  this.scheduleRenderCallback();
639
648
  }
649
+ const { faceletScale } = options;
650
+ if (typeof faceletScale !== "undefined") {
651
+ this.experimentalSetFaceletScale(faceletScale);
652
+ }
640
653
  }
641
654
  onPositionChange(p) {
642
655
  const reid333 = p.state;
@@ -793,23 +806,14 @@ var Cube3D = class extends Object3D {
793
806
  experimentalSetFoundationOpacity(opacity) {
794
807
  this.experimentalFoundationMeshes[0].material.opacity = opacity;
795
808
  }
796
- experimentalSetStickerWidth(width) {
809
+ experimentalSetFaceletScale(faceletScale) {
810
+ this.options.faceletScale = faceletScale;
797
811
  for (const orbitInfo of Object.values(this.kpuzzleFaceletInfo)) {
798
812
  for (const pieceInfo of orbitInfo) {
799
813
  for (const faceletInfo of pieceInfo) {
800
- faceletInfo.facelet.scale.setScalar(
801
- width / cubieDimensions.stickerWidth
802
- );
803
- }
804
- }
805
- }
806
- }
807
- experimentalSetCenterStickerWidth(width) {
808
- for (const orbitInfo of [this.kpuzzleFaceletInfo["CENTERS"]]) {
809
- for (const pieceInfo of orbitInfo) {
810
- for (const faceletInfo of pieceInfo) {
811
- faceletInfo.facelet.scale.setScalar(
812
- width / cubieDimensions.stickerWidth
814
+ faceletInfo.facelet.scale.setScalar(getFaceletScale(this.options));
815
+ faceletInfo.hintFacelet?.scale.setScalar(
816
+ getFaceletScale(this.options)
813
817
  );
814
818
  }
815
819
  }
@@ -1189,11 +1193,12 @@ var AxisInfo2 = class {
1189
1193
  var DEFAULT_COLOR_FRACTION = 0.71;
1190
1194
  var PG_SCALE = 0.5;
1191
1195
  var PG3D = class extends Object3D2 {
1192
- constructor(scheduleRenderCallback, kpuzzle, stickerDat, enableFoundationOpt = false, enableHintStickersOpt = false, hintStickerHeightScale = 1, params = {}) {
1196
+ constructor(scheduleRenderCallback, kpuzzle, stickerDat, enableFoundationOpt = false, enableHintStickersOpt = false, hintStickerHeightScale = 1, faceletScale = 1, params = {}) {
1193
1197
  super();
1194
1198
  this.scheduleRenderCallback = scheduleRenderCallback;
1195
1199
  this.kpuzzle = kpuzzle;
1196
1200
  this.stickerDat = stickerDat;
1201
+ this.faceletScale = faceletScale;
1197
1202
  this.params = params;
1198
1203
  this.stickerTargets = [];
1199
1204
  this.controlTargets = [];
@@ -1237,7 +1242,7 @@ var PG3D = class extends Object3D2 {
1237
1242
  normals.push(normal(f.coords));
1238
1243
  totArea += polyarea(f.coords);
1239
1244
  }
1240
- const colorfrac = DEFAULT_COLOR_FRACTION;
1245
+ const colorfrac = faceletScale !== "auto" ? faceletScale * faceletScale : DEFAULT_COLOR_FRACTION;
1241
1246
  let nonDupStickers = 0;
1242
1247
  for (const sticker of stickers) {
1243
1248
  if (!sticker.isDup) {
@@ -1619,6 +1624,11 @@ var PG3D = class extends Object3D2 {
1619
1624
  if (this.lastPos) {
1620
1625
  this.onPositionChange(this.lastPos);
1621
1626
  }
1627
+ if (typeof options.faceletScale !== "undefined" && options.faceletScale !== this.faceletScale) {
1628
+ console.warn(
1629
+ "Dynamic facelet scale is not yet supported for PG3D. For now, re-create the TwistyPlayer to change the facelet scale."
1630
+ );
1631
+ }
1622
1632
  this.updateMaterialArrays();
1623
1633
  this.scheduleRenderCallback();
1624
1634
  }
@@ -1728,13 +1738,15 @@ var Twisty3DScene = class {
1728
1738
  async function cube3DShim(renderCallback, options) {
1729
1739
  return new Cube3D(await cube3x3x3.kpuzzle(), renderCallback, options);
1730
1740
  }
1731
- async function pg3dShim(renderCallback, puzzleLoader, hintFacelets) {
1741
+ async function pg3dShim(renderCallback, puzzleLoader, hintFacelets, faceletScale) {
1732
1742
  return new PG3D(
1733
1743
  renderCallback,
1734
1744
  await puzzleLoader.kpuzzle(),
1735
1745
  (await puzzleLoader.pg()).get3d(),
1736
1746
  true,
1737
- hintFacelets === "floating"
1747
+ hintFacelets === "floating",
1748
+ void 0,
1749
+ faceletScale
1738
1750
  );
1739
1751
  }
1740
1752
  export {
@@ -1745,4 +1757,4 @@ export {
1745
1757
  cube3DShim,
1746
1758
  pg3dShim
1747
1759
  };
1748
- //# sourceMappingURL=twisty-dynamic-3d-K4BNTWDJ.js.map
1760
+ //# sourceMappingURL=twisty-dynamic-3d-Q54GMZJG.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/cubing/twisty/views/3D/puzzles/Cube3D.ts", "../../src/cubing/twisty/controllers/easing.ts", "../../src/cubing/twisty/views/3D/puzzles/PG3D.ts", "../../src/cubing/twisty/heavy-code-imports/dynamic-entries/twisty-dynamic-3d.ts", "../../src/cubing/twisty/views/3D/Twisty3DScene.ts"],
4
+ "sourcesContent": ["import {\n BackSide,\n BoxGeometry,\n BufferAttribute,\n BufferGeometry,\n DoubleSide,\n Euler,\n Group,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n Quaternion,\n Texture,\n TextureLoader,\n Vector2,\n Vector3,\n} from \"three\";\nimport type { KPuzzle } from \"../../../../kpuzzle\";\nimport type { ExperimentalStickeringMask } from \"../../../../puzzles/cubing-private\";\nimport type {\n FaceletMeshStickeringMask,\n StickeringMask,\n} from \"../../../../puzzles/stickerings/mask\";\nimport type {\n MillisecondTimestamp,\n PuzzlePosition,\n} from \"../../../controllers/AnimationTypes\";\nimport { smootherStep } from \"../../../controllers/easing\";\nimport {\n HintFaceletStyle,\n hintFaceletStyles,\n} from \"../../../model/props/puzzle/display/HintFaceletProp\";\nimport type { InitialHintFaceletsAnimation } from \"../../../model/props/puzzle/display/InitialHintFaceletsAnimationProp\";\nimport type { FaceletScale } from \"../../../model/props/puzzle/display/FaceletScaleProp\";\nimport { TAU } from \"../TAU\";\nimport { haveStartedSharingRenderers } from \"../Twisty3DVantage\";\nimport type { Twisty3DPuzzle } from \"./Twisty3DPuzzle\";\n\nconst svgLoader = new TextureLoader();\n\nconst ignoredMaterial = new MeshBasicMaterial({\n color: 0x444444,\n side: DoubleSide,\n});\n\nconst ignoredMaterialHint = new MeshBasicMaterial({\n color: 0xcccccc,\n side: BackSide,\n transparent: true,\n opacity: 0.75,\n});\n\nconst invisibleMaterial = new MeshBasicMaterial({\n visible: false,\n});\n\nconst orientedMaterial = new MeshBasicMaterial({\n color: 0x44ddcc,\n});\n\nconst orientedMaterialHint = new MeshBasicMaterial({\n color: 0x44ddcc,\n side: BackSide,\n transparent: true,\n opacity: 0.5,\n});\n\ninterface MaterialMap\n extends Record<FaceletMeshStickeringMask, MeshBasicMaterial> {\n regular: MeshBasicMaterial;\n dim: MeshBasicMaterial;\n ignored: MeshBasicMaterial;\n invisible: MeshBasicMaterial;\n}\n\nclass AxisInfo {\n public stickerMaterial: MaterialMap;\n public hintStickerMaterial: MaterialMap;\n constructor(\n public vector: Vector3,\n public fromZ: Euler,\n public color: number,\n public dimColor: number,\n public hintOpacityScale: number, // TODO: make this work better across bright *and* dark backgrounds. Maybe tweak sticker compositing settings?\n options?: { hintColor?: number; hintDimColor?: number },\n ) {\n // TODO: Make sticker material single-sided when cubie foundation is opaque?\n this.stickerMaterial = {\n regular: new MeshBasicMaterial({\n color,\n side: DoubleSide,\n }),\n dim: new MeshBasicMaterial({\n color: dimColor,\n side: DoubleSide,\n }),\n oriented: orientedMaterial,\n ignored: ignoredMaterial,\n invisible: invisibleMaterial,\n };\n this.hintStickerMaterial = {\n regular: new MeshBasicMaterial({\n color: options?.hintColor ?? color,\n side: BackSide,\n transparent: true,\n opacity: 0.5 * hintOpacityScale,\n }),\n dim: new MeshBasicMaterial({\n color: options?.hintDimColor ?? dimColor,\n side: BackSide,\n transparent: true,\n opacity: 0.5 * hintOpacityScale,\n }),\n oriented: orientedMaterialHint,\n ignored: ignoredMaterialHint,\n invisible: invisibleMaterial,\n };\n }\n}\n\nconst axesInfo: AxisInfo[] = [\n new AxisInfo(\n new Vector3(0, 1, 0),\n new Euler(-TAU / 4, 0, 0),\n 0xffffff,\n 0xdddddd,\n 1.25,\n ),\n new AxisInfo(\n new Vector3(-1, 0, 0),\n new Euler(0, -TAU / 4, 0),\n 0xff8800,\n 0x884400,\n 1,\n { hintDimColor: 0x996600 },\n ),\n new AxisInfo(\n new Vector3(0, 0, 1),\n new Euler(0, 0, 0),\n 0x00ff00,\n 0x008800,\n 1,\n { hintDimColor: 0x009900 },\n ),\n new AxisInfo(\n new Vector3(1, 0, 0),\n new Euler(0, TAU / 4, 0),\n 0xff0000,\n 0x660000,\n 1,\n { hintDimColor: 0x990000 },\n ),\n new AxisInfo(\n new Vector3(0, 0, -1),\n new Euler(0, TAU / 2, 0),\n 0x2266ff,\n 0x113388,\n 0.75,\n { hintDimColor: 0x001866 },\n ),\n new AxisInfo(\n new Vector3(0, -1, 0),\n new Euler(TAU / 4, 0, 0),\n 0xffff00,\n 0x888800,\n 1.25,\n { hintDimColor: 0xbbbb00 },\n ),\n];\n\nconst face: { [s: string]: number } = {\n U: 0,\n L: 1,\n F: 2,\n R: 3,\n B: 4,\n D: 5,\n};\n\nconst familyToAxis: { [s: string]: number } = {\n U: face.U,\n u: face.U,\n Uw: face.U,\n Uv: face.U,\n y: face.U,\n L: face.L,\n l: face.L,\n Lw: face.L,\n Lv: face.L,\n M: face.L,\n F: face.F,\n f: face.F,\n Fw: face.F,\n Fv: face.F,\n S: face.F,\n z: face.F,\n R: face.R,\n r: face.R,\n Rw: face.R,\n Rv: face.R,\n x: face.R,\n B: face.B,\n b: face.B,\n Bw: face.B,\n Bv: face.B,\n D: face.D,\n d: face.D,\n Dw: face.D,\n Dv: face.D,\n E: face.D,\n};\n\nconst cubieDimensions = {\n // stickerWidth: 0.85, // Now `faceletScale` in options.\n stickerElevation: 0.503,\n foundationWidth: 1,\n hintStickerElevation: 1.45,\n};\nconst EXPERIMENTAL_PICTURE_CUBE_HINT_ELEVATION = 2;\n\n/** @deprecated */\nexport function experimentalSetDefaultStickerElevation(\n stickerElevation: number,\n): void {\n cubieDimensions.stickerElevation = stickerElevation;\n}\n\nexport interface Cube3DOptions {\n showMainStickers?: boolean;\n hintFacelets?: HintFaceletStyle;\n showFoundation?: boolean; // TODO: better name\n experimentalStickeringMask?: ExperimentalStickeringMask;\n foundationSprite?: Texture | null;\n hintSprite?: Texture | null;\n initialHintFaceletsAnimation?: InitialHintFaceletsAnimation;\n faceletScale?: \"auto\" | number;\n}\n\nconst cube3DOptionsDefaults: Cube3DOptions = {\n showMainStickers: true,\n hintFacelets: \"floating\",\n showFoundation: true,\n experimentalStickeringMask: undefined,\n foundationSprite: null,\n hintSprite: null,\n initialHintFaceletsAnimation: \"auto\",\n faceletScale: \"auto\",\n};\n\nconst DEFAULT_STICKER_SCALE = 0.85;\nfunction getFaceletScale(options: Cube3DOptions): number {\n if (\n typeof options.faceletScale === \"undefined\" ||\n options.faceletScale === \"auto\"\n ) {\n return DEFAULT_STICKER_SCALE;\n }\n return options.faceletScale;\n}\n\n// TODO: Make internal foundation faces one-sided, facing to the outside of the cube.\nconst blackMesh = new MeshBasicMaterial({\n color: 0x000000,\n opacity: 1,\n transparent: true,\n});\n\nconst blackTranslucentMesh = new MeshBasicMaterial({\n color: 0x000000,\n opacity: 0.3,\n transparent: true,\n});\n\nclass CubieDef {\n public matrix: Matrix4;\n public stickerFaces: number[];\n // stickerFaceNames can be e.g. [\"U\", \"F\", \"R\"], \"UFR\" if every face is a single letter.\n constructor(\n public orbit: string,\n stickerFaceNames: string[] | string,\n q: Quaternion,\n ) {\n const individualStickerFaceNames =\n typeof stickerFaceNames === \"string\"\n ? stickerFaceNames.split(\"\")\n : stickerFaceNames;\n this.stickerFaces = individualStickerFaceNames.map((s) => face[s]);\n this.matrix = new Matrix4();\n this.matrix.setPosition(firstPiecePosition[orbit]);\n this.matrix.premultiply(new Matrix4().makeRotationFromQuaternion(q));\n }\n}\n\nfunction t(v: Vector3, t4: number): Quaternion {\n return new Quaternion().setFromAxisAngle(v, (TAU * t4) / 4);\n}\n\nconst r = {\n O: new Vector3(0, 0, 0),\n U: new Vector3(0, -1, 0),\n L: new Vector3(1, 0, 0),\n F: new Vector3(0, 0, -1),\n R: new Vector3(-1, 0, 0),\n B: new Vector3(0, 0, 1),\n D: new Vector3(0, 1, 0),\n};\n\ninterface OrbitIndexed<T> {\n [s: string]: T;\n}\ntype PieceIndexed<T> = OrbitIndexed<T[]>;\n\nconst firstPiecePosition: OrbitIndexed<Vector3> = {\n EDGES: new Vector3(0, 1, 1),\n CORNERS: new Vector3(1, 1, 1),\n CENTERS: new Vector3(0, 1, 0),\n};\nconst orientationRotation: OrbitIndexed<Matrix4[]> = {\n EDGES: [0, 1].map((i) =>\n new Matrix4().makeRotationAxis(\n firstPiecePosition.EDGES.clone().normalize(),\n (-i * TAU) / 2,\n ),\n ),\n CORNERS: [0, 1, 2].map((i) =>\n new Matrix4().makeRotationAxis(\n firstPiecePosition.CORNERS.clone().normalize(),\n (-i * TAU) / 3,\n ),\n ),\n CENTERS: [0, 1, 2, 3].map((i) =>\n new Matrix4().makeRotationAxis(\n firstPiecePosition.CENTERS.clone().normalize(),\n (-i * TAU) / 4,\n ),\n ),\n};\nconst cubieStickerOrder = [face.U, face.F, face.R];\n\nconst pieceDefs: PieceIndexed<CubieDef> = {\n EDGES: [\n new CubieDef(\"EDGES\", \"UF\", t(r.O, 0)),\n new CubieDef(\"EDGES\", \"UR\", t(r.U, 3)),\n new CubieDef(\"EDGES\", \"UB\", t(r.U, 2)),\n new CubieDef(\"EDGES\", \"UL\", t(r.U, 1)),\n new CubieDef(\"EDGES\", \"DF\", t(r.F, 2)),\n new CubieDef(\"EDGES\", \"DR\", t(r.F, 2).premultiply(t(r.D, 1))),\n new CubieDef(\"EDGES\", \"DB\", t(r.F, 2).premultiply(t(r.D, 2))),\n new CubieDef(\"EDGES\", \"DL\", t(r.F, 2).premultiply(t(r.D, 3))),\n new CubieDef(\"EDGES\", \"FR\", t(r.U, 3).premultiply(t(r.R, 3))),\n new CubieDef(\"EDGES\", \"FL\", t(r.U, 1).premultiply(t(r.R, 3))),\n new CubieDef(\"EDGES\", \"BR\", t(r.U, 3).premultiply(t(r.R, 1))),\n new CubieDef(\"EDGES\", \"BL\", t(r.U, 1).premultiply(t(r.R, 1))),\n ],\n CORNERS: [\n new CubieDef(\"CORNERS\", \"UFR\", t(r.O, 0)),\n new CubieDef(\"CORNERS\", \"URB\", t(r.U, 3)),\n new CubieDef(\"CORNERS\", \"UBL\", t(r.U, 2)),\n new CubieDef(\"CORNERS\", \"ULF\", t(r.U, 1)),\n new CubieDef(\"CORNERS\", \"DRF\", t(r.F, 2).premultiply(t(r.D, 1))),\n new CubieDef(\"CORNERS\", \"DFL\", t(r.F, 2).premultiply(t(r.D, 0))),\n new CubieDef(\"CORNERS\", \"DLB\", t(r.F, 2).premultiply(t(r.D, 3))),\n new CubieDef(\"CORNERS\", \"DBR\", t(r.F, 2).premultiply(t(r.D, 2))),\n ],\n CENTERS: [\n new CubieDef(\"CENTERS\", \"U\", t(r.O, 0)),\n new CubieDef(\"CENTERS\", \"L\", t(r.R, 3).premultiply(t(r.U, 1))),\n new CubieDef(\"CENTERS\", \"F\", t(r.R, 3)),\n new CubieDef(\"CENTERS\", \"R\", t(r.R, 3).premultiply(t(r.D, 1))),\n new CubieDef(\"CENTERS\", \"B\", t(r.R, 3).premultiply(t(r.D, 2))),\n new CubieDef(\"CENTERS\", \"D\", t(r.R, 2)),\n ],\n};\n\nconst CUBE_SCALE = 1 / 3;\n\ninterface FaceletInfo {\n faceIdx: number;\n facelet: Mesh;\n hintFacelet?: Mesh;\n}\n\n// TODO: Compatibility with Randelshofer or standard net layout? Offer a\n// conversion function?\nconst pictureStickerCoords: Record<string, number[][][]> = {\n EDGES: [\n [\n [0, 4, 6],\n [0, 4, 5],\n ],\n [\n [3, 5, 7],\n [0, 7, 5],\n ],\n [\n [2, 4, 8],\n [0, 10, 5],\n ],\n [\n [1, 3, 7],\n [0, 1, 5],\n ],\n [\n [2, 4, 2],\n [2, 4, 3],\n ],\n [\n [3, 5, 1],\n [2, 7, 3],\n ],\n [\n [0, 4, 0],\n [2, 10, 3],\n ],\n [\n [1, 3, 1],\n [2, 1, 3],\n ],\n [\n [3, 5, 4],\n [3, 6, 4],\n ],\n [\n [1, 3, 4],\n [1, 2, 4],\n ],\n [\n [1, 9, 4],\n [1, 8, 4],\n ],\n [\n [3, 11, 4],\n [3, 0, 4],\n ],\n ],\n CORNERS: [\n [\n [0, 5, 6],\n [0, 5, 5],\n [0, 6, 5],\n ],\n [\n [3, 5, 8],\n [0, 8, 5],\n [0, 9, 5],\n ],\n [\n [2, 3, 8],\n [0, 11, 5],\n [0, 0, 5],\n ],\n [\n [1, 3, 6],\n [0, 2, 5],\n [0, 3, 5],\n ],\n [\n [3, 5, 2],\n [2, 6, 3],\n [2, 5, 3],\n ],\n [\n [2, 3, 2],\n [2, 3, 3],\n [2, 2, 3],\n ],\n [\n [1, 3, 0],\n [2, 0, 3],\n [2, 11, 3],\n ],\n [\n [0, 5, 0],\n [2, 9, 3],\n [2, 8, 3],\n ],\n ],\n CENTERS: [\n [[0, 4, 7]],\n [[0, 1, 4]],\n [[0, 4, 4]],\n [[0, 7, 4]],\n [[0, 10, 4]],\n [[0, 4, 1]],\n ],\n};\n\nlet sharedCubieFoundationGeometryCache: BoxGeometry | null = null;\nfunction sharedCubieFoundationGeometry(): BoxGeometry {\n return (\n sharedCubieFoundationGeometryCache ??\n (sharedCubieFoundationGeometryCache = new BoxGeometry(\n cubieDimensions.foundationWidth,\n cubieDimensions.foundationWidth,\n cubieDimensions.foundationWidth,\n ))\n );\n}\n\nfunction newStickerGeometry(): BufferGeometry {\n const r = new BufferGeometry();\n const half = 0.5;\n r.setAttribute(\n \"position\",\n new BufferAttribute(\n new Float32Array([\n half,\n half,\n 0,\n -half,\n half,\n 0,\n half,\n -half,\n 0,\n -half,\n half,\n 0,\n -half,\n -half,\n 0,\n half,\n -half,\n 0,\n ]),\n 3,\n ),\n );\n r.setAttribute(\n \"uv\",\n new BufferAttribute(\n new Float32Array([\n 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1,\n ]),\n 2,\n ),\n );\n // r.setAttribute('normals', new BufferAttribute(new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]), 3));\n return r;\n}\n\nlet sharedStickerGeometryCache: BufferGeometry | null = null;\nfunction sharedStickerGeometry(): BufferGeometry {\n return (\n sharedStickerGeometryCache ??\n (sharedStickerGeometryCache = newStickerGeometry())\n );\n}\n\n// TODO: Split into \"scene model\" and \"view\".\nexport class Cube3D extends Object3D implements Twisty3DPuzzle {\n kpuzzleFaceletInfo: Record<string, FaceletInfo[][]>;\n private pieces: PieceIndexed<Object3D> = {};\n private options: Cube3DOptions;\n // TODO: Keep track of option-based meshes better.\n private experimentalHintStickerMeshes: Mesh[] = [];\n private experimentalFoundationMeshes: Mesh[] = [];\n\n private setSpriteURL: (url: string) => void;\n private sprite: Texture | Promise<Texture> = new Promise((resolve) => {\n this.setSpriteURL = (url: string): void => {\n svgLoader.load(url, resolve);\n };\n });\n\n // TODO: Don't overwrite the static function.\n // TODO: This doesn't work dynamically yet.\n setSprite(texture: Texture): void {\n this.sprite = texture;\n }\n\n private setHintSpriteURL: (url: string) => void;\n private hintSprite: Texture | Promise<Texture> = new Promise((resolve) => {\n this.setHintSpriteURL = (url: string): void => {\n svgLoader.load(url, resolve);\n };\n });\n\n // TODO: Don't overwrite the static function.\n // TODO: This doesn't work dynamically yet.\n setHintSprite(texture: Texture): void {\n this.hintSprite = texture;\n }\n\n constructor(\n private kpuzzle: KPuzzle,\n private scheduleRenderCallback?: () => void,\n options: Cube3DOptions = {},\n ) {\n super();\n\n this.options = { ...cube3DOptionsDefaults };\n Object.assign(this.options, options); // TODO: check if this works\n\n if (this.kpuzzle.name() !== \"3x3x3\") {\n throw new Error(\n `Invalid puzzle for this Cube3D implementation: ${this.kpuzzle.name()}`,\n );\n }\n\n if (options.foundationSprite) {\n this.setSprite(options.foundationSprite);\n }\n if (options.hintSprite) {\n this.setHintSprite(options.hintSprite);\n }\n\n this.kpuzzleFaceletInfo = {};\n for (const orbit in pieceDefs) {\n const orbitFaceletInfo: FaceletInfo[][] = [];\n this.kpuzzleFaceletInfo[orbit] = orbitFaceletInfo;\n this.pieces[orbit] = pieceDefs[orbit].map(\n this.createCubie.bind(this, orbit, orbitFaceletInfo),\n );\n }\n this.scale.set(CUBE_SCALE, CUBE_SCALE, CUBE_SCALE);\n\n // TODO: Can we construct this directly instead of applying it later? Would that be more code-efficient?\n if (this.options.experimentalStickeringMask) {\n this.setStickeringMask(this.options.experimentalStickeringMask);\n }\n this.#animateRaiseHintFacelets();\n\n if (this.options.faceletScale) {\n this.experimentalSetFaceletScale(this.options.faceletScale);\n }\n }\n\n #sharedHintStickerGeometryCache: BufferGeometry | null = null;\n #sharedHintStickerGeometry(): BufferGeometry {\n return (this.#sharedHintStickerGeometryCache ??= newStickerGeometry());\n }\n\n // TODO: Generalize this into an animation mechanism.\n #animateRaiseHintFacelets(): void {\n if (\n this.options.initialHintFaceletsAnimation === \"none\" ||\n (this.options.initialHintFaceletsAnimation !== \"always\" &&\n haveStartedSharingRenderers())\n ) {\n return;\n }\n const translationRange =\n cubieDimensions.hintStickerElevation - cubieDimensions.stickerElevation;\n this.#sharedHintStickerGeometry().translate(0, 0, -translationRange);\n setTimeout(() => {\n const hintStartTime = performance.now();\n let lastTranslation = 0;\n const translationDuration: MillisecondTimestamp = 1000;\n function ease(x: number) {\n return x * (2 - x);\n }\n const animateRaiseHintSticker = () => {\n const elapsed = performance.now() - hintStartTime;\n const newTranslation =\n ease(elapsed / translationDuration) * translationRange;\n this.#sharedHintStickerGeometry().translate(\n 0,\n 0,\n newTranslation - lastTranslation,\n );\n lastTranslation = newTranslation;\n if (elapsed < translationDuration) {\n requestAnimationFrame(animateRaiseHintSticker);\n this.scheduleRenderCallback?.();\n }\n };\n animateRaiseHintSticker();\n }, 500);\n }\n\n // Can only be called once.\n /** @deprecated */\n experimentalSetStickerSpriteURL(stickerSpriteURL: string): void {\n this.setSpriteURL(stickerSpriteURL);\n }\n\n // Can only be called once.\n /** @deprecated */\n experimentalSetHintStickerSpriteURL(hintStickerSpriteURL: string): void {\n this.setHintSpriteURL(hintStickerSpriteURL);\n }\n\n setStickeringMask(stickeringMask: StickeringMask): void {\n if (stickeringMask.specialBehaviour === \"picture\") {\n // TODO: if the latest stickering mask was already \"picture\", don't redo work.\n for (const pieceInfos of Object.values(this.kpuzzleFaceletInfo)) {\n for (const faceletInfos of pieceInfos) {\n for (const faceletInfo of faceletInfos) {\n faceletInfo.facelet.material = invisibleMaterial;\n const { hintFacelet } = faceletInfo;\n if (hintFacelet) {\n hintFacelet.material = invisibleMaterial;\n }\n }\n }\n }\n return;\n }\n this.options.experimentalStickeringMask = stickeringMask;\n for (const [orbitName, orbitStickeringMask] of Object.entries(\n stickeringMask.orbits,\n )) {\n for (\n let pieceIdx = 0;\n pieceIdx < orbitStickeringMask.pieces.length;\n pieceIdx++\n ) {\n const pieceStickeringMask = orbitStickeringMask.pieces[pieceIdx];\n if (pieceStickeringMask) {\n const pieceInfo = this.kpuzzleFaceletInfo[orbitName][pieceIdx];\n for (\n let faceletIdx = 0;\n faceletIdx < pieceInfo.length;\n faceletIdx++\n ) {\n const faceletStickeringMask =\n pieceStickeringMask.facelets[faceletIdx];\n if (faceletStickeringMask) {\n const faceletInfo = pieceInfo[faceletIdx];\n\n const stickeringMask =\n typeof faceletStickeringMask === \"string\"\n ? faceletStickeringMask\n : faceletStickeringMask?.mask;\n\n faceletInfo.facelet.material =\n axesInfo[faceletInfo.faceIdx].stickerMaterial[stickeringMask];\n // TODO\n const hintStickeringMask =\n typeof faceletStickeringMask === \"string\"\n ? stickeringMask\n : faceletStickeringMask.hintMask ?? stickeringMask;\n if (faceletInfo.hintFacelet) {\n faceletInfo.hintFacelet.material =\n axesInfo[faceletInfo.faceIdx].hintStickerMaterial[\n hintStickeringMask\n ];\n }\n }\n }\n }\n }\n }\n if (this.scheduleRenderCallback) {\n this.scheduleRenderCallback();\n }\n }\n\n /** @deprecated */\n public experimentalUpdateOptions(options: Cube3DOptions): void {\n if (\"showMainStickers\" in options) {\n throw new Error(\"Unimplemented\");\n }\n\n const showFoundation = options.showFoundation;\n if (\n typeof showFoundation !== \"undefined\" &&\n this.options.showFoundation !== showFoundation\n ) {\n this.options.showFoundation = showFoundation;\n for (const foundation of this.experimentalFoundationMeshes) {\n foundation.visible = showFoundation;\n }\n }\n\n const hintFacelets = options.hintFacelets;\n if (\n typeof hintFacelets !== \"undefined\" &&\n this.options.hintFacelets !== hintFacelets &&\n hintFaceletStyles[hintFacelets] // TODO: test this\n ) {\n this.options.hintFacelets = hintFacelets;\n for (const hintSticker of this.experimentalHintStickerMeshes) {\n hintSticker.visible = hintFacelets === \"floating\";\n }\n this.scheduleRenderCallback!(); // TODO\n }\n\n const { experimentalStickeringMask } = options;\n if (typeof experimentalStickeringMask !== \"undefined\") {\n this.options.experimentalStickeringMask = experimentalStickeringMask;\n this.setStickeringMask(experimentalStickeringMask);\n this.scheduleRenderCallback!(); // TODO\n }\n\n const { faceletScale } = options;\n if (typeof faceletScale !== \"undefined\") {\n this.experimentalSetFaceletScale(faceletScale);\n }\n }\n\n public onPositionChange(p: PuzzlePosition): void {\n const reid333 = p.state;\n for (const orbit in pieceDefs) {\n const pieces = pieceDefs[orbit];\n for (let i = 0; i < pieces.length; i++) {\n const j = reid333.stateData[orbit].pieces[i];\n this.pieces[orbit][j].matrix.copy(pieceDefs[orbit][i].matrix);\n this.pieces[orbit][j].matrix.multiply(\n orientationRotation[orbit][reid333.stateData[orbit].orientation[i]],\n );\n }\n for (const moveProgress of p.movesInProgress) {\n const move = moveProgress.move;\n const turnNormal = axesInfo[familyToAxis[move.family]].vector;\n const moveMatrix = new Matrix4().makeRotationAxis(\n turnNormal,\n (-this.ease(moveProgress.fraction) *\n moveProgress.direction *\n move.amount *\n TAU) /\n 4,\n );\n for (let i = 0; i < pieces.length; i++) {\n const quantumTransformation = this.kpuzzle.moveToTransformation(\n move.modified({ amount: 1 }),\n );\n const k =\n quantumTransformation.transformationData[orbit].permutation[i];\n if (\n i !== k ||\n quantumTransformation.transformationData[orbit].orientation[i] !== 0\n ) {\n const j = reid333.stateData[orbit].pieces[i];\n this.pieces[orbit][j].matrix.premultiply(moveMatrix);\n }\n }\n }\n }\n this.scheduleRenderCallback!();\n }\n\n // TODO: Always create (but sometimes hide parts) so we can show them later,\n // or (better) support creating puzzle parts on demand.\n private createCubie(\n orbit: string,\n orbitFacelets: FaceletInfo[][],\n piece: CubieDef,\n orbitPieceIdx: number,\n ): Object3D {\n const cubieFaceletInfo: FaceletInfo[] = [];\n orbitFacelets.push(cubieFaceletInfo);\n const cubie = new Group();\n if (this.options.showFoundation) {\n const foundation = this.createCubieFoundation();\n cubie.add(foundation);\n this.experimentalFoundationMeshes.push(foundation);\n }\n for (let i = 0; i < piece.stickerFaces.length; i++) {\n const sticker = this.createSticker(\n axesInfo[cubieStickerOrder[i]],\n axesInfo[piece.stickerFaces[i]],\n false,\n );\n const faceletInfo: FaceletInfo = {\n faceIdx: piece.stickerFaces[i],\n facelet: sticker,\n };\n cubie.add(sticker);\n if (this.options.hintFacelets === \"floating\") {\n const hintSticker = this.createSticker(\n axesInfo[cubieStickerOrder[i]],\n axesInfo[piece.stickerFaces[i]],\n true,\n );\n cubie.add(hintSticker);\n faceletInfo.hintFacelet = hintSticker;\n this.experimentalHintStickerMeshes.push(hintSticker);\n }\n\n if (\n this.options.experimentalStickeringMask?.specialBehaviour ===\n \"picture\" &&\n pictureStickerCoords[orbit] &&\n pictureStickerCoords[orbit][orbitPieceIdx] &&\n pictureStickerCoords[orbit][orbitPieceIdx][i]\n ) {\n const [rotate, offsetX, offsetY] =\n pictureStickerCoords[orbit][orbitPieceIdx][i];\n (async () => {\n const addImageSticker = async (hint: boolean) => {\n const texture: Texture = await (hint\n ? this.hintSprite\n : this.sprite);\n\n const mesh = this.createSticker(\n axesInfo[cubieStickerOrder[i]],\n axesInfo[piece.stickerFaces[i]],\n hint,\n );\n mesh.material = new MeshBasicMaterial({\n map: texture,\n side: hint ? BackSide : DoubleSide,\n transparent: true,\n });\n\n const x1 = offsetX / 12;\n const x2 = (offsetX + 1) / 12;\n const y1 = offsetY / 9;\n const y2 = (offsetY + 1) / 9;\n\n let v1 = new Vector2(x1, y1);\n let v2 = new Vector2(x1, y2);\n let v3 = new Vector2(x2, y2);\n let v4 = new Vector2(x2, y1);\n\n switch (rotate) {\n case 1: {\n [v1, v2, v3, v4] = [v2, v3, v4, v1];\n break;\n }\n case 2: {\n [v1, v2, v3, v4] = [v3, v4, v1, v2];\n break;\n }\n case 3: {\n [v1, v2, v3, v4] = [v4, v1, v2, v3];\n break;\n }\n }\n mesh.geometry.setAttribute(\n \"uv\",\n new BufferAttribute(\n new Float32Array([\n v3.x,\n v3.y,\n v2.x,\n v2.y,\n v4.x,\n v4.y,\n v2.x,\n v2.y,\n v1.x,\n v1.y,\n v4.x,\n v4.y,\n ]),\n 2,\n ),\n );\n cubie.add(mesh);\n };\n // const delay: number = ({\n // CENTERS: 1000,\n // EDGES: 2000,\n // CORNERS: 3500,\n // } as Record<string, number>)[orbit];\n // if (orbit === \"CENTERS\" && orbitPieceIdx === 5) {\n addImageSticker(true);\n addImageSticker(false);\n // } else {\n // await this.sprite;\n // await this.hintSprite;\n // setTimeout(\n // () => addImageSticker(true),\n // delay + orbitPieceIdx * 100,\n // );\n // setTimeout(\n // () => addImageSticker(false),\n // delay + orbitPieceIdx * 100,\n // );\n // }\n })();\n }\n\n cubieFaceletInfo.push(faceletInfo);\n }\n cubie.matrix.copy(piece.matrix);\n cubie.matrixAutoUpdate = false;\n this.add(cubie);\n return cubie;\n }\n\n // TODO: Support creating only the outward-facing parts?\n private createCubieFoundation(): Mesh {\n const box = sharedCubieFoundationGeometry();\n return new Mesh(\n box,\n this.options.experimentalStickeringMask?.specialBehaviour === \"picture\"\n ? blackMesh\n : blackTranslucentMesh,\n );\n }\n\n private createSticker(\n posAxisInfo: AxisInfo,\n materialAxisInfo: AxisInfo,\n isHint: boolean,\n ): Mesh {\n const geo =\n this.options.experimentalStickeringMask?.specialBehaviour === \"picture\"\n ? newStickerGeometry()\n : isHint\n ? this.#sharedHintStickerGeometry()\n : sharedStickerGeometry();\n const stickerMesh = new Mesh(\n geo,\n isHint\n ? materialAxisInfo.hintStickerMaterial.regular\n : materialAxisInfo.stickerMaterial.regular,\n );\n stickerMesh.setRotationFromEuler(posAxisInfo.fromZ);\n stickerMesh.position.copy(posAxisInfo.vector);\n stickerMesh.position.multiplyScalar(\n isHint\n ? this.options.experimentalStickeringMask?.specialBehaviour ===\n \"picture\"\n ? EXPERIMENTAL_PICTURE_CUBE_HINT_ELEVATION\n : cubieDimensions.hintStickerElevation\n : cubieDimensions.stickerElevation,\n );\n return stickerMesh;\n }\n\n /** @deprecated */\n experimentalSetFoundationOpacity(opacity: number): void {\n (\n this.experimentalFoundationMeshes[0].material as MeshBasicMaterial\n ).opacity = opacity;\n }\n\n /** @deprecated */\n experimentalSetFaceletScale(faceletScale: FaceletScale): void {\n this.options.faceletScale = faceletScale;\n for (const orbitInfo of Object.values(this.kpuzzleFaceletInfo)) {\n for (const pieceInfo of orbitInfo) {\n for (const faceletInfo of pieceInfo) {\n faceletInfo.facelet.scale.setScalar(getFaceletScale(this.options));\n faceletInfo.hintFacelet?.scale.setScalar(\n getFaceletScale(this.options),\n );\n // faceletInfo.facelet.setRotationFromAxisAngle(new Vector3(0, 1, 0), 0);\n // faceletInfo.facelet.rotateOnAxis(new Vector3(1, 0, 1), TAU / 6);\n }\n }\n }\n }\n\n // /** @deprecated */\n // experimentalSetCenterStickerWidth(width: number): void {\n // for (const orbitInfo of [this.kpuzzleFaceletInfo[\"CENTERS\"]]) {\n // for (const pieceInfo of orbitInfo) {\n // for (const faceletInfo of pieceInfo) {\n // faceletInfo.facelet.scale.setScalar(\n // width / getStickerScale(this.options),\n // );\n // // faceletInfo.facelet.setRotationFromAxisAngle(new Vector3(0, 1, 0), 0);\n // // faceletInfo.facelet.rotateOnAxis(new Vector3(1, 0, 1), TAU / 6);\n // }\n // }\n // }\n // }\n\n private ease(fraction: number): number {\n return smootherStep(fraction);\n }\n}\n", "export function smootherStep(x: number): number {\n return x * x * x * (10 - x * (15 - 6 * x));\n}\n", "import {\n BufferAttribute,\n BufferGeometry,\n Color,\n DoubleSide,\n Euler,\n FrontSide,\n Group,\n Material,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n Texture,\n Vector3,\n} from \"three\";\nimport { Move } from \"../../../../alg\";\nimport type { KPuzzle, KTransformation } from \"../../../../kpuzzle\";\nimport type {\n StickerDat,\n StickerDatAxis,\n StickerDatSticker,\n} from \"../../../../puzzle-geometry\";\nimport type { TextureMapper } from \"../../../../puzzle-geometry/PuzzleGeometry\";\nimport {\n ExperimentalFaceletMeshStickeringMask,\n experimentalGetFaceletStickeringMask,\n ExperimentalStickeringMask,\n} from \"../../../../puzzles/cubing-private\";\nimport type { PuzzlePosition } from \"../../../controllers/AnimationTypes\";\nimport { smootherStep } from \"../../../controllers/easing\";\nimport type { HintFaceletStyle } from \"../../../model/props/puzzle/display/HintFaceletProp\";\nimport { TAU } from \"../TAU\";\nimport type { Twisty3DPuzzle } from \"./Twisty3DPuzzle\";\n\nconst foundationMaterial = new MeshBasicMaterial({\n side: DoubleSide,\n color: 0x000000,\n});\nconst invisMaterial = new MeshBasicMaterial({\n visible: false,\n});\nconst basicStickerMaterial = new MeshBasicMaterial({\n vertexColors: true,\n});\n\nfunction dist(coords: number[], a: number, b: number): number {\n return Math.hypot(\n coords[3 * a] - coords[3 * b],\n coords[3 * a + 1] - coords[3 * b + 1],\n coords[3 * a + 2] - coords[3 * b + 2],\n );\n}\n\nfunction triarea(coords: number[], a: number, b: number, c: number): number {\n const ab = dist(coords, a, b);\n const bc = dist(coords, b, c);\n const ac = dist(coords, a, c);\n const p = (ab + bc + ac) / 2;\n return Math.sqrt(p * (p - ab) * (p - bc) * (p - ac));\n}\n\nfunction polyarea(coords: number[]): number {\n let sum = 0;\n for (let i = 2; 3 * i < coords.length; i++) {\n sum += triarea(coords, 0, 1, i);\n }\n return sum;\n}\n\nfunction normalize(r: number[]): number[] {\n const m = Math.hypot(r[0], r[1], r[2]);\n r[0] /= m;\n r[1] /= m;\n r[2] /= m;\n return r;\n}\n\nfunction cross(a: number[], b: number[]): number[] {\n const r = new Array<number>(3);\n r[0] = a[1] * b[2] - a[2] * b[1];\n r[1] = a[2] * b[0] - a[0] * b[2];\n r[2] = a[0] * b[1] - a[1] * b[0];\n return r;\n}\n\nfunction normal(c: number[]): number[] {\n const a: number[] = [c[3] - c[0], c[4] - c[1], c[5] - c[2]];\n const b: number[] = [c[6] - c[3], c[7] - c[4], c[8] - c[5]];\n const r = cross(a, b);\n return normalize(r);\n}\n\nfunction trimEdges(face: number[], tr: number): number[] {\n const r: number[] = [];\n const A: number[] = new Array(3);\n const B: number[] = new Array(3);\n for (let iter = 1; iter < 10; iter++) {\n for (let i = 0; i < face.length; i += 3) {\n const pi = (i + face.length - 3) % face.length;\n const ni = (i + 3) % face.length;\n for (let k = 0; k < 3; k++) {\n A[k] = face[pi + k] - face[i + k];\n B[k] = face[ni + k] - face[i + k];\n }\n const alen = Math.hypot(A[0], A[1], A[2]);\n const blen = Math.hypot(B[0], B[1], B[2]);\n for (let k = 0; k < 3; k++) {\n A[k] /= alen;\n B[k] /= blen;\n }\n const d = A[0] * B[0] + A[1] * B[1] + A[2] * B[2];\n const m = tr / Math.sqrt(1 - d * d);\n for (let k = 0; k < 3; k++) {\n r[i + k] = face[i + k] + (A[k] + B[k]) * m;\n }\n }\n let good = true;\n for (let i = 0; good && i < r.length; i += 3) {\n const ni = (i + 3) % face.length;\n let t = 0;\n for (let k = 0; k < 3; k++) {\n const a = face[ni + k] - face[i + k];\n const b = r[ni + k] - r[i + k];\n t += a * b;\n }\n if (t <= 0) {\n good = false;\n }\n }\n if (good) {\n return r;\n }\n tr /= 2;\n }\n return face;\n}\n\nclass Filler {\n pos: number;\n ipos: number;\n vertices: Float32Array;\n colors: Uint8Array;\n uvs?: Float32Array;\n ind: Uint8Array;\n constructor(public sz: number, public tm: TextureMapper) {\n this.vertices = new Float32Array(9 * sz);\n this.uvs = undefined;\n this.colors = new Uint8Array(18 * sz);\n this.ind = new Uint8Array(sz);\n this.pos = 0;\n this.ipos = 0;\n }\n\n add(pt: number[], i: number, c: number) {\n this.vertices[this.pos] = pt[3 * i + 0];\n this.vertices[this.pos + 1] = pt[3 * i + 1];\n this.vertices[this.pos + 2] = pt[3 * i + 2];\n this.colors[this.pos] = c >> 16;\n this.colors[this.pos + 1] = (c >> 8) & 255;\n this.colors[this.pos + 2] = c & 255;\n this.pos += 3;\n }\n\n addUncolored(pt: number[], i: number) {\n this.vertices[this.pos] = pt[3 * i + 0];\n this.vertices[this.pos + 1] = pt[3 * i + 1];\n this.vertices[this.pos + 2] = pt[3 * i + 2];\n this.pos += 3;\n }\n\n setind(i: number) {\n this.ind[this.ipos++] = i;\n }\n\n makePoly(coords: number[], color: number, ind: number): void {\n const ncoords: number[] = coords;\n for (let g = 1; 3 * (g + 1) < ncoords.length; g++) {\n this.add(ncoords, 0, color);\n this.add(ncoords, g, color);\n this.add(ncoords, g + 1, color);\n this.setind(ind);\n }\n }\n\n setAttributes(geo: BufferGeometry) {\n geo.setAttribute(\"position\", new BufferAttribute(this.vertices, 3));\n // the geometry only needs the first half of the array\n const sa2 = this.colors.subarray(0, 9 * this.sz);\n geo.setAttribute(\"color\", new BufferAttribute(sa2, 3, true));\n }\n\n makeGroups(geo: BufferGeometry) {\n geo.clearGroups();\n for (let i = 0; i < this.ipos; ) {\n const si = i++;\n const iv = this.ind[si];\n while (this.ind[i] === iv) {\n i++;\n }\n geo.addGroup(3 * si, 3 * (i - si), iv);\n }\n }\n\n saveOriginalColors() {\n this.colors.copyWithin(this.pos, 0, this.pos);\n }\n}\n\nclass StickerDef {\n private origColor: number;\n private origColorStickeringMask: number;\n private faceColor: number;\n private texturePtr?: StickerDef = undefined;\n public twistVal: number = -1;\n public stickerStart: number;\n public stickerEnd: number;\n public hintStart: number;\n public hintEnd: number;\n public foundationStart: number;\n public foundationEnd: number;\n private isDup: boolean;\n private faceNum: number;\n constructor(\n filler: Filler,\n stickerDat: StickerDatSticker,\n trim: number,\n options?: {\n stickeringMask?: ExperimentalFaceletMeshStickeringMask;\n },\n ) {\n this.isDup = !!stickerDat.isDup;\n this.faceNum = stickerDat.face;\n this.stickerStart = filler.ipos;\n const sdColor = new Color(stickerDat.color).getHex();\n this.origColor = sdColor;\n this.origColorStickeringMask = sdColor;\n if (options?.stickeringMask) {\n this.setStickeringMask(filler, options.stickeringMask);\n }\n this.faceColor = sdColor;\n const coords = this.stickerCoords(stickerDat.coords, trim);\n filler.makePoly(coords, this.faceColor, this.isDup ? 4 : 0);\n this.stickerEnd = filler.ipos;\n }\n\n private stickerCoords(coords: number[], trim: number): number[] {\n return trimEdges(coords.slice(), trim);\n }\n\n private hintCoords(\n coords: number[],\n hintStickerHeightScale: number,\n trim: number,\n normal: number[],\n ): number[] {\n coords = this.stickerCoords(coords, trim); // pick up trim from stickers\n normal = normal.slice();\n for (let i = 0; i < 3; i++) {\n normal[i] *= 0.5 * hintStickerHeightScale;\n }\n const hCoords = new Array<number>(coords.length);\n for (let i = 0; 3 * i < coords.length; i++) {\n const j = coords.length / 3 - 1 - i;\n hCoords[3 * i] = coords[3 * j] + normal[0];\n hCoords[3 * i + 1] = coords[3 * j + 1] + normal[1];\n hCoords[3 * i + 2] = coords[3 * j + 2] + normal[2];\n }\n return hCoords;\n }\n\n private foundationCoords(coords: number[]): number[] {\n const ncoords = coords.slice();\n for (let i = 0; i < coords.length; i++) {\n ncoords[i] = coords[i] * 0.999;\n }\n return ncoords;\n }\n\n addHint(\n filler: Filler,\n stickerDat: StickerDatSticker,\n hintStickers: boolean,\n hintStickerHeightScale: number,\n trim: number,\n normal: number[],\n ): void {\n this.hintStart = filler.ipos;\n const coords = this.hintCoords(\n stickerDat.coords,\n hintStickerHeightScale,\n trim,\n normal,\n );\n filler.makePoly(\n coords,\n this.faceColor,\n hintStickers && !this.isDup ? 2 : 4,\n );\n this.hintEnd = filler.ipos;\n }\n\n public addFoundation(\n filler: Filler,\n stickerDat: StickerDatSticker,\n black: number,\n ) {\n this.foundationStart = filler.ipos;\n const coords = this.foundationCoords(stickerDat.coords);\n filler.makePoly(coords, black, this.isDup ? 4 : 6);\n this.foundationEnd = filler.ipos;\n }\n\n private setHintStickers(filler: Filler, hintStickers: boolean): void {\n const indv = this.isDup || !hintStickers ? 4 : 2;\n for (let i = this.hintStart; i < this.hintEnd; i++) {\n filler.ind[i] = indv | (filler.ind[i] & 1);\n }\n }\n\n setStickeringMask(\n filler: Filler,\n faceletMeshStickeringMask: ExperimentalFaceletMeshStickeringMask,\n ): void {\n let c = 0;\n switch (faceletMeshStickeringMask) {\n case \"regular\": {\n c = this.origColor;\n break;\n }\n case \"dim\": {\n if (this.origColor === 0xffffff) {\n c = 0xdddddd;\n } else {\n c = new Color(this.origColor).multiplyScalar(0.5).getHex();\n }\n break;\n }\n case \"oriented\": {\n c = 0xff88ff;\n break;\n }\n case \"ignored\": {\n c = 0x444444;\n break;\n }\n case \"invisible\":\n c = this.origColor;\n }\n this.origColorStickeringMask = c;\n for (let i = 9 * this.stickerStart; i < 9 * this.stickerEnd; i += 3) {\n filler.colors[filler.pos + i] = c >> 16;\n filler.colors[filler.pos + i + 1] = (c >> 8) & 255;\n filler.colors[filler.pos + i + 2] = c & 255;\n }\n for (let i = 9 * this.hintStart; i < 9 * this.hintEnd; i += 3) {\n filler.colors[filler.pos + i] = c >> 16;\n filler.colors[filler.pos + i + 1] = (c >> 8) & 255;\n filler.colors[filler.pos + i + 2] = c & 255;\n }\n this.setHintStickers(\n filler,\n faceletMeshStickeringMask !== \"invisible\" && !this.isDup,\n );\n }\n\n public addUVs(filler: Filler): void {\n const uvs = filler.uvs!;\n const vert = filler.vertices;\n const coords = new Array(3);\n for (let i = 3 * this.stickerStart; i < 3 * this.stickerEnd; i++) {\n coords[0] = vert[3 * i];\n coords[1] = vert[3 * i + 1];\n coords[2] = vert[3 * i + 2];\n const uv = filler.tm.getuv(this.faceNum, coords);\n uvs[2 * i] = uv[0];\n uvs[2 * i + 1] = uv[1];\n }\n for (let i = 3 * this.hintStart; i < 3 * this.hintEnd; i++) {\n coords[0] = vert[3 * i];\n coords[1] = vert[3 * i + 1];\n coords[2] = vert[3 * i + 2];\n const uv = filler.tm.getuv(this.faceNum, coords);\n uvs[2 * i] = uv[0];\n uvs[2 * i + 1] = uv[1];\n }\n }\n\n public setTexture(filler: Filler, sd: StickerDef): number {\n if (this.texturePtr === sd) {\n return 0;\n }\n this.texturePtr = sd;\n const sz = 6 * filler.sz;\n filler.uvs!.copyWithin(\n 6 * this.stickerStart,\n 6 * sd.stickerStart + sz,\n 6 * sd.stickerEnd + sz,\n );\n filler.uvs!.copyWithin(\n 6 * this.hintStart,\n 6 * sd.hintStart + sz,\n 6 * sd.hintEnd + sz,\n );\n return 1;\n }\n\n public setColor(filler: Filler, sd: StickerDef): number {\n const c = sd.origColorStickeringMask;\n if (this.faceColor !== c) {\n this.faceColor = c;\n const sz = filler.pos;\n filler.colors.copyWithin(\n 9 * this.stickerStart,\n 9 * sd.stickerStart + sz,\n 9 * sd.stickerEnd + sz,\n );\n filler.colors.copyWithin(\n 9 * this.hintStart,\n 9 * sd.hintStart + sz,\n 9 * sd.hintEnd + sz,\n );\n return 1;\n } else {\n return 0;\n }\n }\n}\n\nclass HitPlaneDef {\n public cubie: Group;\n private geo: BufferGeometry;\n constructor(hitface: any, tm: TextureMapper, stickerDat: StickerDat) {\n this.cubie = new Group();\n const coords = hitface.coords as number[];\n const filler = new Filler(coords.length / 3 - 2, tm);\n for (let g = 1; 3 * g + 3 < coords.length; g++) {\n filler.addUncolored(coords, 0);\n filler.addUncolored(coords, g);\n filler.addUncolored(coords, g + 1);\n }\n this.geo = new BufferGeometry();\n filler.setAttributes(this.geo);\n const obj = new Mesh(this.geo, invisMaterial);\n obj.userData.quantumMove = stickerDat.notationMapper.notationToExternal(\n new Move(hitface.name),\n );\n this.cubie.scale.setScalar(0.99);\n this.cubie.add(obj);\n }\n}\n\nclass AxisInfo {\n public axis: Vector3;\n public order: number;\n constructor(axisDat: StickerDatAxis) {\n const vec = axisDat.coordinates;\n this.axis = new Vector3(vec[0], vec[1], vec[2]);\n this.order = axisDat.order;\n }\n}\n\nexport interface PG3DOptions {\n stickeringMask?: ExperimentalStickeringMask;\n}\n\nconst DEFAULT_COLOR_FRACTION = 0.71;\nconst PG_SCALE = 0.5;\n\n// TODO: Split into \"scene model\" and \"view\".\n/*\n * PG3D uses a single geometry for the puzzle, with all the faces for\n * each sticker (including the foundation stickers) in a single\n * geometry. We use the materialIndex in the face to point to a\n * specific entry, which is either a colored sticker, invisible, or\n * black (foundation).\n *\n * To support general twisting of a subset of the puzzle, we then\n * instantiate this same geometry in two different meshes with two\n * distinct material arrays. One, the fixed mesh, has the material\n * array set up like: [colored, invisible, black, invisible].\n * The twisting mesh has the material array set up as\n * [invisible, colored, invislble, black]. When not twisted, the\n * two meshes are directly coincident, and the (shared) materialIndex\n * in each face points to a non-invisible material in exactly one of\n * the two meshes. When we decide to twist some cubies, we make\n * the cubies that move point to visible materials in the moving\n * mesh (which makes them point to invisible materials in the static\n * mesh). This way, we only need to rotate the moving mesh as a\n * single object---this should be very fast, and occur entirely in\n * the GPU. Unfortunately this doesn't quite work as fast as we'd\n * like because three.js makes a draw call every time we have a change\n * in the material index. By moving the foundation triangles separate\n * from the sticker triangles, we enhance the probability that many\n * triangles can be rendered in one call speeding up the render.\n * We also get some assistance from puzzleGeometry to try to keep\n * nearby stickers close to each other.\n */\nexport class PG3D extends Object3D implements Twisty3DPuzzle {\n private stickers: { [key: string]: StickerDef[][] };\n private axesInfo: { [key: string]: AxisInfo };\n\n private stickerTargets: Object3D[] = [];\n private controlTargets: Object3D[] = [];\n\n private movingObj: Object3D;\n private filler: Filler;\n private foundationBound: number; // before this: colored; after: black\n private fixedGeo: BufferGeometry;\n private lastPos: PuzzlePosition;\n private lastMoveTransformation: KTransformation;\n private hintMaterial: Material;\n private stickerMaterial: Material;\n private materialArray1: Material[];\n private materialArray2: Material[];\n private textured: boolean = false;\n private showHintStickers: boolean = false;\n private showFoundations: boolean = false;\n private hintMaterialDisposable: boolean;\n private stickerMaterialDisposable: boolean;\n\n #pendingStickeringUpdate: boolean = false;\n\n public isPG3DForTwisty3DPuzzleWrapper: true;\n\n constructor(\n private scheduleRenderCallback: () => void,\n private kpuzzle: KPuzzle,\n private stickerDat: StickerDat,\n enableFoundationOpt: boolean = false,\n enableHintStickersOpt: boolean = false,\n hintStickerHeightScale: number = 1,\n private faceletScale: \"auto\" | number = 1,\n private params: PG3DOptions = {},\n ) {\n super();\n if (stickerDat.stickers.length === 0) {\n throw Error(\"Reuse of stickerdat from pg; please don't do that.\");\n }\n this.hintMaterial = new MeshBasicMaterial({\n vertexColors: true,\n transparent: true,\n opacity: 0.5,\n });\n this.hintMaterialDisposable = true;\n this.stickerMaterial = basicStickerMaterial;\n this.stickerMaterialDisposable = false;\n this.axesInfo = {};\n const axesDef = this.stickerDat.axis;\n for (const axis of axesDef) {\n this.axesInfo[axis.quantumMove.family] = new AxisInfo(axis);\n }\n const stickers = this.stickerDat.stickers as any[];\n this.stickers = {};\n this.materialArray1 = new Array(8);\n this.materialArray2 = new Array(8);\n // TODO: the argument enableFoundationOpt really means, do we ever want to display\n // foundations. But it is presently *used* to mean, show foundations initially\n // (and maybe setStickeringMask changes this). So for now we set up the\n // show flag from the enable flag, and turn on the enable flag so later when it's\n // used we will get the foundations. What this means is the geometry always \"pays\"\n // for foundations, even if they aren't displayed.\n this.showFoundation(enableFoundationOpt);\n enableFoundationOpt = true;\n let triangleCount = 0;\n const multiplier = 3;\n for (const sticker of stickers) {\n const sides = sticker.coords.length / 3;\n triangleCount += multiplier * (sides - 2);\n }\n const filler = new Filler(triangleCount, stickerDat.textureMapper);\n const black = 0;\n const normals: number[][] = [];\n let totArea = 0;\n for (const f of stickerDat.faces) {\n normals.push(normal(f.coords));\n totArea += polyarea(f.coords);\n }\n const colorfrac =\n faceletScale !== \"auto\"\n ? faceletScale * faceletScale\n : DEFAULT_COLOR_FRACTION;\n let nonDupStickers = 0;\n for (const sticker of stickers) {\n if (!sticker.isDup) {\n nonDupStickers++;\n }\n }\n const trim =\n (Math.sqrt(totArea / nonDupStickers) * (1 - Math.sqrt(colorfrac))) / 2;\n for (const sticker of stickers) {\n const orbit = sticker.orbit;\n const ord = sticker.ord;\n const ori = sticker.ori;\n if (!this.stickers[orbit]) {\n this.stickers[orbit] = [];\n }\n if (!this.stickers[orbit][ori]) {\n this.stickers[orbit][ori] = [];\n }\n const options: {\n stickeringMask?: ExperimentalFaceletMeshStickeringMask;\n } = {};\n if (params.stickeringMask) {\n options.stickeringMask = experimentalGetFaceletStickeringMask(\n params.stickeringMask,\n orbit,\n ord,\n ori,\n false,\n );\n }\n const stickerdef = new StickerDef(filler, sticker, trim, options);\n this.stickers[orbit][ori][ord] = stickerdef;\n }\n // TODO: the argument enableHintStickersOpt really means, do we ever want to display\n // hint stickers. But it is presently *used* to mean, show hint stickers initially\n // (and maybe setStickeringMask changes this). So for now we set up the\n // show flag from the enable flag, and turn on the enable flag so later when it's\n // used we will get the hint stickers. What this means is the geometry always \"pays\"\n // for hint stickers, even if they aren't displayed.\n this.showHintStickers = enableHintStickersOpt;\n enableHintStickersOpt = true;\n for (const sticker of stickers) {\n const orbit = sticker.orbit;\n const ord = sticker.ord;\n const ori = sticker.ori;\n this.stickers[orbit][ori][ord].addHint(\n filler,\n sticker,\n enableHintStickersOpt,\n hintStickerHeightScale,\n trim,\n normals[sticker.face],\n );\n }\n this.foundationBound = filler.ipos;\n for (const sticker of stickers) {\n const orbit = sticker.orbit;\n const ord = sticker.ord;\n const ori = sticker.ori;\n if (enableFoundationOpt) {\n this.stickers[orbit][ori][ord].addFoundation(filler, sticker, black);\n }\n }\n const fixedGeo = new BufferGeometry();\n filler.setAttributes(fixedGeo);\n filler.makeGroups(fixedGeo);\n const obj = new Mesh(fixedGeo, this.materialArray1);\n obj.scale.set(PG_SCALE, PG_SCALE, PG_SCALE);\n this.add(obj);\n const obj2 = new Mesh(fixedGeo, this.materialArray2);\n obj2.scale.set(PG_SCALE, PG_SCALE, PG_SCALE);\n this.add(obj2);\n const hitfaces = this.stickerDat.faces as any[];\n this.movingObj = obj2;\n this.fixedGeo = fixedGeo;\n this.filler = filler;\n for (const hitface of hitfaces) {\n const facedef = new HitPlaneDef(\n hitface,\n stickerDat.textureMapper,\n this.stickerDat,\n );\n facedef.cubie.scale.set(PG_SCALE, PG_SCALE, PG_SCALE);\n this.add(facedef.cubie);\n this.controlTargets.push(facedef.cubie.children[0]);\n }\n filler.saveOriginalColors();\n stickerDat.stickers = []; // don't need these anymore\n this.updateMaterialArrays();\n /*\n this.experimentalUpdateTexture(\n true,\n new TextureLoader().load(\n \"/experiments.cubing.net/cubing.js/twisty/mkbhd-sprite-red.png\",\n ),\n new TextureLoader().load(\n \"/experiments.cubing.net/cubing.js/twisty/mkbhd-sprite-red-hint.png\",\n ),\n );\n */\n }\n\n public dispose(): void {\n if (this.fixedGeo) {\n this.fixedGeo.dispose();\n }\n if (this.stickerMaterialDisposable) {\n this.stickerMaterial.dispose();\n this.stickerMaterial = basicStickerMaterial;\n this.stickerMaterialDisposable = false;\n }\n if (this.hintMaterialDisposable) {\n this.hintMaterial.dispose();\n this.hintMaterial = basicStickerMaterial;\n this.hintMaterialDisposable = false;\n }\n }\n\n public experimentalGetStickerTargets(): Object3D[] {\n return this.stickerTargets;\n }\n\n public experimentalGetControlTargets(): Object3D[] {\n return this.controlTargets;\n }\n\n #isValidMove(move: Move): boolean {\n try {\n this.kpuzzle.moveToTransformation(move);\n return true;\n } catch (_) {\n return false;\n }\n }\n\n getClosestMoveToAxis(\n point: Vector3,\n transformations: {\n invert: boolean;\n depth?: \"secondSlice\" | \"rotation\" | \"none\";\n },\n ): { move: Move; order: number } | null {\n let closestMove: Move | null = null;\n let closestMoveDotProduct: number = 0;\n\n let modify: (move: Move) => Move = (m) => m;\n switch (transformations.depth) {\n case \"secondSlice\": {\n modify = (m: Move) => m.modified({ innerLayer: 2 });\n break;\n }\n case \"rotation\": {\n modify = (m: Move) => m.modified({ family: `${m.family}v` });\n break;\n }\n }\n\n for (const axis of this.stickerDat.axis) {\n const product = point.dot(new Vector3(...axis.coordinates));\n if (product > closestMoveDotProduct) {\n const modified = this.stickerDat.notationMapper.notationToExternal(\n modify(axis.quantumMove),\n );\n if (!modified) {\n continue;\n }\n if (this.#isValidMove(modified)) {\n closestMoveDotProduct = product;\n closestMove = modified;\n }\n }\n }\n\n if (!closestMove) {\n return null;\n }\n\n if (transformations.invert) {\n closestMove = closestMove.invert();\n }\n const order = this.kpuzzle\n .moveToTransformation(closestMove)\n .repetitionOrder();\n return { move: closestMove, order }; // TODO: push this down\n }\n\n setStickeringMask(stickeringMask: ExperimentalStickeringMask): void {\n this.params.stickeringMask = stickeringMask;\n if (stickeringMask.specialBehaviour !== \"picture\") {\n for (const orbitName in this.kpuzzle.definition.orbits) {\n const { numPieces, numOrientations: orientations } =\n this.kpuzzle.definition.orbits[orbitName];\n for (let pieceIdx = 0; pieceIdx < numPieces; pieceIdx++) {\n for (let faceletIdx = 0; faceletIdx < orientations; faceletIdx++) {\n const faceletStickeringMask = experimentalGetFaceletStickeringMask(\n stickeringMask,\n orbitName,\n pieceIdx,\n faceletIdx,\n false,\n );\n const stickerDef = this.stickers[orbitName][faceletIdx][pieceIdx];\n if (\n this.textured &&\n this.hintMaterialDisposable &&\n faceletStickeringMask === \"invisible\"\n ) {\n // ignore \"invisible\" if textured hints\n } else {\n stickerDef.setStickeringMask(this.filler, faceletStickeringMask);\n }\n }\n }\n }\n }\n this.#pendingStickeringUpdate = true;\n if (this.lastPos) {\n this.onPositionChange(this.lastPos);\n }\n }\n\n public onPositionChange(p: PuzzlePosition): void {\n const transformation = p.state.experimentalToTransformation();\n if (!transformation) {\n throw new Error(\"indistinguishable pieces are not supported by PG3D yet\");\n }\n const noRotation = new Euler();\n this.movingObj.rotation.copy(noRotation);\n let colormods = 0;\n const filler = this.filler;\n const ind = filler.ind;\n if (\n !this.lastPos ||\n this.#pendingStickeringUpdate ||\n !this.lastPos.state\n .experimentalToTransformation()!\n .isIdentical(transformation)\n ) {\n for (const orbit in this.stickers) {\n const pieces = this.stickers[orbit];\n const pos2 = transformation.transformationData[orbit];\n const orin = pieces.length;\n if (orin === 1) {\n const pieces2 = pieces[0];\n for (let i = 0; i < pieces2.length; i++) {\n const ni = pos2.permutation[i];\n if (this.textured) {\n colormods += pieces2[i].setTexture(filler, pieces2[ni]);\n } else {\n colormods += pieces2[i].setColor(filler, pieces2[ni]);\n }\n }\n } else {\n for (let ori = 0; ori < orin; ori++) {\n const pieces2 = pieces[ori];\n for (let i = 0; i < pieces2.length; i++) {\n const nori = (ori + orin - pos2.orientation[i]) % orin;\n const ni = pos2.permutation[i];\n if (this.textured) {\n colormods += pieces2[i].setTexture(filler, pieces[nori][ni]);\n } else {\n colormods += pieces2[i].setColor(filler, pieces[nori][ni]);\n }\n }\n }\n }\n }\n this.lastPos = p;\n }\n let vismods = 0;\n for (const moveProgress of p.movesInProgress) {\n const externalMove = moveProgress.move;\n // TODO: unswizzle goes external to internal, and so does the call after that\n // and so does the stateForBlockMove call\n const unswizzled = this.stickerDat.unswizzle(externalMove);\n if (!unswizzled) {\n // bad times, but let's not throw.\n return;\n }\n\n const move = externalMove;\n let quantumTransformation;\n try {\n quantumTransformation = this.kpuzzle.moveToTransformation(\n move.modified({ amount: 1 }),\n );\n } catch (e) {\n // couldn't get it from a quantum of the external move. Let's try\n // getting it from a quantum of the internal move, translated back\n // to external so we can get the transformation. This happens for\n // instance when working with \"x2\" on megaminx.\n const move1 = this.stickerDat.notationMapper.notationToInternal(move);\n if (move1) {\n const move2 = this.stickerDat.notationMapper.notationToExternal(\n move1.modified({ amount: 1 }),\n );\n if (move2) {\n quantumTransformation = this.kpuzzle.moveToTransformation(move2);\n }\n }\n if (!quantumTransformation) {\n console.log(e);\n throw e;\n }\n }\n const ax = this.axesInfo[unswizzled.family];\n const turnNormal = ax.axis;\n const angle =\n (-this.ease(moveProgress.fraction) *\n moveProgress.direction *\n unswizzled.amount *\n TAU) /\n ax.order;\n this.movingObj.rotateOnAxis(turnNormal, angle);\n if (this.lastMoveTransformation !== quantumTransformation) {\n for (const orbit in this.stickers) {\n const pieces = this.stickers[orbit];\n const orin = pieces.length;\n const bmv = quantumTransformation.transformationData[orbit];\n for (let ori = 0; ori < orin; ori++) {\n const pieces2 = pieces[ori];\n for (let i = 0; i < pieces2.length; i++) {\n const p2 = pieces2[i];\n const ni = bmv.permutation[i];\n let tv = 0;\n if (ni !== i || bmv.orientation[i] !== 0) {\n tv = 1;\n }\n if (tv !== p2.twistVal) {\n if (tv) {\n for (let j = p2.stickerStart; j < p2.stickerEnd; j++) {\n ind[j] |= 1;\n }\n for (let j = p2.hintStart; j < p2.hintEnd; j++) {\n ind[j] |= 1;\n }\n for (let j = p2.foundationStart; j < p2.foundationEnd; j++) {\n ind[j] |= 1;\n }\n } else {\n for (let j = p2.stickerStart; j < p2.stickerEnd; j++) {\n ind[j] &= ~1;\n }\n for (let j = p2.hintStart; j < p2.hintEnd; j++) {\n ind[j] &= ~1;\n }\n for (let j = p2.foundationStart; j < p2.foundationEnd; j++) {\n ind[j] &= ~1;\n }\n }\n p2.twistVal = tv;\n vismods++;\n }\n }\n }\n }\n this.lastMoveTransformation = quantumTransformation;\n }\n }\n if (this.#pendingStickeringUpdate || vismods) {\n this.filler.makeGroups(this.fixedGeo);\n }\n if (this.#pendingStickeringUpdate || colormods) {\n if (this.textured) {\n (this.fixedGeo.getAttribute(\"uv\") as BufferAttribute).updateRange = {\n offset: 0,\n count: 6 * this.foundationBound,\n };\n (\n this.fixedGeo.getAttribute(\"uv\") as BufferAttribute\n ).needsUpdate = true;\n }\n if (this.#pendingStickeringUpdate || !this.textured) {\n (this.fixedGeo.getAttribute(\"color\") as BufferAttribute).updateRange = {\n offset: 0,\n count: 9 * this.foundationBound,\n };\n (\n this.fixedGeo.getAttribute(\"color\") as BufferAttribute\n ).needsUpdate = true;\n }\n }\n this.scheduleRenderCallback();\n this.#pendingStickeringUpdate = false;\n }\n\n private ease(fraction: number): number {\n return smootherStep(fraction);\n }\n\n private showHintFacelets(v: boolean) {\n this.showHintStickers = v;\n }\n\n private updateMaterialArrays() {\n for (let i = 0; i < 8; i++) {\n this.materialArray1[i] = invisMaterial;\n this.materialArray2[i] = invisMaterial;\n }\n this.materialArray1[0] = this.stickerMaterial;\n this.materialArray2[1] = this.stickerMaterial;\n if (this.showHintStickers) {\n this.materialArray1[2] = this.hintMaterial;\n this.materialArray2[3] = this.hintMaterial;\n } else {\n this.materialArray1[2] = invisMaterial;\n this.materialArray2[3] = invisMaterial;\n }\n if (this.showFoundations) {\n this.materialArray1[6] = foundationMaterial;\n this.materialArray2[7] = foundationMaterial;\n } else {\n this.materialArray1[6] = invisMaterial;\n this.materialArray2[7] = invisMaterial;\n }\n }\n\n private showFoundation(v: boolean) {\n this.showFoundations = v;\n }\n\n private setHintStickerOpacity(v: number): void {\n if (this.hintMaterialDisposable) {\n this.hintMaterial.dispose();\n this.hintMaterialDisposable = false;\n }\n if (v === 0) {\n this.hintMaterial = invisMaterial;\n } else if (v === 1) {\n this.hintMaterial = this.stickerMaterial;\n } else {\n this.hintMaterial = new MeshBasicMaterial({\n vertexColors: true,\n transparent: true,\n opacity: v,\n });\n this.hintMaterialDisposable = true;\n }\n }\n\n public experimentalUpdateOptions(options: {\n showMainStickers?: boolean;\n hintFacelets?: HintFaceletStyle;\n showFoundation?: boolean; // TODO: better name\n hintStickerOpacity?: number;\n faceletScale?: \"auto\" | number;\n }): void {\n if (options.hintFacelets !== undefined) {\n this.showHintFacelets(options.hintFacelets !== \"none\");\n }\n if (options.showFoundation !== undefined) {\n this.showFoundation(options.showFoundation);\n }\n if (options.hintStickerOpacity !== undefined) {\n this.setHintStickerOpacity(options.hintStickerOpacity);\n }\n this.#pendingStickeringUpdate = true;\n if (this.lastPos) {\n this.onPositionChange(this.lastPos);\n }\n if (\n typeof options.faceletScale !== \"undefined\" &&\n options.faceletScale !== this.faceletScale\n ) {\n console.warn(\n \"Dynamic facelet scale is not yet supported for PG3D. For now, re-create the TwistyPlayer to change the facelet scale.\",\n );\n }\n this.updateMaterialArrays();\n this.scheduleRenderCallback();\n }\n\n private adduvs() {\n const filler = this.filler;\n if (filler.uvs) {\n return;\n }\n this.filler.uvs = new Float32Array(12 * filler.sz);\n for (const orbit in this.stickers) {\n const pieces = this.stickers[orbit];\n const orin = pieces.length;\n for (let ori = 0; ori < orin; ori++) {\n const pieces2 = pieces[ori];\n for (const piece2 of pieces2) {\n piece2.addUVs(this.filler);\n }\n }\n }\n filler.uvs!.copyWithin(6 * filler.sz, 0, 6 * filler.sz);\n const sa1 = filler.uvs!.subarray(0, 6 * filler.sz);\n this.fixedGeo.setAttribute(\"uv\", new BufferAttribute(sa1, 2, true));\n }\n\n public experimentalUpdateTexture(\n enabled: boolean,\n stickerTexture?: Texture | null,\n hintTexture?: Texture | null,\n ) {\n if (!stickerTexture) {\n enabled = false;\n }\n if (enabled && !this.filler.uvs) {\n this.adduvs();\n }\n this.textured = enabled;\n if (this.stickerMaterialDisposable) {\n this.stickerMaterial.dispose();\n this.stickerMaterialDisposable = false;\n }\n if (enabled) {\n this.stickerMaterial = new MeshBasicMaterial({\n map: stickerTexture,\n side: FrontSide,\n transparent: false,\n });\n this.stickerMaterialDisposable = true;\n } else {\n this.stickerMaterial = basicStickerMaterial;\n }\n if (this.hintMaterialDisposable) {\n this.hintMaterial.dispose();\n this.hintMaterialDisposable = false;\n }\n if (enabled) {\n this.hintMaterial = new MeshBasicMaterial({\n map: hintTexture,\n side: FrontSide,\n transparent: true,\n });\n this.hintMaterialDisposable = true;\n } else {\n this.hintMaterial = basicStickerMaterial;\n }\n if (enabled) {\n this.showHintFacelets(hintTexture !== null);\n }\n this.updateMaterialArrays();\n this.#pendingStickeringUpdate = true;\n if (this.lastPos) {\n this.onPositionChange(this.lastPos);\n }\n this.scheduleRenderCallback();\n }\n}\n", "import { cube3x3x3, PuzzleLoader } from \"../../../puzzles\";\nimport type { HintFaceletStyle } from \"../../model/props/puzzle/display/HintFaceletProp\";\nimport type { FaceletScale } from \"../../model/props/puzzle/display/FaceletScaleProp\";\nimport { Cube3D, Cube3DOptions } from \"../../views/3D/puzzles/Cube3D\";\nimport { PG3D } from \"../../views/3D/puzzles/PG3D\";\n\n// Mangled to avoid autocompleting.\n// This must not be imported directly.\nexport * as T3I from \"three\";\nexport { Cube3D } from \"../../views/3D/puzzles/Cube3D\";\nexport { PG3D } from \"../../views/3D/puzzles/PG3D\";\nexport { Twisty3DScene } from \"../../views/3D/Twisty3DScene\";\n\nexport async function cube3DShim(\n renderCallback: () => void,\n options?: Cube3DOptions,\n): Promise<Cube3D> {\n return new Cube3D(await cube3x3x3.kpuzzle(), renderCallback, options);\n}\n\n// TODO: take loader?\nexport async function pg3dShim(\n renderCallback: () => void,\n puzzleLoader: PuzzleLoader,\n hintFacelets: HintFaceletStyle,\n faceletScale: FaceletScale,\n): Promise<PG3D> {\n return new PG3D(\n renderCallback,\n await puzzleLoader.kpuzzle(),\n (await puzzleLoader.pg!()).get3d(),\n true,\n hintFacelets === \"floating\",\n undefined,\n faceletScale,\n );\n}\n", "import type { Scene as ThreeScene } from \"three\";\nimport { THREEJS } from \"../../heavy-code-imports/3d\";\nimport type { Twisty3DPuzzle } from \"./puzzles/Twisty3DPuzzle\";\nimport type { Twisty3DRenderTarget } from \"./Twisty3DRenderTarget\";\n\nexport class Twisty3DScene implements Twisty3DRenderTarget {\n private renderTargets: Set<Twisty3DRenderTarget> = new Set();\n public twisty3Ds: Set<Twisty3DPuzzle> = new Set();\n\n threeJSScene: Promise<ThreeScene> = (async () =>\n new (await THREEJS).Scene())();\n constructor() {}\n\n addRenderTarget(renderTarget: Twisty3DRenderTarget): void {\n this.renderTargets.add(renderTarget);\n }\n\n scheduleRender(): void {\n for (const renderTarget of this.renderTargets) {\n renderTarget.scheduleRender();\n }\n }\n\n async addTwisty3DPuzzle(twisty3DPuzzle: Twisty3DPuzzle): Promise<void> {\n this.twisty3Ds.add(twisty3DPuzzle);\n (await this.threeJSScene).add(twisty3DPuzzle);\n // TODO: scheduleRender?\n }\n\n async removeTwisty3DPuzzle(twisty3DPuzzle: Twisty3DPuzzle): Promise<void> {\n this.twisty3Ds.delete(twisty3DPuzzle);\n (await this.threeJSScene).remove(twisty3DPuzzle);\n // TODO: scheduleRender?\n }\n\n async clearPuzzles(): Promise<void> {\n for (const puz of this.twisty3Ds) {\n (await this.threeJSScene).remove(puz);\n }\n this.twisty3Ds.clear();\n // TODO: scheduleRender?\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["r", "stickeringMask", "BufferAttribute", "BufferGeometry", "DoubleSide", "Euler", "Group", "Mesh", "MeshBasicMaterial", "Object3D", "Vector3", "MeshBasicMaterial", "DoubleSide", "r", "face", "t", "BufferAttribute", "normal", "Group", "BufferGeometry", "Mesh", "AxisInfo", "Vector3", "Object3D", "Euler"]
7
+ }
@@ -3,10 +3,6 @@ import { g as PuzzleSpecificSimplifyOptions, M as Move, a as Alg, P as Pause, h
3
3
  import { P as Parsed } from './parseAlg-2dd4194b.js';
4
4
  import { a as KPuzzle, j as PuzzleGeometry, K as KState, e as KTransformation, w as PuzzleDescriptionString } from './KState-0da22515.js';
5
5
 
6
- declare const experimentalStickerings: Record<string, {
7
- groups?: Partial<Record<PuzzleID, string>>;
8
- }>;
9
-
10
6
  declare type FaceletMeshStickeringMask = "regular" | "dim" | "oriented" | "ignored" | "invisible";
11
7
  declare type FaceletStickeringMask = {
12
8
  mask: FaceletMeshStickeringMask;
@@ -38,8 +34,13 @@ interface PuzzleLoader {
38
34
  stickeringMask?: (stickering: ExperimentalStickering) => Promise<StickeringMask>;
39
35
  stickerings?: () => Promise<ExperimentalStickering[]>;
40
36
  puzzleSpecificSimplifyOptions?: PuzzleSpecificSimplifyOptions;
37
+ puzzleSpecificSimplifyOptionsPromise?: Promise<PuzzleSpecificSimplifyOptions>;
41
38
  }
42
39
 
40
+ declare const experimentalStickerings: Record<string, {
41
+ groups?: Partial<Record<PuzzleID, string>>;
42
+ }>;
43
+
43
44
  declare type MillisecondTimestamp = number;
44
45
  declare type Duration = MillisecondTimestamp;
45
46
  declare type Timestamp = MillisecondTimestamp;
@@ -72,7 +73,7 @@ interface UserVisibleError {
72
73
  declare class UserVisibleErrorTracker extends SimpleTwistyPropSource<UserVisibleError> {
73
74
  getDefaultValue(): UserVisibleError;
74
75
  reset(): void;
75
- canReuseValue(_v1: UserVisibleError, _v2: UserVisibleError): boolean;
76
+ protected canReuseValue(_v1: UserVisibleError, _v2: UserVisibleError): boolean;
76
77
  }
77
78
 
78
79
  declare type InputRecord = {};
@@ -90,7 +91,7 @@ declare abstract class TwistyPropParent<T> {
90
91
  #private;
91
92
  abstract get(): Promise<T>;
92
93
  canReuse(v1: T, v2: T): boolean;
93
- canReuseValue(_v1: T, _v2: T): boolean;
94
+ protected canReuseValue(_v1: T, _v2: T): boolean;
94
95
  debugGetChildren(): TwistyPropDerived<any, any>[];
95
96
  protected addChild(child: TwistyPropDerived<any, any>): void;
96
97
  protected removeChild(child: TwistyPropDerived<any, any>): void;
@@ -111,11 +112,11 @@ declare abstract class TwistyPropSource<OutputType, InputType = OutputType> exte
111
112
  constructor(initialValue?: PromiseOrValue<InputType>);
112
113
  set(input: PromiseOrValue<InputType>): void;
113
114
  get(): Promise<OutputType>;
114
- deriveFromPromiseOrValue(input: PromiseOrValue<InputType>, oldValuePromise: Promise<OutputType>): Promise<OutputType>;
115
+ protected deriveFromPromiseOrValue(input: PromiseOrValue<InputType>, oldValuePromise: Promise<OutputType>): Promise<OutputType>;
115
116
  protected abstract derive(input: InputType, oldValuePromise: Promise<OutputType>): PromiseOrValue<OutputType>;
116
117
  }
117
118
  declare abstract class SimpleTwistyPropSource<SimpleType> extends TwistyPropSource<SimpleType> {
118
- derive(input: SimpleType): PromiseOrValue<SimpleType>;
119
+ protected derive(input: SimpleType): PromiseOrValue<SimpleType>;
119
120
  }
120
121
  declare const NO_VALUE: unique symbol;
121
122
  declare type NoValueType = typeof NO_VALUE;
@@ -136,8 +137,8 @@ interface PlayingInfo {
136
137
  }
137
138
  declare class PlayingInfoProp extends TwistyPropSource<PlayingInfo, Partial<PlayingInfo>> {
138
139
  getDefaultValue(): Promise<PlayingInfo>;
139
- derive(newInfo: Partial<PlayingInfo>, oldValuePromise: Promise<PlayingInfo>): Promise<PlayingInfo>;
140
- canReuseValue(v1: PlayingInfo, v2: PlayingInfo): boolean;
140
+ protected derive(newInfo: Partial<PlayingInfo>, oldValuePromise: Promise<PlayingInfo>): Promise<PlayingInfo>;
141
+ protected canReuseValue(v1: PlayingInfo, v2: PlayingInfo): boolean;
141
142
  }
142
143
 
143
144
  declare class ArbitraryStringProp extends SimpleTwistyPropSource<string | null> {
@@ -169,8 +170,8 @@ interface AlgWithIssues {
169
170
  }
170
171
  declare class AlgProp extends TwistyPropSource<AlgWithIssues, Alg | string> {
171
172
  getDefaultValue(): AlgWithIssues;
172
- canReuseValue(v1: AlgWithIssues, v2: AlgWithIssues): boolean;
173
- derive(newAlg: Alg | string): Promise<AlgWithIssues>;
173
+ protected canReuseValue(v1: AlgWithIssues, v2: AlgWithIssues): boolean;
174
+ protected derive(newAlg: Alg | string): Promise<AlgWithIssues>;
174
175
  }
175
176
 
176
177
  declare type AlgTransformationPropInputs = {
@@ -237,7 +238,7 @@ interface CatchUpMove {
237
238
  }
238
239
  declare class CatchUpMoveProp extends SimpleTwistyPropSource<CatchUpMove> {
239
240
  getDefaultValue(): CatchUpMove;
240
- canReuseValue(v1: CatchUpMove, v2: CatchUpMove): boolean;
241
+ protected canReuseValue(v1: CatchUpMove, v2: CatchUpMove): boolean;
241
242
  }
242
243
 
243
244
  interface CurrentLeavesSimplifiedPropInputs {
@@ -249,8 +250,8 @@ interface CurrentLeavesSimplified {
249
250
  movesFinished: Move[];
250
251
  }
251
252
  declare class CurrentLeavesSimplifiedProp extends TwistyPropDerived<CurrentLeavesSimplifiedPropInputs, CurrentLeavesSimplified> {
252
- derive(inputs: CurrentLeavesSimplifiedPropInputs): CurrentLeavesSimplified;
253
- canReuse(v1: CurrentLeavesSimplified, v2: CurrentLeavesSimplified): boolean;
253
+ protected derive(inputs: CurrentLeavesSimplifiedPropInputs): CurrentLeavesSimplified;
254
+ protected canReuseValue(v1: CurrentLeavesSimplified, v2: CurrentLeavesSimplified): boolean;
254
255
  }
255
256
 
256
257
  declare const smartTimestamps: {
@@ -263,7 +264,7 @@ declare type TimestampRequest = MillisecondTimestamp | keyof typeof smartTimesta
263
264
  declare class TimestampRequestProp extends SimpleTwistyPropSource<TimestampRequest> {
264
265
  getDefaultValue(): TimestampRequest;
265
266
  set(v: TimestampRequest): void;
266
- validInput(v: TimestampRequest): boolean;
267
+ protected validInput(v: TimestampRequest): boolean;
267
268
  }
268
269
 
269
270
  interface DetailedTimelineInfoInputs {
@@ -279,8 +280,8 @@ interface DetailedTimelineInfo {
279
280
  }
280
281
  declare class DetailedTimelineInfoProp extends TwistyPropDerived<DetailedTimelineInfoInputs, DetailedTimelineInfo> {
281
282
  #private;
282
- derive(inputs: DetailedTimelineInfoInputs): DetailedTimelineInfo;
283
- canReuse(v1: DetailedTimelineInfo, v2: DetailedTimelineInfo): boolean;
283
+ protected derive(inputs: DetailedTimelineInfoInputs): DetailedTimelineInfo;
284
+ protected canReuseValue(v1: DetailedTimelineInfo, v2: DetailedTimelineInfo): boolean;
284
285
  }
285
286
 
286
287
  interface PositionPropInputs {
@@ -537,8 +538,8 @@ interface CoarseTimelineInfo {
537
538
  atEnd: boolean;
538
539
  }
539
540
  declare class CoarseTimelineInfoProp extends TwistyPropDerived<CoarseTimelineInfoInputs, CoarseTimelineInfo> {
540
- derive(inputs: CoarseTimelineInfoInputs): CoarseTimelineInfo;
541
- canReuseValue(v1: CoarseTimelineInfo, v2: CoarseTimelineInfo): boolean;
541
+ protected derive(inputs: CoarseTimelineInfoInputs): CoarseTimelineInfo;
542
+ protected canReuseValue(v1: CoarseTimelineInfo, v2: CoarseTimelineInfo): boolean;
542
543
  }
543
544
 
544
545
  declare class TempoScaleProp extends TwistyPropSource<number, number> {
@@ -622,6 +623,11 @@ declare class StickeringMaskRequestProp extends TwistyPropSource<StickeringMask
622
623
  derive(input: string | StickeringMask | null): StickeringMask | null;
623
624
  }
624
625
 
626
+ declare type FaceletScale = "auto" | number;
627
+ declare class FaceletScaleProp extends SimpleTwistyPropSource<FaceletScale> {
628
+ getDefaultValue(): FaceletScale;
629
+ }
630
+
625
631
  declare const dragInputModes: {
626
632
  auto: boolean;
627
633
  none: boolean;
@@ -664,8 +670,8 @@ interface OrbitCoordinates {
664
670
  declare type OrbitCoordinatesRequest = Partial<OrbitCoordinates> | "auto";
665
671
  declare class OrbitCoordinatesRequestProp extends TwistyPropSource<OrbitCoordinatesRequest, Partial<OrbitCoordinates> | "auto"> {
666
672
  getDefaultValue(): OrbitCoordinatesRequest;
667
- canReuseValue(v1: OrbitCoordinates, v2: OrbitCoordinates): boolean;
668
- derive(newCoordinates: Partial<OrbitCoordinates> | "auto", oldValuePromise: Promise<OrbitCoordinatesRequest>): Promise<OrbitCoordinatesRequest>;
673
+ protected canReuseValue(v1: OrbitCoordinates, v2: OrbitCoordinates): boolean;
674
+ protected derive(newCoordinates: Partial<OrbitCoordinates> | "auto", oldValuePromise: Promise<OrbitCoordinatesRequest>): Promise<OrbitCoordinatesRequest>;
669
675
  }
670
676
 
671
677
  declare class LatitudeLimitProp extends SimpleTwistyPropSource<CoordinateDegrees> {
@@ -698,6 +704,7 @@ declare class TwistySceneModel {
698
704
  orbitCoordinatesRequest: OrbitCoordinatesRequestProp;
699
705
  stickeringMaskRequest: StickeringMaskRequestProp;
700
706
  stickeringRequest: StickeringRequestProp;
707
+ faceletScale: FaceletScaleProp;
701
708
  foundationStickerSprite: SpriteProp;
702
709
  hintStickerSprite: SpriteProp;
703
710
  orbitCoordinates: OrbitCoordinatesProp;
@@ -705,6 +712,7 @@ declare class TwistySceneModel {
705
712
  constructor(twistyPlayerModel: TwistyPlayerModel);
706
713
  }
707
714
 
715
+ declare type Without<T, K extends string[]> = Pick<T, Exclude<keyof T, K[number]>>;
708
716
  declare class TwistyPlayerModel {
709
717
  userVisibleErrorTracker: UserVisibleErrorTracker;
710
718
  alg: AlgProp;
@@ -747,7 +755,10 @@ declare class TwistyPlayerModel {
747
755
  twistySceneModel: TwistySceneModel;
748
756
  twizzleLink(): Promise<string>;
749
757
  experimentalAddAlgLeaf(algLeaf: AlgLeaf, options?: AppendOptions): void;
750
- experimentalAddMove(flexibleMove: Move | string, options?: AppendOptions): void;
758
+ experimentalAddMove(flexibleMove: Move | string, options?: Without<AppendOptions, [
759
+ "puzzleLoader",
760
+ "puzzleSpecificSimplifyOptions"
761
+ ]>): void;
751
762
  experimentalRemoveFinalChild(): void;
752
763
  }
753
764
 
@@ -962,6 +973,8 @@ declare abstract class TwistyPlayerSettable extends ManagedCustomElement {
962
973
  get experimentalStickering(): never;
963
974
  set experimentalStickeringMaskOrbits(stickeringMask: string | StickeringMask);
964
975
  get experimentalStickeringMaskOrbits(): never;
976
+ set experimentalFaceletScale(faceletScale: FaceletScale);
977
+ get experimentalFaceletScale(): never;
965
978
  set backView(backView: BackViewLayoutWithAuto);
966
979
  get backView(): never;
967
980
  set background(backgroundTheme: BackgroundThemeWithAuto);
@@ -1,5 +1,5 @@
1
- import { P as PuzzleID, a as PuzzleLoader } from '../TwizzleLink-4d656916.js';
2
- export { a as PuzzleLoader } from '../TwizzleLink-4d656916.js';
1
+ import { P as PuzzleID, a as PuzzleLoader } from '../TwizzleLink-b28e5d4f.js';
2
+ export { a as PuzzleLoader } from '../TwizzleLink-b28e5d4f.js';
3
3
  import 'three';
4
4
  import '../Alg-8b4e9255.js';
5
5
  import '../parseAlg-2dd4194b.js';