2023-05-05 13:26:17 +02:00
|
|
|
xrfragment.xrf = {}
|
|
|
|
|
xrfragment.model = {}
|
2023-05-04 16:24:54 +02:00
|
|
|
|
|
|
|
|
xrfragment.init = function(opts){
|
|
|
|
|
opts = opts || {}
|
2023-05-05 13:26:17 +02:00
|
|
|
let XRF = function(){
|
2023-05-08 14:21:28 +02:00
|
|
|
alert("queries are not implemented (yet)")
|
2023-05-05 13:26:17 +02:00
|
|
|
}
|
|
|
|
|
for ( let i in opts ) XRF[i] = xrfragment[i] = opts[i]
|
2023-05-05 18:53:42 +02:00
|
|
|
for ( let i in xrfragment ) XRF[i] = xrfragment[i]
|
2023-05-05 13:26:17 +02:00
|
|
|
for ( let i in xrfragment.XRF ) XRF[i] = xrfragment.XRF[i] // shortcuts to constants (NAVIGATOR e.g.)
|
2023-05-04 16:24:54 +02:00
|
|
|
xrfragment.Parser.debug = xrfragment.debug
|
|
|
|
|
if( opts.loaders ) opts.loaders.map( xrfragment.patchLoader )
|
2023-05-05 13:26:17 +02:00
|
|
|
return XRF
|
2023-05-04 16:24:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
xrfragment.patchLoader = function(loader){
|
|
|
|
|
loader.prototype.load = ((load) => function(url, onLoad, onProgress, onError){
|
|
|
|
|
load.call( this,
|
|
|
|
|
url,
|
2023-05-05 13:26:17 +02:00
|
|
|
(model) => { onLoad(model); xrfragment.parseModel(model,url) },
|
2023-05-04 16:24:54 +02:00
|
|
|
onProgress,
|
|
|
|
|
onError)
|
|
|
|
|
})(loader.prototype.load)
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-05 18:53:42 +02:00
|
|
|
xrfragment.getFile = (url) => url.split("/").pop().replace(/#.*/,'')
|
|
|
|
|
|
2023-05-05 13:26:17 +02:00
|
|
|
xrfragment.parseModel = function(model,url){
|
2023-05-05 18:53:42 +02:00
|
|
|
let file = xrfragment.getFile(url)
|
|
|
|
|
model.file = file
|
|
|
|
|
model.render = function(){}
|
2023-05-05 13:26:17 +02:00
|
|
|
xrfragment.model[file] = model
|
2023-05-08 14:21:28 +02:00
|
|
|
console.log("scanning "+file)
|
2023-05-05 18:53:42 +02:00
|
|
|
|
2023-05-04 16:24:54 +02:00
|
|
|
model.scene.traverse( (mesh) => {
|
2023-05-08 14:21:28 +02:00
|
|
|
console.log(mesh.name)
|
2023-05-04 16:24:54 +02:00
|
|
|
if( mesh.userData ){
|
|
|
|
|
let frag = {}
|
|
|
|
|
for( let k in mesh.userData ){
|
|
|
|
|
xrfragment.Parser.parse( k, mesh.userData[k], frag )
|
|
|
|
|
// call native function (xrf/env.js e.g.), or pass it to user decorator
|
2023-05-05 13:26:17 +02:00
|
|
|
let func = xrfragment.xrf[k] || function(){}
|
2023-05-08 14:21:28 +02:00
|
|
|
let opts = {mesh, model, camera: xrfragment.camera, scene: xrfragment.scene, renderer: xrfragment.renderer, THREE: xrfragment.THREE }
|
2023-05-04 21:28:12 +02:00
|
|
|
if( xrfragment[k] ) xrfragment[k]( func, frag[k], opts)
|
|
|
|
|
else func( frag[k], opts)
|
2023-05-04 16:24:54 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
2023-05-05 13:26:17 +02:00
|
|
|
|
|
|
|
|
xrfragment.getLastModel = () => Object.values(xrfragment.model)[ Object.values(xrfragment.model).length-1 ]
|
|
|
|
|
|
|
|
|
|
xrfragment.eval = function( url, model ){
|
2023-05-08 14:21:28 +02:00
|
|
|
let notice = false
|
|
|
|
|
let { THREE, camera } = xrfragment
|
|
|
|
|
let frag = xrfragment.URI.parse( url, XRF.NAVIGATOR )
|
|
|
|
|
|
|
|
|
|
for ( let i in frag ) {
|
|
|
|
|
if( !String(i).match(/(pos|rot)/) ) notice = true
|
|
|
|
|
if( i == "pos" ){
|
|
|
|
|
camera.position.x = frag.pos.x
|
|
|
|
|
camera.position.y = frag.pos.y
|
|
|
|
|
camera.position.z = frag.pos.z
|
|
|
|
|
}
|
|
|
|
|
if( i == "rot" ){
|
|
|
|
|
camera.rotation.x = THREE.MathUtils.degToRad( frag.pos.x )
|
|
|
|
|
camera.rotation.y = THREE.MathUtils.degToRad( frag.pos.y )
|
|
|
|
|
camera.rotation.z = THREE.MathUtils.degToRad( frag.pos.z )
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if( notice ) alert("only 'pos' and 'rot' XRF.NAVIGATOR-flagged XR fragments are supported (for now)")
|
|
|
|
|
console.dir({url,model,frag})
|
2023-05-05 13:26:17 +02:00
|
|
|
}
|