Skip to content
This repository was archived by the owner on May 18, 2025. It is now read-only.

Commit 18febc6

Browse files
bugfix: enter-vr (black screen) + fixed objects-leak when resetting scene
1 parent adf13e7 commit 18febc6

16 files changed

+199074
-135
lines changed

dist/xrfragment.aframe.all.js

Lines changed: 29 additions & 36 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/xrfragment.aframe.js

Lines changed: 29 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* v0.5.1 generated at Thu Apr 25 03:56:52 PM UTC 2024
2+
* v0.5.1 generated at Tue Jun 4 04:54:19 PM UTC 2024
33
* https://xrfragment.org
44
* SPDX-License-Identifier: MPL-2.0
55
*/
@@ -1591,15 +1591,17 @@ var xrf = {}
15911591
xrf.init = function(opts){
15921592
opts = opts || {}
15931593

1594-
xrf.debug = document.location.hostname.match(/^(localhost|[0-9])/) ? 0 : false
1595-
if( !xrf.debug ){
1594+
xrf.debug = document.location.hostname.match(/^(localhost|[0-9]\.[0-9])/) || document.location.port == '8080' ? 0 : false
1595+
if( xrf.debug === false ){
15961596
console.log("add #debug=[0-9] to URL to see XR Fragment debuglog")
15971597
xrf.debug = parseInt( ( document.location.hash.match(/debug=([0-9])/) || [0,'0'] )[1] )
1598+
}else{
1599+
xrf.stats()
15981600
}
15991601

16001602
xrf.Parser.debug = xrf.debug
16011603
xrf.detectCameraRig(opts)
1602-
for ( let i in opts ) xrf[i] = opts[i]
1604+
for ( let i in opts ) xrf[i] = opts[i]
16031605
xrf.emit('init',opts)
16041606
return xrf
16051607
}
@@ -1626,10 +1628,9 @@ xrf.detectCameraRig = function(opts){
16261628
xrf.stats = () => {
16271629
// bookmarklet from https://github.com/zlgenuine/threejs_stats
16281630
(function(){
1629-
for( let i = 0; i < 4; i++ ){
1630-
var script=document.createElement('script');script.onload=function(){var stats=new Stats();stats.showPanel( i );
1631-
stats.dom.style.marginTop = `${i*48}px`; document.body.appendChild(stats.dom);requestAnimationFrame(function loop(){stats.update();requestAnimationFrame(loop)});};script.src='//rawgit.com/mrdoob/stats.js/master/build/stats.min.js';document.head.appendChild(script);
1632-
}
1631+
let i = 0;
1632+
var script=document.createElement('script');script.onload=function(){var stats=new Stats();stats.showPanel( i );
1633+
stats.dom.style.marginTop = `${i*48}px`; document.body.appendChild(stats.dom);requestAnimationFrame(function loop(){stats.update();requestAnimationFrame(loop)});};script.src='//rawgit.com/mrdoob/stats.js/master/build/stats.min.js';document.head.appendChild(script);
16331634
})()
16341635
}
16351636

@@ -1905,14 +1906,17 @@ xrf.model = {}
19051906
xrf.mixers = []
19061907

19071908
xrf.init = ((init) => function(opts){
1909+
// operate in own subscene
19081910
let scene = new opts.THREE.Group()
19091911
opts.scene.add(scene)
1910-
opts.scene = scene
1912+
opts.sceneRoot = opts.scene
1913+
opts.scene = scene
19111914
init(opts)
19121915
//if( opts.loaders ) Object.values(opts.loaders).map( xrf.patchLoader )
19131916

19141917
xrf.patchRenderer(opts)
19151918
xrf.navigator.init()
1919+
xrf.interactive = xrf.interactiveGroup( xrf.THREE, xrf.renderer, xrf.camera)
19161920
// return xrfragment lib as 'xrf' query functor (like jquery)
19171921
for ( let i in xrf ) xrf.query[i] = xrf[i]
19181922

@@ -1983,11 +1987,11 @@ xrf.reset = () => {
19831987
obj.removeFromParent()
19841988
return true
19851989
};
1990+
// also remove XRF objects from global scene
19861991
let nodes = []
19871992
xrf.scene.traverse( (child) => child.isXRF && (nodes.push(child)) )
1988-
nodes.map( disposeObject ) // leave non-XRF objects intact
1989-
xrf.interactive = xrf.interactiveGroup( xrf.THREE, xrf.renderer, xrf.camera)
1990-
xrf.add( xrf.interactive )
1993+
nodes.map( disposeObject )
1994+
xrf.interactive.clear()
19911995
xrf.layers = 0
19921996
}
19931997

@@ -3024,14 +3028,14 @@ xrf.interactiveGroup = function(THREE,renderer,camera){
30243028

30253029
if ( intersects.length > 0 ) {
30263030

3027-
console.log(object.name)
30283031

30293032
const intersection = intersects[ 0 ];
30303033

30313034
object = intersection.object;
30323035
const uv = intersection.uv;
30333036

30343037
_event.type = eventsMapper[ event.type ];
3038+
console.log( (new Date()).getTime()+" "+event.type+":"+_event.type+" "+object.name)
30353039
if( uv ) _event.data.set( uv.x, 1 - uv.y );
30363040

30373041
object.dispatchEvent( _event );
@@ -3066,6 +3070,11 @@ xrf.interactiveGroup = function(THREE,renderer,camera){
30663070
this.objects.push(obj)
30673071
}
30683072

3073+
clear(){
3074+
while( this.children[0] != undefined ) this.children[0].remove()
3075+
this.objects = []
3076+
}
3077+
30693078
}
30703079

30713080
return new interactive(renderer,camera)
@@ -3250,7 +3259,7 @@ xrf.filter.process = function(frag,scene,opts){
32503259
if( processed ) processed[n.uuid] == true
32513260
}
32523261

3253-
// spec 2: https://xrfragment.org/doc/RFC_XR_Macros.html#embedding-xr-content-using-src
3262+
// spec 3 @ https://xrfragment.org/doc/RFC_XR_Macros.html#embedding-xr-content-using-src
32543263
// reparent scene based on objectname in case it matches a (non-negating) selector
32553264
if( opts.reparent && firstFilter && !firstFilter.value && firstFilter.show === true ){
32563265
let obj
@@ -4133,8 +4142,8 @@ window.AFRAME.registerComponent('xrf', {
41334142
let pos = xrf.frag.pos.last
41344143
if( pos ){ AFRAME.XRF.camera.position.set(pos.x, pos.y*scale, pos.z) }
41354144
}
4136-
aScene.addEventListener('enter-vr', repositionUser(1) )
4137-
aScene.addEventListener('enter-ar', repositionUser(2) )
4145+
aScene.addEventListener('enter-vr', () => setTimeout( () => repositionUser(1),100 ) )
4146+
aScene.addEventListener('enter-ar', () => setTimeout( () => repositionUser(2),100 ) )
41384147

41394148
xrf.addEventListener('navigateLoaded', (opts) => {
41404149
setTimeout( () => AFRAME.fade.out(),500)
@@ -4221,12 +4230,6 @@ window.AFRAME.registerComponent('xrf', {
42214230
}
42224231
xrf.addEventListener('interactionReady', AFRAME.XRF.clickableMeshToEntity )
42234232

4224-
// cleanup xrf-get objects when resetting scene
4225-
xrf.addEventListener('reset', (opts) => {
4226-
let els = [...document.querySelectorAll('[xrf-get]')]
4227-
els.map( (el) => document.querySelector('a-scene').removeChild(el) )
4228-
})
4229-
42304233
if( typeof this.data === 'string' || this.data.http || this.data.https ){
42314234
let url
42324235
if( typeof this.data === 'string' ) url = this.data
@@ -4939,7 +4942,7 @@ window.AFRAME.registerComponent('xrf-get', {
49394942
setTimeout( () => {
49404943

49414944
if( !this.mesh ){
4942-
let scene = AFRAME.XRF.scene
4945+
let scene = xrf.scene
49434946
let mesh = this.mesh = scene.getObjectByName(meshname);
49444947
if( !this.el.className.match(/ray/) ) this.el.className += " ray"
49454948
if (!mesh){
@@ -4978,17 +4981,6 @@ window.AFRAME.registerComponent('xrf-get', {
49784981

49794982
this.el.emit("update",{timeout:0})
49804983

4981-
AFRAME.XRF.addEventListener('reset', () => {
4982-
try{
4983-
if( this.el ){
4984-
while ( this.el.object3D.children.length ){
4985-
this.el.object3D.children[0].remove()
4986-
}
4987-
this.el.remove()
4988-
}
4989-
}catch(e){}
4990-
})
4991-
49924984
}
49934985

49944986
});
@@ -5008,12 +5000,13 @@ window.AFRAME.registerComponent('xrf-pinchmove', {
50085000
// multiply the direction by a "speed" factor
50095001
direction.multiplyScalar(0.4)
50105002
// get the current position
5011-
var pos = player.getAttribute("position")
5003+
var pos = xrf.camera.position
5004+
//player.getAttribute("position")
50125005
// add the direction vector
50135006
pos.x += direction.x
50145007
pos.z += direction.z
50155008
// set the new position
5016-
this.data.rig.setAttribute("position", pos);
5009+
//this.data.rig.setAttribute("position", pos);
50175010
// !!! NOTE - it would be more efficient to do the
50185011
// position change on the players THREE.Object:
50195012
// `player.object3D.position.add(direction)`

0 commit comments

Comments
 (0)