@lewismoten/gamemaker-sandbox-tools 3.1.0 → 3.4.0
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.
- package/CHANGELOG.md +44 -0
- package/NOTICE.md +105 -3
- package/README.md +301 -15
- package/dist/audio-files.js +82 -0
- package/dist/audio.js +23 -138
- package/dist/block-merge.js +43 -0
- package/dist/color-reduce.js +44 -0
- package/dist/colors.js +87 -0
- package/dist/delta.js +75 -0
- package/dist/disk-diff.js +220 -0
- package/dist/drawing.js +83 -869
- package/dist/embroidery/compile.js +85 -0
- package/dist/embroidery/dst.js +79 -0
- package/dist/embroidery/exp.js +26 -0
- package/dist/embroidery/fill.js +49 -0
- package/dist/embroidery/geom.js +82 -0
- package/dist/embroidery/pes.js +79 -0
- package/dist/embroidery/satin.js +29 -0
- package/dist/embroidery/simulate.js +30 -0
- package/dist/embroidery/strokeFont.js +253 -0
- package/dist/embroidery/svg.js +24 -0
- package/dist/embroidery/types.js +13 -0
- package/dist/embroidery/units.js +26 -0
- package/dist/embroidery/validate.js +15 -0
- package/dist/formats/blocks.js +1 -103
- package/dist/formats/character.js +1 -83
- package/dist/formats/cmf.js +1 -37
- package/dist/formats/fli.js +1 -296
- package/dist/formats/fliLimits.js +1 -54
- package/dist/formats/game.js +1 -193
- package/dist/formats/gif.js +1 -125
- package/dist/formats/graphicScripts.js +1 -44
- package/dist/formats/map.js +1 -38
- package/dist/formats/monster.js +1 -69
- package/dist/formats/palette.js +1 -58
- package/dist/formats/recording.js +1 -17
- package/dist/formats/sound.js +1 -44
- package/dist/formats/voc.js +1 -303
- package/dist/gif-shrink.js +56 -0
- package/dist/image/png.js +42 -0
- package/dist/images.js +81 -43
- package/dist/kit/actors.js +19 -0
- package/dist/kit/align.js +204 -0
- package/dist/kit/blit.js +45 -0
- package/dist/kit/blockRoles.js +97 -0
- package/dist/kit/clips.js +40 -0
- package/dist/kit/coverPaint.js +18 -0
- package/dist/kit/disk.js +76 -0
- package/dist/kit/fadeOut.js +13 -0
- package/dist/kit/fliClips.js +133 -0
- package/dist/kit/fliShrink.js +277 -0
- package/dist/kit/gameSim.js +235 -0
- package/dist/kit/hopBot.js +142 -0
- package/dist/kit/levelGen.js +1423 -0
- package/dist/kit/levelGrid.js +33 -0
- package/dist/kit/levelPicture.js +27 -0
- package/dist/kit/menuVersion.js +19 -0
- package/dist/kit/microText.js +35 -0
- package/dist/kit/mumble.js +74 -0
- package/dist/kit/music.js +8 -0
- package/dist/kit/palRamps.js +32 -0
- package/dist/kit/palette.js +49 -0
- package/dist/kit/pcText.js +72 -0
- package/dist/kit/photo.js +150 -0
- package/dist/kit/pixels.js +79 -0
- package/dist/kit/png.js +40 -0
- package/dist/kit/quantize.js +72 -0
- package/dist/kit/raytrace.js +379 -0
- package/dist/kit/recordedDemo.js +10 -0
- package/dist/kit/reel.js +77 -0
- package/dist/kit/road3d.js +67 -0
- package/dist/kit/routeChecks.js +8 -0
- package/dist/kit/saveSlots.js +11 -0
- package/dist/kit/sceneInit.js +13 -0
- package/dist/kit/sceneSim.js +112 -0
- package/dist/kit/screenText.js +15 -0
- package/dist/kit/sdftext.js +237 -0
- package/dist/kit/shading.js +69 -0
- package/dist/kit/song.js +251 -0
- package/dist/kit/songFx.js +179 -0
- package/dist/kit/sound.js +52 -0
- package/dist/kit/synthParts.js +20 -0
- package/dist/kit/tar.js +53 -0
- package/dist/kit/textBounds.js +84 -0
- package/dist/kit/textfit.js +246 -0
- package/dist/kit/transforms.js +57 -0
- package/dist/kit/tune.js +21 -0
- package/dist/look-alike.js +50 -0
- package/dist/menu-version.js +4 -0
- package/dist/mesh/colorBodies.js +137 -0
- package/dist/mesh/decimate.js +207 -0
- package/dist/mesh/meshCheck.js +51 -0
- package/dist/mesh/overhang.js +41 -0
- package/dist/mesh/sampledField.js +12 -0
- package/dist/mesh/stl.js +36 -0
- package/dist/mesh/surfaceNets.js +79 -0
- package/dist/mesh/tetraMesh.js +62 -0
- package/dist/mesh/threeMf.js +58 -0
- package/dist/mesh/zipFile.js +52 -0
- package/dist/microFont.js +101 -0
- package/dist/music/compose.js +72 -0
- package/dist/pack/meshPack.js +198 -0
- package/dist/pack/threeMfPack.js +92 -0
- package/dist/palette-reserve.js +116 -0
- package/dist/palettes.js +138 -0
- package/dist/release-notes.js +40 -0
- package/dist/simulation.js +16 -2774
- package/dist/text.js +74 -0
- package/dist/types/audio.d.ts +4 -0
- package/dist/types/audioFiles.d.ts +22 -0
- package/dist/types/audioWav.d.ts +4 -0
- package/dist/types/blockMerge.d.ts +24 -0
- package/dist/types/colorReduce.d.ts +23 -0
- package/dist/types/{web/packages/tools/src/colors.d.ts → colors.d.ts} +6 -0
- package/dist/types/delta.d.ts +32 -0
- package/dist/types/diskDiff.d.ts +47 -0
- package/dist/types/drawing.d.ts +15 -0
- package/dist/types/embroidery/compile.d.ts +3 -0
- package/dist/types/embroidery/dst.d.ts +13 -0
- package/dist/types/embroidery/exp.d.ts +8 -0
- package/dist/types/embroidery/fill.d.ts +6 -0
- package/dist/types/embroidery/geom.d.ts +19 -0
- package/dist/types/embroidery/pes.d.ts +10 -0
- package/dist/types/embroidery/satin.d.ts +11 -0
- package/dist/types/embroidery/simulate.d.ts +19 -0
- package/dist/types/embroidery/strokeFont.d.ts +20 -0
- package/dist/types/embroidery/svg.d.ts +3 -0
- package/dist/types/embroidery/types.d.ts +70 -0
- package/dist/types/embroidery/units.d.ts +10 -0
- package/dist/types/embroidery/validate.d.ts +22 -0
- package/dist/types/formats/blocks.d.ts +1 -0
- package/dist/types/formats/character.d.ts +1 -0
- package/dist/types/formats/cmf.d.ts +1 -0
- package/dist/types/formats/fli.d.ts +1 -0
- package/dist/types/formats/fliLimits.d.ts +1 -0
- package/dist/types/formats/game.d.ts +1 -0
- package/dist/types/formats/gif.d.ts +1 -0
- package/dist/types/formats/graphicScripts.d.ts +1 -0
- package/dist/types/formats/map.d.ts +1 -0
- package/dist/types/formats/monster.d.ts +1 -0
- package/dist/types/formats/palette.d.ts +1 -0
- package/dist/types/formats/recording.d.ts +1 -0
- package/dist/types/formats/sound.d.ts +1 -0
- package/dist/types/formats/voc.d.ts +1 -0
- package/dist/types/gifShrink.d.ts +8 -0
- package/dist/types/image/animatedGif.d.ts +9 -0
- package/dist/types/image/surface.d.ts +26 -0
- package/dist/types/images.d.ts +13 -0
- package/dist/types/kit/actors.d.ts +7 -0
- package/dist/types/kit/align.d.ts +93 -0
- package/dist/types/kit/audioEvents.d.ts +26 -0
- package/dist/types/kit/blit.d.ts +20 -0
- package/dist/types/kit/blockRoles.d.ts +243 -0
- package/dist/types/{games/kit → kit}/clips.d.ts +1 -1
- package/dist/types/kit/coverPaint.d.ts +7 -0
- package/dist/types/kit/disk.d.ts +15 -0
- package/dist/types/kit/fadeOut.d.ts +12 -0
- package/dist/types/kit/fliClips.d.ts +32 -0
- package/dist/types/kit/fliShrink.d.ts +149 -0
- package/dist/types/{games/kit → kit}/gameSim.d.ts +9 -5
- package/dist/types/kit/hopBot.d.ts +72 -0
- package/dist/types/kit/laserClearance.d.ts +16 -0
- package/dist/types/kit/laserJoints.d.ts +39 -0
- package/dist/types/kit/laserLayout.d.ts +54 -0
- package/dist/types/kit/laserPixels.d.ts +52 -0
- package/dist/types/kit/laserPreview.d.ts +9 -0
- package/dist/types/kit/laserSvg.d.ts +35 -0
- package/dist/types/kit/levelGen/castle.d.ts +17 -0
- package/dist/types/kit/levelGen/dungeon.d.ts +11 -0
- package/dist/types/kit/levelGen/forest.d.ts +17 -0
- package/dist/types/kit/levelGen/furnish.d.ts +31 -0
- package/dist/types/kit/levelGen/grid.d.ts +46 -0
- package/dist/types/kit/levelGen/index.d.ts +138 -0
- package/dist/types/kit/levelGen/interior.d.ts +18 -0
- package/dist/types/kit/levelGen/jumpModel.d.ts +78 -0
- package/dist/types/kit/levelGen/needs.d.ts +44 -0
- package/dist/types/kit/levelGen/overworld.d.ts +21 -0
- package/dist/types/kit/levelGen/platform.d.ts +59 -0
- package/dist/types/kit/levelGen/platformCap.d.ts +13 -0
- package/dist/types/kit/levelGen/platformReach.d.ts +37 -0
- package/dist/types/kit/levelGen/props.d.ts +37 -0
- package/dist/types/kit/levelGen/town.d.ts +24 -0
- package/dist/types/kit/levelGrid.d.ts +16 -0
- package/dist/types/kit/levelPicture.d.ts +9 -0
- package/dist/types/kit/menuVersion.d.ts +7 -0
- package/dist/types/kit/microText.d.ts +18 -0
- package/dist/types/kit/mumble.d.ts +41 -0
- package/dist/types/kit/music.d.ts +1 -0
- package/dist/types/kit/palMerge.d.ts +10 -0
- package/dist/types/kit/palRamps.d.ts +28 -0
- package/dist/types/kit/pcText.d.ts +19 -0
- package/dist/types/kit/photo.d.ts +69 -0
- package/dist/types/kit/png.d.ts +7 -0
- package/dist/types/kit/quantize.d.ts +20 -0
- package/dist/types/kit/raytrace.d.ts +169 -0
- package/dist/types/kit/recordedDemo.d.ts +1 -0
- package/dist/types/kit/road3d.d.ts +71 -0
- package/dist/types/kit/routeChecks.d.ts +6 -0
- package/dist/types/kit/saveSlots.d.ts +17 -0
- package/dist/types/kit/sceneInit.d.ts +11 -0
- package/dist/types/{games/kit → kit}/sceneSim.d.ts +5 -5
- package/dist/types/kit/screenText.d.ts +3 -0
- package/dist/types/kit/sdftext.d.ts +34 -0
- package/dist/types/kit/shading.d.ts +23 -0
- package/dist/types/kit/shareBlocks.d.ts +20 -0
- package/dist/types/kit/song.d.ts +89 -0
- package/dist/types/kit/songFx.d.ts +99 -0
- package/dist/types/kit/synthParts.d.ts +7 -0
- package/dist/types/kit/tar.d.ts +13 -0
- package/dist/types/kit/textfit.d.ts +74 -0
- package/dist/types/kit/transforms.d.ts +8 -0
- package/dist/types/lookAlike.d.ts +31 -0
- package/dist/types/menuVersionEntry.d.ts +1 -0
- package/dist/types/mesh/colorBodies.d.ts +18 -0
- package/dist/types/mesh/decimate.d.ts +10 -0
- package/dist/types/mesh/fieldTrinket.d.ts +40 -0
- package/dist/types/mesh/figureShapes.d.ts +24 -0
- package/dist/types/mesh/mesh.d.ts +9 -0
- package/dist/types/mesh/meshCheck.d.ts +22 -0
- package/dist/types/mesh/overhang.d.ts +24 -0
- package/dist/types/mesh/pixelFigure.d.ts +41 -0
- package/dist/types/mesh/sampledField.d.ts +3 -0
- package/dist/types/mesh/sdfShapes.d.ts +20 -0
- package/dist/types/mesh/stl.d.ts +9 -0
- package/dist/types/mesh/strokeText.d.ts +8 -0
- package/dist/types/mesh/surfaceNets.d.ts +14 -0
- package/dist/types/mesh/tetraMesh.d.ts +4 -0
- package/dist/types/mesh/threeMf.d.ts +12 -0
- package/dist/types/mesh/trinketKinds.d.ts +72 -0
- package/dist/types/mesh/trinketTool.d.ts +26 -0
- package/dist/types/mesh/voxel.d.ts +10 -0
- package/dist/types/mesh/zipFile.d.ts +13 -0
- package/dist/types/microFont.d.ts +6 -0
- package/dist/types/pack/meshPack.d.ts +26 -0
- package/dist/types/pack/threeMfPack.d.ts +11 -0
- package/dist/types/palettePresetData.d.ts +4 -0
- package/dist/types/palettePresets.d.ts +12 -0
- package/dist/types/paletteReserve.d.ts +52 -0
- package/dist/types/palettes.d.ts +4 -0
- package/dist/types/releaseNotes.d.ts +3 -0
- package/dist/types/simulation.d.ts +6 -0
- package/dist/types/{web/packages/tools/src/text.d.ts → text.d.ts} +6 -6
- package/package.json +145 -15
- package/dist/binary-D7wuaC5g.js +0 -120
- package/dist/pixels-DzfIIUOl.js +0 -76
- package/dist/types/games/kit/blit.d.ts +0 -10
- package/dist/types/games/kit/music.d.ts +0 -1
- package/dist/types/games/kit/pcText.d.ts +0 -8
- package/dist/types/games/kit/shading.d.ts +0 -11
- package/dist/types/web/packages/tools/src/audio.d.ts +0 -3
- package/dist/types/web/packages/tools/src/drawing.d.ts +0 -10
- package/dist/types/web/packages/tools/src/images.d.ts +0 -2
- package/dist/types/web/packages/tools/src/microFont.d.ts +0 -1
- package/dist/types/web/packages/tools/src/simulation.d.ts +0 -3
- package/dist/types/web/scripts/cdGames.d.ts +0 -103
- package/dist/types/web/scripts/gameShots.d.ts +0 -12
- package/dist/types/web/scripts/ogImage.d.ts +0 -21
- package/dist/types/web/src/audio/cmfLoad.d.ts +0 -7
- package/dist/types/web/src/audio/cmfPlayer.d.ts +0 -69
- package/dist/types/web/src/audio/context.d.ts +0 -12
- package/dist/types/web/src/audio/engine.d.ts +0 -39
- package/dist/types/web/src/audio/music.worklet.d.ts +0 -14
- package/dist/types/web/src/audio/opl.d.ts +0 -37
- package/dist/types/web/src/audio/output.d.ts +0 -13
- package/dist/types/web/src/desk/boxes/boxFacts.d.ts +0 -85
- package/dist/types/web/src/dosPlayer/fileExtensions.d.ts +0 -44
- package/dist/types/web/src/dosPlayer/patchRules.d.ts +0 -24
- package/dist/types/web/src/dosPlayer/patchTable.d.ts +0 -80
- package/dist/types/web/src/edition.d.ts +0 -6
- package/dist/types/web/src/eggs/eggState.d.ts +0 -26
- package/dist/types/web/src/eggs/eggs.d.ts +0 -31
- package/dist/types/web/src/engine/character.d.ts +0 -30
- package/dist/types/web/src/engine/funcKeys.d.ts +0 -33
- package/dist/types/web/src/engine/game.d.ts +0 -52
- package/dist/types/web/src/engine/keys.d.ts +0 -17
- package/dist/types/web/src/engine/machine.d.ts +0 -99
- package/dist/types/web/src/engine/menus.d.ts +0 -46
- package/dist/types/web/src/engine/monsters.d.ts +0 -19
- package/dist/types/web/src/engine/playGain.d.ts +0 -11
- package/dist/types/web/src/engine/playerLook.d.ts +0 -26
- package/dist/types/web/src/engine/recorder.d.ts +0 -60
- package/dist/types/web/src/engine/render.d.ts +0 -8
- package/dist/types/web/src/engine/scene.d.ts +0 -156
- package/dist/types/web/src/engine/scroll.d.ts +0 -16
- package/dist/types/web/src/engine/showGraphic.d.ts +0 -39
- package/dist/types/web/src/engine/slowPc.d.ts +0 -62
- package/dist/types/web/src/engine/touch.d.ts +0 -33
- package/dist/types/web/src/engine/world.d.ts +0 -215
- package/dist/types/web/src/export/gameAbout.d.ts +0 -15
- package/dist/types/web/src/formats/binary.d.ts +0 -44
- package/dist/types/web/src/formats/blocks.d.ts +0 -52
- package/dist/types/web/src/formats/character.d.ts +0 -65
- package/dist/types/web/src/formats/cmf.d.ts +0 -33
- package/dist/types/web/src/formats/fli.d.ts +0 -45
- package/dist/types/web/src/formats/fliLimits.d.ts +0 -13
- package/dist/types/web/src/formats/game.d.ts +0 -72
- package/dist/types/web/src/formats/gif.d.ts +0 -15
- package/dist/types/web/src/formats/graphicScripts.d.ts +0 -18
- package/dist/types/web/src/formats/highscore.d.ts +0 -10
- package/dist/types/web/src/formats/map.d.ts +0 -24
- package/dist/types/web/src/formats/monster.d.ts +0 -48
- package/dist/types/web/src/formats/palette.d.ts +0 -15
- package/dist/types/web/src/formats/recording.d.ts +0 -7
- package/dist/types/web/src/formats/sound.d.ts +0 -13
- package/dist/types/web/src/formats/voc.d.ts +0 -13
- package/dist/types/web/src/gfx/cp437Glyphs.d.ts +0 -2
- package/dist/types/web/src/gfx/font8x8.d.ts +0 -2
- package/dist/types/web/src/gfx/levelPicture.d.ts +0 -81
- package/dist/types/web/src/gfx/screen.d.ts +0 -46
- package/dist/types/web/src/gfx/titlePicture.d.ts +0 -21
- package/dist/types/web/src/input/chords.d.ts +0 -22
- package/dist/types/web/src/input/deskMouse.d.ts +0 -14
- package/dist/types/web/src/input/keyboard.d.ts +0 -39
- package/dist/types/web/src/input/scancodes.d.ts +0 -3
- package/dist/types/web/src/manual/printables/types.d.ts +0 -277
- package/dist/types/web/src/project/bizarre.d.ts +0 -28
- package/dist/types/web/src/project/companion.d.ts +0 -35
- package/dist/types/web/src/project/diskFacts.d.ts +0 -30
- package/dist/types/web/src/project/files.d.ts +0 -124
- package/dist/types/web/src/project/gameFiles.d.ts +0 -49
- package/dist/types/web/src/project/gamePack.d.ts +0 -17
- package/dist/types/web/src/project/health.d.ts +0 -30
- package/dist/types/web/src/project/secretGames.d.ts +0 -19
- package/dist/types/web/src/project/storage.d.ts +0 -46
- package/dist/types/web/src/project/streamGame.d.ts +0 -38
- package/dist/types/web/src/project/zip.d.ts +0 -33
- package/dist/types/web/src/retro/dos/disks.d.ts +0 -33
- package/dist/types/web/src/retro/text/cp437.d.ts +0 -4
- package/dist/types/web/src/seededRandom.d.ts +0 -6
- package/dist/types/web/src/tinHearts/deskHearts.d.ts +0 -33
- package/dist/types/web/src/tinHearts/manifest.d.ts +0 -30
- package/dist/types/web/src/tinHearts/tinHearts.d.ts +0 -84
- package/dist/types/web/src/walkthrough/format.d.ts +0 -92
- package/dist/types/web/src/walkthrough/madeUpScores.d.ts +0 -6
- package/dist/types/web/src/walkthrough/runtime.d.ts +0 -134
- /package/dist/types/{web/src/assistant → image}/png.d.ts +0 -0
- /package/dist/types/{games/kit → kit}/palette.d.ts +0 -0
- /package/dist/types/{games/kit → kit}/pixels.d.ts +0 -0
- /package/dist/types/{games/kit → kit}/reel.d.ts +0 -0
- /package/dist/types/{games/kit → kit}/sound.d.ts +0 -0
- /package/dist/types/{games/kit → kit}/textBounds.d.ts +0 -0
- /package/dist/types/{games/kit → kit}/tune.d.ts +0 -0
- /package/dist/types/{web/src/audio → music}/compose.d.ts +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const C = [0, 8, 2, 10, 12, 4, 14, 6, 3, 11, 1, 9, 15, 7, 13, 5];
|
|
2
|
+
function U(A, r = [[0, 0, 0]]) {
|
|
3
|
+
const s = new Float64Array(32768);
|
|
4
|
+
for (const t of A) for (let e = 0; e < t.length; e += 3) s[t[e] >> 3 << 10 | t[e + 1] >> 3 << 5 | t[e + 2] >> 3]++;
|
|
5
|
+
const u = [];
|
|
6
|
+
for (let t = 0; t < s.length; t++) s[t] && u.push(t);
|
|
7
|
+
const o = (t) => Math.sqrt(s[t]), n = (t, e) => t >> 10 - e * 5 & 31, i = [{ bins: u, weight: u.reduce((t, e) => t + o(e), 0) }], c = 256 - r.length;
|
|
8
|
+
for (; i.length < c; ) {
|
|
9
|
+
let t = -1, e = 0, l = 0;
|
|
10
|
+
if (i.forEach((f, p) => {
|
|
11
|
+
if (!(f.bins.length < 2))
|
|
12
|
+
for (let d = 0; d < 3; d++) {
|
|
13
|
+
let y = 31, M = 0;
|
|
14
|
+
for (const v of f.bins) {
|
|
15
|
+
const m = n(v, d);
|
|
16
|
+
m < y && (y = m), m > M && (M = m);
|
|
17
|
+
}
|
|
18
|
+
const k = (M - y) * f.weight;
|
|
19
|
+
k > e && (e = k, t = p, l = d);
|
|
20
|
+
}
|
|
21
|
+
}), t < 0) break;
|
|
22
|
+
const a = i[t];
|
|
23
|
+
a.bins.sort((f, p) => n(f, l) - n(p, l) || f - p);
|
|
24
|
+
let w = 0, b = 1;
|
|
25
|
+
for (; b < a.bins.length - 1 && (w += o(a.bins[b - 1]), !(w >= a.weight / 2)); b++)
|
|
26
|
+
;
|
|
27
|
+
const h = a.bins.slice(0, b), E = a.bins.slice(b);
|
|
28
|
+
i.splice(t, 1, { bins: h, weight: h.reduce((f, p) => f + o(p), 0) }, { bins: E, weight: E.reduce((f, p) => f + o(p), 0) });
|
|
29
|
+
}
|
|
30
|
+
const g = new Uint8Array(768);
|
|
31
|
+
return r.forEach(([t, e, l], a) => g.set([t >> 2, e >> 2, l >> 2], a * 3)), i.forEach((t, e) => {
|
|
32
|
+
let l = 0, a = 0, w = 0;
|
|
33
|
+
for (const h of t.bins)
|
|
34
|
+
l += n(h, 0) * o(h), a += n(h, 1) * o(h), w += n(h, 2) * o(h);
|
|
35
|
+
const b = (h) => Math.min(63, Math.round((h / t.weight * 8 + 4) / 4));
|
|
36
|
+
g.set([b(l), b(a), b(w)], (r.length + e) * 3);
|
|
37
|
+
}), g;
|
|
38
|
+
}
|
|
39
|
+
class q {
|
|
40
|
+
constructor(r, s = 8) {
|
|
41
|
+
this.palette = r, this.amount = s;
|
|
42
|
+
}
|
|
43
|
+
palette;
|
|
44
|
+
amount;
|
|
45
|
+
lut = new Int16Array(4096 * 64).fill(-1);
|
|
46
|
+
/** The nearest palette entry to a 6-bit color. */
|
|
47
|
+
nearest(r, s, u) {
|
|
48
|
+
const o = r << 12 | s << 6 | u;
|
|
49
|
+
let n = this.lut[o];
|
|
50
|
+
if (n >= 0) return n;
|
|
51
|
+
let i = 1e9;
|
|
52
|
+
for (let c = 0; c < 256; c++) {
|
|
53
|
+
const g = this.palette[c * 3] - r, t = this.palette[c * 3 + 1] - s, e = this.palette[c * 3 + 2] - u, l = 3 * g * g + 4 * t * t + 2 * e * e;
|
|
54
|
+
l < i && (i = l, n = c);
|
|
55
|
+
}
|
|
56
|
+
return this.lut[o] = n, n;
|
|
57
|
+
}
|
|
58
|
+
/** A whole picture: `rgb` is w*h*3 bytes. */
|
|
59
|
+
apply(r, s, u) {
|
|
60
|
+
const o = new Uint8Array(s * u);
|
|
61
|
+
for (let n = 0; n < u; n++)
|
|
62
|
+
for (let i = 0; i < s; i++) {
|
|
63
|
+
const c = n * s + i, g = (C[(n & 3) * 4 + (i & 3)] / 16 - 0.47) * this.amount, t = (e) => Math.max(0, Math.min(63, Math.round((e + g) / 4.048)));
|
|
64
|
+
o[c] = this.nearest(t(r[c * 3]), t(r[c * 3 + 1]), t(r[c * 3 + 2]));
|
|
65
|
+
}
|
|
66
|
+
return o;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
q as Quantizer,
|
|
71
|
+
U as medianCutPalette
|
|
72
|
+
};
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
const q = (n, t) => [n[0] + t[0], n[1] + t[1], n[2] + t[2]], d = (n, t) => [n[0] - t[0], n[1] - t[1], n[2] - t[2]], y = (n, t) => [n[0] * t, n[1] * t, n[2] * t], x = (n, t) => n[0] * t[0] + n[1] * t[1] + n[2] * t[2], T = (n, t) => [n[1] * t[2] - n[2] * t[1], n[2] * t[0] - n[0] * t[2], n[0] * t[1] - n[1] * t[0]], P = (n, t, s) => [n[0] + (t[0] - n[0]) * s, n[1] + (t[1] - n[1]) * s, n[2] + (t[2] - n[2]) * s], k = (n) => n < 0 ? 0 : n > 1 ? 1 : n;
|
|
2
|
+
function A(n) {
|
|
3
|
+
const t = Math.hypot(n[0], n[1], n[2]) || 1;
|
|
4
|
+
return [n[0] / t, n[1] / t, n[2] / t];
|
|
5
|
+
}
|
|
6
|
+
const v = [1, 0, 0, 0, 1, 0, 0, 0, 1];
|
|
7
|
+
function R(n) {
|
|
8
|
+
const t = Math.cos(n), s = Math.sin(n);
|
|
9
|
+
return [1, 0, 0, 0, t, -s, 0, s, t];
|
|
10
|
+
}
|
|
11
|
+
function X(n) {
|
|
12
|
+
const t = Math.cos(n), s = Math.sin(n);
|
|
13
|
+
return [t, 0, s, 0, 1, 0, -s, 0, t];
|
|
14
|
+
}
|
|
15
|
+
function F(n, t) {
|
|
16
|
+
const s = [];
|
|
17
|
+
for (let i = 0; i < 3; i++) for (let o = 0; o < 3; o++) s.push(n[i * 3] * t[o] + n[i * 3 + 1] * t[3 + o] + n[i * 3 + 2] * t[6 + o]);
|
|
18
|
+
return s;
|
|
19
|
+
}
|
|
20
|
+
const J = (n, t, s) => [n[0], t[0], s[0], n[1], t[1], s[1], n[2], t[2], s[2]], I = (n, t) => [
|
|
21
|
+
n[0] * t[0] + n[1] * t[1] + n[2] * t[2],
|
|
22
|
+
n[3] * t[0] + n[4] * t[1] + n[5] * t[2],
|
|
23
|
+
n[6] * t[0] + n[7] * t[1] + n[8] * t[2]
|
|
24
|
+
], W = (n, t) => [n[0] * t[0] + n[3] * t[1] + n[6] * t[2], n[1] * t[0] + n[4] * t[1] + n[7] * t[2], n[2] * t[0] + n[5] * t[1] + n[8] * t[2]], D = (n = [0, 0, 0], t = v, s = 1) => ({ rot: t, pos: n, size: s }), w = 1e-4;
|
|
25
|
+
class g {
|
|
26
|
+
constructor(t, s) {
|
|
27
|
+
this.at = t, this.material = s;
|
|
28
|
+
}
|
|
29
|
+
at;
|
|
30
|
+
material;
|
|
31
|
+
/** World-space bounding box, [min, max]. */
|
|
32
|
+
box = [
|
|
33
|
+
[0, 0, 0],
|
|
34
|
+
[0, 0, 0]
|
|
35
|
+
];
|
|
36
|
+
/** Whether the shape throws a shadow. */
|
|
37
|
+
shadows = !0;
|
|
38
|
+
/** Recomputes the world box after `at` changes. */
|
|
39
|
+
update() {
|
|
40
|
+
const [t, s] = this.bounds(), i = [1e9, 1e9, 1e9], o = [-1e9, -1e9, -1e9];
|
|
41
|
+
for (const r of [t[0], s[0]])
|
|
42
|
+
for (const e of [t[1], s[1]])
|
|
43
|
+
for (const c of [t[2], s[2]]) {
|
|
44
|
+
const h = this.toWorld([r, e, c]);
|
|
45
|
+
for (let l = 0; l < 3; l++)
|
|
46
|
+
i[l] = Math.min(i[l], h[l]), o[l] = Math.max(o[l], h[l]);
|
|
47
|
+
}
|
|
48
|
+
return this.box = [i, o], this;
|
|
49
|
+
}
|
|
50
|
+
toWorld(t) {
|
|
51
|
+
return q(I(this.at.rot, y(t, this.at.size)), this.at.pos);
|
|
52
|
+
}
|
|
53
|
+
/** The world box's eight corners. */
|
|
54
|
+
corners() {
|
|
55
|
+
const [t, s] = this.box, i = [];
|
|
56
|
+
for (const o of [t[0], s[0]]) for (const r of [t[1], s[1]]) for (const e of [t[2], s[2]]) i.push([o, r, e]);
|
|
57
|
+
return i;
|
|
58
|
+
}
|
|
59
|
+
hit(t, s, i) {
|
|
60
|
+
if (!E(this.box, t, s, i)) return;
|
|
61
|
+
const o = this.at.size, r = y(W(this.at.rot, d(t, this.at.pos)), 1 / o), e = W(this.at.rot, s), c = this.local(r, e, i / o);
|
|
62
|
+
if (!c || c.t * o >= i) return;
|
|
63
|
+
let h = A(I(this.at.rot, c.n));
|
|
64
|
+
x(h, s) > 0 && (h = y(h, -1));
|
|
65
|
+
const l = c.t * o;
|
|
66
|
+
return { t: l, p: q(t, y(s, l)), local: q(r, y(e, c.t)), n: h, shape: this };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function E(n, t, s, i) {
|
|
70
|
+
const o = n[0], r = n[1];
|
|
71
|
+
let e = 0, c = i;
|
|
72
|
+
for (let h = 0; h < 3; h++) {
|
|
73
|
+
const l = s[h], p = t[h];
|
|
74
|
+
if (l > -1e-12 && l < 1e-12) {
|
|
75
|
+
if (p < o[h] || p > r[h]) return !1;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const a = 1 / l;
|
|
79
|
+
let u = (o[h] - p) * a, f = (r[h] - p) * a;
|
|
80
|
+
if (u > f) {
|
|
81
|
+
const M = u;
|
|
82
|
+
u = f, f = M;
|
|
83
|
+
}
|
|
84
|
+
if (u > e && (e = u), f < c && (c = f), e > c) return !1;
|
|
85
|
+
}
|
|
86
|
+
return !0;
|
|
87
|
+
}
|
|
88
|
+
class K extends g {
|
|
89
|
+
constructor(t, s, i, o) {
|
|
90
|
+
super(i, o), this.mn = t, this.mx = s, this.update();
|
|
91
|
+
}
|
|
92
|
+
mn;
|
|
93
|
+
mx;
|
|
94
|
+
bounds() {
|
|
95
|
+
return [this.mn, this.mx];
|
|
96
|
+
}
|
|
97
|
+
local(t, s, i) {
|
|
98
|
+
let o = -1e9, r = 1e9, e = 0, c = 0;
|
|
99
|
+
for (let a = 0; a < 3; a++) {
|
|
100
|
+
if (Math.abs(s[a]) < 1e-12) {
|
|
101
|
+
if (t[a] < this.mn[a] || t[a] > this.mx[a]) return;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
let u = (this.mn[a] - t[a]) / s[a], f = (this.mx[a] - t[a]) / s[a];
|
|
105
|
+
u > f && ([u, f] = [f, u]), u > o && (o = u, e = a), f < r && (r = f, c = a);
|
|
106
|
+
}
|
|
107
|
+
if (o > r) return;
|
|
108
|
+
const [h, l] = o > w ? [o, e] : [r, c];
|
|
109
|
+
if (h <= w || h >= i) return;
|
|
110
|
+
const p = [0, 0, 0];
|
|
111
|
+
return p[l] = -Math.sign(s[l]) || 1, { t: h, n: p };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
class O extends g {
|
|
115
|
+
constructor(t, s, i, o, r, e, c = { bottom: !0, top: !0 }) {
|
|
116
|
+
super(r, e), this.r0 = t, this.r1 = s, this.y0 = i, this.y1 = o, this.caps = c, this.update();
|
|
117
|
+
}
|
|
118
|
+
r0;
|
|
119
|
+
r1;
|
|
120
|
+
y0;
|
|
121
|
+
y1;
|
|
122
|
+
caps;
|
|
123
|
+
bounds() {
|
|
124
|
+
const t = Math.max(this.r0, this.r1);
|
|
125
|
+
return [
|
|
126
|
+
[-t, this.y0, -t],
|
|
127
|
+
[t, this.y1, t]
|
|
128
|
+
];
|
|
129
|
+
}
|
|
130
|
+
local(t, s, i) {
|
|
131
|
+
const o = (this.r1 - this.r0) / (this.y1 - this.y0), r = this.r0 - o * this.y0, e = r + o * t[1], c = s[0] * s[0] + s[2] * s[2] - o * o * s[1] * s[1], h = 2 * (t[0] * s[0] + t[2] * s[2] - o * s[1] * e), l = t[0] * t[0] + t[2] * t[2] - e * e;
|
|
132
|
+
let p;
|
|
133
|
+
const a = (u, f) => {
|
|
134
|
+
u > w && u < i && (!p || u < p.t) && (p = { t: u, n: f() });
|
|
135
|
+
};
|
|
136
|
+
if (Math.abs(c) > 1e-12) {
|
|
137
|
+
const u = h * h - 4 * c * l;
|
|
138
|
+
if (u >= 0) {
|
|
139
|
+
const f = Math.sqrt(u);
|
|
140
|
+
for (const M of [(-h - f) / (2 * c), (-h + f) / (2 * c)]) {
|
|
141
|
+
const m = t[1] + s[1] * M;
|
|
142
|
+
m < this.y0 || m > this.y1 || a(M, () => {
|
|
143
|
+
const b = t[0] + s[0] * M, z = t[2] + s[2] * M;
|
|
144
|
+
return [b, -(r + o * m) * o, z];
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (Math.abs(s[1]) > 1e-12)
|
|
150
|
+
for (const [u, f, M, m] of [
|
|
151
|
+
[this.y0, this.r0, this.caps.bottom, -1],
|
|
152
|
+
[this.y1, this.r1, this.caps.top, 1]
|
|
153
|
+
]) {
|
|
154
|
+
if (!M) continue;
|
|
155
|
+
const b = (u - t[1]) / s[1], z = t[0] + s[0] * b, C = t[2] + s[2] * b;
|
|
156
|
+
z * z + C * C <= f * f && a(b, () => [0, m, 0]);
|
|
157
|
+
}
|
|
158
|
+
return p;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
class Q extends g {
|
|
162
|
+
constructor(t, s, i, o) {
|
|
163
|
+
super(i, o), this.inner = t, this.outer = s, this.update();
|
|
164
|
+
}
|
|
165
|
+
inner;
|
|
166
|
+
outer;
|
|
167
|
+
bounds() {
|
|
168
|
+
return [
|
|
169
|
+
[-this.outer, -1e-3, -this.outer],
|
|
170
|
+
[this.outer, 1e-3, this.outer]
|
|
171
|
+
];
|
|
172
|
+
}
|
|
173
|
+
local(t, s, i) {
|
|
174
|
+
if (Math.abs(s[1]) < 1e-12) return;
|
|
175
|
+
const o = -t[1] / s[1];
|
|
176
|
+
if (o <= w || o >= i) return;
|
|
177
|
+
const r = t[0] + s[0] * o, e = t[2] + s[2] * o, c = r * r + e * e;
|
|
178
|
+
if (!(c > this.outer * this.outer || c < this.inner * this.inner))
|
|
179
|
+
return { t: o, n: [0, 1, 0] };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
class U extends g {
|
|
183
|
+
constructor(t, s, i) {
|
|
184
|
+
super(s, i), this.r = t, this.update();
|
|
185
|
+
}
|
|
186
|
+
r;
|
|
187
|
+
bounds() {
|
|
188
|
+
const t = this.r;
|
|
189
|
+
return [
|
|
190
|
+
[-t, -t, -t],
|
|
191
|
+
[t, t, t]
|
|
192
|
+
];
|
|
193
|
+
}
|
|
194
|
+
local(t, s, i) {
|
|
195
|
+
const o = x(t, s), r = x(t, t) - this.r * this.r, e = o * o - r;
|
|
196
|
+
if (e < 0) return;
|
|
197
|
+
const c = Math.sqrt(e), h = -o - c > w ? -o - c : -o + c;
|
|
198
|
+
if (!(h <= w || h >= i))
|
|
199
|
+
return { t: h, n: q(t, y(s, h)) };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
class V extends g {
|
|
203
|
+
constructor(t, s, i, o, r) {
|
|
204
|
+
super(o, r), this.a = t, this.b = s, this.r = i, this.update();
|
|
205
|
+
}
|
|
206
|
+
a;
|
|
207
|
+
b;
|
|
208
|
+
r;
|
|
209
|
+
bounds() {
|
|
210
|
+
const t = this.r;
|
|
211
|
+
return [
|
|
212
|
+
[Math.min(this.a[0], this.b[0]) - t, Math.min(this.a[1], this.b[1]) - t, Math.min(this.a[2], this.b[2]) - t],
|
|
213
|
+
[Math.max(this.a[0], this.b[0]) + t, Math.max(this.a[1], this.b[1]) + t, Math.max(this.a[2], this.b[2]) + t]
|
|
214
|
+
];
|
|
215
|
+
}
|
|
216
|
+
local(t, s, i) {
|
|
217
|
+
const o = d(this.b, this.a), r = d(t, this.a), e = x(o, o), c = x(o, s), h = x(o, r), l = x(s, r), p = x(r, r), a = this.r, u = e - c * c;
|
|
218
|
+
let f = e * l - h * c, M = e * p - h * h - a * a * e, m = f * f - u * M, b = -1;
|
|
219
|
+
if (m >= 0) {
|
|
220
|
+
b = (-f - Math.sqrt(m)) / u;
|
|
221
|
+
const B = h + b * c;
|
|
222
|
+
if (!(B > 0 && B < e)) {
|
|
223
|
+
const S = B <= 0 ? r : d(t, this.b);
|
|
224
|
+
f = x(s, S), M = x(S, S) - a * a, m = f * f - M, b = m > 0 ? -f - Math.sqrt(m) : -1;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (b <= w || b >= i) return;
|
|
228
|
+
const z = q(t, y(s, b)), C = d(z, this.a), j = k(x(C, o) / e);
|
|
229
|
+
return { t: b, n: d(C, y(o, j)) };
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
class Z extends g {
|
|
233
|
+
constructor(t, s, i, o, r) {
|
|
234
|
+
super(o, r), this.a = t, this.b = s, this.c = i, this.update();
|
|
235
|
+
}
|
|
236
|
+
a;
|
|
237
|
+
b;
|
|
238
|
+
c;
|
|
239
|
+
bounds() {
|
|
240
|
+
const t = [this.a, this.b, this.c];
|
|
241
|
+
return [[0, 1, 2].map((s) => Math.min(...t.map((i) => i[s])) - 1e-3), [0, 1, 2].map((s) => Math.max(...t.map((i) => i[s])) + 1e-3)];
|
|
242
|
+
}
|
|
243
|
+
local(t, s, i) {
|
|
244
|
+
const o = d(this.b, this.a), r = d(this.c, this.a), e = T(s, r), c = x(o, e);
|
|
245
|
+
if (Math.abs(c) < 1e-12) return;
|
|
246
|
+
const h = d(t, this.a), l = x(h, e) / c;
|
|
247
|
+
if (l < 0 || l > 1) return;
|
|
248
|
+
const p = T(h, o), a = x(s, p) / c;
|
|
249
|
+
if (a < 0 || l + a > 1) return;
|
|
250
|
+
const u = x(r, p) / c;
|
|
251
|
+
if (!(u <= w || u >= i))
|
|
252
|
+
return { t: u, n: T(o, r) };
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
class _ extends g {
|
|
256
|
+
constructor(t, s, i) {
|
|
257
|
+
super(s, i), this.text = t, this.update();
|
|
258
|
+
}
|
|
259
|
+
text;
|
|
260
|
+
bounds() {
|
|
261
|
+
const t = this.text.grid;
|
|
262
|
+
return [
|
|
263
|
+
[t.x0, t.y0, -this.text.half - 0.01],
|
|
264
|
+
[t.x1, t.y1, this.text.half + 0.01]
|
|
265
|
+
];
|
|
266
|
+
}
|
|
267
|
+
local(t, s, i) {
|
|
268
|
+
const o = this.text.trace(t[0], t[1], t[2], s[0], s[1], s[2]);
|
|
269
|
+
if (!(o <= w || o >= i))
|
|
270
|
+
return { t: o, n: this.text.normal(t[0] + s[0] * o, t[1] + s[1] * o, t[2] + s[2] * o) };
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
class G extends g {
|
|
274
|
+
constructor(t) {
|
|
275
|
+
super(D(), () => ({ color: [0, 0, 0], kd: 0, ks: 0, shine: 1, mirror: 0 })), this.parts = t, this.update();
|
|
276
|
+
}
|
|
277
|
+
parts;
|
|
278
|
+
bounds() {
|
|
279
|
+
return [
|
|
280
|
+
[0, 0, 0],
|
|
281
|
+
[0, 0, 0]
|
|
282
|
+
];
|
|
283
|
+
}
|
|
284
|
+
local() {
|
|
285
|
+
}
|
|
286
|
+
update() {
|
|
287
|
+
const t = [1e9, 1e9, 1e9], s = [-1e9, -1e9, -1e9];
|
|
288
|
+
for (const i of this.parts ?? [])
|
|
289
|
+
for (let o = 0; o < 3; o++)
|
|
290
|
+
t[o] = Math.min(t[o], i.box[0][o]), s[o] = Math.max(s[o], i.box[1][o]);
|
|
291
|
+
return this.box = [t, s], this;
|
|
292
|
+
}
|
|
293
|
+
hit(t, s, i) {
|
|
294
|
+
if (E(this.box, t, s, i))
|
|
295
|
+
return H(this.parts, t, s, i);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
function H(n, t, s, i = 1e9) {
|
|
299
|
+
let o;
|
|
300
|
+
for (const r of n) {
|
|
301
|
+
const e = r.hit(t, s, o ? o.t : i);
|
|
302
|
+
e && (o = e);
|
|
303
|
+
}
|
|
304
|
+
return o;
|
|
305
|
+
}
|
|
306
|
+
function L(n, t, s, i = 1e9) {
|
|
307
|
+
for (const o of n)
|
|
308
|
+
if (!(!o.shadows || !E(o.box, t, s, i)) && (o instanceof G ? L(o.parts, t, s, i) : o.hit(t, s, i)))
|
|
309
|
+
return !0;
|
|
310
|
+
return !1;
|
|
311
|
+
}
|
|
312
|
+
class $ {
|
|
313
|
+
constructor(t, s, i, o = 320, r = 200, e = 1.2) {
|
|
314
|
+
this.eye = t, this.focal = i, this.w = o, this.h = r, this.aspect = e, this.fw = A(d(s, t)), this.right = A(T([0, 1, 0], this.fw)), this.up = T(this.fw, this.right);
|
|
315
|
+
}
|
|
316
|
+
eye;
|
|
317
|
+
focal;
|
|
318
|
+
w;
|
|
319
|
+
h;
|
|
320
|
+
aspect;
|
|
321
|
+
fw;
|
|
322
|
+
right;
|
|
323
|
+
up;
|
|
324
|
+
ray(t, s) {
|
|
325
|
+
const i = (t - this.w / 2) / this.focal, o = -(s - this.h / 2) * this.aspect / this.focal;
|
|
326
|
+
return A(q(this.fw, q(y(this.right, i), y(this.up, o))));
|
|
327
|
+
}
|
|
328
|
+
project(t) {
|
|
329
|
+
const s = d(t, this.eye), i = x(s, this.fw);
|
|
330
|
+
if (!(i < 0.05))
|
|
331
|
+
return [this.w / 2 + x(s, this.right) * this.focal / i, this.h / 2 - x(s, this.up) * this.focal / i / this.aspect];
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function Y(n, t, s) {
|
|
335
|
+
let i = Math.imul(n, 374761393) ^ Math.imul(t, 668265263) ^ Math.imul(s, 2147483647);
|
|
336
|
+
return i = Math.imul(i ^ i >>> 13, 1274126177), ((i ^ i >>> 16) >>> 0) / 4294967296;
|
|
337
|
+
}
|
|
338
|
+
function N(n, t, s) {
|
|
339
|
+
const i = Math.floor(n), o = Math.floor(t), r = Math.floor(s), e = (u) => u * u * (3 - 2 * u), c = e(n - i), h = e(t - o), l = e(s - r), p = (u, f, M) => u + (f - u) * M, a = (u, f, M) => Y(i + u, o + f, r + M);
|
|
340
|
+
return p(p(p(a(0, 0, 0), a(1, 0, 0), c), p(a(0, 1, 0), a(1, 1, 0), c), h), p(p(a(0, 0, 1), a(1, 0, 1), c), p(a(0, 1, 1), a(1, 1, 1), c), h), l) * 2 - 1;
|
|
341
|
+
}
|
|
342
|
+
function tt(n, t, s, i = 4) {
|
|
343
|
+
let o = 0, r = 0.5;
|
|
344
|
+
for (let e = 0; e < i; e++)
|
|
345
|
+
o += N(n, t, s) * r, n *= 2.03, t *= 2.03, s *= 2.03, r *= 0.5;
|
|
346
|
+
return o;
|
|
347
|
+
}
|
|
348
|
+
const st = (n, t, s, i) => Y(Math.floor(n * i), Math.floor(t * i), Math.floor(s * i));
|
|
349
|
+
export {
|
|
350
|
+
K as Box,
|
|
351
|
+
$ as Camera,
|
|
352
|
+
V as Capsule,
|
|
353
|
+
O as Cone,
|
|
354
|
+
G as Group,
|
|
355
|
+
_ as Lettering,
|
|
356
|
+
Q as Ring,
|
|
357
|
+
g as Shape,
|
|
358
|
+
U as Sphere,
|
|
359
|
+
Z as Tri,
|
|
360
|
+
q as add,
|
|
361
|
+
I as apply,
|
|
362
|
+
L as blocked,
|
|
363
|
+
k as clamp01,
|
|
364
|
+
T as cross,
|
|
365
|
+
x as dot,
|
|
366
|
+
tt as fbm,
|
|
367
|
+
J as fromAxes,
|
|
368
|
+
st as grain,
|
|
369
|
+
P as mix,
|
|
370
|
+
F as mulM,
|
|
371
|
+
H as nearest,
|
|
372
|
+
N as noise,
|
|
373
|
+
A as norm,
|
|
374
|
+
D as placed,
|
|
375
|
+
R as rotX,
|
|
376
|
+
X as rotY,
|
|
377
|
+
y as scale,
|
|
378
|
+
d as sub
|
|
379
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { serializeRecording as l } from "@lewismoten/gamemaker-sandbox-engine/formats/recording";
|
|
2
|
+
function k(e, r = 30, n = 4) {
|
|
3
|
+
if (e.length % 2) throw new RangeError("Demo keys must be delta/key pairs");
|
|
4
|
+
const o = [];
|
|
5
|
+
for (let t = 0; t < e.length; t += 2) o.push({ delta: e[t], key: e[t + 1] });
|
|
6
|
+
return o.push({ delta: r, key: 1 }, { delta: n, key: 129 }), l(o);
|
|
7
|
+
}
|
|
8
|
+
export {
|
|
9
|
+
k as recordedDemo
|
|
10
|
+
};
|
package/dist/kit/reel.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { encodeFli as k } from "@lewismoten/gamemaker-sandbox-engine/formats/fli";
|
|
2
|
+
import { Pixels as w } from "./pixels.js";
|
|
3
|
+
function x(o, t) {
|
|
4
|
+
return o.map((s) => Math.round(s * Math.max(0, Math.min(1, t))));
|
|
5
|
+
}
|
|
6
|
+
class U {
|
|
7
|
+
constructor(t, s = 320, h = 200) {
|
|
8
|
+
this.pal = t, this.w = s, this.h = h, this.frames.push(new Uint8Array(s * h)), this.palettes.push(new Uint8Array(768));
|
|
9
|
+
}
|
|
10
|
+
pal;
|
|
11
|
+
w;
|
|
12
|
+
h;
|
|
13
|
+
frames = [];
|
|
14
|
+
palettes = [];
|
|
15
|
+
last;
|
|
16
|
+
/** Adds a picture for `hold` frames, its palette faded to `light`. */
|
|
17
|
+
add(t, s = 1, h = 1, r = this.pal) {
|
|
18
|
+
const a = Uint8Array.from(t.px), e = h >= 1 ? r : x(r, h);
|
|
19
|
+
for (let l = 0; l < s; l++)
|
|
20
|
+
this.frames.push(a), this.palettes.push(e);
|
|
21
|
+
return this.last = { px: a, pal: r }, this;
|
|
22
|
+
}
|
|
23
|
+
/** A picture drawn over a copy of `bg` (the actors over the scenery), for `hold` frames. */
|
|
24
|
+
frame(t, s, h = 1, r = 1, a = this.pal) {
|
|
25
|
+
const e = new w(t.w, t.h);
|
|
26
|
+
return e.px.set(t.px), s(e), this.add(e, h, r, a);
|
|
27
|
+
}
|
|
28
|
+
/** The picture fading in from black over `n` frames (the last at full light). */
|
|
29
|
+
fadeIn(t, s, h = this.pal) {
|
|
30
|
+
for (let r = 1; r <= s; r++) this.add(t, 1, r / s, h);
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
/** The last picture fading out to black over `n` frames. */
|
|
34
|
+
fadeOut(t) {
|
|
35
|
+
const s = this.last;
|
|
36
|
+
if (!s) return this;
|
|
37
|
+
for (let h = t - 1; h >= 0; h--)
|
|
38
|
+
this.frames.push(s.px), this.palettes.push(x(s.pal, h / t));
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* A cartoon's closing iris: black closes in on (cx, cy) over `n` frames from the last picture
|
|
43
|
+
* down to a circle `end` pixels across (round on a 4:3 screen: VGA's pixels are taller than
|
|
44
|
+
* wide), and holds there `hold` frames. Follow it with fadeOut. Gives an intro whose pictures
|
|
45
|
+
* are the title's art a last view that isn't the title.
|
|
46
|
+
*/
|
|
47
|
+
irisOut(t, s, h, r = 64, a = 6) {
|
|
48
|
+
const e = this.last;
|
|
49
|
+
if (!e) return this;
|
|
50
|
+
let l = 0;
|
|
51
|
+
const f = (i) => e.pal[i * 3] + e.pal[i * 3 + 1] + e.pal[i * 3 + 2];
|
|
52
|
+
for (let i = 1; i < e.pal.length / 3; i++) f(i) < f(l) && (l = i);
|
|
53
|
+
const u = Math.hypot(Math.max(t, this.w - t), Math.max(s, this.h - s) * 1.2), m = new w(this.w, this.h);
|
|
54
|
+
for (let i = 1; i <= h; i++) {
|
|
55
|
+
const d = i / h, M = u + (r / 2 - u) * (1 - (1 - d) * (1 - d));
|
|
56
|
+
for (let p = 0; p < this.h; p++)
|
|
57
|
+
for (let n = 0; n < this.w; n++) {
|
|
58
|
+
const c = p * this.w + n;
|
|
59
|
+
m.px[c] = Math.hypot(n - t, (p - s) * 1.2) <= M ? e.px[c] : l;
|
|
60
|
+
}
|
|
61
|
+
this.add(m, i === h ? a : 1, 1, e.pal);
|
|
62
|
+
}
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
/** The .FLI: `speed` is the wait after each frame in 1/70 s (5 = 14 frames a second). */
|
|
66
|
+
fli(t) {
|
|
67
|
+
return k(this.frames, this.pal, { width: this.w, height: this.h, speed: t, palettes: this.palettes, runs: !0 });
|
|
68
|
+
}
|
|
69
|
+
/** How long it plays, in seconds. */
|
|
70
|
+
seconds(t) {
|
|
71
|
+
return this.frames.length * t / 70;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export {
|
|
75
|
+
U as Reel,
|
|
76
|
+
x as dimmed
|
|
77
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Pixels as u } from "./pixels.js";
|
|
2
|
+
function l(t, r, i) {
|
|
3
|
+
const o = (e) => Math.max(0, (e - t) * i);
|
|
4
|
+
return {
|
|
5
|
+
halfWidth: o,
|
|
6
|
+
laneX: (e, s) => r + e * 2 * o(s) / 3,
|
|
7
|
+
dividerX: (e, s) => r + e * o(s) / 3
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function m(t, r, i = "spawn") {
|
|
11
|
+
return r.map((o) => {
|
|
12
|
+
const e = t.filter(([, n]) => n === o).sort((n, a) => n[0] - a[0]), s = `${i}${o}_end`, h = [];
|
|
13
|
+
let f = 0;
|
|
14
|
+
return e.forEach(([n, , a], c) => {
|
|
15
|
+
if (n < f || n < 2) throw new Error(`road lane ${o}: entry at ${n} is out of order`);
|
|
16
|
+
h.push({
|
|
17
|
+
name: `${i}${o}_${c}`,
|
|
18
|
+
kind: a,
|
|
19
|
+
birthTime: n,
|
|
20
|
+
next: c + 1 < e.length ? `${i}${o}_${c + 1}` : s,
|
|
21
|
+
ntime: n + 1 - f
|
|
22
|
+
}), f = n + 1;
|
|
23
|
+
}), { lane: o, first: h[0]?.name ?? s, blocks: h, end: s };
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function w(t, r) {
|
|
27
|
+
let i = 0, o = 0;
|
|
28
|
+
return t.map(([e, s, h]) => (i += e, o += s, [i, o, h, r]));
|
|
29
|
+
}
|
|
30
|
+
const M = (t) => [
|
|
31
|
+
[t, 1, 1],
|
|
32
|
+
[t, 1, 2],
|
|
33
|
+
[3 * t, 4, 4],
|
|
34
|
+
[2 * t, 3, 5]
|
|
35
|
+
], $ = 240, p = (t, r) => [r[0] - t[0], r[1] - t[1], $], b = (t) => [
|
|
36
|
+
[`${t}0`, 12],
|
|
37
|
+
[`${t}1`, 8],
|
|
38
|
+
[`${t}2`, 5],
|
|
39
|
+
[`${t}3`, 200]
|
|
40
|
+
], x = [
|
|
41
|
+
{ scale: 0.25, bottom: 6 },
|
|
42
|
+
{ scale: 0.45, bottom: 11 },
|
|
43
|
+
{ scale: 0.72, bottom: 16 },
|
|
44
|
+
{ scale: 1, bottom: 19 }
|
|
45
|
+
];
|
|
46
|
+
function _(t, r, i, o) {
|
|
47
|
+
const e = new u(20, 20, o);
|
|
48
|
+
if (r >= 1) return e.blit(t, 0, i - 19, o);
|
|
49
|
+
const s = Math.max(1, Math.round(20 * r)), h = Math.round(10 - s / 2), f = i + 1 - s;
|
|
50
|
+
for (let n = 0; n < s; n++)
|
|
51
|
+
for (let a = 0; a < s; a++) {
|
|
52
|
+
const c = t.get(Math.min(19, Math.floor((a + 0.5) / r)), Math.min(19, Math.floor((n + 0.5) / r)));
|
|
53
|
+
c !== o && e.set(h + a, f + n, c);
|
|
54
|
+
}
|
|
55
|
+
return e;
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
$ as ROAD_LEAP,
|
|
59
|
+
x as ROAD_SIZES,
|
|
60
|
+
b as growPics,
|
|
61
|
+
M as laneSlide,
|
|
62
|
+
p as leapTo,
|
|
63
|
+
w as roadCorners,
|
|
64
|
+
l as roadView,
|
|
65
|
+
_ as shrinkSprite,
|
|
66
|
+
m as spawnChains
|
|
67
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const t = { x: 54, w: 196, h: 14, y: (o) => 37 + o * 14 }, x = { x: 34, y: 181, w: 246, h: 15 };
|
|
2
|
+
function n(o, e, h, c) {
|
|
3
|
+
for (let r = 0; r < 10; r++)
|
|
4
|
+
o.rect(t.x, t.y(r), t.w, t.h, e), c !== void 0 && o.frame(t.x, t.y(r), t.w, t.h, c);
|
|
5
|
+
return o.rect(x.x, x.y, x.w, x.h, h), o;
|
|
6
|
+
}
|
|
7
|
+
export {
|
|
8
|
+
t as SLOT,
|
|
9
|
+
x as STATUS,
|
|
10
|
+
n as saveSlots
|
|
11
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { startSceneInits as o } from "@lewismoten/gamemaker-sandbox-engine/engine/scene";
|
|
2
|
+
import { changeBlocks as a } from "@lewismoten/gamemaker-sandbox-engine/engine/scene";
|
|
3
|
+
import { BACKBL as r } from "@lewismoten/gamemaker-sandbox-engine/engine/world";
|
|
4
|
+
function c(e, i, n = !1) {
|
|
5
|
+
if (o(e, i), n && e.noMons)
|
|
6
|
+
for (let t = 0; t < r; t++) e.bg[t].birthTime > 0 && e.blkMon.push({ blnum: t, nexttime: e.clock + e.bg[t].birthTime });
|
|
7
|
+
}
|
|
8
|
+
const f = (e, i) => c(e, i, !0);
|
|
9
|
+
export {
|
|
10
|
+
a as changeBlocks,
|
|
11
|
+
c as initializeScene,
|
|
12
|
+
f as legacySceneInits
|
|
13
|
+
};
|