diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/.profile b/buildroot-v86/board/v86/rootfs_overlay/root/.profile index 6681994..8a5d88c 100644 --- a/buildroot-v86/board/v86/rootfs_overlay/root/.profile +++ b/buildroot-v86/board/v86/rootfs_overlay/root/.profile @@ -31,7 +31,7 @@ test -f /root/.boot || { touch /root/.boot # make sure we run below once - # add menu items + # add menu items https://xrsh.isvery.ninja/#Launcher%20menu find /root/.config/launcher -type f | while read item; do js ' let term = document.querySelector("[isoterminal]").components.isoterminal.term @@ -59,5 +59,7 @@ test -f /root/.boot || { # uncomment to set location (3D scene file [with XR Fragments] ) #require https://xrfragment.org/index.glb #require https://coderofsalvation.github.io/xrsh-media/assets/background.glb - # } + +# auto-load /mnt/.env (if passed via AFRAME's isoterminal="overlayfs: boot.sh" e.g. +test -f /mnt/.env && source /mnt/.env diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/bin/save b/buildroot-v86/board/v86/rootfs_overlay/root/bin/save index f9d763f..4f7d607 100755 --- a/buildroot-v86/board/v86/rootfs_overlay/root/bin/save +++ b/buildroot-v86/board/v86/rootfs_overlay/root/bin/save @@ -1,14 +1,53 @@ #!/bin/sh source /etc/profile.sh -javascript=' - const isoterminal = document.querySelector("[isoterminal]").components.isoterminal.term - isoterminal.save() - return "[OK] xrsh state saved\n" -' +state(){ + javascript=' + const isoterminal = document.querySelector("[isoterminal]").components.isoterminal.term + isoterminal.save() + return "[OK] xrsh state saved\n" + ' + + echo "[i] triggering ~/hook.d/save/* scripts" + hook save + echo "[i] warning: do not resize the browserwindow" + echo "[i] please wait.." + js "$javascript" + exit +} -echo "[i] triggering ~/hook.d/save/* scripts" -hook save -echo "[i] warning: do not resize the browserwindow" -echo "[i] please wait.." -js "$javascript" +file(){ + javascript=' + + filename='$1' + + function saveUint8Array(uint8Array, filename = 'download.bin', mimeType = 'application/octet-stream') { + const blob = new Blob([uint8Array], { type: mimeType }); + const url = URL.createObjectURL(blob); + + const a = document.createElement('a'); + a.href = url; + a.download = filename; + + // Programmatically trigger the click event + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + + // Clean up the URL object + URL.revokeObjectURL(url); + } + + let term = document.querySelector("[isoterminal]") + term.emit("read_file", [filename, (str,buf) > saveUint8Array(buf, filename) ) + + return "" + ' + hook save + js "$javascript" + exit +} + +test -z "$1" && state +test -n "$1" && file +echo "Usage: save [file] # pass no argument to save VM state to localStorage" diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/scene1/.env b/buildroot-v86/board/v86/rootfs_overlay/root/scene1/.env old mode 100644 new mode 100755 index 03be4a9..c940ddd --- a/buildroot-v86/board/v86/rootfs_overlay/root/scene1/.env +++ b/buildroot-v86/board/v86/rootfs_overlay/root/scene1/.env @@ -1,2 +1,4 @@ +#!/bin/sh +cd $(dirname $(readlink -f $0)) echo "loading AFRAME glTF scene" cp index.html /root/index.html diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/scene1/.env.leave b/buildroot-v86/board/v86/rootfs_overlay/root/scene1/.env.leave new file mode 100644 index 0000000..a9f4150 --- /dev/null +++ b/buildroot-v86/board/v86/rootfs_overlay/root/scene1/.env.leave @@ -0,0 +1 @@ +echo "" > /root/index.html # cleanup diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/scene2/.env b/buildroot-v86/board/v86/rootfs_overlay/root/scene2/.env old mode 100644 new mode 100755 index 19a84b5..6db4606 --- a/buildroot-v86/board/v86/rootfs_overlay/root/scene2/.env +++ b/buildroot-v86/board/v86/rootfs_overlay/root/scene2/.env @@ -1,3 +1,5 @@ +#!/bin/sh +cd $(dirname $(readlink -f $0)) echo "loading THREE.js scene" echo "" > /root/index.html # empty scene cp index.js /root/index.js diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/scene2/.env.leave b/buildroot-v86/board/v86/rootfs_overlay/root/scene2/.env.leave new file mode 100644 index 0000000..4cfb683 --- /dev/null +++ b/buildroot-v86/board/v86/rootfs_overlay/root/scene2/.env.leave @@ -0,0 +1,2 @@ +echo "" > /root/index.html # empty scene +cp cleanup.js /root/index.js diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/scene2/cleanup.js b/buildroot-v86/board/v86/rootfs_overlay/root/scene2/cleanup.js new file mode 100755 index 0000000..1801a6c --- /dev/null +++ b/buildroot-v86/board/v86/rootfs_overlay/root/scene2/cleanup.js @@ -0,0 +1,3 @@ +const ascene = AFRAME.scenes[0] +const scene = ascene.object3D +scene.getObjectByName("cube").remove() diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/scene2/index.js b/buildroot-v86/board/v86/rootfs_overlay/root/scene2/index.js index d9edf97..fae0e17 100755 --- a/buildroot-v86/board/v86/rootfs_overlay/root/scene2/index.js +++ b/buildroot-v86/board/v86/rootfs_overlay/root/scene2/index.js @@ -4,6 +4,7 @@ const object = new THREE.Mesh( new THREE.BoxGeometry(1, 1, 1), new THREE.MeshBasicMaterial({ color: 0xff0000 }) ); +object.name = "cube" object.position.set(0.3, 1.4, -0.4) object.scale.set(0.2,0.2,0.2) diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/scene3/.env b/buildroot-v86/board/v86/rootfs_overlay/root/scene3/.env old mode 100644 new mode 100755 index 4fc3f09..38d83c3 --- a/buildroot-v86/board/v86/rootfs_overlay/root/scene3/.env +++ b/buildroot-v86/board/v86/rootfs_overlay/root/scene3/.env @@ -1,2 +1,4 @@ +#!/bin/sh +cd $(dirname $(readlink -f $0)) echo "loading AFRAME demo scene" cp index.html /root/index.html diff --git a/buildroot-v86/board/v86/rootfs_overlay/root/scene3/.env.leave b/buildroot-v86/board/v86/rootfs_overlay/root/scene3/.env.leave new file mode 100644 index 0000000..a9f4150 --- /dev/null +++ b/buildroot-v86/board/v86/rootfs_overlay/root/scene3/.env.leave @@ -0,0 +1 @@ +echo "" > /root/index.html # cleanup diff --git a/dist/v86-linux.iso b/dist/v86-linux.iso index 6ba1c45..f1a615c 100644 Binary files a/dist/v86-linux.iso and b/dist/v86-linux.iso differ