Go to file
Leon van Kammen f7e6d5a04d
/ mirror_to_github (push) Successful in 20s Details
/ test (push) Successful in 5s Details
main: update documentation
2025-01-16 16:24:15 +01:00
.forgejo/workflows mirror to c-frame 2025-01-16 12:07:19 +01:00
.github/workflows 1st commit 2023-11-01 12:53:18 +01:00
com added more documentation 2025-01-16 15:34:38 +01:00
.env added more documentation 2025-01-16 15:34:38 +01:00
.gitignore javascript bridge fixes 2024-09-02 13:05:47 +00:00
.gitmodules main: work in progress [might break] 2024-07-23 13:21:48 +00:00
LICENSE 1st commit 2023-11-01 12:53:18 +01:00
README.awk added more documentation 2025-01-16 15:34:38 +01:00
README.md main: update documentation 2025-01-16 16:24:15 +01:00

README.md

XRshell apps & components

This is a library of useful AFRAME components used in XRSH [or in any AFRAME app].
Characteristics:

Usage

<script src="https://codeberg.org/xrsh/xrsh-com/com/require.js"/>
<script src="https://codeberg.org/xrsh/xrsh-com/com/example/helloworld.js"/>

<a-entity helloworld="foo:1" class="cubes" name="box">  

See component list below

this README.md is generated by running echo "$(./README.awk com/*.js)" > README.md

Credits

This project is partially funded through NGI0 Entrust, a fund established by NLnet with financial support from the European Commission's Next Generation Internet program. Learn more at the NLnet project page.

NLnet foundation logo NGI Zero Logo

Component List

data_events

allows components to react to data changes

 <script>
   AFRAME.registerComponent('mycom',{
     init: function(){ this.data.foo = 1 }, 
     event: {
       foo:   (e) => alert("I was updated!")
     }
   })
 </script>

 <a-entity mycom data_events/>

html-as-texture-in-xr

shows domid only in immersive mode (wrapper around aframe-htmlmesh

It also sets class 'XR' to the (HTML) body-element in immersive mode. This allows CSS (in dom component) to visually update accordingly.

depends on AFRAME.utils.require

 <style type="text/css">
   .XR #foo { color:red; }
 </style>

 <a-entity html-as-texture-in-xr="domid: #foo">
   <b id="foo">hello</b>
 </a-entitiy>
property type
domid string
event target info
3D a-scene fired when going into immersive mode
2D a-scene fired when leaving immersive mode

isoterminal

Renders a windowed terminal in both (non)immersive mode. It displays an interactive javascript console or boots into a Linux ISO image (via WASM).

  <a-entity isoterminal="iso: xrsh.iso" position="0 1.6 -0.3"></a-entity>

depends on AFRAME.utils.require

property type default info
iso string https`//forgejo.isvery.ninja/assets/xrsh-buildroot/main/xrsh.iso"
overlayfs string WORK-IN-PROGRESS
width number 800
height number 600
depth number 0.03
lineHeight number 18
prompt boolean true boot straight into ISO or give user choice
padding `number`` 18
maximized boolean false
minimized boolean false
muteUntilPrompt boolean true mute stdout until a prompt is detected in ISO
HUD boolean false link to camera movement
transparent boolean false heavy, needs good gpu
memory number 60 VM memory (in MB) [NOTE` quest or smartphone webworker might crash > 40mb ]
bufferLatency number 1 in ms` bufferlatency from webworker to term (batch-update every char to texture)
debug boolean false
emulator string fbterm terminal emulator

for more info see xrsh.isvery.ninja

Component design:

                  css/html template                                                                                
                                                                                                                    
                    ┌─────────┐   ┌────────────┐                  exit-AR                                
           ┌───────►│ com/dom ┼──►│ com/window ├───────────────── exit-VR  ◄─┐                           
           │        └─────────┘   └───────────┬┘                             │                           
           │                                  │                              │                           
┌──────────┴────────┐                         │   ┌───────────┐    ┌─────────────────────────────┐
│  com/isoterminal  ├────────────────────────────►│com/term.js│    │com/html-as-texture-in-XR.js │
└────────┬─┬────────┘                         │   └──┬─────┬▲─┘    └─────────────────────────────┘
         │ │        ┌────────┐             ┌──▼──────▼──────┐                     ││        │                       
         │ └───────►│ plane  ├─────►text───┼►div#isoterminal│◄────────────────── enter-VR   │                       
         │          └────────┘             └────────────────┘                    enter-AR ◄─┘                       
         │                                   │                                                     
         │                                   │                                                                   
         │                             ISOTerminal.js                                                                   
         │                ┌───────────────────────────┐           
         │                │ com/isoterminal/worker.js ├            
         │                └──────────────┌────────────┤            
         │                     │         │ v86.js     │            
         │                     │         │ feat/*.js  │            
         │                     │         │ libv86.js  │            
         │                     │         └────────────┘            
         │                     │         
         └─────────────────────┘    
                                                                                                                    
NOTE: For convenience reasons, events are forwarded between com/isoterminal.js, worker.js and ISOTerminal
      Instead of a melting pot of different functionnames, events are flowing through everything (ISOTerminal.emit())

pastedrop

detects user copy/paste and file dragdrop action and clipboard functions

  <a-entity pastedrop/>
event target info
pasteFile self always translates input to a File object

require

automatically requires dependencies

await AFRAME.utils.require( this.dependencies )               (*) autoload missing components
await AFRAME.utils.require( this.el.getAttributeNames() )     (*) autoload missing components
await AFRAME.utils.require({foo: "https://foo.com/aframe/components/foo.js"},this)
await AFRAME.utils.require(["./app/foo.js","foo.css"],this)

(*) = prefixes baseURL AFRAME.utils.require.baseURL ('./com/' e.g.)