janusweb 1.7.0 → 1.7.2

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 (32) hide show
  1. package/.github/workflows/deploy.yml +71 -0
  2. package/Dockerfile +14 -0
  3. package/README.md +210 -7
  4. package/janusxr.com/.args +2 -0
  5. package/janusxr.com/.init.lua +30 -0
  6. package/media/assets/webui/apps/comms/voip.js +27 -25
  7. package/media/assets/webui/apps/editor/editor.js +3 -0
  8. package/media/assets/webui/apps/navigation/navigation.js +1 -1
  9. package/media/assets/webui/apps/xrfragment/level0-sidecarfile.js +308 -0
  10. package/media/assets/webui/apps/xrfragment/level2-hyperlink.js +265 -0
  11. package/media/assets/webui/apps/xrfragment/level7-engine-prefixes.export.js +93 -0
  12. package/media/assets/webui/apps/xrfragment/level7-engine-prefixes.import.js +229 -0
  13. package/media/assets/webui/apps/xrfragment/patch/metaquest-fix-flickering.js +15 -0
  14. package/media/assets/webui/apps/xrfragment/xrfragment.json +14 -0
  15. package/media/assets/webui/default.json +1 -0
  16. package/media/images/portal.svg +130 -0
  17. package/media/index.html +48 -1
  18. package/package.json +2 -2
  19. package/scripts/client.js +24 -0
  20. package/scripts/config.js +12 -1
  21. package/scripts/janusbase.js +1 -0
  22. package/scripts/janusparagraph.js +169 -22
  23. package/scripts/janusxrplayer.js +4 -6
  24. package/scripts/room.js +59 -36
  25. package/scripts/translators/paragraph/html-xml-rss.js +47 -0
  26. package/scripts/translators/peertube.js +89 -0
  27. package/scripts/translators/xrfragments.js +5 -5
  28. package/tests/room/paragraph.xml +47 -0
  29. package/utils/build.sh +1 -0
  30. package/utils/dev-link.sh +75 -0
  31. package/utils/release.binary.sh +36 -0
  32. package/utils/release.docker.sh +11 -0
@@ -0,0 +1,229 @@
1
+ // https://xrfragment.org/#%F0%9F%93%9Clevel7%3A%20engine%20prefixes
2
+ // There are cases where the 3D scene file might want to hint the
3
+ // specific features to the viewer-engine (JANUSWEB, THREE.js, AFRAME, Godot e.g.).
4
+
5
+ xrf_engines = function(){
6
+
7
+ const {toJanusObject,applyPrefixes,applyCleanup} = xrf_engines
8
+ let cleanup = []
9
+
10
+ const map = (obj,key,realKey) => {
11
+ let match = true
12
+
13
+ // compatibility workaround: some 3D editors omit false booleans in export :/
14
+ // therefore we support boolean strings
15
+ if( obj.userData[key] == 'false' ) obj.userData[key] = false
16
+ if( obj.userData[key] == 'true' ) obj.userData[key] = true
17
+
18
+ // increment/decrement
19
+ let scroller = key.match(/[+]$/)
20
+ if( scroller && !scene.scrollers ){
21
+ if( typeof obj.userData[key] != 'number' ) obj.userData[key] = parseFloat(obj.userData[key])
22
+ scene.scrollers = []
23
+ elation.events.add(null, 'janusweb_script_frame', function(e){
24
+ scene.scrollers.map( (f) => f(e.data) ) // e.data == delta
25
+ })
26
+ }
27
+
28
+ // special cases
29
+ switch( key ){
30
+ case "-three-material.blending": if( obj.material ){
31
+ const modes = {
32
+ 'THREE.NoBlending': THREE.NoBlending,
33
+ 'THREE.NormalBlending': THREE.NormalBlending,
34
+ 'THREE.AdditiveBlending': THREE.AdditiveBlending,
35
+ 'THREE.SubtractiveBlending': THREE.SubtractiveBlending,
36
+ 'THREE.MultiplyBlending': THREE.MultiplyBlending
37
+ }
38
+ setTimeout( () => { // not sure why this only works in setTimeout
39
+ if( modes[ obj.userData[key] ] ) obj.material.blending = modes[ obj.userData[key] ]
40
+ },10)
41
+ }
42
+ break;
43
+
44
+ case "-three-material.sides": if( obj.material ){
45
+ const modes = {
46
+ 'THREE.FrontSide': THREE.NoBlending,
47
+ 'THREE.BackSide': THREE.NormalBlending,
48
+ 'THREE.DoubleSide': THREE.DoubleSide
49
+ }
50
+ setTimeout( () => { // not sure why this only works in setTimeout
51
+ if( modes[ obj.userData[key] ] ) obj.material.sides = modes[ obj.userData[key] ]
52
+ },10)
53
+ }
54
+ break;
55
+
56
+ case "-janus-use_local_asset": room.use_local_asset = obj.userData[key]
57
+ room.localasset = room.createObject('object', {
58
+ id: room.use_local_asset,
59
+ collision_id: room.use_local_asset + '_collision',
60
+ collision_scale: V(1,1,1),
61
+ collision_pos: V(0,0,0),
62
+ col: room.col,
63
+ //fwd: room.fwd,
64
+ xdir: room.xdir,
65
+ ydir: room.ydir,
66
+ zdir: room.zdir,
67
+ shadows: true
68
+ });
69
+ break;
70
+
71
+ // DECLARATIVE entities
72
+ case "-janus-tag": let opts = {}// rotation: '0 -180 0' }
73
+ for( let i in obj.userData ){
74
+ if( !i.match(/^-janus-/) ) continue
75
+ opts[ i.replace(/-janus-/,'') ] = obj.userData[i]
76
+ }
77
+
78
+ // create asset
79
+ if( obj.userData['-janus-tag'].match(/^asset/) ){
80
+ if( opts.src && !opts.src.match(/(^\.|:\/)/) ) opts.src = room.baseurl + opts.src
81
+ room.loadNewAsset( opts['tag'].replace(/^asset/,''), opts )
82
+ }else{
83
+ opts.js_id = opts.name = String(`-janus-${obj.name}_${obj.userData['-janus-tag']}`).replace(/.*janus-/,'-janus-')
84
+ // create room object
85
+ const jo = room.createObject( opts.tag, opts )
86
+ jo.objects['3d'].name = opts.js_id
87
+ jo.visible = false
88
+
89
+ // replace janusobject with nested THREE obj
90
+ obj.parent.add( jo.objects['3d'] )
91
+
92
+ // fix unclickable objects (since obj might be nested in the scene-tree)
93
+ if( jo.colliders ){
94
+ jo.removeCollider()
95
+ jo.colliders.parent.children.push( jo.objects['3d'] )
96
+ }
97
+
98
+ // we need setTimeout otherwise quaternion is not updated
99
+ // https://github.com/jbaicoianu/janusweb/issues/306
100
+ setTimeout( () => {
101
+ jo.orientation.copy( obj.quaternion)
102
+ jo.position.copy( obj.position )
103
+ //jo.scale.copy( obj.scale )
104
+ jo.visible = true
105
+ },200)
106
+ // mark previously generated geo/materials by janusweb export for deletion
107
+ obj.traverse ( (o) => cleanup.push(o) )
108
+ cleanup.push(obj)
109
+ }
110
+ break;
111
+ // OBJECTS
112
+ case "-janus-collision_id": const collision_id = obj.userData[key]
113
+ if( collision_id != obj.name ){
114
+ console.warn(`xrfragment: ${obj.name}.collision_id can be '${obj.name}' only (for now)..skipping '${collision_id}'`)
115
+ }else{
116
+ const jo = toJanusObject(obj,{noreparent:true})
117
+ jo.collidable = true
118
+ jo.collision_id = collision_id
119
+ jo.removeCollider();
120
+ const collider = obj.clone()
121
+ collider.position.set(0,0,0)
122
+ collider.rotation.set(0,0,0)
123
+ collider.scale.set(1,1,1)
124
+ jo.collision_trigger = true
125
+ jo.setCollider('mesh',{mesh: collider})
126
+ jo.colliders.parent = obj
127
+ //jo.objects.dynamics.mass = 1
128
+ //jo.objects.dynamics.addForce('static', new THREE.Vector3(0, room.gravity, 0));
129
+ //elation.events.add(jo.objects.dynamics, 'physics_collide', elation.bind(jo, jo.handleCollision));
130
+ console.log(`xrfragment: setting collision_id = ${collision_id}`)
131
+ }
132
+ break;
133
+
134
+ default: match = false
135
+
136
+ // JANUS property fallthrough
137
+ if( key.match(/^-janus-/) && !key.match("-janus-tag") ){
138
+ // *TODO* more heuristics to determine scene
139
+ if( obj.name == 'Scene' || obj?.parent?.name == '' || obj.userData['-janus-source']){
140
+ room[realKey] = obj.userData[key];
141
+ }else{
142
+ toJanusObject(obj)[realKey] = obj.userData[key]
143
+ }
144
+ match = true
145
+ }
146
+
147
+ // THREE fallthrough
148
+ if( key.match(/^-three-/) ){
149
+
150
+ if( realKey.match('material.') && obj.material ){ // clone shared materials
151
+ obj.material = obj.material.clone()
152
+ if( realKey.match('material.map') ) obj.material.map = obj.material.map.clone()
153
+ }
154
+
155
+ const setKeyVal = (o, path, val ) => new Function('o', 'v', `o.${path} = v `)(o, val);
156
+ if( scroller ){
157
+ const setKeyValIncr = (o, path, val, delta) => new Function('o', 'speed', `o.${path} += ${delta} * speed`)(o, val);
158
+ try{
159
+ const myscroller = function(path,val,delta){
160
+ setKeyValIncr( this, path, val, delta)
161
+ }.bind(obj, realKey.replace(/[+]$/,''), obj.userData[key])
162
+ myscroller(0.000001) // see if it triggers error
163
+ scene.scrollers.push(myscroller) // otherwise add frame-function
164
+ }catch(e){
165
+ console.error(`could not apply engine prefix: ${obj.name} => ${key} (tip: dont use them on <paragraph> objects)`)
166
+ }
167
+ }else{
168
+ try{
169
+ setKeyVal( obj, realKey, obj.userData[key] )
170
+ }catch(e){ console.error(e) }
171
+ }
172
+ match = true
173
+ }
174
+ break;
175
+ }
176
+
177
+ if( match ){
178
+ //console.log(`xrfragment: engine prefix '${key}:${realKey}' = '${obj.userData[key]}'`)
179
+ }
180
+ }
181
+
182
+ room.gravity = 0 // new default unless specified otherwise
183
+ let scene = elation.engine.instances.default.systems.world.scene['world-3d']
184
+ const isAsset = (obj) => String(obj.userData['-janus-tag']).match(/^asset/)
185
+ const isJanusTag = (obj) => String(obj.userData['-janus-tag']) && !isAsset(obj)
186
+ applyPrefixes(scene,map, (o) => isAsset(o) ) // janus requires first initialzing of assets
187
+ applyPrefixes(scene,map, (o) => isJanusTag(o) ) // then regular janus tags
188
+ applyPrefixes(scene,map, (o) => !isJanusTag(o) && !isAsset(o) ) // then set properties on the rest
189
+ applyCleanup(cleanup)
190
+ }
191
+
192
+
193
+ xrf_engines.toJanusObject = function(obj,opts){
194
+ if( room.objects[ obj.name ] ) return room.objects[ obj.name ]
195
+ opts = opts || {}
196
+ opts.tag = opts.tag || 'object'
197
+ const create = () => room.createObject( opts.tag,{ js_id: obj.name, ...opts })
198
+ let jo = create()
199
+ jo.objects['3d'] = obj
200
+ return jo
201
+ }
202
+
203
+ xrf_engines.applyPrefixes = function(scene,map,criteria){
204
+ criteria = criteria ? criteria : (obj) => true
205
+ scene.traverse( (obj) => {
206
+ if( criteria(obj) ){
207
+ for( let field in obj.userData ){
208
+ if( obj.userData[field] ){
209
+ try{
210
+ map(obj,field, field.replace(/^-(janus|three)-/,'') )
211
+ }catch(e){ console.error(e) }
212
+ }
213
+ }
214
+ }
215
+ })
216
+ }
217
+
218
+ xrf_engines.applyCleanup = function(cleanup){
219
+ const clean = (o) => {
220
+ if( o.geometry ) o.geometry.dispose()
221
+ if( o.material ) o.material.dispose()
222
+ o.removeFromParent()
223
+ }
224
+ cleanup.map(clean)
225
+ }
226
+
227
+
228
+ elation.events.add(null, 'room_load_complete', xrf_engines ) // future scenes
229
+ if( room.loaded ) xrf_engines() // current scene
@@ -0,0 +1,15 @@
1
+ // Meta Quest 2 results in rapid flickering when loading a new room
2
+ // therefore we show the shroud while loading
3
+ setActiveRoom = room.janus.setActiveRoom.bind(room.janus)
4
+ room.janus.setActiveRoom = function(url,referer,skipURL){
5
+ if( url.replace(/#.*/,'') != room.url ){
6
+ room.fadeAudioOut()
7
+ setTimeout( function(){
8
+ setActiveRoom.apply(room.janus, [url, referer, skipURL])
9
+ }, 500)
10
+ }else{
11
+ room.urlhash = url.match('#') ? url.replace(/.*#/,'') : 'spawn'
12
+ room.setPlayerPosition()
13
+ // ignore same-room setActiveRoom-calls (it restarts audio when clicking internal hyperlinks)
14
+ }
15
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "templates": {
3
+ },
4
+ "scripts": [
5
+ "./level2-hyperlink.js",
6
+ "./level0-sidecarfile.js",
7
+ "./level7-engine-prefixes.import.js",
8
+ "./level7-engine-prefixes.export.js",
9
+ "./patch/metaquest-fix-flickering.js"
10
+ ],
11
+ "css": []
12
+ }
13
+
14
+
@@ -11,6 +11,7 @@
11
11
  "virtualgamepad": "./apps/virtualgamepad/virtualgamepad.json",
12
12
  "buttons": "./apps/buttons/buttons.json",
13
13
  "xrmenu": "./apps/xrmenu/xrmenu.json",
14
+ "xrfragment": "./apps/xrfragment/xrfragment.json",
14
15
  "vfs": "./apps/vfs/vfs.json"
15
16
  },
16
17
  "includes": [
@@ -0,0 +1,130 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ width="79.375008mm"
6
+ height="158.75mm"
7
+ viewBox="0 0 79.375007 158.75"
8
+ version="1.1"
9
+ id="svg1"
10
+ xml:space="preserve"
11
+ inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
12
+ sodipodi:docname="portal.svg"
13
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
14
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
15
+ xmlns:xlink="http://www.w3.org/1999/xlink"
16
+ xmlns="http://www.w3.org/2000/svg"
17
+ xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
18
+ id="namedview1"
19
+ pagecolor="#ffffff"
20
+ bordercolor="#000000"
21
+ borderopacity="0.25"
22
+ inkscape:showpageshadow="2"
23
+ inkscape:pageopacity="0.0"
24
+ inkscape:pagecheckerboard="0"
25
+ inkscape:deskcolor="#d1d1d1"
26
+ inkscape:document-units="mm"
27
+ inkscape:zoom="0.73673541"
28
+ inkscape:cx="48.185549"
29
+ inkscape:cy="464.88875"
30
+ inkscape:window-width="1920"
31
+ inkscape:window-height="1030"
32
+ inkscape:window-x="0"
33
+ inkscape:window-y="26"
34
+ inkscape:window-maximized="1"
35
+ inkscape:current-layer="layer1" /><defs
36
+ id="defs1"><inkscape:path-effect
37
+ effect="fillet_chamfer"
38
+ id="path-effect6"
39
+ is_visible="true"
40
+ lpeversion="1"
41
+ nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,7.2009148,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,6.7344665,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,5.7643969,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,7.2192412,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
42
+ radius="0"
43
+ unit="px"
44
+ method="auto"
45
+ mode="F"
46
+ chamfer_steps="1"
47
+ flexible="false"
48
+ use_knot_distance="true"
49
+ apply_no_radius="true"
50
+ apply_with_radius="true"
51
+ only_selected="false"
52
+ hide_knots="false" /><inkscape:path-effect
53
+ effect="fillet_chamfer"
54
+ id="path-effect5"
55
+ is_visible="true"
56
+ lpeversion="1"
57
+ nodesatellites_param="F,0,0,1,0,6.191627,0,1 @ F,0,0,1,0,7.505764,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
58
+ radius="0"
59
+ unit="px"
60
+ method="auto"
61
+ mode="F"
62
+ chamfer_steps="1"
63
+ flexible="false"
64
+ use_knot_distance="true"
65
+ apply_no_radius="true"
66
+ apply_with_radius="true"
67
+ only_selected="false"
68
+ hide_knots="false" /><inkscape:path-effect
69
+ effect="fillet_chamfer"
70
+ id="path-effect4"
71
+ is_visible="true"
72
+ lpeversion="1"
73
+ nodesatellites_param="F,0,0,1,0,5.2792018,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
74
+ radius="0"
75
+ unit="px"
76
+ method="auto"
77
+ mode="F"
78
+ chamfer_steps="1"
79
+ flexible="false"
80
+ use_knot_distance="true"
81
+ apply_no_radius="true"
82
+ apply_with_radius="true"
83
+ only_selected="false"
84
+ hide_knots="false" /><inkscape:path-effect
85
+ effect="fillet_chamfer"
86
+ id="path-effect3"
87
+ is_visible="true"
88
+ lpeversion="1"
89
+ nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,5.7643974,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,6.1418531,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
90
+ radius="0"
91
+ unit="px"
92
+ method="auto"
93
+ mode="F"
94
+ chamfer_steps="1"
95
+ flexible="false"
96
+ use_knot_distance="true"
97
+ apply_no_radius="true"
98
+ apply_with_radius="true"
99
+ only_selected="false"
100
+ hide_knots="false" /><linearGradient
101
+ id="linearGradient2"
102
+ inkscape:collect="always"><stop
103
+ style="stop-color:#364051;stop-opacity:0.26459038;"
104
+ offset="0"
105
+ id="stop2" /><stop
106
+ style="stop-color:#4a6483;stop-opacity:0.49411765;"
107
+ offset="0.38955703"
108
+ id="stop5" /><stop
109
+ style="stop-color:#947ac4;stop-opacity:1;"
110
+ offset="1"
111
+ id="stop3" /></linearGradient><linearGradient
112
+ inkscape:collect="always"
113
+ xlink:href="#linearGradient2"
114
+ id="linearGradient3"
115
+ x1="127.20676"
116
+ y1="190.95575"
117
+ x2="125.82147"
118
+ y2="111.5928"
119
+ gradientUnits="userSpaceOnUse"
120
+ gradientTransform="translate(-22.266022,-50.996373)" /></defs><g
121
+ inkscape:label="Layer 1"
122
+ inkscape:groupmode="layer"
123
+ id="layer1"
124
+ transform="translate(-64.560526,-20.90281)"><path
125
+ style="fill:url(#linearGradient3);stroke:none"
126
+ d="M 64.560526,100.27781 V 28.103725 a 7.2009148,7.2009148 135 0 1 7.200915,-7.200915 h 32.486589 32.95303 a 6.7344665,6.7344665 45 0 1 6.73447,6.734466 v 72.640534 l 0,73.6106 a 5.7643969,5.7643969 135 0 1 -5.7644,5.7644 h -33.9231 -32.468263 a 7.2192412,7.2192412 45 0 1 -7.219241,-7.21924 z m 47.103984,29.96041 c 3.30617,-0.89658 6.16277,-2.11655 8.7251,-3.72622 6.98934,-4.39076 11.53086,-10.56792 13.83499,-18.8177 0.48271,-1.72835 0.5565,-2.71166 0.5565,-7.41649 0,-4.704823 -0.0738,-5.688133 -0.5565,-7.416483 -2.30413,-8.24978 -6.84565,-14.42695 -13.83499,-18.8177 -2.5689,-1.6138 -5.43589,-2.83688 -8.7251,-3.72217 -2.55776,-0.68843 -9.42862,-0.95176 -12.402534,-0.47534 -10.8555,1.73904 -20.28912,9.58188 -23.99411,19.94801 -1.2723,3.55973 -1.72805,6.32622 -1.72707,10.483683 9.6e-4,4.08141 0.44822,6.87117 1.64645,10.26947 1.03429,2.9334 1.66772,4.17255 3.62059,7.08285 4.34347,6.47292 11.22797,11.10147 19.09019,12.83461 3.158324,0.69621 10.829344,0.56999 13.766484,-0.22652 z m -11.914404,-1.57307 c -13.08222,-2.28643 -23.09848,-13.06889 -24.03518,-25.87379 -0.64646,-8.837263 2.21242,-16.696163 8.28145,-22.765193 6.04898,-6.04898 13.79151,-8.88345 22.632904,-8.28572 11.92033,0.8059 22.16853,9.45106 25.46177,21.479 0.51415,1.87781 0.59239,2.81007 0.59239,7.058363 0,4.2483 -0.0782,5.18056 -0.59239,7.05837 -2.99448,10.9368 -11.36764,18.84373 -22.34177,21.09776 -1.91619,0.39357 -8.23426,0.53966 -9.999174,0.23121 z m 1.164184,-11.67565 c -2.463224,-1.79225 -5.168364,-5.26924 -6.569154,-8.44346 l -0.49623,-1.12448 h -2.87023 c -1.97121,0 -2.87024,0.0944 -2.87024,0.30147 0,0.43057 1.47343,2.76695 2.60716,4.13412 2.35223,2.83656 7.61793,5.74857 10.595564,5.85951 0.56836,0.0212 0.52671,-0.0552 -0.39687,-0.72716 z m 8.03494,0.37347 c 3.18248,-0.84719 6.87927,-3.15195 8.83123,-5.50582 1.13372,-1.36717 2.60715,-3.70355 2.60715,-4.13412 0,-0.20822 -0.92068,-0.29876 -2.97656,-0.29273 l -2.97657,0.009 -1.10778,2.30636 c -1.27253,2.64936 -3.14145,5.05872 -5.2672,6.79035 -1.61221,1.3133 -1.46174,1.45319 0.88973,0.82722 z m -5.49495,-5.04661 v -4.8948 h -3.968754 c -2.71819,0 -3.96875,0.092 -3.96875,0.29204 0,0.80418 2.18452,4.28343 3.70416,5.89957 1.368124,1.45499 3.805444,3.55555 4.167194,3.59142 0.0364,0.004 0.0661,-2.1961 0.0661,-4.88823 z m 5.15937,1.855 c 1.80981,-1.83861 3.13335,-3.76242 3.9611,-5.75761 l 0.41163,-0.99219 h -3.9723 -3.9723 v 4.91281 4.91281 l 0.85989,-0.59713 c 0.47294,-0.32843 1.69334,-1.44384 2.71198,-2.47869 z m -15.337294,-8.80032 c -0.0992,-0.25466 -0.3097,-1.50481 -0.46779,-2.77812 -0.27657,-2.22771 -0.0302,-6.130013 0.46779,-7.408343 0.16538,-0.42455 -0.0719,-0.46302 -2.85627,-0.46302 h -3.03663 l -0.36511,1.25677 c -0.21641,0.74491 -0.36512,2.49603 -0.36512,4.299483 0,1.80346 0.14871,3.55458 0.36512,4.29948 l 0.36511,1.25677 h 3.03663 c 2.78435,0 3.02165,-0.0385 2.85627,-0.46302 z m 10.177924,-5.09323 v -5.556253 h -4.346874 -4.34687 l -0.32567,1.52136 c -0.41827,1.95392 -0.41827,6.115873 0,8.069793 l 0.32567,1.52135 h 4.34687 4.346874 z m 10.36219,4.43177 c 0.42701,-1.46197 0.42701,-7.401563 0,-8.863543 l -0.32842,-1.12448 h -4.22314 -4.22313 v 5.556253 5.55625 h 4.22313 4.22314 z m 7.66123,-0.13229 c 0.21641,-0.7449 0.36512,-2.49602 0.36512,-4.29948 0,-1.803453 -0.14871,-3.554573 -0.36512,-4.299483 l -0.36511,-1.25677 h -3.03315 -3.03315 l 0.22326,1.38907 c 0.1228,0.76398 0.22327,2.63922 0.22327,4.167183 0,1.52797 -0.10047,3.40321 -0.22327,4.16719 l -0.22326,1.38906 h 3.03315 3.03315 z M 94.345136,92.009577 c 1.40079,-3.17422 4.10593,-6.6512 6.569154,-8.44346 1.19166,-0.86706 0.84372,-0.96209 -1.367474,-0.37346 -3.18248,0.84719 -6.87926,3.15195 -8.83122,5.50582 -1.13373,1.36716 -2.60716,3.70355 -2.60716,4.13412 0,0.20704 0.89903,0.30146 2.87024,0.30146 h 2.87023 z m 9.109144,-3.78302 v -4.9075 l -1.12839,0.77635 c -1.88197,1.29483 -4.751514,4.5327 -5.817124,6.5638 -0.5456,1.03993 -0.99199,2.02219 -0.99199,2.18282 0,0.20001 1.25056,0.29203 3.96875,0.29203 h 3.968754 z m 9.12047,3.91532 c -1.13224,-2.72914 -4.20629,-6.5233 -6.67308,-8.2363 l -0.85989,-0.59713 v 4.91281 4.9128 h 3.9723 3.9723 z m 7.81286,0.69072 c 0,-0.43057 -1.47343,-2.76696 -2.60715,-4.13412 -1.95196,-2.35387 -5.64875,-4.65863 -8.83123,-5.50582 -2.35147,-0.62597 -2.50194,-0.48608 -0.88973,0.82722 2.12575,1.73162 3.99467,4.14099 5.2672,6.79035 l 1.10778,2.30636 2.97657,0.009 c 2.05588,0.006 2.97656,-0.0845 2.97656,-0.29273 z"
127
+ id="path1"
128
+ sodipodi:nodetypes="cccccccccsssscssssssssscssssscsccscssssccssccssccccssscccsscccccsssssscssscssccccssccccsscccccccsssscccssscccssssssscsccssssccsscccccssssssccss"
129
+ inkscape:path-effect="#path-effect6"
130
+ inkscape:original-d="m 64.560526,100.27781 v -79.375 h 39.687504 39.6875 v 79.375 79.375 h -39.6875 -39.687504 z m 47.103984,29.96041 c 3.30617,-0.89658 6.16277,-2.11655 8.7251,-3.72622 6.98934,-4.39076 11.53086,-10.56792 13.83499,-18.8177 0.48271,-1.72835 0.5565,-2.71166 0.5565,-7.41649 0,-4.704823 -0.0738,-5.688133 -0.5565,-7.416483 -2.30413,-8.24978 -6.84565,-14.42695 -13.83499,-18.8177 -2.5689,-1.6138 -5.43589,-2.83688 -8.7251,-3.72217 -2.55776,-0.68843 -9.42862,-0.95176 -12.402534,-0.47534 -10.8555,1.73904 -20.28912,9.58188 -23.99411,19.94801 -1.2723,3.55973 -1.72805,6.32622 -1.72707,10.483683 9.6e-4,4.08141 0.44822,6.87117 1.64645,10.26947 1.03429,2.9334 1.66772,4.17255 3.62059,7.08285 4.34347,6.47292 11.22797,11.10147 19.09019,12.83461 3.158324,0.69621 10.829344,0.56999 13.766484,-0.22652 z m -11.914404,-1.57307 c -13.08222,-2.28643 -23.09848,-13.06889 -24.03518,-25.87379 -0.64646,-8.837263 2.21242,-16.696163 8.28145,-22.765193 6.04898,-6.04898 13.79151,-8.88345 22.632904,-8.28572 11.92033,0.8059 22.16853,9.45106 25.46177,21.479 0.51415,1.87781 0.59239,2.81007 0.59239,7.058363 0,4.2483 -0.0782,5.18056 -0.59239,7.05837 -2.99448,10.9368 -11.36764,18.84373 -22.34177,21.09776 -1.91619,0.39357 -8.23426,0.53966 -9.999174,0.23121 z m 1.164184,-11.67565 c -2.463224,-1.79225 -5.168364,-5.26924 -6.569154,-8.44346 l -0.49623,-1.12448 h -2.87023 c -1.97121,0 -2.87024,0.0944 -2.87024,0.30147 0,0.43057 1.47343,2.76695 2.60716,4.13412 2.35223,2.83656 7.61793,5.74857 10.595564,5.85951 0.56836,0.0212 0.52671,-0.0552 -0.39687,-0.72716 z m 8.03494,0.37347 c 3.18248,-0.84719 6.87927,-3.15195 8.83123,-5.50582 1.13372,-1.36717 2.60715,-3.70355 2.60715,-4.13412 0,-0.20822 -0.92068,-0.29876 -2.97656,-0.29273 l -2.97657,0.009 -1.10778,2.30636 c -1.27253,2.64936 -3.14145,5.05872 -5.2672,6.79035 -1.61221,1.3133 -1.46174,1.45319 0.88973,0.82722 z m -5.49495,-5.04661 v -4.8948 h -3.968754 c -2.71819,0 -3.96875,0.092 -3.96875,0.29204 0,0.80418 2.18452,4.28343 3.70416,5.89957 1.368124,1.45499 3.805444,3.55555 4.167194,3.59142 0.0364,0.004 0.0661,-2.1961 0.0661,-4.88823 z m 5.15937,1.855 c 1.80981,-1.83861 3.13335,-3.76242 3.9611,-5.75761 l 0.41163,-0.99219 h -3.9723 -3.9723 v 4.91281 4.91281 l 0.85989,-0.59713 c 0.47294,-0.32843 1.69334,-1.44384 2.71198,-2.47869 z m -15.337294,-8.80032 c -0.0992,-0.25466 -0.3097,-1.50481 -0.46779,-2.77812 -0.27657,-2.22771 -0.0302,-6.130013 0.46779,-7.408343 0.16538,-0.42455 -0.0719,-0.46302 -2.85627,-0.46302 h -3.03663 l -0.36511,1.25677 c -0.21641,0.74491 -0.36512,2.49603 -0.36512,4.299483 0,1.80346 0.14871,3.55458 0.36512,4.29948 l 0.36511,1.25677 h 3.03663 c 2.78435,0 3.02165,-0.0385 2.85627,-0.46302 z m 10.177924,-5.09323 v -5.556253 h -4.346874 -4.34687 l -0.32567,1.52136 c -0.41827,1.95392 -0.41827,6.115873 0,8.069793 l 0.32567,1.52135 h 4.34687 4.346874 z m 10.36219,4.43177 c 0.42701,-1.46197 0.42701,-7.401563 0,-8.863543 l -0.32842,-1.12448 h -4.22314 -4.22313 v 5.556253 5.55625 h 4.22313 4.22314 z m 7.66123,-0.13229 c 0.21641,-0.7449 0.36512,-2.49602 0.36512,-4.29948 0,-1.803453 -0.14871,-3.554573 -0.36512,-4.299483 l -0.36511,-1.25677 h -3.03315 -3.03315 l 0.22326,1.38907 c 0.1228,0.76398 0.22327,2.63922 0.22327,4.167183 0,1.52797 -0.10047,3.40321 -0.22327,4.16719 l -0.22326,1.38906 h 3.03315 3.03315 z M 94.345136,92.009577 c 1.40079,-3.17422 4.10593,-6.6512 6.569154,-8.44346 1.19166,-0.86706 0.84372,-0.96209 -1.367474,-0.37346 -3.18248,0.84719 -6.87926,3.15195 -8.83122,5.50582 -1.13373,1.36716 -2.60716,3.70355 -2.60716,4.13412 0,0.20704 0.89903,0.30146 2.87024,0.30146 h 2.87023 z m 9.109144,-3.78302 v -4.9075 l -1.12839,0.77635 c -1.88197,1.29483 -4.751514,4.5327 -5.817124,6.5638 -0.5456,1.03993 -0.99199,2.02219 -0.99199,2.18282 0,0.20001 1.25056,0.29203 3.96875,0.29203 h 3.968754 z m 9.12047,3.91532 c -1.13224,-2.72914 -4.20629,-6.5233 -6.67308,-8.2363 l -0.85989,-0.59713 v 4.91281 4.9128 h 3.9723 3.9723 z m 7.81286,0.69072 c 0,-0.43057 -1.47343,-2.76696 -2.60715,-4.13412 -1.95196,-2.35387 -5.64875,-4.65863 -8.83123,-5.50582 -2.35147,-0.62597 -2.50194,-0.48608 -0.88973,0.82722 2.12575,1.73162 3.99467,4.14099 5.2672,6.79035 l 1.10778,2.30636 2.97657,0.009 c 2.05588,0.006 2.97656,-0.0845 2.97656,-0.29273 z" /></g></svg>
package/media/index.html CHANGED
@@ -34,8 +34,55 @@
34
34
  <script src="janusweb.js"></script>
35
35
  </head>
36
36
  <body>
37
- <janus-viewer src="https://www.janusxr.org/"></janus-viewer>
37
+ <janus-viewer src="./index.html"></janus-viewer> <!-- project this document in 3D -->
38
38
  </body>
39
39
  </html>
40
40
 
41
+ <!--
41
42
 
43
+ <fireboxroom>
44
+ <assets></assets>
45
+ <room use_local_asset="room_plane" fwd="0 0 1">
46
+ <object js_id="links" rotation="0 180 0">
47
+
48
+ <link js_id="1" pos="3 0 10" xdir="-0.866027 0 0.499998" ydir="0 1 0" zdir="-0.499998 0 -0.866027" url="https://www.reddit.com/r/vrsites" col="#ffffff" scale="1.5 3 1" draw_glow="false" >
49
+ <paragraph js_id="p" width="300" height="700" pos="0 1.53 0.05" transparent="true" scale="0.7 1.68 1" lighting="false">
50
+ <![CDATA[ <img src="media/images/portal.svg" width="300" height="700"/> ]]>
51
+ </paragraph>
52
+ </link>
53
+
54
+ <link js_id="3" pos="5 0 8.5" xdir="-0.707109 0 0.707105" ydir="0 1 0" zdir="-0.707105 0 -0.707109" url="https://vesta.janusxr.org" col="#ffffff" scale="1.5 3 1" draw_glow="false">
55
+ <paragraph js_id="p" width="300" height="700" pos="0 1.53 0.05" transparent="true" scale="0.7 1.68 1" lighting="false">
56
+ <![CDATA[ <img src="media/images/portal.svg" width="300" height="700"/> ]]>
57
+ </paragraph>
58
+ </link>
59
+
60
+ <link js_id="2" pos="-3 0 10" xdir="-0.866024 0 -0.500002" ydir="0 1 0" zdir="0.500002 0 -0.866024" url="workspaces" col="#ffffff" scale="1.5 3 1" draw_glow="false">
61
+ <paragraph js_id="p" width="300" height="700" pos="0 1.53 0.05" transparent="true" scale="0.7 1.68 1" lighting="false">
62
+ <![CDATA[ <img src="media/images/portal.svg" width="300" height="700"/> ]]>
63
+ </paragraph>
64
+ </link>
65
+
66
+ <link js_id="4" pos="-5 0 8.5" xdir="-0.707106 0 -0.707108" ydir="0 1 0" zdir="0.707108 0 -0.707106" url="bookmarks" col="#ffffff" scale="1.5 3 1" draw_glow="false">
67
+ <paragraph js_id="p" width="300" height="700" pos="0 1.53 0.05" transparent="true" scale="0.7 1.68 1" lighting="false">
68
+ <![CDATA[ <img src="media/images/portal.svg" width="300" height="700"/> ]]>
69
+ </paragraph>
70
+ </link>
71
+
72
+ <link js_id="0" pos="0 0 10.8" xdir="-1 0 -0.000002" ydir="0 1 0" zdir="0.000002 0 -1" url="https://www.janusxr.org/newlobby/index.html" col="#ffffff" scale="1.5 3 1" draw_glow="false">
73
+ <paragraph js_id="p" width="300" height="700" pos="0 1.53 0.05" transparent="true" scale="0.7 1.68 1" lighting="false">
74
+ <![CDATA[ <img src="media/images/portal.svg" width="300" height="700"/> ]]>
75
+ </paragraph>
76
+ </link>
77
+
78
+ <link js_id="5" pos="-6.51 0 6.5" rotation="-180 65 -180" url="https://xrforge.isvery.ninja" col="#ffffff" scale="1.5 3 1" draw_glow="false">
79
+ <paragraph js_id="p" width="300" height="700" pos="0 1.53 0.05" transparent="true" scale="0.7 1.68 1" lighting="false">
80
+ <![CDATA[ <img src="media/images/portal.svg" width="300" height="700"/> ]]>
81
+ </paragraph>
82
+ </link>
83
+
84
+ </object>
85
+ </room>
86
+ </fireboxroom>
87
+
88
+ -->
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "janusweb",
3
3
  "description": "Web client for JanusVR worlds",
4
- "version": "1.7.0",
4
+ "version": "1.7.2",
5
5
  "main": "scripts/janusweb.js",
6
6
  "author": "James Baicoianu",
7
7
  "license": "MIT",
@@ -19,7 +19,7 @@
19
19
  "url": "https://github.com/jbaicoianu/janusweb"
20
20
  },
21
21
  "dependencies": {
22
- "elation-engine": ">=0.9.114",
22
+ "elation-engine": "^0.10.0",
23
23
  "uglify-js": "*"
24
24
  },
25
25
  "keywords": [
package/scripts/client.js CHANGED
@@ -152,6 +152,30 @@ elation.require(['elements.elements', 'elements', 'engine.engine', 'engine.asset
152
152
  }
153
153
  }
154
154
  });
155
+ this.initProxies()
156
+ }
157
+ initProxies() {
158
+ elation.engine.assets = new Proxy(elation.engine.assets,{
159
+ get(me,k){
160
+ if( k == "corsproxy" && me[k] ){
161
+ const p = elation.config.get("engine.assets.corsproxies")
162
+ if( ! p?.length ){
163
+ return me[k] // nothing to roundrobin
164
+ }else{ // roundrobin proxies
165
+ if( !p.index ) p.index = 0
166
+ const corsproxy = p[ p.index ]
167
+ elation.config.set("engine.assets.corsproxy", corsproxy )
168
+ p.index = (p.index + 1) % p.length
169
+ return corsproxy
170
+ }
171
+ }
172
+ return me[k]
173
+ },
174
+ set(me,k,v){
175
+ me[k] = v
176
+ return true
177
+ }
178
+ })
155
179
  }
156
180
  initButtons() {
157
181
  this.sharebutton = elation.ui.button({classname: 'janusweb_sharing', label: 'Share'});
package/scripts/config.js CHANGED
@@ -1,5 +1,16 @@
1
1
  elation.config.set('janusweb.network.host', 'wss://presence.janusxr.org:5567'); // Default presence server
2
- elation.config.set('engine.assets.corsproxy', 'https://p.janusxr.org/'); // CORS proxy URL
2
+
3
+ proxies = [
4
+ 'https://p.janusxr.org/',
5
+ 'https://cors.xrforge.isvery.ninja/'
6
+ ]
7
+ elation.config.set('engine.assets.corsproxy', proxies[0]); // CORS proxy URL
8
+ elation.config.set('engine.assets.corsproxies', [] ); // rotate **online** proxies only
9
+ proxies.map( (url) =>
10
+ fetch(url,{method:'HEAD'})
11
+ .then( (res) => res.ok && elation.config.get("engine.assets.corsproxies").push(url) )
12
+ )
13
+
3
14
  elation.config.set('engine.assets.workers', 'auto'); // Number of workers to use for asset parsing
4
15
  //elation.config.set('engine.assets.image.maxsize', 16384);
5
16
  elation.config.set('engine.assets.image.anisotropy', 16);
@@ -353,6 +353,7 @@ elation.require(['engine.things.generic', 'utils.template', 'janusweb.parts'], f
353
353
  jsid: ['property', 'js_id'],
354
354
  pos: ['property', 'position'],
355
355
  rotation: ['property', 'rotation'],
356
+ angular: ['property', 'angular'],
356
357
  scale: ['property', 'scale'],
357
358
  //rotation_order: ['property', 'rotation_order'],
358
359
  col: ['property', 'color'],