scaling src's works as expected now

This commit is contained in:
Leon van Kammen 2023-07-05 16:43:07 +02:00
parent e33591f432
commit a6fa82fd85
9 changed files with 2991 additions and 2170 deletions

View file

@ -973,6 +973,7 @@ xrf.navigator.to = (url,flags,loader,data) => {
// force relative path // force relative path
if( dir ) dir = dir[0] == '.' ? dir : `.${dir}` if( dir ) dir = dir[0] == '.' ? dir : `.${dir}`
url = url.replace(dir,"")
loader = loader || new Loader().setPath( dir ) loader = loader || new Loader().setPath( dir )
const onLoad = (model) => { const onLoad = (model) => {
xrf.reset() // clear xrf objects from scene xrf.reset() // clear xrf objects from scene
@ -1278,13 +1279,13 @@ xrf.frag.q = function(v, opts){
if( !scene.getObjectByName(i) && i != '*' ) return console.log(` └ mesh not found: ${i}`) if( !scene.getObjectByName(i) && i != '*' ) return console.log(` └ mesh not found: ${i}`)
if( i == '*' ){ if( i == '*' ){
let cloneScene = scene.clone() let cloneScene = scene.clone()
// add interactive elements (href's e.g.) // add interactive elements (href's e.g.) *TODO* this is called by both internal/external src's
v.scene.add( xrf.interactive.clone() ) v.scene.add( xrf.interactive.clone() )
cloneScene.children.forEach( (child) => v.scene.getObjectByName(child.name) ? null : v.scene.add(child) ) cloneScene.children.forEach( (child) => v.scene.getObjectByName(child.name) ? null : v.scene.add(child) )
target.mesh = v.scene target.mesh = v.scene
}else{ }else{
console.log(` └ query-ing mesh: ${i}`)
if( !v.scene.getObjectByName(i) && target.id === true ){ if( !v.scene.getObjectByName(i) && target.id === true ){
console.log(` └ query-ing mesh: ${i}`)
v.scene.add( target.mesh = scene.getObjectByName(i).clone() ) v.scene.add( target.mesh = scene.getObjectByName(i).clone() )
} }
} }
@ -1319,8 +1320,9 @@ xrf.frag.q = function(v, opts){
}) })
} }
if( opts.embedded && opts.embedded.fragment == "src" ) instanceScene() // spec : https://xrfragment.org/#src const doLocalInstancing = opts.embedded && opts.embedded.fragment == 'src' && opts.embedded.string[0] == '#'
else showHide() // predefined view // spec : https://xrfragment.org/#queries if( doLocalInstancing ) instanceScene() // spec : https://xrfragment.org/#src
else showHide() // spec : https://xrfragment.org/#queries
} }
xrf.frag.rot = function(v, opts){ xrf.frag.rot = function(v, opts){
let { mesh, model, camera, scene, renderer, THREE} = opts let { mesh, model, camera, scene, renderer, THREE} = opts
@ -1364,32 +1366,107 @@ xrf.frag.src = function(v, opts){
console.dir(xrf) console.dir(xrf)
if( srcScene.visible ) src.add( srcScene ) if( srcScene.visible ) src.add( srcScene )
} }
src.position.copy( mesh.position ) xrf.frag.src.apply( src, opts )
src.rotation.copy( mesh.rotation )
src.scale.copy( mesh.scale )
mesh.add(src)
if( !opts.recursive ) mesh.material.visible = false // lets hide the preview object because deleting disables animations+nested objs
},10) },10)
} }
const externalSRC = () => { const externalSRC = () => {
debugger fetch(v.string, { method: 'HEAD' })
console.log("external !") .then( (res) => {
console.dir(v) console.log(`loading src ${v.string}`)
console.dir(frag) let mimetype = res.headers.get('Content-type')
console.log("src mimetype: "+mimetype)
return xrf.frag.src.type[ mimetype ] ? xrf.frag.src.type[ mimetype ](v.string,opts) : xrf.frag.src.type.unknown(v.string,opts)
})
.finally( () => {
})
.catch( console.error )
//// apply URI XR Fragments inside src-value //// apply URI XR Fragments inside src-value
//for( var i in frag ){ //for( var i in frag ){
// xrf.eval.fragment(i, Object.assign(opts,{frag, model,scene})) // xrf.eval.fragment(i, Object.assign(opts,{frag, model,scene}))
//} //}
//let {urlObj,dir,file,hash,ext} = xrf.parseUrl(url)
//const Loader = xrf.loaders[ext]
//if( !Loader ) throw 'xrfragment: no loader passed to xrfragment for extension .'+ext
//loader = loader || new Loader().setPath( dir )
} }
if( v.string[0] == "#" ) localSRC() // local if( v.string[0] == "#" ) localSRC() // current file
else externalSRC() else externalSRC() // external file
}
/*
* replace the src-mesh with the contents of the src
*/
xrf.frag.src.apply = function(scene, opts, url){
let { mesh, model, camera, renderer, THREE} = opts
if( url ){
let frag = xrfragment.URI.parse(url)
console.log("parse url:"+url)
console.log("children:"+scene.children.length)
// apply URI XR Fragments (queries) inside src-value
for( var i in frag ){
xrf.eval.fragment(i, Object.assign(opts,{frag, model:{scene},scene}))
}
// if( frag.q ) scene = frag.q.scene
console.dir(frag)
//xrf.add( model.scene )
xrf.eval( '#', {scene} ) // execute the default projection '#' (if exist)
xrf.eval( url, {scene} ) // and eval URI XR fragments
//if( !hash.match(/pos=/) )
// xrf.eval( '#pos=0,0,0' ) // set default position if not specified
// apply bounding box scaling for external files
let bboxMesh = new THREE.Box3().setFromObject(mesh);
let bboxScene = new THREE.Box3().setFromObject(scene);
let maxScene = bboxScene.max.y > bboxScene.max.x ? bboxScene.max.y : bboxScene.max.x
let maxMesh = bboxMesh.max.y > bboxMesh.max.x ? bboxMesh.max.y : bboxMesh.max.x
let factor = maxMesh > maxScene ? maxScene / maxMesh : maxMesh / maxScene
scene.scale.multiplyScalar( factor )
}
scene.isXRF = model.scene.isSRC = true
//scene.position.copy( mesh.position )
//scene.rotation.copy( mesh.rotation )
//scene.scale.copy( mesh.scale )
scene.scale.multiply( mesh.scale )
mesh.add( scene )
if( !opts.recursive && mesh.material ) mesh.material.visible = false // lets hide the preview object because deleting disables animations+nested objs
}
xrf.frag.src.type = {}
/*
* mimetype: unknown
*/
xrf.frag.src.type['unknown'] = function( url, opts ){
return new Promise( (resolve,reject) => {
reject(`${url} mimetype not supported (yet)`)
})
}
/*
* mimetype: model/gltf+json
*/
xrf.frag.src.type['model/gltf+json'] = function( url, opts ){
return new Promise( (resolve,reject) => {
let {urlObj,dir,file,hash,ext} = xrf.parseUrl(url)
let loader
const Loader = xrf.loaders[ext]
if( !Loader ) throw 'xrfragment: no loader passed to xrfragment for extension .'+ext
if( !dir.match("://") ){ // force relative path
dir = dir[0] == '.' ? dir : `.${dir}`
loader = new Loader().setPath( dir )
}else loader = new Loader()
const onLoad = (model) => {
xrf.frag.src.apply( model.scene, {...opts, model, scene: model.scene}, url )
resolve(model)
}
loader.load(url, onLoad )
})
} }
window.AFRAME.registerComponent('xrf', { window.AFRAME.registerComponent('xrf', {
schema: { schema: {

View file

@ -973,6 +973,7 @@ xrf.navigator.to = (url,flags,loader,data) => {
// force relative path // force relative path
if( dir ) dir = dir[0] == '.' ? dir : `.${dir}` if( dir ) dir = dir[0] == '.' ? dir : `.${dir}`
url = url.replace(dir,"")
loader = loader || new Loader().setPath( dir ) loader = loader || new Loader().setPath( dir )
const onLoad = (model) => { const onLoad = (model) => {
xrf.reset() // clear xrf objects from scene xrf.reset() // clear xrf objects from scene
@ -1278,13 +1279,13 @@ xrf.frag.q = function(v, opts){
if( !scene.getObjectByName(i) && i != '*' ) return console.log(` └ mesh not found: ${i}`) if( !scene.getObjectByName(i) && i != '*' ) return console.log(` └ mesh not found: ${i}`)
if( i == '*' ){ if( i == '*' ){
let cloneScene = scene.clone() let cloneScene = scene.clone()
// add interactive elements (href's e.g.) // add interactive elements (href's e.g.) *TODO* this is called by both internal/external src's
v.scene.add( xrf.interactive.clone() ) v.scene.add( xrf.interactive.clone() )
cloneScene.children.forEach( (child) => v.scene.getObjectByName(child.name) ? null : v.scene.add(child) ) cloneScene.children.forEach( (child) => v.scene.getObjectByName(child.name) ? null : v.scene.add(child) )
target.mesh = v.scene target.mesh = v.scene
}else{ }else{
console.log(` └ query-ing mesh: ${i}`)
if( !v.scene.getObjectByName(i) && target.id === true ){ if( !v.scene.getObjectByName(i) && target.id === true ){
console.log(` └ query-ing mesh: ${i}`)
v.scene.add( target.mesh = scene.getObjectByName(i).clone() ) v.scene.add( target.mesh = scene.getObjectByName(i).clone() )
} }
} }
@ -1319,8 +1320,9 @@ xrf.frag.q = function(v, opts){
}) })
} }
if( opts.embedded && opts.embedded.fragment == "src" ) instanceScene() // spec : https://xrfragment.org/#src const doLocalInstancing = opts.embedded && opts.embedded.fragment == 'src' && opts.embedded.string[0] == '#'
else showHide() // predefined view // spec : https://xrfragment.org/#queries if( doLocalInstancing ) instanceScene() // spec : https://xrfragment.org/#src
else showHide() // spec : https://xrfragment.org/#queries
} }
xrf.frag.rot = function(v, opts){ xrf.frag.rot = function(v, opts){
let { mesh, model, camera, scene, renderer, THREE} = opts let { mesh, model, camera, scene, renderer, THREE} = opts
@ -1364,30 +1366,105 @@ xrf.frag.src = function(v, opts){
console.dir(xrf) console.dir(xrf)
if( srcScene.visible ) src.add( srcScene ) if( srcScene.visible ) src.add( srcScene )
} }
src.position.copy( mesh.position ) xrf.frag.src.apply( src, opts )
src.rotation.copy( mesh.rotation )
src.scale.copy( mesh.scale )
mesh.add(src)
if( !opts.recursive ) mesh.material.visible = false // lets hide the preview object because deleting disables animations+nested objs
},10) },10)
} }
const externalSRC = () => { const externalSRC = () => {
debugger fetch(v.string, { method: 'HEAD' })
console.log("external !") .then( (res) => {
console.dir(v) console.log(`loading src ${v.string}`)
console.dir(frag) let mimetype = res.headers.get('Content-type')
console.log("src mimetype: "+mimetype)
return xrf.frag.src.type[ mimetype ] ? xrf.frag.src.type[ mimetype ](v.string,opts) : xrf.frag.src.type.unknown(v.string,opts)
})
.finally( () => {
})
.catch( console.error )
//// apply URI XR Fragments inside src-value //// apply URI XR Fragments inside src-value
//for( var i in frag ){ //for( var i in frag ){
// xrf.eval.fragment(i, Object.assign(opts,{frag, model,scene})) // xrf.eval.fragment(i, Object.assign(opts,{frag, model,scene}))
//} //}
//let {urlObj,dir,file,hash,ext} = xrf.parseUrl(url)
//const Loader = xrf.loaders[ext]
//if( !Loader ) throw 'xrfragment: no loader passed to xrfragment for extension .'+ext
//loader = loader || new Loader().setPath( dir )
} }
if( v.string[0] == "#" ) localSRC() // local if( v.string[0] == "#" ) localSRC() // current file
else externalSRC() else externalSRC() // external file
}
/*
* replace the src-mesh with the contents of the src
*/
xrf.frag.src.apply = function(scene, opts, url){
let { mesh, model, camera, renderer, THREE} = opts
if( url ){
let frag = xrfragment.URI.parse(url)
console.log("parse url:"+url)
console.log("children:"+scene.children.length)
// apply URI XR Fragments (queries) inside src-value
for( var i in frag ){
xrf.eval.fragment(i, Object.assign(opts,{frag, model:{scene},scene}))
}
// if( frag.q ) scene = frag.q.scene
console.dir(frag)
//xrf.add( model.scene )
xrf.eval( '#', {scene} ) // execute the default projection '#' (if exist)
xrf.eval( url, {scene} ) // and eval URI XR fragments
//if( !hash.match(/pos=/) )
// xrf.eval( '#pos=0,0,0' ) // set default position if not specified
// apply bounding box scaling for external files
let bboxMesh = new THREE.Box3().setFromObject(mesh);
let bboxScene = new THREE.Box3().setFromObject(scene);
let maxScene = bboxScene.max.y > bboxScene.max.x ? bboxScene.max.y : bboxScene.max.x
let maxMesh = bboxMesh.max.y > bboxMesh.max.x ? bboxMesh.max.y : bboxMesh.max.x
let factor = maxMesh > maxScene ? maxScene / maxMesh : maxMesh / maxScene
scene.scale.multiplyScalar( factor )
}
scene.isXRF = model.scene.isSRC = true
//scene.position.copy( mesh.position )
//scene.rotation.copy( mesh.rotation )
//scene.scale.copy( mesh.scale )
scene.scale.multiply( mesh.scale )
mesh.add( scene )
if( !opts.recursive && mesh.material ) mesh.material.visible = false // lets hide the preview object because deleting disables animations+nested objs
}
xrf.frag.src.type = {}
/*
* mimetype: unknown
*/
xrf.frag.src.type['unknown'] = function( url, opts ){
return new Promise( (resolve,reject) => {
reject(`${url} mimetype not supported (yet)`)
})
}
/*
* mimetype: model/gltf+json
*/
xrf.frag.src.type['model/gltf+json'] = function( url, opts ){
return new Promise( (resolve,reject) => {
let {urlObj,dir,file,hash,ext} = xrf.parseUrl(url)
let loader
const Loader = xrf.loaders[ext]
if( !Loader ) throw 'xrfragment: no loader passed to xrfragment for extension .'+ext
if( !dir.match("://") ){ // force relative path
dir = dir[0] == '.' ? dir : `.${dir}`
loader = new Loader().setPath( dir )
}else loader = new Loader()
const onLoad = (model) => {
xrf.frag.src.apply( model.scene, {...opts, model, scene: model.scene}, url )
resolve(model)
}
loader.load(url, onLoad )
})
} }

View file

@ -973,6 +973,7 @@ xrf.navigator.to = (url,flags,loader,data) => {
// force relative path // force relative path
if( dir ) dir = dir[0] == '.' ? dir : `.${dir}` if( dir ) dir = dir[0] == '.' ? dir : `.${dir}`
url = url.replace(dir,"")
loader = loader || new Loader().setPath( dir ) loader = loader || new Loader().setPath( dir )
const onLoad = (model) => { const onLoad = (model) => {
xrf.reset() // clear xrf objects from scene xrf.reset() // clear xrf objects from scene
@ -1278,13 +1279,13 @@ xrf.frag.q = function(v, opts){
if( !scene.getObjectByName(i) && i != '*' ) return console.log(` └ mesh not found: ${i}`) if( !scene.getObjectByName(i) && i != '*' ) return console.log(` └ mesh not found: ${i}`)
if( i == '*' ){ if( i == '*' ){
let cloneScene = scene.clone() let cloneScene = scene.clone()
// add interactive elements (href's e.g.) // add interactive elements (href's e.g.) *TODO* this is called by both internal/external src's
v.scene.add( xrf.interactive.clone() ) v.scene.add( xrf.interactive.clone() )
cloneScene.children.forEach( (child) => v.scene.getObjectByName(child.name) ? null : v.scene.add(child) ) cloneScene.children.forEach( (child) => v.scene.getObjectByName(child.name) ? null : v.scene.add(child) )
target.mesh = v.scene target.mesh = v.scene
}else{ }else{
console.log(` └ query-ing mesh: ${i}`)
if( !v.scene.getObjectByName(i) && target.id === true ){ if( !v.scene.getObjectByName(i) && target.id === true ){
console.log(` └ query-ing mesh: ${i}`)
v.scene.add( target.mesh = scene.getObjectByName(i).clone() ) v.scene.add( target.mesh = scene.getObjectByName(i).clone() )
} }
} }
@ -1319,8 +1320,9 @@ xrf.frag.q = function(v, opts){
}) })
} }
if( opts.embedded && opts.embedded.fragment == "src" ) instanceScene() // spec : https://xrfragment.org/#src const doLocalInstancing = opts.embedded && opts.embedded.fragment == 'src' && opts.embedded.string[0] == '#'
else showHide() // predefined view // spec : https://xrfragment.org/#queries if( doLocalInstancing ) instanceScene() // spec : https://xrfragment.org/#src
else showHide() // spec : https://xrfragment.org/#queries
} }
xrf.frag.rot = function(v, opts){ xrf.frag.rot = function(v, opts){
let { mesh, model, camera, scene, renderer, THREE} = opts let { mesh, model, camera, scene, renderer, THREE} = opts
@ -1364,31 +1366,106 @@ xrf.frag.src = function(v, opts){
console.dir(xrf) console.dir(xrf)
if( srcScene.visible ) src.add( srcScene ) if( srcScene.visible ) src.add( srcScene )
} }
src.position.copy( mesh.position ) xrf.frag.src.apply( src, opts )
src.rotation.copy( mesh.rotation )
src.scale.copy( mesh.scale )
mesh.add(src)
if( !opts.recursive ) mesh.material.visible = false // lets hide the preview object because deleting disables animations+nested objs
},10) },10)
} }
const externalSRC = () => { const externalSRC = () => {
debugger fetch(v.string, { method: 'HEAD' })
console.log("external !") .then( (res) => {
console.dir(v) console.log(`loading src ${v.string}`)
console.dir(frag) let mimetype = res.headers.get('Content-type')
console.log("src mimetype: "+mimetype)
return xrf.frag.src.type[ mimetype ] ? xrf.frag.src.type[ mimetype ](v.string,opts) : xrf.frag.src.type.unknown(v.string,opts)
})
.finally( () => {
})
.catch( console.error )
//// apply URI XR Fragments inside src-value //// apply URI XR Fragments inside src-value
//for( var i in frag ){ //for( var i in frag ){
// xrf.eval.fragment(i, Object.assign(opts,{frag, model,scene})) // xrf.eval.fragment(i, Object.assign(opts,{frag, model,scene}))
//} //}
//let {urlObj,dir,file,hash,ext} = xrf.parseUrl(url)
//const Loader = xrf.loaders[ext]
//if( !Loader ) throw 'xrfragment: no loader passed to xrfragment for extension .'+ext
//loader = loader || new Loader().setPath( dir )
} }
if( v.string[0] == "#" ) localSRC() // local if( v.string[0] == "#" ) localSRC() // current file
else externalSRC() else externalSRC() // external file
}
/*
* replace the src-mesh with the contents of the src
*/
xrf.frag.src.apply = function(scene, opts, url){
let { mesh, model, camera, renderer, THREE} = opts
if( url ){
let frag = xrfragment.URI.parse(url)
console.log("parse url:"+url)
console.log("children:"+scene.children.length)
// apply URI XR Fragments (queries) inside src-value
for( var i in frag ){
xrf.eval.fragment(i, Object.assign(opts,{frag, model:{scene},scene}))
}
// if( frag.q ) scene = frag.q.scene
console.dir(frag)
//xrf.add( model.scene )
xrf.eval( '#', {scene} ) // execute the default projection '#' (if exist)
xrf.eval( url, {scene} ) // and eval URI XR fragments
//if( !hash.match(/pos=/) )
// xrf.eval( '#pos=0,0,0' ) // set default position if not specified
// apply bounding box scaling for external files
let bboxMesh = new THREE.Box3().setFromObject(mesh);
let bboxScene = new THREE.Box3().setFromObject(scene);
let maxScene = bboxScene.max.y > bboxScene.max.x ? bboxScene.max.y : bboxScene.max.x
let maxMesh = bboxMesh.max.y > bboxMesh.max.x ? bboxMesh.max.y : bboxMesh.max.x
let factor = maxMesh > maxScene ? maxScene / maxMesh : maxMesh / maxScene
scene.scale.multiplyScalar( factor )
}
scene.isXRF = model.scene.isSRC = true
//scene.position.copy( mesh.position )
//scene.rotation.copy( mesh.rotation )
//scene.scale.copy( mesh.scale )
scene.scale.multiply( mesh.scale )
mesh.add( scene )
if( !opts.recursive && mesh.material ) mesh.material.visible = false // lets hide the preview object because deleting disables animations+nested objs
}
xrf.frag.src.type = {}
/*
* mimetype: unknown
*/
xrf.frag.src.type['unknown'] = function( url, opts ){
return new Promise( (resolve,reject) => {
reject(`${url} mimetype not supported (yet)`)
})
}
/*
* mimetype: model/gltf+json
*/
xrf.frag.src.type['model/gltf+json'] = function( url, opts ){
return new Promise( (resolve,reject) => {
let {urlObj,dir,file,hash,ext} = xrf.parseUrl(url)
let loader
const Loader = xrf.loaders[ext]
if( !Loader ) throw 'xrfragment: no loader passed to xrfragment for extension .'+ext
if( !dir.match("://") ){ // force relative path
dir = dir[0] == '.' ? dir : `.${dir}`
loader = new Loader().setPath( dir )
}else loader = new Loader()
const onLoad = (model) => {
xrf.frag.src.apply( model.scene, {...opts, model, scene: model.scene}, url )
resolve(model)
}
loader.load(url, onLoad )
})
} }
export default xrf; export default xrf;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -20,6 +20,7 @@ xrf.navigator.to = (url,flags,loader,data) => {
// force relative path // force relative path
if( dir ) dir = dir[0] == '.' ? dir : `.${dir}` if( dir ) dir = dir[0] == '.' ? dir : `.${dir}`
url = url.replace(dir,"")
loader = loader || new Loader().setPath( dir ) loader = loader || new Loader().setPath( dir )
const onLoad = (model) => { const onLoad = (model) => {
xrf.reset() // clear xrf objects from scene xrf.reset() // clear xrf objects from scene

View file

@ -13,13 +13,13 @@ xrf.frag.q = function(v, opts){
if( !scene.getObjectByName(i) && i != '*' ) return console.log(` └ mesh not found: ${i}`) if( !scene.getObjectByName(i) && i != '*' ) return console.log(` └ mesh not found: ${i}`)
if( i == '*' ){ if( i == '*' ){
let cloneScene = scene.clone() let cloneScene = scene.clone()
// add interactive elements (href's e.g.) // add interactive elements (href's e.g.) *TODO* this is called by both internal/external src's
v.scene.add( xrf.interactive.clone() ) v.scene.add( xrf.interactive.clone() )
cloneScene.children.forEach( (child) => v.scene.getObjectByName(child.name) ? null : v.scene.add(child) ) cloneScene.children.forEach( (child) => v.scene.getObjectByName(child.name) ? null : v.scene.add(child) )
target.mesh = v.scene target.mesh = v.scene
}else{ }else{
console.log(` └ query-ing mesh: ${i}`)
if( !v.scene.getObjectByName(i) && target.id === true ){ if( !v.scene.getObjectByName(i) && target.id === true ){
console.log(` └ query-ing mesh: ${i}`)
v.scene.add( target.mesh = scene.getObjectByName(i).clone() ) v.scene.add( target.mesh = scene.getObjectByName(i).clone() )
} }
} }
@ -54,6 +54,7 @@ xrf.frag.q = function(v, opts){
}) })
} }
if( opts.embedded && opts.embedded.fragment == "src" ) instanceScene() // spec : https://xrfragment.org/#src const doLocalInstancing = opts.embedded && opts.embedded.fragment == 'src' && opts.embedded.string[0] == '#'
else showHide() // predefined view // spec : https://xrfragment.org/#queries if( doLocalInstancing ) instanceScene() // spec : https://xrfragment.org/#src
else showHide() // spec : https://xrfragment.org/#queries
} }

View file

@ -30,30 +30,105 @@ xrf.frag.src = function(v, opts){
console.dir(xrf) console.dir(xrf)
if( srcScene.visible ) src.add( srcScene ) if( srcScene.visible ) src.add( srcScene )
} }
src.position.copy( mesh.position ) xrf.frag.src.apply( src, opts )
src.rotation.copy( mesh.rotation )
src.scale.copy( mesh.scale )
mesh.add(src)
if( !opts.recursive ) mesh.material.visible = false // lets hide the preview object because deleting disables animations+nested objs
},10) },10)
} }
const externalSRC = () => { const externalSRC = () => {
debugger fetch(v.string, { method: 'HEAD' })
console.log("external !") .then( (res) => {
console.dir(v) console.log(`loading src ${v.string}`)
console.dir(frag) let mimetype = res.headers.get('Content-type')
console.log("src mimetype: "+mimetype)
return xrf.frag.src.type[ mimetype ] ? xrf.frag.src.type[ mimetype ](v.string,opts) : xrf.frag.src.type.unknown(v.string,opts)
})
.finally( () => {
})
.catch( console.error )
//// apply URI XR Fragments inside src-value //// apply URI XR Fragments inside src-value
//for( var i in frag ){ //for( var i in frag ){
// xrf.eval.fragment(i, Object.assign(opts,{frag, model,scene})) // xrf.eval.fragment(i, Object.assign(opts,{frag, model,scene}))
//} //}
//let {urlObj,dir,file,hash,ext} = xrf.parseUrl(url)
//const Loader = xrf.loaders[ext]
//if( !Loader ) throw 'xrfragment: no loader passed to xrfragment for extension .'+ext
//loader = loader || new Loader().setPath( dir )
} }
if( v.string[0] == "#" ) localSRC() // local if( v.string[0] == "#" ) localSRC() // current file
else externalSRC() else externalSRC() // external file
}
/*
* replace the src-mesh with the contents of the src
*/
xrf.frag.src.apply = function(scene, opts, url){
let { mesh, model, camera, renderer, THREE} = opts
if( url ){
let frag = xrfragment.URI.parse(url)
console.log("parse url:"+url)
console.log("children:"+scene.children.length)
// apply URI XR Fragments (queries) inside src-value
for( var i in frag ){
xrf.eval.fragment(i, Object.assign(opts,{frag, model:{scene},scene}))
}
// if( frag.q ) scene = frag.q.scene
console.dir(frag)
//xrf.add( model.scene )
xrf.eval( '#', {scene} ) // execute the default projection '#' (if exist)
xrf.eval( url, {scene} ) // and eval URI XR fragments
//if( !hash.match(/pos=/) )
// xrf.eval( '#pos=0,0,0' ) // set default position if not specified
// apply bounding box scaling for external files
let bboxMesh = new THREE.Box3().setFromObject(mesh);
let bboxScene = new THREE.Box3().setFromObject(scene);
let maxScene = bboxScene.max.y > bboxScene.max.x ? bboxScene.max.y : bboxScene.max.x
let maxMesh = bboxMesh.max.y > bboxMesh.max.x ? bboxMesh.max.y : bboxMesh.max.x
let factor = maxMesh > maxScene ? maxScene / maxMesh : maxMesh / maxScene
scene.scale.multiplyScalar( factor )
}
scene.isXRF = model.scene.isSRC = true
//scene.position.copy( mesh.position )
//scene.rotation.copy( mesh.rotation )
//scene.scale.copy( mesh.scale )
scene.scale.multiply( mesh.scale )
mesh.add( scene )
if( !opts.recursive && mesh.material ) mesh.material.visible = false // lets hide the preview object because deleting disables animations+nested objs
}
xrf.frag.src.type = {}
/*
* mimetype: unknown
*/
xrf.frag.src.type['unknown'] = function( url, opts ){
return new Promise( (resolve,reject) => {
reject(`${url} mimetype not supported (yet)`)
})
}
/*
* mimetype: model/gltf+json
*/
xrf.frag.src.type['model/gltf+json'] = function( url, opts ){
return new Promise( (resolve,reject) => {
let {urlObj,dir,file,hash,ext} = xrf.parseUrl(url)
let loader
const Loader = xrf.loaders[ext]
if( !Loader ) throw 'xrfragment: no loader passed to xrfragment for extension .'+ext
if( !dir.match("://") ){ // force relative path
dir = dir[0] == '.' ? dir : `.${dir}`
loader = new Loader().setPath( dir )
}else loader = new Loader()
const onLoad = (model) => {
xrf.frag.src.apply( model.scene, {...opts, model, scene: model.scene}, url )
resolve(model)
}
loader.load(url, onLoad )
})
} }