fix url navigation

This commit is contained in:
Leon van Kammen 2024-01-30 09:58:00 +00:00
parent 9df7685253
commit ae7225d4ba
20 changed files with 12934 additions and 538 deletions

View file

@ -4,7 +4,7 @@ name: Deploy static content to Pages
on: on:
# Runs on pushes targeting the default branch # Runs on pushes targeting the default branch
push: push:
branches: ["main","feat/multiparty"] branches: ["main"] # ["main","feat/multiparty"]
# Allows you to run this workflow manually from the Actions tab # Allows you to run this workflow manually from the Actions tab
workflow_dispatch: workflow_dispatch:
@ -31,11 +31,11 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Checkout feat/multiparty #- name: Checkout feat/multiparty
uses: actions/checkout@v3 # uses: actions/checkout@v3
with: # with:
ref: feat/multiparty # ref: feat/multiparty
path: feat/multiparty # path: feat/multiparty
- name: Setup Pages - name: Setup Pages
uses: actions/configure-pages@v3 uses: actions/configure-pages@v3
- name: create index.gltf - name: create index.gltf
@ -44,7 +44,7 @@ jobs:
run: cp example/assets/*.{gltf,glb} . run: cp example/assets/*.{gltf,glb} .
# working-directory: ./ # working-directory: ./
- name: Upload artifact - name: Upload artifact
uses: actions/upload-pages-artifact@v1 uses: actions/upload-pages-artifact@v3
with: with:
path: '.' path: '.'
- name: Deploy to GitHub Pages - name: Deploy to GitHub Pages

View file

@ -1,5 +1,5 @@
/* /*
* v0.5.1 generated at Mon Jan 29 08:11:09 PM UTC 2024 * v0.5.1 generated at Tue Jan 30 09:55:47 AM UTC 2024
* https://xrfragment.org * https://xrfragment.org
* SPDX-License-Identifier: MPL-2.0 * SPDX-License-Identifier: MPL-2.0
*/ */
@ -903,10 +903,12 @@ xrf.patchLoader = function(loader){
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'') xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
// parseModel event is essential for src.js to hook into embedded loaded models
xrf.parseModel = function(model,url){ xrf.parseModel = function(model,url){
let file = xrf.getFile(url) let file = xrf.getFile(url)
model.file = file model.file = file
model.isXRF = true
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
xrf.emit('parseModel',{model,url,file}) xrf.emit('parseModel',{model,url,file})
} }
@ -932,7 +934,7 @@ xrf.reset = () => {
xrf.add( xrf.interactive ) xrf.add( xrf.interactive )
xrf.layers = 0 xrf.layers = 0
// reset certain events // allow others to reset certain events
xrf.emit('reset',{}) xrf.emit('reset',{})
// remove mixers // remove mixers
xrf.mixers.map( (m) => m.stop()) xrf.mixers.map( (m) => m.stop())
@ -1043,7 +1045,6 @@ xrf.navigator.to = (url,flags,loader,data) => {
} }
if( data ){ // file upload if( data ){ // file upload
console.dir(loader)
loader.parse(data, "", onLoad ) loader.parse(data, "", onLoad )
}else loader.load(url, onLoad ) }else loader.load(url, onLoad )
}) })
@ -1339,7 +1340,7 @@ xrf.frag.src.enableSourcePortation = (src) => {
mat.metalness = 1 mat.metalness = 1
mat.opacity = 0 mat.opacity = 0
const cube = new THREE.Mesh( geo, mat ) const cube = new THREE.Mesh( geo, mat )
console.log("todo: sourceportate") // *TODO* sourceportate?
return xrf.frag.src return xrf.frag.src
} }
@ -1473,7 +1474,7 @@ xrf.addEventListener('parseModel', (opts) => {
model.animations.map( (anim) => { model.animations.map( (anim) => {
anim.optimize() anim.optimize()
console.log("action: "+anim.name) if( xrf.debug ) console.log("action: "+anim.name)
mixer.actions.push( mixer.clipAction( anim, model.scene ) ) mixer.actions.push( mixer.clipAction( anim, model.scene ) )
}) })
@ -1825,7 +1826,7 @@ xrf.filter.process = function(frag,scene,opts){
let obj let obj
frag.target = firstFilter frag.target = firstFilter
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) ) scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace")) if( xrf.debug ) console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if(obj ){ if(obj ){
obj.position.set(0,0,0) obj.position.set(0,0,0)
if( opts.copyScene ) { if( opts.copyScene ) {
@ -1883,7 +1884,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
scene.traverse( (n) => { scene.traverse( (n) => {
if( n.userData && n.userData['#'] ){ if( n.userData && n.userData['#'] ){
let frag = xrf.URI.parse( n.userData['#'] ) let frag = xrf.URI.parse( n.userData['#'] )
if( n.parent && n.parent.parent.isScene && document.location.hash.length < 2 ){ if( !n.parent && document.location.hash.length < 2){
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
}else{ }else{
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
@ -2251,7 +2252,7 @@ xrf.portalNonEuclidian = function(opts){
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
cam.getWorldPosition(cameraPosition) cam.getWorldPosition(cameraPosition)
cam.getWorldDirection(cameraDirection) cam.getWorldDirection(cameraDirection)
if( cameraPosition.distanceTo(newPos) > 20.0 ) return // dont render far portals if( cameraPosition.distanceTo(newPos) > 10.0 ) return // dont render far portals
// init // init
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
@ -2406,6 +2407,17 @@ window.AFRAME.registerComponent('xrf', {
https: { type:'string'}, https: { type:'string'},
}, },
init: function () { init: function () {
// override this.data when URL has passed (`://....com/?https://foo.com/index.glb` e.g.)
if( typeof this.data == "string" ){
let searchIsUri = document.location.search &&
!document.location.search.match(/=/) &&
document.location.search.match("://")
if( searchIsUri || document.location.hash.length > 1 ){ // override url
this.data = `${document.location.search.substr(1)}${document.location.hash}`
}
}
if( !AFRAME.XRF ){ if( !AFRAME.XRF ){
let camera = document.querySelector('[camera]') let camera = document.querySelector('[camera]')
@ -2532,15 +2544,6 @@ window.AFRAME.registerComponent('xrf', {
aScene.setAttribute('xrf-gaze','') aScene.setAttribute('xrf-gaze','')
} }
if( typeof this.data == "string" ){
let searchIsUri = document.location.search &&
!document.location.search.match(/=/) &&
document.location.search.match("://")
if( searchIsUri || document.location.hash.length > 1 ){ // override url
this.data = `${document.location.search.substr(1)}${document.location.hash}`
}
}
}, },
}) })
@ -2821,7 +2824,7 @@ window.AFRAME.registerComponent('xrf-get', {
mesh.scale.copy(world.scale) mesh.scale.copy(world.scale)
mesh.setRotationFromQuaternion(world.quat); mesh.setRotationFromQuaternion(world.quat);
}else{ }else{
// add() will reparent the mesh so lets create a dummy // lets create a dummy add function so that the mesh won't get reparented
this.el.object3D.add = (a) => a this.el.object3D.add = (a) => a
} }
this.el.setObject3D('mesh',mesh) this.el.setObject3D('mesh',mesh)
@ -2833,6 +2836,10 @@ window.AFRAME.registerComponent('xrf-get', {
this.el.emit("update",{timeout:0}) this.el.emit("update",{timeout:0})
AFRAME.XRF.addEventListener('reset', () => {
this.el.remove()
})
} }
}); });

View file

@ -1,5 +1,5 @@
/* /*
* v0.5.1 generated at Mon Jan 29 08:11:09 PM UTC 2024 * v0.5.1 generated at Tue Jan 30 09:55:47 AM UTC 2024
* https://xrfragment.org * https://xrfragment.org
* SPDX-License-Identifier: MPL-2.0 * SPDX-License-Identifier: MPL-2.0
*/ */
@ -901,10 +901,12 @@ xrf.patchLoader = function(loader){
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'') xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
// parseModel event is essential for src.js to hook into embedded loaded models
xrf.parseModel = function(model,url){ xrf.parseModel = function(model,url){
let file = xrf.getFile(url) let file = xrf.getFile(url)
model.file = file model.file = file
model.isXRF = true
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
xrf.emit('parseModel',{model,url,file}) xrf.emit('parseModel',{model,url,file})
} }
@ -930,7 +932,7 @@ xrf.reset = () => {
xrf.add( xrf.interactive ) xrf.add( xrf.interactive )
xrf.layers = 0 xrf.layers = 0
// reset certain events // allow others to reset certain events
xrf.emit('reset',{}) xrf.emit('reset',{})
// remove mixers // remove mixers
xrf.mixers.map( (m) => m.stop()) xrf.mixers.map( (m) => m.stop())
@ -1041,7 +1043,6 @@ xrf.navigator.to = (url,flags,loader,data) => {
} }
if( data ){ // file upload if( data ){ // file upload
console.dir(loader)
loader.parse(data, "", onLoad ) loader.parse(data, "", onLoad )
}else loader.load(url, onLoad ) }else loader.load(url, onLoad )
}) })
@ -1337,7 +1338,7 @@ xrf.frag.src.enableSourcePortation = (src) => {
mat.metalness = 1 mat.metalness = 1
mat.opacity = 0 mat.opacity = 0
const cube = new THREE.Mesh( geo, mat ) const cube = new THREE.Mesh( geo, mat )
console.log("todo: sourceportate") // *TODO* sourceportate?
return xrf.frag.src return xrf.frag.src
} }
@ -1471,7 +1472,7 @@ xrf.addEventListener('parseModel', (opts) => {
model.animations.map( (anim) => { model.animations.map( (anim) => {
anim.optimize() anim.optimize()
console.log("action: "+anim.name) if( xrf.debug ) console.log("action: "+anim.name)
mixer.actions.push( mixer.clipAction( anim, model.scene ) ) mixer.actions.push( mixer.clipAction( anim, model.scene ) )
}) })
@ -1823,7 +1824,7 @@ xrf.filter.process = function(frag,scene,opts){
let obj let obj
frag.target = firstFilter frag.target = firstFilter
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) ) scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace")) if( xrf.debug ) console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if(obj ){ if(obj ){
obj.position.set(0,0,0) obj.position.set(0,0,0)
if( opts.copyScene ) { if( opts.copyScene ) {
@ -1881,7 +1882,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
scene.traverse( (n) => { scene.traverse( (n) => {
if( n.userData && n.userData['#'] ){ if( n.userData && n.userData['#'] ){
let frag = xrf.URI.parse( n.userData['#'] ) let frag = xrf.URI.parse( n.userData['#'] )
if( n.parent && n.parent.parent.isScene && document.location.hash.length < 2 ){ if( !n.parent && document.location.hash.length < 2){
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
}else{ }else{
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
@ -2249,7 +2250,7 @@ xrf.portalNonEuclidian = function(opts){
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
cam.getWorldPosition(cameraPosition) cam.getWorldPosition(cameraPosition)
cam.getWorldDirection(cameraDirection) cam.getWorldDirection(cameraDirection)
if( cameraPosition.distanceTo(newPos) > 20.0 ) return // dont render far portals if( cameraPosition.distanceTo(newPos) > 10.0 ) return // dont render far portals
// init // init
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true
@ -2404,6 +2405,17 @@ window.AFRAME.registerComponent('xrf', {
https: { type:'string'}, https: { type:'string'},
}, },
init: function () { init: function () {
// override this.data when URL has passed (`://....com/?https://foo.com/index.glb` e.g.)
if( typeof this.data == "string" ){
let searchIsUri = document.location.search &&
!document.location.search.match(/=/) &&
document.location.search.match("://")
if( searchIsUri || document.location.hash.length > 1 ){ // override url
this.data = `${document.location.search.substr(1)}${document.location.hash}`
}
}
if( !AFRAME.XRF ){ if( !AFRAME.XRF ){
let camera = document.querySelector('[camera]') let camera = document.querySelector('[camera]')
@ -2530,15 +2542,6 @@ window.AFRAME.registerComponent('xrf', {
aScene.setAttribute('xrf-gaze','') aScene.setAttribute('xrf-gaze','')
} }
if( typeof this.data == "string" ){
let searchIsUri = document.location.search &&
!document.location.search.match(/=/) &&
document.location.search.match("://")
if( searchIsUri || document.location.hash.length > 1 ){ // override url
this.data = `${document.location.search.substr(1)}${document.location.hash}`
}
}
}, },
}) })
@ -2819,7 +2822,7 @@ window.AFRAME.registerComponent('xrf-get', {
mesh.scale.copy(world.scale) mesh.scale.copy(world.scale)
mesh.setRotationFromQuaternion(world.quat); mesh.setRotationFromQuaternion(world.quat);
}else{ }else{
// add() will reparent the mesh so lets create a dummy // lets create a dummy add function so that the mesh won't get reparented
this.el.object3D.add = (a) => a this.el.object3D.add = (a) => a
} }
this.el.setObject3D('mesh',mesh) this.el.setObject3D('mesh',mesh)
@ -2831,6 +2834,10 @@ window.AFRAME.registerComponent('xrf-get', {
this.el.emit("update",{timeout:0}) this.el.emit("update",{timeout:0})
AFRAME.XRF.addEventListener('reset', () => {
this.el.remove()
})
} }
}); });

12188
dist/xrfragment.module.js vendored

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/* /*
* v0.5.1 generated at Mon Jan 29 08:11:09 PM UTC 2024 * v0.5.1 generated at Tue Jan 30 09:55:47 AM UTC 2024
* https://xrfragment.org * https://xrfragment.org
* SPDX-License-Identifier: MPL-2.0 * SPDX-License-Identifier: MPL-2.0
*/ */
@ -901,10 +901,12 @@ xrf.patchLoader = function(loader){
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'') xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
// parseModel event is essential for src.js to hook into embedded loaded models
xrf.parseModel = function(model,url){ xrf.parseModel = function(model,url){
let file = xrf.getFile(url) let file = xrf.getFile(url)
model.file = file model.file = file
model.isXRF = true
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
xrf.emit('parseModel',{model,url,file}) xrf.emit('parseModel',{model,url,file})
} }
@ -930,7 +932,7 @@ xrf.reset = () => {
xrf.add( xrf.interactive ) xrf.add( xrf.interactive )
xrf.layers = 0 xrf.layers = 0
// reset certain events // allow others to reset certain events
xrf.emit('reset',{}) xrf.emit('reset',{})
// remove mixers // remove mixers
xrf.mixers.map( (m) => m.stop()) xrf.mixers.map( (m) => m.stop())
@ -1041,7 +1043,6 @@ xrf.navigator.to = (url,flags,loader,data) => {
} }
if( data ){ // file upload if( data ){ // file upload
console.dir(loader)
loader.parse(data, "", onLoad ) loader.parse(data, "", onLoad )
}else loader.load(url, onLoad ) }else loader.load(url, onLoad )
}) })
@ -1337,7 +1338,7 @@ xrf.frag.src.enableSourcePortation = (src) => {
mat.metalness = 1 mat.metalness = 1
mat.opacity = 0 mat.opacity = 0
const cube = new THREE.Mesh( geo, mat ) const cube = new THREE.Mesh( geo, mat )
console.log("todo: sourceportate") // *TODO* sourceportate?
return xrf.frag.src return xrf.frag.src
} }
@ -1471,7 +1472,7 @@ xrf.addEventListener('parseModel', (opts) => {
model.animations.map( (anim) => { model.animations.map( (anim) => {
anim.optimize() anim.optimize()
console.log("action: "+anim.name) if( xrf.debug ) console.log("action: "+anim.name)
mixer.actions.push( mixer.clipAction( anim, model.scene ) ) mixer.actions.push( mixer.clipAction( anim, model.scene ) )
}) })
@ -1823,7 +1824,7 @@ xrf.filter.process = function(frag,scene,opts){
let obj let obj
frag.target = firstFilter frag.target = firstFilter
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) ) scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace")) if( xrf.debug ) console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if(obj ){ if(obj ){
obj.position.set(0,0,0) obj.position.set(0,0,0)
if( opts.copyScene ) { if( opts.copyScene ) {
@ -1881,7 +1882,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
scene.traverse( (n) => { scene.traverse( (n) => {
if( n.userData && n.userData['#'] ){ if( n.userData && n.userData['#'] ){
let frag = xrf.URI.parse( n.userData['#'] ) let frag = xrf.URI.parse( n.userData['#'] )
if( n.parent && n.parent.parent.isScene && document.location.hash.length < 2 ){ if( !n.parent && document.location.hash.length < 2){
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
}else{ }else{
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
@ -2249,7 +2250,7 @@ xrf.portalNonEuclidian = function(opts){
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
cam.getWorldPosition(cameraPosition) cam.getWorldPosition(cameraPosition)
cam.getWorldDirection(cameraDirection) cam.getWorldDirection(cameraDirection)
if( cameraPosition.distanceTo(newPos) > 20.0 ) return // dont render far portals if( cameraPosition.distanceTo(newPos) > 10.0 ) return // dont render far portals
// init // init
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true

View file

@ -1,5 +1,5 @@
/* /*
* v0.5.1 generated at Mon Jan 29 08:11:09 PM UTC 2024 * v0.5.1 generated at Tue Jan 30 09:55:47 AM UTC 2024
* https://xrfragment.org * https://xrfragment.org
* SPDX-License-Identifier: MPL-2.0 * SPDX-License-Identifier: MPL-2.0
*/ */
@ -901,10 +901,12 @@ xrf.patchLoader = function(loader){
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'') xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
// parseModel event is essential for src.js to hook into embedded loaded models
xrf.parseModel = function(model,url){ xrf.parseModel = function(model,url){
let file = xrf.getFile(url) let file = xrf.getFile(url)
model.file = file model.file = file
model.isXRF = true
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
xrf.emit('parseModel',{model,url,file}) xrf.emit('parseModel',{model,url,file})
} }
@ -930,7 +932,7 @@ xrf.reset = () => {
xrf.add( xrf.interactive ) xrf.add( xrf.interactive )
xrf.layers = 0 xrf.layers = 0
// reset certain events // allow others to reset certain events
xrf.emit('reset',{}) xrf.emit('reset',{})
// remove mixers // remove mixers
xrf.mixers.map( (m) => m.stop()) xrf.mixers.map( (m) => m.stop())
@ -1041,7 +1043,6 @@ xrf.navigator.to = (url,flags,loader,data) => {
} }
if( data ){ // file upload if( data ){ // file upload
console.dir(loader)
loader.parse(data, "", onLoad ) loader.parse(data, "", onLoad )
}else loader.load(url, onLoad ) }else loader.load(url, onLoad )
}) })
@ -1337,7 +1338,7 @@ xrf.frag.src.enableSourcePortation = (src) => {
mat.metalness = 1 mat.metalness = 1
mat.opacity = 0 mat.opacity = 0
const cube = new THREE.Mesh( geo, mat ) const cube = new THREE.Mesh( geo, mat )
console.log("todo: sourceportate") // *TODO* sourceportate?
return xrf.frag.src return xrf.frag.src
} }
@ -1471,7 +1472,7 @@ xrf.addEventListener('parseModel', (opts) => {
model.animations.map( (anim) => { model.animations.map( (anim) => {
anim.optimize() anim.optimize()
console.log("action: "+anim.name) if( xrf.debug ) console.log("action: "+anim.name)
mixer.actions.push( mixer.clipAction( anim, model.scene ) ) mixer.actions.push( mixer.clipAction( anim, model.scene ) )
}) })
@ -1823,7 +1824,7 @@ xrf.filter.process = function(frag,scene,opts){
let obj let obj
frag.target = firstFilter frag.target = firstFilter
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) ) scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace")) if( xrf.debug ) console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if(obj ){ if(obj ){
obj.position.set(0,0,0) obj.position.set(0,0,0)
if( opts.copyScene ) { if( opts.copyScene ) {
@ -1881,7 +1882,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
scene.traverse( (n) => { scene.traverse( (n) => {
if( n.userData && n.userData['#'] ){ if( n.userData && n.userData['#'] ){
let frag = xrf.URI.parse( n.userData['#'] ) let frag = xrf.URI.parse( n.userData['#'] )
if( n.parent && n.parent.parent.isScene && document.location.hash.length < 2 ){ if( !n.parent && document.location.hash.length < 2){
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
}else{ }else{
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments
@ -2249,7 +2250,7 @@ xrf.portalNonEuclidian = function(opts){
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
cam.getWorldPosition(cameraPosition) cam.getWorldPosition(cameraPosition)
cam.getWorldDirection(cameraDirection) cam.getWorldDirection(cameraDirection)
if( cameraPosition.distanceTo(newPos) > 20.0 ) return // dont render far portals if( cameraPosition.distanceTo(newPos) > 10.0 ) return // dont render far portals
// init // init
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true

View file

@ -80,7 +80,7 @@ value: draft-XRFRAGMENTS-leonvankammen-00
<h1 class="special" id="abstract">Abstract</h1> <h1 class="special" id="abstract">Abstract</h1>
<p>This draft is a specification for 4D URLs &amp; <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> navigation, which links together space, time &amp; text together, for hypermedia browsers with- or without a network-connection.<br> <p>This draft is a specification for 4D URI&rsquo;s &amp; <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> navigation, which links together space, time &amp; text together, for hypermedia browsers with- or without a network-connection.<br>
The specification promotes spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br> The specification promotes spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br>
XR Fragments allows us to better use existing metadata inside 3D scene(files), by connecting it to proven technologies like <a href="https://en.wikipedia.org/wiki/URI_fragment">URI Fragments</a>.</p> XR Fragments allows us to better use existing metadata inside 3D scene(files), by connecting it to proven technologies like <a href="https://en.wikipedia.org/wiki/URI_fragment">URI Fragments</a>.</p>
@ -95,13 +95,13 @@ Historically, there&rsquo;s many attempts to create the ultimate markuplanguage
The lowest common denominator is: designers describing/tagging/naming things using <strong>plain text</strong>.<br> The lowest common denominator is: designers describing/tagging/naming things using <strong>plain text</strong>.<br>
XR Fragments exploits the fact that all 3D models already contain such metadata:</p> XR Fragments exploits the fact that all 3D models already contain such metadata:</p>
<p><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URLs</strong></p> <p><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URI&rsquo;s</strong></p>
<p>Or more detailed:</p> <p>It solves:</p>
<ol> <ol>
<li>addressibility and <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> navigation of 3D scenes/objects: <a href="https://en.wikipedia.org/wiki/URI_fragment">URI Fragments</a> + src/href spatial metadata</li> <li>addressibility and <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> navigation of 3D scenes/objects: <a href="https://en.wikipedia.org/wiki/URI_fragment">URI Fragments</a> + src/href spatial metadata</li>
<li>Interlinking (text)objects by collapsing space into a Word Graph (XRWG) to show <a href="#visible-links">visible links</a></li> <li>Interlinking text &amp; spatial objects by collapsing space into a Word Graph (XRWG) to show <a href="#visible-links">visible links</a></li>
<li>unlocking spatial potential of the (originally 2D) hashtag (which jumps to a chapter) for navigating XR documents</li> <li>unlocking spatial potential of the (originally 2D) hashtag (which jumps to a chapter) for navigating XR documents</li>
</ol> </ol>
@ -111,10 +111,78 @@ XR Fragments exploits the fact that all 3D models already contain such metadata:
<h1 id="core-principle">Core principle</h1> <h1 id="core-principle">Core principle</h1>
<p><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URLs</strong></p> <p><strong>XR Fragments allows controlling 3D models using URLs, based on (non)existing metadata via URI&rsquo;s</strong></p>
<p>XR Fragments tries to seek to connect the world of text (semantical web / RDF), and the world of pixels.<br> <p>XR Fragments tries to seek to connect the world of text (semantical web / RDF), and the world of pixels.<br>
Instead of combining them (in a game-editor e.g.), XR Fragments <strong>integrates all</strong>, by collecting metadata into an XRWG and control it via URL:</p> Instead of forcing authors to combine 3D/2D objects programmatically (publishing thru a game-editor e.g.), XR Fragments <strong>integrates all</strong> which allows a universal viewing experience.<br></p>
<pre><code> +───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ U R N │
│ U R L | │
│ | |-----------------+--------| │
│ +--------------------------------------------------| │
│ | │
│ + https://foo.com/some/foo/scene.glb#someview &lt;-- http URI (=URL and has URN) │
│ | │
│ + ipfs://cfe0987ec9r9098ecr/cats.fbx#someview &lt;-- an IPFS URI (=URL and has URN) │
│ │
│ ec09f7e9cf8e7f09c8e7f98e79c09ef89e000efece8f7ecfe9fe &lt;-- an interpeer URI │
│ │
│ │
│ |------------------------+-------------------------| │
│ | │
│ U R I │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
</code></pre>
<p>Fact: our typical browser URL&rsquo;s are just <strong>a possible implementation</strong> of URI&rsquo;s (for untapped humancentric potential of URI&rsquo;s <a href="https://interpeer.io">see interpeer.io</a>)</p>
<blockquote>
<p>XR Fragments does not look at XR (or the web) thru the lens of HTML or URLs.<br>But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective.</p>
</blockquote>
<p>Below you can see how this translates back into good-old URLs:</p>
<pre><code> +───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano │
│ │
│ 2D URL: ://library.com /document ?search #chapter │
│ │
│ 4D URL: ://park.com /4Dscene.fbx ─&gt; ?other.glb ─&gt; #view ───&gt; hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ (hypermediatic) #material │ │
│ │ ( feedback ) #animation │ │
│ │ ( loop ) #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG &lt;─────────────────────&lt;─────────────+ │
│ │ │ │
│ └─ objects ──────────────&gt;─────────────+ │
│ │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
</code></pre>
<blockquote>
<p>?-linked and #-linked navigation allows a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.</p>
</blockquote>
<p>Traditional webbrowsers can become 4D document-ready by:</p>
<ul>
<li><a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> loading 3D assets (gltf/fbx e.g.) natively (with or without using HTML).</li>
<li>allowing assets to publish hashtags to themselves (the scene) using the hashbus (like hashtags controlling the scrollbar).</li>
<li>collapsing the 3D scene to an wordgraph (for essential navigation purposes) controllable thru a hash(tag)bus</li>
<li>completely bypasses the security-trap of loading external scripts (by loading 3D model-files, not HTML-javascriptable resources)</li>
</ul>
<p>XR Fragments itself are <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> and HTML-agnostic, though pseudo-XR Fragment browsers <strong>can</strong> be implemented on top of HTML/Javascript.</p>
<table> <table>
<thead> <thead>
@ -176,48 +244,13 @@ Instead of combining them (in a game-editor e.g.), XR Fragments <strong>integrat
</tbody> </tbody>
</table> </table>
<blockquote>
<p>XR Fragments does not look at XR (or the web) thru the lens of HTML.<br>But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective:</p>
</blockquote>
<pre><code> +──────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano │
│ │
│ 2D URL: ://library.com /document ?search #chapter │
│ │
│ 4D URL: ://park.com /4Dscene.fbx ──&gt; ?misc ──&gt; #view ───&gt; hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ #material │ │
│ │ #animation │ │
│ │ #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG &lt;─────────────────────&lt;────────────+ │
│ │ │ │
│ └─ objects ──────────────&gt;────────────+ │
│ │
│ │
+──────────────────────────────────────────────────────────────────────────────────────────────+
</code></pre>
<p>Traditional webbrowsers can become 4D document-ready by:</p>
<ul>
<li><a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> loading 3D assets (gltf/fbx e.g.) natively (with or without using HTML).</li>
<li>allowing assets to publish hashtags to themselves (the scene) using the hashbus (like hashtags controlling the scrollbar).</li>
<li>collapsing the 3D scene to an wordgraph (for essential navigation purposes) controllable thru a hash(tag)bus</li>
</ul>
<p>XR Fragments itself are <a href="https://github.com/coderofsalvation/hypermediatic">hypermediatic</a> and HTML-agnostic, though pseudo-XR Fragment browsers <strong>can</strong> be implemented on top of HTML/Javascript.</p>
<h1 id="conventions-and-definitions">Conventions and Definitions</h1> <h1 id="conventions-and-definitions">Conventions and Definitions</h1>
<p>See appendix below in case certain terms are not clear.</p> <p>See appendix below in case certain terms are not clear.</p>
<h2 id="xr-fragment-uri-grammar">XR Fragment URI Grammar</h2> <h2 id="xr-fragment-url-grammar">XR Fragment URL Grammar</h2>
<p>For typical HTTP-like browsers/applications:</p>
<pre><code>reserved = gen-delims / sub-delims <pre><code>reserved = gen-delims / sub-delims
gen-delims = &quot;#&quot; / &quot;&amp;&quot; gen-delims = &quot;#&quot; / &quot;&amp;&quot;
@ -253,6 +286,10 @@ sub-delims = &quot;,&quot; / &quot;=&quot;
<p>this is already implemented in all browsers</p> <p>this is already implemented in all browsers</p>
</blockquote> </blockquote>
<p>Pseudo (non-native) browser-implementations (supporting XR Fragments using HTML+JS e.g.) can use the <code>?</code> search-operator to address outbound content.<br>
In other words, the URL updates to: <code>https://me.com?https://me.com/other.glb</code> when navigating to <code>https://me.com/other.glb</code> from inside a <code>https://me.com</code> WebXR experience e.g.<br>
That way, if the link gets shared, the XR Fragments implementation at <code>https://me.com</code> can load the latter (and still indicates which XR Fragments entrypoint-experience/client was used).</p>
<h1 id="list-of-uri-fragments">List of URI Fragments</h1> <h1 id="list-of-uri-fragments">List of URI Fragments</h1>
<table> <table>
@ -1404,6 +1441,16 @@ Non-HTML Hypermedia browsers should make browser extensions the right place, to
<td>an object inside a scene characterized by vertex-, face- and customproperty data.</td> <td>an object inside a scene characterized by vertex-, face- and customproperty data.</td>
</tr> </tr>
<tr>
<td>URI</td>
<td>some resource at something somewhere via someprotocol (<code>http://me.com/foo.glb#foo</code> or <code>e76f8efec8efce98e6f</code> <a href="https://interpeer.io">see interpeer.io</a>)</td>
</tr>
<tr>
<td>URL</td>
<td>something somewhere via someprotocol (<code>http://me.com/foo.glb</code>)</td>
</tr>
<tr> <tr>
<td>metadata</td> <td>metadata</td>
<td>custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers)</td> <td>custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers)</td>

View file

@ -93,7 +93,7 @@ value: draft-XRFRAGMENTS-leonvankammen-00
.# Abstract .# Abstract
This draft is a specification for 4D URLs & [hypermediatic](https://github.com/coderofsalvation/hypermediatic) navigation, which links together space, time & text together, for hypermedia browsers with- or without a network-connection.<br> This draft is a specification for 4D URI's & [hypermediatic](https://github.com/coderofsalvation/hypermediatic) navigation, which links together space, time & text together, for hypermedia browsers with- or without a network-connection.<br>
The specification promotes spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br> The specification promotes spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br>
XR Fragments allows us to better use existing metadata inside 3D scene(files), by connecting it to proven technologies like [URI Fragments](https://en.wikipedia.org/wiki/URI_fragment). XR Fragments allows us to better use existing metadata inside 3D scene(files), by connecting it to proven technologies like [URI Fragments](https://en.wikipedia.org/wiki/URI_fragment).
@ -108,22 +108,86 @@ Historically, there's many attempts to create the ultimate markuplanguage or 3D
The lowest common denominator is: designers describing/tagging/naming things using **plain text**.<br> The lowest common denominator is: designers describing/tagging/naming things using **plain text**.<br>
XR Fragments exploits the fact that all 3D models already contain such metadata: XR Fragments exploits the fact that all 3D models already contain such metadata:
**XR Fragments allows controlling of metadata in 3D scene(files) using URLs** **XR Fragments allows controlling of metadata in 3D scene(files) using URI's**
Or more detailed: It solves:
1. addressibility and [hypermediatic](https://github.com/coderofsalvation/hypermediatic) navigation of 3D scenes/objects: [URI Fragments](https://en.wikipedia.org/wiki/URI_fragment) + src/href spatial metadata 1. addressibility and [hypermediatic](https://github.com/coderofsalvation/hypermediatic) navigation of 3D scenes/objects: [URI Fragments](https://en.wikipedia.org/wiki/URI_fragment) + src/href spatial metadata
1. Interlinking (text)objects by collapsing space into a Word Graph (XRWG) to show [visible links](#visible-links) 1. Interlinking text & spatial objects by collapsing space into a Word Graph (XRWG) to show [visible links](#visible-links)
1. unlocking spatial potential of the (originally 2D) hashtag (which jumps to a chapter) for navigating XR documents 1. unlocking spatial potential of the (originally 2D) hashtag (which jumps to a chapter) for navigating XR documents
> NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible > NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible
# Core principle # Core principle
**XR Fragments allows controlling of metadata in 3D scene(files) using URLs** **XR Fragments allows controlling 3D models using URLs, based on (non)existing metadata via URI's**
XR Fragments tries to seek to connect the world of text (semantical web / RDF), and the world of pixels.<br> XR Fragments tries to seek to connect the world of text (semantical web / RDF), and the world of pixels.<br>
Instead of combining them (in a game-editor e.g.), XR Fragments **integrates all**, by collecting metadata into an XRWG and control it via URL: Instead of forcing authors to combine 3D/2D objects programmatically (publishing thru a game-editor e.g.), XR Fragments **integrates all** which allows a universal viewing experience.<br>
```
+───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ U R N │
│ U R L | │
│ | |-----------------+--------| │
│ +--------------------------------------------------| │
│ | │
│ + https://foo.com/some/foo/scene.glb#someview <-- http URI (=URL and has URN)
│ | │
│ + ipfs://cfe0987ec9r9098ecr/cats.fbx#someview <-- an IPFS URI (=URL and has URN)
│ │
│ ec09f7e9cf8e7f09c8e7f98e79c09ef89e000efece8f7ecfe9fe <-- an interpeer URI
│ │
│ │
│ |------------------------+-------------------------| │
│ | │
│ U R I │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
```
Fact: our typical browser URL's are just **a possible implementation** of URI's (for untapped humancentric potential of URI's [see interpeer.io](https://interpeer.io))
> XR Fragments does not look at XR (or the web) thru the lens of HTML or URLs.<br>But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective.
Below you can see how this translates back into good-old URLs:
```
+───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano
│ │
│ 2D URL: ://library.com /document ?search #chapter
│ │
│ 4D URL: ://park.com /4Dscene.fbx ─> ?other.glb ─> #view ───> hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ (hypermediatic) #material │ │
│ │ ( feedback ) #animation │ │
│ │ ( loop ) #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG <─────────────────────<─────────────+ │
│ │ │ │
│ └─ objects ──────────────>─────────────+ │
│ │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
```
> ?-linked and #-linked navigation allows a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.
Traditional webbrowsers can become 4D document-ready by:
* [hypermediatic](https://github.com/coderofsalvation/hypermediatic) loading 3D assets (gltf/fbx e.g.) natively (with or without using HTML).
* allowing assets to publish hashtags to themselves (the scene) using the hashbus (like hashtags controlling the scrollbar).
* collapsing the 3D scene to an wordgraph (for essential navigation purposes) controllable thru a hash(tag)bus
* completely bypasses the security-trap of loading external scripts (by loading 3D model-files, not HTML-javascriptable resources)
XR Fragments itself are [hypermediatic](https://github.com/coderofsalvation/hypermediatic) and HTML-agnostic, though pseudo-XR Fragment browsers **can** be implemented on top of HTML/Javascript.
| principle | XR 4D URL | HTML 2D URL | | principle | XR 4D URL | HTML 2D URL |
|----------------------|-------------------------------------------------|---------------------------------------| |----------------------|-------------------------------------------------|---------------------------------------|
@ -136,45 +200,13 @@ Instead of combining them (in a game-editor e.g.), XR Fragments **integrates all
| href metadata | draws visible connection(s) for XRWG 'tag' | n/a | | href metadata | draws visible connection(s) for XRWG 'tag' | n/a |
| href metadata | filters certain (in)visible objects | n/a | | href metadata | filters certain (in)visible objects | n/a |
> XR Fragments does not look at XR (or the web) thru the lens of HTML.<br>But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective:
```
+──────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano
│ │
│ 2D URL: ://library.com /document ?search #chapter
│ │
│ 4D URL: ://park.com /4Dscene.fbx ──> ?misc ──> #view ───> hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ #material │ │
│ │ #animation │ │
│ │ #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG <─────────────────────<────────────+ │
│ │ │ │
│ └─ objects ──────────────>────────────+ │
│ │
│ │
+──────────────────────────────────────────────────────────────────────────────────────────────+
```
Traditional webbrowsers can become 4D document-ready by:
* [hypermediatic](https://github.com/coderofsalvation/hypermediatic) loading 3D assets (gltf/fbx e.g.) natively (with or without using HTML).
* allowing assets to publish hashtags to themselves (the scene) using the hashbus (like hashtags controlling the scrollbar).
* collapsing the 3D scene to an wordgraph (for essential navigation purposes) controllable thru a hash(tag)bus
XR Fragments itself are [hypermediatic](https://github.com/coderofsalvation/hypermediatic) and HTML-agnostic, though pseudo-XR Fragment browsers **can** be implemented on top of HTML/Javascript.
# Conventions and Definitions # Conventions and Definitions
See appendix below in case certain terms are not clear. See appendix below in case certain terms are not clear.
## XR Fragment URI Grammar ## XR Fragment URL Grammar
For typical HTTP-like browsers/applications:
``` ```
reserved = gen-delims / sub-delims reserved = gen-delims / sub-delims
@ -191,6 +223,10 @@ sub-delims = "," / "="
> this is already implemented in all browsers > this is already implemented in all browsers
Pseudo (non-native) browser-implementations (supporting XR Fragments using HTML+JS e.g.) can use the `?` search-operator to address outbound content.<br>
In other words, the URL updates to: `https://me.com?https://me.com/other.glb` when navigating to `https://me.com/other.glb` from inside a `https://me.com` WebXR experience e.g.<br>
That way, if the link gets shared, the XR Fragments implementation at `https://me.com` can load the latter (and still indicates which XR Fragments entrypoint-experience/client was used).
# List of URI Fragments # List of URI Fragments
| fragment | type | example | info | | fragment | type | example | info |
@ -957,6 +993,8 @@ This document has no IANA actions.
|human | a sentient being who thinks fuzzy, absorbs, and shares thought (by plain text, not markuplanguage) | |human | a sentient being who thinks fuzzy, absorbs, and shares thought (by plain text, not markuplanguage) |
|scene | a (local/remote) 3D scene or 3D file (index.gltf e.g.) | |scene | a (local/remote) 3D scene or 3D file (index.gltf e.g.) |
|3D object | an object inside a scene characterized by vertex-, face- and customproperty data. | |3D object | an object inside a scene characterized by vertex-, face- and customproperty data. |
|URI | some resource at something somewhere via someprotocol (`http://me.com/foo.glb#foo` or `e76f8efec8efce98e6f` [see interpeer.io](https://interpeer.io))|
|URL | something somewhere via someprotocol (`http://me.com/foo.glb`) |
|metadata | custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers) | |metadata | custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers) |
|XR fragment | URI Fragment with spatial hints like `#pos=0,0,0&t=1,100` e.g. | |XR fragment | URI Fragment with spatial hints like `#pos=0,0,0&t=1,100` e.g. |
|the XRWG | wordgraph (collapses 3D scene to tags) | |the XRWG | wordgraph (collapses 3D scene to tags) |

View file

@ -3,7 +3,7 @@
Internet Engineering Task Force L.R. van Kammen Internet Engineering Task Force L.R. van Kammen
Internet-Draft 6 December 2023 Internet-Draft 30 January 2024
Intended status: Informational Intended status: Informational
@ -13,7 +13,7 @@ Intended status: Informational
Abstract Abstract
This draft is a specification for 4D URLs & hypermediatic This draft is a specification for 4D URI's & hypermediatic
(https://github.com/coderofsalvation/hypermediatic) navigation, which (https://github.com/coderofsalvation/hypermediatic) navigation, which
links together space, time & text together, for hypermedia browsers links together space, time & text together, for hypermedia browsers
with- or without a network-connection. with- or without a network-connection.
@ -41,11 +41,11 @@ Status of This Memo
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on 8 June 2024. This Internet-Draft will expire on 2 August 2024.
Copyright Notice Copyright Notice
Copyright (c) 2023 IETF Trust and the persons identified as the Copyright (c) 2024 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
@ -53,9 +53,9 @@ Copyright Notice
van Kammen Expires 8 June 2024 [Page 1] van Kammen Expires 2 August 2024 [Page 1]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
@ -71,47 +71,47 @@ Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Core principle . . . . . . . . . . . . . . . . . . . . . . . 3 2. Core principle . . . . . . . . . . . . . . . . . . . . . . . 3
3. Conventions and Definitions . . . . . . . . . . . . . . . . . 5 3. Conventions and Definitions . . . . . . . . . . . . . . . . . 6
3.1. XR Fragment URI Grammar . . . . . . . . . . . . . . . . . 5 3.1. XR Fragment URL Grammar . . . . . . . . . . . . . . . . . 6
4. List of URI Fragments . . . . . . . . . . . . . . . . . . . . 6 4. List of URI Fragments . . . . . . . . . . . . . . . . . . . . 7
4.1. List of metadata for 3D nodes . . . . . . . . . . . . . . 6 4.1. List of metadata for 3D nodes . . . . . . . . . . . . . . 8
4.2. vector datatypes . . . . . . . . . . . . . . . . . . . . 7 4.2. vector datatypes . . . . . . . . . . . . . . . . . . . . 8
4.3. Dynamic XR Fragments (+databindings) . . . . . . . . . . 7 4.3. Dynamic XR Fragments (+databindings) . . . . . . . . . . 9
5. Spatial Referencing 3D . . . . . . . . . . . . . . . . . . . 8 5. Spatial Referencing 3D . . . . . . . . . . . . . . . . . . . 10
6. Navigating 3D . . . . . . . . . . . . . . . . . . . . . . . . 9 6. Navigating 3D . . . . . . . . . . . . . . . . . . . . . . . . 10
7. Top-level URL processing . . . . . . . . . . . . . . . . . . 10 7. Top-level URL processing . . . . . . . . . . . . . . . . . . 12
8. Embedding XR content using src . . . . . . . . . . . . . . . 11 8. Embedding XR content using src . . . . . . . . . . . . . . . 12
9. Navigating content href portals . . . . . . . . . . . . . . . 13 9. Navigating content href portals . . . . . . . . . . . . . . . 14
9.1. Walking surfaces . . . . . . . . . . . . . . . . . . . . 15 9.1. Walking surfaces . . . . . . . . . . . . . . . . . . . . 16
9.2. UX spec . . . . . . . . . . . . . . . . . . . . . . . . . 15 9.2. UX spec . . . . . . . . . . . . . . . . . . . . . . . . . 16
9.3. Scaling instanced content . . . . . . . . . . . . . . . . 15 9.3. Scaling instanced content . . . . . . . . . . . . . . . . 16
10. XR Fragment: pos . . . . . . . . . . . . . . . . . . . . . . 16 10. XR Fragment: pos . . . . . . . . . . . . . . . . . . . . . . 17
11. XR Fragment: rot . . . . . . . . . . . . . . . . . . . . . . 16 11. XR Fragment: rot . . . . . . . . . . . . . . . . . . . . . . 17
12. XR Fragment: t . . . . . . . . . . . . . . . . . . . . . . . 16 12. XR Fragment: t . . . . . . . . . . . . . . . . . . . . . . . 17
13. XR audio/video integration . . . . . . . . . . . . . . . . . 17 13. XR audio/video integration . . . . . . . . . . . . . . . . . 18
14. XR Fragment filters . . . . . . . . . . . . . . . . . . . . . 17 14. XR Fragment filters . . . . . . . . . . . . . . . . . . . . . 18
14.1. including/excluding . . . . . . . . . . . . . . . . . . 18 14.1. including/excluding . . . . . . . . . . . . . . . . . . 19
14.2. Filter Parser . . . . . . . . . . . . . . . . . . . . . 18 14.2. Filter Parser . . . . . . . . . . . . . . . . . . . . . 19
15. Visible links . . . . . . . . . . . . . . . . . . . . . . . . 19 15. Visible links . . . . . . . . . . . . . . . . . . . . . . . . 20
16. Text in XR (tagging,linking to spatial objects) . . . . . . . 19 16. Text in XR (tagging,linking to spatial objects) . . . . . . . 20
16.1. Default Data URI mimetype . . . . . . . . . . . . . . . 23 16.1. Default Data URI mimetype . . . . . . . . . . . . . . . 24
16.2. URL and Data URI . . . . . . . . . . . . . . . . . . . . 24 16.2. URL and Data URI . . . . . . . . . . . . . . . . . . . . 25
16.3. XR Text example parser . . . . . . . . . . . . . . . . . 25 16.3. XR Text example parser . . . . . . . . . . . . . . . . . 26
17. Transclusion (broken link) resolution . . . . . . . . . . . . 27 17. Transclusion (broken link) resolution . . . . . . . . . . . . 28
18. Topic-based index-less Webrings . . . . . . . . . . . . . . . 28 18. Topic-based index-less Webrings . . . . . . . . . . . . . . . 29
19. Security Considerations . . . . . . . . . . . . . . . . . . . 29 19. Security Considerations . . . . . . . . . . . . . . . . . . . 30
20. FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 20. FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
21. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 30 21. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 31
22. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 30 22. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 31
23. Appendix: Definitions . . . . . . . . . . . . . . . . . . . . 30 23. Appendix: Definitions . . . . . . . . . . . . . . . . . . . . 31
van Kammen Expires 8 June 2024 [Page 2] van Kammen Expires 2 August 2024 [Page 2]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
1. Introduction 1. Introduction
@ -126,16 +126,16 @@ Internet-Draft XR Fragments December 2023
such metadata: such metadata:
*XR Fragments allows controlling of metadata in 3D scene(files) using *XR Fragments allows controlling of metadata in 3D scene(files) using
URLs* URI's*
Or more detailed: It solves:
1. addressibility and hypermediatic 1. addressibility and hypermediatic
(https://github.com/coderofsalvation/hypermediatic) navigation of (https://github.com/coderofsalvation/hypermediatic) navigation of
3D scenes/objects: URI Fragments (https://en.wikipedia.org/wiki/ 3D scenes/objects: URI Fragments (https://en.wikipedia.org/wiki/
URI_fragment) + src/href spatial metadata URI_fragment) + src/href spatial metadata
2. Interlinking (text)objects by collapsing space into a Word Graph 2. Interlinking text & spatial objects by collapsing space into a
(XRWG) to show visible links (#visible-links) Word Graph (XRWG) to show visible links (#visible-links)
3. unlocking spatial potential of the (originally 2D) hashtag (which 3. unlocking spatial potential of the (originally 2D) hashtag (which
jumps to a chapter) for navigating XR documents jumps to a chapter) for navigating XR documents
@ -144,14 +144,14 @@ Internet-Draft XR Fragments December 2023
2. Core principle 2. Core principle
*XR Fragments allows controlling of metadata in 3D scene(files) using *XR Fragments allows controlling 3D models using URLs, based on
URLs* (non)existing metadata via URI's*
XR Fragments tries to seek to connect the world of text (semantical XR Fragments tries to seek to connect the world of text (semantical
web / RDF), and the world of pixels. web / RDF), and the world of pixels.
Instead of combining them (in a game-editor e.g.), XR Fragments Instead of forcing authors to combine 3D/2D objects programmatically
*integrates all*, by collecting metadata into an XRWG and control it (publishing thru a game-editor e.g.), XR Fragments *integrates all*
via URL: which allows a universal viewing experience.
@ -165,9 +165,121 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 3] van Kammen Expires 2 August 2024 [Page 3]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
+───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ U R N │
│ U R L | │
│ | |-----------------+--------| │
│ +--------------------------------------------------| │
│ | │
│ + https://foo.com/some/foo/scene.glb#someview <-- http URI (=URL and has URN) │
│ | │
│ + ipfs://cfe0987ec9r9098ecr/cats.fbx#someview <-- an IPFS URI (=URL and has URN) │
│ │
│ ec09f7e9cf8e7f09c8e7f98e79c09ef89e000efece8f7ecfe9fe <-- an interpeer URI │
│ │
│ │
│ |------------------------+-------------------------| │
│ | │
│ U R I │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
Fact: our typical browser URL's are just *a possible implementation*
of URI's (for untapped humancentric potential of URI's see
interpeer.io (https://interpeer.io))
| XR Fragments does not look at XR (or the web) thru the lens of
| HTML or URLs.
| But approaches things from a higherlevel feedbackloop/hypermedia
| browser-perspective.
Below you can see how this translates back into good-old URLs:
van Kammen Expires 2 August 2024 [Page 4]
Internet-Draft XR Fragments January 2024
+───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano │
│ │
│ 2D URL: ://library.com /document ?search #chapter │
│ │
│ 4D URL: ://park.com /4Dscene.fbx ─> ?other.glb ─> #view ───> hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ (hypermediatic) #material │ │
│ │ ( feedback ) #animation │ │
│ │ ( loop ) #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG <─────────────────────<─────────────+ │
│ │ │ │
│ └─ objects ──────────────>─────────────+ │
│ │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
| ?-linked and #-linked navigation allows a Hypermediatic
| FeedbackLoop (HFL) between external and internal 4D navigation.
Traditional webbrowsers can become 4D document-ready by:
* hypermediatic (https://github.com/coderofsalvation/hypermediatic)
loading 3D assets (gltf/fbx e.g.) natively (with or without using
HTML).
* allowing assets to publish hashtags to themselves (the scene)
using the hashbus (like hashtags controlling the scrollbar).
* collapsing the 3D scene to an wordgraph (for essential navigation
purposes) controllable thru a hash(tag)bus
* completely bypasses the security-trap of loading external scripts
(by loading 3D model-files, not HTML-javascriptable resources)
XR Fragments itself are hypermediatic
(https://github.com/coderofsalvation/hypermediatic) and HTML-
agnostic, though pseudo-XR Fragment browsers *can* be implemented on
top of HTML/Javascript.
van Kammen Expires 2 August 2024 [Page 5]
Internet-Draft XR Fragments January 2024
+===========+===============================+====================+ +===========+===============================+====================+
@ -200,73 +312,13 @@ Internet-Draft XR Fragments December 2023
Table 1 Table 1
| XR Fragments does not look at XR (or the web) thru the lens of
| HTML.
| But approaches things from a higherlevel feedbackloop/hypermedia
| browser-perspective:
van Kammen Expires 8 June 2024 [Page 4]
Internet-Draft XR Fragments December 2023
+──────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano │
│ │
│ 2D URL: ://library.com /document ?search #chapter │
│ │
│ 4D URL: ://park.com /4Dscene.fbx ──> ?misc ──> #view ───> hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ #material │ │
│ │ #animation │ │
│ │ #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG <─────────────────────<────────────+ │
│ │ │ │
│ └─ objects ──────────────>────────────+ │
│ │
│ │
+──────────────────────────────────────────────────────────────────────────────────────────────+
Traditional webbrowsers can become 4D document-ready by:
* hypermediatic (https://github.com/coderofsalvation/hypermediatic)
loading 3D assets (gltf/fbx e.g.) natively (with or without using
HTML).
* allowing assets to publish hashtags to themselves (the scene)
using the hashbus (like hashtags controlling the scrollbar).
* collapsing the 3D scene to an wordgraph (for essential navigation
purposes) controllable thru a hash(tag)bus
XR Fragments itself are hypermediatic
(https://github.com/coderofsalvation/hypermediatic) and HTML-
agnostic, though pseudo-XR Fragment browsers *can* be implemented on
top of HTML/Javascript.
3. Conventions and Definitions 3. Conventions and Definitions
See appendix below in case certain terms are not clear. See appendix below in case certain terms are not clear.
3.1. XR Fragment URI Grammar 3.1. XR Fragment URL Grammar
For typical HTTP-like browsers/applications:
reserved = gen-delims / sub-delims reserved = gen-delims / sub-delims
gen-delims = "#" / "&" gen-delims = "#" / "&"
@ -277,9 +329,13 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 5]
van Kammen Expires 2 August 2024 [Page 6]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
+==========================+=================================+ +==========================+=================================+
@ -294,6 +350,16 @@ Internet-Draft XR Fragments December 2023
| this is already implemented in all browsers | this is already implemented in all browsers
Pseudo (non-native) browser-implementations (supporting XR Fragments
using HTML+JS e.g.) can use the ? search-operator to address outbound
content.
In other words, the URL updates to: https://me.com?https://me.com/
other.glb when navigating to https://me.com/other.glb from inside a
https://me.com WebXR experience e.g.
That way, if the link gets shared, the XR Fragments implementation at
https://me.com can load the latter (and still indicates which XR
Fragments entrypoint-experience/client was used).
4. List of URI Fragments 4. List of URI Fragments
+==========+============+==============+===========================+ +==========+============+==============+===========================+
@ -313,6 +379,21 @@ Internet-Draft XR Fragments December 2023
Table 3 Table 3
van Kammen Expires 2 August 2024 [Page 7]
Internet-Draft XR Fragments January 2024
4.1. List of metadata for 3D nodes 4.1. List of metadata for 3D nodes
+======+========+==========+===================+===================+ +======+========+==========+===================+===================+
@ -330,14 +411,6 @@ Internet-Draft XR Fragments December 2023
| | | geo" | highlighting) | | | | | geo" | highlighting) | |
+------+--------+----------+-------------------+-------------------+ +------+--------+----------+-------------------+-------------------+
van Kammen Expires 8 June 2024 [Page 6]
Internet-Draft XR Fragments December 2023
Table 4 Table 4
| Supported popular compatible 3D fileformats: .gltf, .obj, .fbx, | Supported popular compatible 3D fileformats: .gltf, .obj, .fbx,
@ -370,30 +443,19 @@ Internet-Draft XR Fragments December 2023
| agnostic, which means that programmatic 3D scene(nodes) can also | agnostic, which means that programmatic 3D scene(nodes) can also
| use the mechanism/metadata. | use the mechanism/metadata.
van Kammen Expires 2 August 2024 [Page 8]
Internet-Draft XR Fragments January 2024
4.3. Dynamic XR Fragments (+databindings) 4.3. Dynamic XR Fragments (+databindings)
These are automatic fragment-to-metadata mappings, which only trigger These are automatic fragment-to-metadata mappings, which only trigger
if the 3D scene metadata matches a specific identifier (aliasname if the 3D scene metadata matches a specific identifier (aliasname
e.g.) e.g.)
van Kammen Expires 8 June 2024 [Page 7]
Internet-Draft XR Fragments December 2023
+==========================+=======================+=================+=======================+ +==========================+=======================+=================+=======================+
|fragment |type |example |info | |fragment |type |example |info |
+==========================+=======================+=================+=======================+ +==========================+=======================+=================+=======================+
@ -437,19 +499,17 @@ Internet-Draft XR Fragments December 2023
Table 6 Table 6
van Kammen Expires 2 August 2024 [Page 9]
Internet-Draft XR Fragments January 2024
5. Spatial Referencing 3D 5. Spatial Referencing 3D
XR Fragments assume the following objectname-to-URIFragment mapping: XR Fragments assume the following objectname-to-URIFragment mapping:
van Kammen Expires 8 June 2024 [Page 8]
Internet-Draft XR Fragments December 2023
my.io/scene.fbx my.io/scene.fbx
+─────────────────────────────+ +─────────────────────────────+
│ sky │ src: http://my.io/scene.fbx#sky (includes building,mainobject,floor) │ sky │ src: http://my.io/scene.fbx#sky (includes building,mainobject,floor)
@ -494,18 +554,18 @@ Internet-Draft XR Fragments December 2023
+--------------------+---------+-----------------------------+ +--------------------+---------+-----------------------------+
| <b>#t</b>=0,100 | vector3 | set playback speed, and | | <b>#t</b>=0,100 | vector3 | set playback speed, and |
| | | (re)position looprange of | | | | (re)position looprange of |
van Kammen Expires 2 August 2024 [Page 10]
Internet-Draft XR Fragments January 2024
| | | scene-animation or src- | | | | scene-animation or src- |
| | | mediacontent | | | | mediacontent |
+--------------------+---------+-----------------------------+ +--------------------+---------+-----------------------------+
| <b>#rot</b>=0,90,0 | vector3 | rotate camera | | <b>#rot</b>=0,90,0 | vector3 | rotate camera |
van Kammen Expires 8 June 2024 [Page 9]
Internet-Draft XR Fragments December 2023
+--------------------+---------+-----------------------------+ +--------------------+---------+-----------------------------+
Table 7 Table 7
@ -550,18 +610,18 @@ Internet-Draft XR Fragments December 2023
*replace the current scene* with a new one, like other.fbx, and *replace the current scene* with a new one, like other.fbx, and
assume pos=0,0,0. assume pos=0,0,0.
van Kammen Expires 2 August 2024 [Page 11]
Internet-Draft XR Fragments January 2024
7. Top-level URL processing 7. Top-level URL processing
| Example URL: ://foo/world.gltf#cube&pos=0,0,0 | Example URL: ://foo/world.gltf#cube&pos=0,0,0
van Kammen Expires 8 June 2024 [Page 10]
Internet-Draft XR Fragments December 2023
The URL-processing-flow for hypermedia browsers goes like this: The URL-processing-flow for hypermedia browsers goes like this:
1. IF a #cube matches a custom property-key (of an object) in the 3D 1. IF a #cube matches a custom property-key (of an object) in the 3D
@ -609,13 +669,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 2 August 2024 [Page 12]
van Kammen Expires 8 June 2024 [Page 11]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
+────────────────────────────────────────────────────────+ +─────────────────────────+ +────────────────────────────────────────────────────────+ +─────────────────────────+
@ -669,9 +725,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 12] van Kammen Expires 2 August 2024 [Page 13]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
6. <b>external</b> src values should be served with appropriate 6. <b>external</b> src values should be served with appropriate
@ -725,9 +781,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 13] van Kammen Expires 2 August 2024 [Page 14]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
+==========+==================+============================+ +==========+==================+============================+
@ -781,9 +837,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 14] van Kammen Expires 2 August 2024 [Page 15]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
» example implementation » example implementation
@ -837,9 +893,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 15] van Kammen Expires 2 August 2024 [Page 16]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
* calculate the <b>bounding box</b> of the instanced scene, and * calculate the <b>bounding box</b> of the instanced scene, and
@ -893,9 +949,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 16] van Kammen Expires 2 August 2024 [Page 17]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
13. XR audio/video integration 13. XR audio/video integration
@ -949,9 +1005,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 17] van Kammen Expires 2 August 2024 [Page 18]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
14.1. including/excluding 14.1. including/excluding
@ -1005,9 +1061,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 18] van Kammen Expires 2 August 2024 [Page 19]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
2. detect object id's & properties foo=1 and foo (reference regex= 2. detect object id's & properties foo=1 and foo (reference regex=
@ -1061,9 +1117,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 19] van Kammen Expires 2 August 2024 [Page 20]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
| The XR Fragments does this by collapsing space into a *Word Graph* | The XR Fragments does this by collapsing space into a *Word Graph*
@ -1117,9 +1173,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 20] van Kammen Expires 2 August 2024 [Page 21]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
Example: Example:
@ -1173,9 +1229,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 21] van Kammen Expires 2 August 2024 [Page 22]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
As seen above, the XRWG can expand bibs As seen above, the XRWG can expand bibs
@ -1229,9 +1285,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 22] van Kammen Expires 2 August 2024 [Page 23]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
12. Default font (unless specified otherwise) is a modern monospace 12. Default font (unless specified otherwise) is a modern monospace
@ -1285,9 +1341,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 23] van Kammen Expires 2 August 2024 [Page 24]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
* lines beginning with @ will not be rendered verbatim by default * lines beginning with @ will not be rendered verbatim by default
@ -1341,9 +1397,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 24] van Kammen Expires 2 August 2024 [Page 25]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
+--------------------------------------------------------------+ +------------------------+ +--------------------------------------------------------------+ +------------------------+
@ -1397,9 +1453,9 @@ xrtext = {
van Kammen Expires 8 June 2024 [Page 25] van Kammen Expires 2 August 2024 [Page 26]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
// bibtex: ↓@ ↓<tag|tag{phrase,|{ruler}> ↓property ↓end // bibtex: ↓@ ↓<tag|tag{phrase,|{ruler}> ↓property ↓end
@ -1453,9 +1509,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 26] van Kammen Expires 2 August 2024 [Page 27]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
str = ` str = `
@ -1509,9 +1565,9 @@ console.log( xrtext.encode(text,tags) ) // multiplex text & bibtex back to
van Kammen Expires 8 June 2024 [Page 27] van Kammen Expires 2 August 2024 [Page 28]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
2. mirroring files on another protocol using (HTTP) errorcode tags 2. mirroring files on another protocol using (HTTP) errorcode tags
@ -1565,9 +1621,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 28] van Kammen Expires 2 August 2024 [Page 29]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
* href: university.edu/projects.gltf#math&-theme math * href: university.edu/projects.gltf#math&-theme math
@ -1621,9 +1677,9 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 8 June 2024 [Page 29] van Kammen Expires 2 August 2024 [Page 30]
Internet-Draft XR Fragments December 2023 Internet-Draft XR Fragments January 2024
Non-HTML Hypermedia browsers should make browser extensions the right Non-HTML Hypermedia browsers should make browser extensions the right
@ -1651,104 +1707,114 @@ Internet-Draft XR Fragments December 2023
23. Appendix: Definitions 23. Appendix: Definitions
+=================+===============================================+ +=================+=============================================+
| definition | explanation | | definition | explanation |
+=================+===============================================+ +=================+=============================================+
| human | a sentient being who thinks fuzzy, absorbs, | | human | a sentient being who thinks fuzzy, absorbs, |
| | and shares thought (by plain text, not | | | and shares thought (by plain text, not |
| | markuplanguage) | | | markuplanguage) |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| scene | a (local/remote) 3D scene or 3D file | | scene | a (local/remote) 3D scene or 3D file |
| | (index.gltf e.g.) | | | (index.gltf e.g.) |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| 3D object | an object inside a scene characterized by | | 3D object | an object inside a scene characterized by |
| | vertex-, face- and customproperty data. | | | vertex-, face- and customproperty data. |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| URI | some resource at something somewhere via |
| | someprotocol (http://me.com/foo.glb#foo or |
| | e76f8efec8efce98e6f see interpeer.io |
| | (https://interpeer.io)) |
+-----------------+---------------------------------------------+
| URL | something somewhere via someprotocol |
| | (http://me.com/foo.glb) |
+-----------------+---------------------------------------------+
| metadata | custom properties of text, 3D Scene or | | metadata | custom properties of text, 3D Scene or |
| | Object(nodes), relevant to machines and a | | | Object(nodes), relevant to machines and a |
van Kammen Expires 2 August 2024 [Page 31]
Internet-Draft XR Fragments January 2024
| | human minority (academics/developers) | | | human minority (academics/developers) |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| XR fragment | URI Fragment with spatial hints like | | XR fragment | URI Fragment with spatial hints like |
| | #pos=0,0,0&t=1,100 e.g. | | | #pos=0,0,0&t=1,100 e.g. |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| the XRWG | wordgraph (collapses 3D scene to tags) | | the XRWG | wordgraph (collapses 3D scene to tags) |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| the hashbus | hashtags map to camera/scene-projections | | the hashbus | hashtags map to camera/scene-projections |
+-----------------+---------------------------------------------+
| spacetime | positions camera, triggers scene-preset/ |
| hashtags | time |
van Kammen Expires 8 June 2024 [Page 30] +-----------------+---------------------------------------------+
Internet-Draft XR Fragments December 2023
+-----------------+-----------------------------------------------+
| spacetime | positions camera, triggers scene-preset/time |
| hashtags | |
+-----------------+-----------------------------------------------+
| teleportation | repositioning the enduser to a different | | teleportation | repositioning the enduser to a different |
| | position (or 3D scene/file) | | | position (or 3D scene/file) |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| sourceportation | teleporting the enduser to the original XR | | sourceportation | teleporting the enduser to the original XR |
| | Document of an src embedded object. | | | Document of an src embedded object. |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| placeholder | a 3D object which with src-metadata (which | | placeholder | a 3D object which with src-metadata (which |
| object | will be replaced by the src-data.) | | object | will be replaced by the src-data.) |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| src | (HTML-piggybacked) metadata of a 3D object | | src | (HTML-piggybacked) metadata of a 3D object |
| | which instances content | | | which instances content |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| href | (HTML-piggybacked) metadata of a 3D object | | href | (HTML-piggybacked) metadata of a 3D object |
| | which links to content | | | which links to content |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| filter | URI Fragment(s) which show/hide object(s) in | | filter | URI Fragment(s) which show/hide object(s) |
| | a scene based on name/tag/property (#cube&- | | | in a scene based on name/tag/property |
| | price=>3) | | | (#cube&-price=>3) |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| visual-meta | visual-meta (https://visual.meta.info) data | | visual-meta | visual-meta (https://visual.meta.info) data |
| | appended to text/books/papers which is | | | appended to text/books/papers which is |
| | indirectly visible/editable in XR. | | | indirectly visible/editable in XR. |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| requestless | metadata which never spawns new requests | | requestless | metadata which never spawns new requests |
| metadata | (unlike RDF/HTML, which can cause framerate- | | metadata | (unlike RDF/HTML, which can cause |
| | dropping, hence not used a lot in games) | | | framerate-dropping, hence not used a lot in |
+-----------------+-----------------------------------------------+ | | games) |
+-----------------+---------------------------------------------+
| FPS | frames per second in spatial experiences | | FPS | frames per second in spatial experiences |
| | (games,VR,AR e.g.), should be as high as | | | (games,VR,AR e.g.), should be as high as |
| | possible | | | possible |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| introspective | inward sensemaking ("I feel this belongs to | | introspective | inward sensemaking ("I feel this belongs to |
| | that") | | | that") |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| extrospective | outward sensemaking ("I'm fairly sure John is | | extrospective | outward sensemaking ("I'm fairly sure John |
| | a person who lives in oklahoma") |
+-----------------+-----------------------------------------------+
van Kammen Expires 2 August 2024 [Page 32]
Internet-Draft XR Fragments January 2024
| | is a person who lives in oklahoma") |
+-----------------+---------------------------------------------+
| ◻ | ascii representation of an 3D object/mesh | | ◻ | ascii representation of an 3D object/mesh |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| (un)obtrusive | obtrusive: wrapping human text/thought in | | (un)obtrusive | obtrusive: wrapping human text/thought in |
| | XML/HTML/JSON obfuscates human text into a | | | XML/HTML/JSON obfuscates human text into a |
| | salad of machine-symbols and words | | | salad of machine-symbols and words |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| flat 3D object | a 3D object of which all verticies share a | | flat 3D object | a 3D object of which all verticies share a |
van Kammen Expires 8 June 2024 [Page 31]
Internet-Draft XR Fragments December 2023
| | plane | | | plane |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| BibTeX | simple tagging/citing/referencing standard | | BibTeX | simple tagging/citing/referencing standard |
| | for plaintext | | | for plaintext |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| BibTag | a BibTeX tag | | BibTag | a BibTeX tag |
+-----------------+-----------------------------------------------+ +-----------------+---------------------------------------------+
| (hashtag)bibs | an easy to speak/type/scan tagging SDL (see | | (hashtag)bibs | an easy to speak/type/scan tagging SDL (see |
| | here (https://github.com/coderofsalvation/ | | | here (https://github.com/coderofsalvation/ |
| | hashtagbibs) which expands to BibTex/JSON/XML | | | hashtagbibs) which expands to BibTex/JSON/ |
+-----------------+-----------------------------------------------+ | | XML |
+-----------------+---------------------------------------------+
Table 13 Table 13
@ -1779,14 +1845,4 @@ Internet-Draft XR Fragments December 2023
van Kammen Expires 2 August 2024 [Page 33]
van Kammen Expires 8 June 2024 [Page 32]

View file

@ -10,7 +10,7 @@
<workgroup>Internet Engineering Task Force</workgroup> <workgroup>Internet Engineering Task Force</workgroup>
<abstract> <abstract>
<t>This draft is a specification for 4D URLs &amp; <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> navigation, which links together space, time &amp; text together, for hypermedia browsers with- or without a network-connection.<br /> <t>This draft is a specification for 4D URI's &amp; <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> navigation, which links together space, time &amp; text together, for hypermedia browsers with- or without a network-connection.<br />
The specification promotes spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br /> The specification promotes spatial addressibility, sharing, navigation, filtering and databinding objects for (XR) Browsers.<br />
@ -30,22 +30,84 @@ Historically, there's many attempts to create the ultimate markuplanguage or 3D
The lowest common denominator is: designers describing/tagging/naming things using <strong>plain text</strong>.<br /> The lowest common denominator is: designers describing/tagging/naming things using <strong>plain text</strong>.<br />
XR Fragments exploits the fact that all 3D models already contain such metadata:</t> XR Fragments exploits the fact that all 3D models already contain such metadata:</t>
<t><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URLs</strong></t> <t><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URI's</strong></t>
<t>Or more detailed:</t> <t>It solves:</t>
<ol spacing="compact"> <ol spacing="compact">
<li>addressibility and <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> navigation of 3D scenes/objects: <eref target="https://en.wikipedia.org/wiki/URI_fragment">URI Fragments</eref> + src/href spatial metadata</li> <li>addressibility and <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> navigation of 3D scenes/objects: <eref target="https://en.wikipedia.org/wiki/URI_fragment">URI Fragments</eref> + src/href spatial metadata</li>
<li>Interlinking (text)objects by collapsing space into a Word Graph (XRWG) to show <eref target="#visible-links">visible links</eref></li> <li>Interlinking text &amp; spatial objects by collapsing space into a Word Graph (XRWG) to show <eref target="#visible-links">visible links</eref></li>
<li>unlocking spatial potential of the (originally 2D) hashtag (which jumps to a chapter) for navigating XR documents</li> <li>unlocking spatial potential of the (originally 2D) hashtag (which jumps to a chapter) for navigating XR documents</li>
</ol> </ol>
<blockquote><t>NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible</t> <blockquote><t>NOTE: The chapters in this document are ordered from highlevel to lowlevel (technical) as much as possible</t>
</blockquote></section> </blockquote></section>
<section anchor="core-principle"><name>Core principle</name> <section anchor="core-principle"><name>Core principle</name>
<t><strong>XR Fragments allows controlling of metadata in 3D scene(files) using URLs</strong></t> <t><strong>XR Fragments allows controlling 3D models using URLs, based on (non)existing metadata via URI's</strong></t>
<t>XR Fragments tries to seek to connect the world of text (semantical web / RDF), and the world of pixels.<br /> <t>XR Fragments tries to seek to connect the world of text (semantical web / RDF), and the world of pixels.<br />
Instead of combining them (in a game-editor e.g.), XR Fragments <strong>integrates all</strong>, by collecting metadata into an XRWG and control it via URL:</t> Instead of forcing authors to combine 3D/2D objects programmatically (publishing thru a game-editor e.g.), XR Fragments <strong>integrates all</strong> which allows a universal viewing experience.<br />
</t>
<artwork><![CDATA[ +───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ U R N │
│ U R L | │
│ | |-----------------+--------| │
│ +--------------------------------------------------| │
│ | │
│ + https://foo.com/some/foo/scene.glb#someview <-- http URI (=URL and has URN)
│ | │
│ + ipfs://cfe0987ec9r9098ecr/cats.fbx#someview <-- an IPFS URI (=URL and has URN)
│ │
│ ec09f7e9cf8e7f09c8e7f98e79c09ef89e000efece8f7ecfe9fe <-- an interpeer URI
│ │
│ │
│ |------------------------+-------------------------| │
│ | │
│ U R I │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
]]>
</artwork>
<t>Fact: our typical browser URL's are just <strong>a possible implementation</strong> of URI's (for untapped humancentric potential of URI's <eref target="https://interpeer.io">see interpeer.io</eref>)</t>
<blockquote><t>XR Fragments does not look at XR (or the web) thru the lens of HTML or URLs.<br />
But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective.</t>
</blockquote><t>Below you can see how this translates back into good-old URLs:</t>
<artwork><![CDATA[ +───────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano │
│ │
│ 2D URL: ://library.com /document ?search #chapter │
│ │
│ 4D URL: ://park.com /4Dscene.fbx ─> ?other.glb ─> #view ───> hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ (hypermediatic) #material │ │
│ │ ( feedback ) #animation │ │
│ │ ( loop ) #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG <─────────────────────<─────────────+ │
│ │ │ │
│ └─ objects ──────────────>─────────────+ │
│ │
│ │
+───────────────────────────────────────────────────────────────────────────────────────────────+
]]>
</artwork>
<blockquote><t>?-linked and #-linked navigation allows a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.</t>
</blockquote><t>Traditional webbrowsers can become 4D document-ready by:</t>
<ul spacing="compact">
<li><eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> loading 3D assets (gltf/fbx e.g.) natively (with or without using HTML).</li>
<li>allowing assets to publish hashtags to themselves (the scene) using the hashbus (like hashtags controlling the scrollbar).</li>
<li>collapsing the 3D scene to an wordgraph (for essential navigation purposes) controllable thru a hash(tag)bus</li>
<li>completely bypasses the security-trap of loading external scripts (by loading 3D model-files, not HTML-javascriptable resources)</li>
</ul>
<t>XR Fragments itself are <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> and HTML-agnostic, though pseudo-XR Fragment browsers <strong>can</strong> be implemented on top of HTML/Javascript.</t>
<table> <table>
<thead> <thead>
<tr> <tr>
@ -104,46 +166,13 @@ Instead of combining them (in a game-editor e.g.), XR Fragments <strong>integrat
<td>n/a</td> <td>n/a</td>
</tr> </tr>
</tbody> </tbody>
</table><blockquote><t>XR Fragments does not look at XR (or the web) thru the lens of HTML.<br /> </table></section>
But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective:</t>
</blockquote>
<artwork><![CDATA[ +──────────────────────────────────────────────────────────────────────────────────────────────+
│ │
│ the soul of any URL: ://macro /meso ?micro #nano │
│ │
│ 2D URL: ://library.com /document ?search #chapter │
│ │
│ 4D URL: ://park.com /4Dscene.fbx ──> ?misc ──> #view ───> hashbus │
│ │ #filter │ │
│ │ #tag │ │
│ │ #material │ │
│ │ #animation │ │
│ │ #texture │ │
│ │ #variable │ │
│ │ │ │
│ XRWG <─────────────────────<────────────+ │
│ │ │ │
│ └─ objects ──────────────>────────────+ │
│ │
│ │
+──────────────────────────────────────────────────────────────────────────────────────────────+
]]>
</artwork>
<t>Traditional webbrowsers can become 4D document-ready by:</t>
<ul spacing="compact">
<li><eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> loading 3D assets (gltf/fbx e.g.) natively (with or without using HTML).</li>
<li>allowing assets to publish hashtags to themselves (the scene) using the hashbus (like hashtags controlling the scrollbar).</li>
<li>collapsing the 3D scene to an wordgraph (for essential navigation purposes) controllable thru a hash(tag)bus</li>
</ul>
<t>XR Fragments itself are <eref target="https://github.com/coderofsalvation/hypermediatic">hypermediatic</eref> and HTML-agnostic, though pseudo-XR Fragment browsers <strong>can</strong> be implemented on top of HTML/Javascript.</t>
</section>
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name> <section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>
<t>See appendix below in case certain terms are not clear.</t> <t>See appendix below in case certain terms are not clear.</t>
<section anchor="xr-fragment-uri-grammar"><name>XR Fragment URI Grammar</name> <section anchor="xr-fragment-url-grammar"><name>XR Fragment URL Grammar</name>
<t>For typical HTTP-like browsers/applications:</t>
<artwork><![CDATA[reserved = gen-delims / sub-delims <artwork><![CDATA[reserved = gen-delims / sub-delims
gen-delims = "#" / "&" gen-delims = "#" / "&"
@ -171,7 +200,12 @@ sub-delims = "," / "="
</tr> </tr>
</tbody> </tbody>
</table><blockquote><t>this is already implemented in all browsers</t> </table><blockquote><t>this is already implemented in all browsers</t>
</blockquote></section> </blockquote><t>Pseudo (non-native) browser-implementations (supporting XR Fragments using HTML+JS e.g.) can use the <tt>?</tt> search-operator to address outbound content.<br />
In other words, the URL updates to: <tt>https://me.com?https://me.com/other.glb</tt> when navigating to <tt>https://me.com/other.glb</tt> from inside a <tt>https://me.com</tt> WebXR experience e.g.<br />
That way, if the link gets shared, the XR Fragments implementation at <tt>https://me.com</tt> can load the latter (and still indicates which XR Fragments entrypoint-experience/client was used).</t>
</section>
</section> </section>
<section anchor="list-of-uri-fragments"><name>List of URI Fragments</name> <section anchor="list-of-uri-fragments"><name>List of URI Fragments</name>
@ -1249,6 +1283,16 @@ Non-HTML Hypermedia browsers should make browser extensions the right place, to
<td>an object inside a scene characterized by vertex-, face- and customproperty data.</td> <td>an object inside a scene characterized by vertex-, face- and customproperty data.</td>
</tr> </tr>
<tr>
<td>URI</td>
<td>some resource at something somewhere via someprotocol (<tt>http://me.com/foo.glb#foo</tt> or <tt>e76f8efec8efce98e6f</tt> <eref target="https://interpeer.io">see interpeer.io</eref>)</td>
</tr>
<tr>
<td>URL</td>
<td>something somewhere via someprotocol (<tt>http://me.com/foo.glb</tt>)</td>
</tr>
<tr> <tr>
<td>metadata</td> <td>metadata</td>
<td>custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers)</td> <td>custom properties of text, 3D Scene or Object(nodes), relevant to machines and a human minority (academics/developers)</td>

View file

@ -3,7 +3,7 @@
Internet Engineering Task Force L.R. van Kammen Internet Engineering Task Force L.R. van Kammen
Internet-Draft 6 December 2023 Internet-Draft 30 January 2024
Intended status: Informational Intended status: Informational
@ -38,11 +38,11 @@ Status of This Memo
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on 8 June 2024. This Internet-Draft will expire on 2 August 2024.
Copyright Notice Copyright Notice
Copyright (c) 2023 IETF Trust and the persons identified as the Copyright (c) 2024 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
@ -53,9 +53,9 @@ Copyright Notice
van Kammen Expires 8 June 2024 [Page 1] van Kammen Expires 2 August 2024 [Page 1]
Internet-Draft XR Macros December 2023 Internet-Draft XR Macros January 2024
extracted from this document must include Revised BSD License text as extracted from this document must include Revised BSD License text as
@ -109,9 +109,9 @@ Table of Contents
van Kammen Expires 8 June 2024 [Page 2] van Kammen Expires 2 August 2024 [Page 2]
Internet-Draft XR Macros December 2023 Internet-Draft XR Macros January 2024
3. Metadata-values can contain the | symbol to 🎲 roundrobin variable 3. Metadata-values can contain the | symbol to 🎲 roundrobin variable
@ -165,9 +165,9 @@ Internet-Draft XR Macros December 2023
van Kammen Expires 8 June 2024 [Page 3] van Kammen Expires 2 August 2024 [Page 3]
Internet-Draft XR Macros December 2023 Internet-Draft XR Macros January 2024
+=========+======+===================+=================+=============+ +=========+======+===================+=================+=============+
@ -221,9 +221,9 @@ Internet-Draft XR Macros December 2023
van Kammen Expires 8 June 2024 [Page 4] van Kammen Expires 2 August 2024 [Page 4]
Internet-Draft XR Macros December 2023 Internet-Draft XR Macros January 2024
Table 3 Table 3
@ -277,9 +277,9 @@ Internet-Draft XR Macros December 2023
van Kammen Expires 8 June 2024 [Page 5] van Kammen Expires 2 August 2024 [Page 5]
Internet-Draft XR Macros December 2023 Internet-Draft XR Macros January 2024
4.5. Usecase: present context menu with options 4.5. Usecase: present context menu with options
@ -333,9 +333,9 @@ click object with (`!clickme`:`!foo|!bar|!flop` e.g.)
van Kammen Expires 8 June 2024 [Page 6] van Kammen Expires 2 August 2024 [Page 6]
Internet-Draft XR Macros December 2023 Internet-Draft XR Macros January 2024
| Note that only macro's can trigger roundrobin values or | Note that only macro's can trigger roundrobin values or
@ -389,4 +389,4 @@ Internet-Draft XR Macros December 2023
van Kammen Expires 8 June 2024 [Page 7] van Kammen Expires 2 August 2024 [Page 7]

View file

@ -4,6 +4,17 @@ window.AFRAME.registerComponent('xrf', {
https: { type:'string'}, https: { type:'string'},
}, },
init: function () { init: function () {
// override this.data when URL has passed (`://....com/?https://foo.com/index.glb` e.g.)
if( typeof this.data == "string" ){
let searchIsUri = document.location.search &&
!document.location.search.match(/=/) &&
document.location.search.match("://")
if( searchIsUri || document.location.hash.length > 1 ){ // override url
this.data = `${document.location.search.substr(1)}${document.location.hash}`
}
}
if( !AFRAME.XRF ){ if( !AFRAME.XRF ){
let camera = document.querySelector('[camera]') let camera = document.querySelector('[camera]')
@ -130,15 +141,6 @@ window.AFRAME.registerComponent('xrf', {
aScene.setAttribute('xrf-gaze','') aScene.setAttribute('xrf-gaze','')
} }
if( typeof this.data == "string" ){
let searchIsUri = document.location.search &&
!document.location.search.match(/=/) &&
document.location.search.match("://")
if( searchIsUri || document.location.hash.length > 1 ){ // override url
this.data = `${document.location.search.substr(1)}${document.location.hash}`
}
}
}, },
}) })

View file

@ -37,7 +37,7 @@ window.AFRAME.registerComponent('xrf-get', {
mesh.scale.copy(world.scale) mesh.scale.copy(world.scale)
mesh.setRotationFromQuaternion(world.quat); mesh.setRotationFromQuaternion(world.quat);
}else{ }else{
// add() will reparent the mesh so lets create a dummy // lets create a dummy add function so that the mesh won't get reparented
this.el.object3D.add = (a) => a this.el.object3D.add = (a) => a
} }
this.el.setObject3D('mesh',mesh) this.el.setObject3D('mesh',mesh)
@ -49,6 +49,10 @@ window.AFRAME.registerComponent('xrf-get', {
this.el.emit("update",{timeout:0}) this.el.emit("update",{timeout:0})
AFRAME.XRF.addEventListener('reset', () => {
this.el.remove()
})
} }
}); });

View file

@ -50,10 +50,12 @@ xrf.patchLoader = function(loader){
xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'') xrf.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
// parseModel event is essential for src.js to hook into embedded loaded models
xrf.parseModel = function(model,url){ xrf.parseModel = function(model,url){
let file = xrf.getFile(url) let file = xrf.getFile(url)
model.file = file model.file = file
model.isXRF = true
model.scene.traverse( (n) => n.isXRF = true ) // mark for deletion during reset()
xrf.emit('parseModel',{model,url,file}) xrf.emit('parseModel',{model,url,file})
} }
@ -79,7 +81,7 @@ xrf.reset = () => {
xrf.add( xrf.interactive ) xrf.add( xrf.interactive )
xrf.layers = 0 xrf.layers = 0
// reset certain events // allow others to reset certain events
xrf.emit('reset',{}) xrf.emit('reset',{})
// remove mixers // remove mixers
xrf.mixers.map( (m) => m.stop()) xrf.mixers.map( (m) => m.stop())

View file

@ -72,7 +72,6 @@ xrf.navigator.to = (url,flags,loader,data) => {
} }
if( data ){ // file upload if( data ){ // file upload
console.dir(loader)
loader.parse(data, "", onLoad ) loader.parse(data, "", onLoad )
}else loader.load(url, onLoad ) }else loader.load(url, onLoad )
}) })

View file

@ -72,7 +72,7 @@ xrf.filter.process = function(frag,scene,opts){
let obj let obj
frag.target = firstFilter frag.target = firstFilter
scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) ) scene.traverse( (n) => hasName(n, firstFilter.key,firstFilter) && (obj = n) )
console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace")) if( xrf.debug ) console.log("reparent "+firstFilter.key+" "+((opts.copyScene)?"copy":"inplace"))
if(obj ){ if(obj ){
obj.position.set(0,0,0) obj.position.set(0,0,0)
if( opts.copyScene ) { if( opts.copyScene ) {

View file

@ -3,7 +3,7 @@ xrf.frag.defaultPredefinedViews = (opts) => {
scene.traverse( (n) => { scene.traverse( (n) => {
if( n.userData && n.userData['#'] ){ if( n.userData && n.userData['#'] ){
let frag = xrf.URI.parse( n.userData['#'] ) let frag = xrf.URI.parse( n.userData['#'] )
if( n.parent && n.parent.parent.isScene && document.location.hash.length < 2 ){ if( !n.parent && document.location.hash.length < 2){
xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments xrf.navigator.to( n.userData['#'] ) // evaluate static XR fragments
}else{ }else{
xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments xrf.hashbus.pub( n.userData['#'] ) // evaluate static XR fragments

View file

@ -56,7 +56,7 @@ xrf.frag.src.enableSourcePortation = (src) => {
mat.metalness = 1 mat.metalness = 1
mat.opacity = 0 mat.opacity = 0
const cube = new THREE.Mesh( geo, mat ) const cube = new THREE.Mesh( geo, mat )
console.log("todo: sourceportate") // *TODO* sourceportate?
return xrf.frag.src return xrf.frag.src
} }

View file

@ -93,7 +93,7 @@ xrf.portalNonEuclidian = function(opts){
let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera let cam = xrf.camera.getCam ? xrf.camera.getCam() : camera
cam.getWorldPosition(cameraPosition) cam.getWorldPosition(cameraPosition)
cam.getWorldDirection(cameraDirection) cam.getWorldDirection(cameraDirection)
if( cameraPosition.distanceTo(newPos) > 20.0 ) return // dont render far portals if( cameraPosition.distanceTo(newPos) > 10.0 ) return // dont render far portals
// init // init
if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true if( !mesh.portal.isLocal || mesh.portal.isLens ) stencilObject.visible = true

View file

@ -37,7 +37,7 @@ xrf.addEventListener('parseModel', (opts) => {
model.animations.map( (anim) => { model.animations.map( (anim) => {
anim.optimize() anim.optimize()
console.log("action: "+anim.name) if( xrf.debug ) console.log("action: "+anim.name)
mixer.actions.push( mixer.clipAction( anim, model.scene ) ) mixer.actions.push( mixer.clipAction( anim, model.scene ) )
}) })