46 lines
1.6 KiB
JavaScript
46 lines
1.6 KiB
JavaScript
// the hashbus (QueryString eventBus) is mentioned in the spec
|
|
//
|
|
// it allows metadata-keys ('foo' e.g.) of 3D scene-nodes (.userData.foo e.g.) to
|
|
// react by executing code
|
|
|
|
let pub = function( url, model, flags ){ // evaluate fragments in url
|
|
if( !url ) return
|
|
if( !url.match(/#/) ) url = `#${url}`
|
|
model = model || xrf.model
|
|
let { THREE, camera } = xrf
|
|
let frag = xrf.URI.parse( url, flags != undefined ? flags : xrf.XRF.NAVIGATOR )
|
|
let opts = {frag, mesh:xrf.camera, model, camera: xrf.camera, scene: xrf.scene, renderer: xrf.renderer, THREE: xrf.THREE, hashbus: xrf.hashbus }
|
|
xrf.emit('hashbus',opts)
|
|
.then( () => {
|
|
for ( let k in frag ){
|
|
pub.fragment(k,opts)
|
|
}
|
|
})
|
|
return frag
|
|
}
|
|
|
|
pub.mesh = (mesh,model) => { // evaluate embedded fragments (metadata) inside mesh of model
|
|
if( mesh.userData ){
|
|
let frag = {}
|
|
for( let k in mesh.userData ) xrf.Parser.parse( k, mesh.userData[k], frag )
|
|
for( let k in frag ){
|
|
let opts = {frag, mesh, model, camera: xrf.camera, scene: model.scene, renderer: xrf.renderer, THREE: xrf.THREE, hashbus: xrf.hashbus }
|
|
mesh.userData.XRF = frag // allow fragment impl to access XRF obj already
|
|
xrf.emit('mesh',opts)
|
|
.then( () => pub.fragment(k,opts) )
|
|
}
|
|
}
|
|
}
|
|
|
|
pub.fragment = (k, opts ) => { // evaluate one fragment
|
|
let frag = opts.frag[k];
|
|
// call native function (xrf/env.js e.g.), or pass it to user decorator
|
|
xrf.emit(k,opts)
|
|
.then( () => {
|
|
let func = xrf.frag[k] || function(){}
|
|
if( xrf[k] ) xrf[k]( func, frag, opts)
|
|
else func( frag, opts)
|
|
})
|
|
}
|
|
|
|
xrf.hashbus = { pub }
|