scaling src's works as expected now
This commit is contained in:
parent
e33591f432
commit
a6fa82fd85
9 changed files with 2991 additions and 2170 deletions
117
dist/xrfragment.aframe.js
vendored
117
dist/xrfragment.aframe.js
vendored
|
|
@ -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: {
|
||||||
|
|
|
||||||
117
dist/xrfragment.three.js
vendored
117
dist/xrfragment.three.js
vendored
|
|
@ -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 )
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
117
dist/xrfragment.three.module.js
vendored
117
dist/xrfragment.three.module.js
vendored
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 )
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue