xrfragment/src/3rd/js/three/xrf/src.js

40 lines
1.4 KiB
JavaScript
Raw Normal View History

2023-06-07 17:42:21 +02:00
// *TODO* use webgl instancing
xrf.frag.src = function(v, opts){
opts.embedded = v // indicate embedded XR fragment
2023-06-07 17:42:21 +02:00
let { mesh, model, camera, scene, renderer, THREE} = opts
let src = new THREE.Group()
if( v.string[0] == "#" ){ // local
console.log(" └ instancing src")
let frag = xrfragment.URI.parse(v.string)
// apply embedded XR fragments
setTimeout( () => {
// apply URI XR Fragments inside src-value
for( var i in frag ){
xrf.eval.fragment(i, Object.assign(opts,{frag, model,scene}))
}
if( frag.q.query ){
let srcScene = frag.q.scene // three/xrf/q.js initializes .scene
2023-06-07 17:42:21 +02:00
if( !srcScene || !srcScene.visible ) return
console.log(" └ inserting "+i+" (srcScene)")
srcScene.position.set(0,0,0)
srcScene.rotation.set(0,0,0)
srcScene.traverse( (m) => {
2023-07-04 17:15:23 +02:00
m.isSRC = true
2023-06-07 17:42:21 +02:00
if( m.userData && (m.userData.src || m.userData.href) ) return ;//delete m.userData.src // prevent infinite recursion
xrf.eval.mesh(m,{scene,recursive:true})
})
console.dir(xrf)
2023-06-07 17:42:21 +02:00
if( srcScene.visible ) src.add( srcScene )
}
src.position.copy( mesh.position )
src.rotation.copy( mesh.rotation )
src.scale.copy( mesh.scale )
mesh.add(src)
2023-06-09 16:40:08 +02:00
if( !opts.recursive ) mesh.material.visible = false // lets hide the preview object because deleting disables animations+nested objs
2023-06-07 17:42:21 +02:00
},10)
}
}