Compare commits

..

No commits in common. "396090de8e0fc09b1dfb4d56f949fb42cac4e439" and "2bc664af0291d33747745ee847836d5bbb004d7b" have entirely different histories.

19 changed files with 64 additions and 115520 deletions

File diff suppressed because one or more lines are too long

View file

@ -1,258 +1,3 @@
/*
* v0.5.1 generated at Tue Feb 18 02:26:59 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:26:52 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:24:48 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:13:55 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:13:00 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:11:29 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:11:17 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:10:12 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:09:18 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:09:14 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:08:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:45:48 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:44:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:44:02 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:41:32 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:41:12 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:38:44 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:38:04 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:37:29 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:37:03 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:35:18 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:34:36 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:32:43 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:31:16 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:28:06 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:27:30 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:26:38 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:26:22 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:42:58 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:42:36 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:42:01 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:40:17 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:40:00 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:39:15 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:36:40 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:36:01 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:35:39 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:35:27 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:34:11 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:33:54 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:33:01 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:32:26 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:31:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:30:32 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:28:46 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:27:27 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:26:11 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:25:52 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:24:18 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:20:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:07:35 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/* /*
* v0.5.1 generated at Tue Feb 11 11:52:02 AM CET 2025 * v0.5.1 generated at Tue Feb 11 11:52:02 AM CET 2025
* https://xrfragment.org * https://xrfragment.org
@ -2370,7 +2115,6 @@ var xrf = {}
xrf.init = function(opts){ xrf.init = function(opts){
opts = opts || {} opts = opts || {}
xrf.debug = document.location.hostname.match(/^(localhost|[0-9]\.[0-9])/) || document.location.port == '8080' ? 0 : false xrf.debug = document.location.hostname.match(/^(localhost|[0-9]\.[0-9])/) || document.location.port == '8080' ? 0 : false
if( document.location.hash.match(/debug=([0-9])/) ){ if( document.location.hash.match(/debug=([0-9])/) ){
xrf.debug = parseInt( ( document.location.hash.match(/debug=([0-9])/) || [0,'0'] )[1] ) xrf.debug = parseInt( ( document.location.hash.match(/debug=([0-9])/) || [0,'0'] )[1] )
@ -3089,14 +2833,10 @@ xrf.frag.href = function(v, opts){
.catch( console.error ) .catch( console.error )
} }
let selected = mesh.userData.XRF.href.selected = (state) => () => { let selected = mesh.userData.XRF.href.selected = (state) => () => {
if( !mesh.material || !mesh.material?.visible || mesh.isSRC ) return // ignore invisible nodes if( (!mesh.material && !mesh.material.visible) && !mesh.isSRC ) return // ignore invisible nodes
if( mesh.selected == state ) return // nothing changed if( mesh.selected == state ) return // nothing changed
console.dir({state, mselected:mesh.selected})
xrf.interactive.objects.map( (o) => { xrf.interactive.objects.map( (o) => {
let newState = o.name == mesh.name ? state : false let newState = o.name == mesh.name ? state : false
if( o.material ){ if( o.material ){
@ -3105,7 +2845,7 @@ xrf.frag.href = function(v, opts){
if( o.material.emissive ){ if( o.material.emissive ){
if( !o.material.emissive.original ) o.material.emissive.original = o.material.emissive.clone() if( !o.material.emissive.original ) o.material.emissive.original = o.material.emissive.clone()
o.material.emissive.r = o.material.emissive.g = o.material.emissive.b = o.material.emissive.r = o.material.emissive.g = o.material.emissive.b =
newState ? o.material.emissive.original.r + 0.2 : o.material.emissive.original.r newState ? o.material.emissive.original.r + 0.5 : o.material.emissive.original.r
} }
} }
}) })
@ -3166,7 +2906,6 @@ xrf.addEventListener('audioInited', function(opts){
}) })
xrf.addEventListener('navigateLoading', (e) => { xrf.addEventListener('navigateLoading', (e) => {
if( !e.url || !e.url.match(/.*#.*pos=/) ) return
xrf.frag.href.audio.click.stop() xrf.frag.href.audio.click.stop()
xrf.frag.href.audio.teleport.stop() xrf.frag.href.audio.teleport.stop()
xrf.frag.href.audio.teleport.play() xrf.frag.href.audio.teleport.play()
@ -3592,8 +3331,6 @@ xrf.addEventListener('parseModel', (opts) => {
mixer.loop.timeStart = t.x != undefined ? t.x : mixer.loop.timeStart mixer.loop.timeStart = t.x != undefined ? t.x : mixer.loop.timeStart
mixer.loop.timeStop = t.y != undefined ? t.y : mixer.loop.timeStop mixer.loop.timeStop = t.y != undefined ? t.y : mixer.loop.timeStop
} }
const singleShotEnded = mixer.loop.timeStop != 'undefined' &&mixer.time == mixer.loop.timeStop && !mixer.loop.enabled
if( singleShotEnded ) return // do nothing
mixer.actions.map( (action) => { mixer.actions.map( (action) => {
if( mixer.loop.timeStart != undefined ){ if( mixer.loop.timeStart != undefined ){
action.time = mixer.loop.timeStart action.time = mixer.loop.timeStart
@ -3613,14 +3350,15 @@ xrf.addEventListener('parseModel', (opts) => {
let update = mixer.update let update = mixer.update
mixer.update = function(time){ mixer.update = function(time){
if( mixer.time == 0 || time == 0 ) return update.call(this,time)
mixer.time = Math.abs(mixer.time) mixer.time = Math.abs(mixer.time)
if( time == 0 ) return update.call(this,time)
// loop jump // loop jump
if( mixer.loop.timeStop > 0 && mixer.time != mixer.loop.timeStop && mixer.time >= mixer.loop.timeStop-0.02 ){ if( mixer.loop.timeStop > 0 && mixer.time > mixer.loop.timeStop ){
if( mixer.loop.enabled ){ if( mixer.loop.enabled ){
setTimeout( () => mixer.updateLoop(), 0 ) // prevent recursion setTimeout( () => mixer.updateLoop(), 0 ) // prevent recursion
}else{ }else{
mixer.setTime( mixer.time = mixer.loop.timeStop ) mixer.setTime( mixer.time = mixer.loop.timeStop )
//mixer.update(mixer.time )
mixer.timeScale = 0 mixer.timeScale = 0
} }
} }
@ -5172,9 +4910,9 @@ window.AFRAME.registerComponent('xrf', {
el.setAttribute("class","ray") // expose to raycaster el.setAttribute("class","ray") // expose to raycaster
// respond to cursor via laser-controls (https://aframe.io/docs/1.4.0/components/laser-controls.html) // respond to cursor via laser-controls (https://aframe.io/docs/1.4.0/components/laser-controls.html)
el.addEventListener("click", (e) => xrf.renderer.xr.isPresenting && clickHandler(e) ) el.addEventListener("click", clickHandler )
el.addEventListener("mouseenter", (e) => xrf.renderer.xr.isPresenting && mesh.userData.XRF.href.selected(true) ) el.addEventListener("mouseenter", mesh.userData.XRF.href.selected(true) )
el.addEventListener("mouseleave", (e) => xrf.renderer.xr.isPresenting && mesh.userData.XRF.href.selected(false) ) el.addEventListener("mouseleave", mesh.userData.XRF.href.selected(false) )
$('a-scene').appendChild(el) $('a-scene').appendChild(el)
} }
createEl(mesh) createEl(mesh)

255
dist/xrfragment.js vendored
View file

@ -1,258 +1,3 @@
/*
* v0.5.1 generated at Tue Feb 18 02:26:59 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:26:52 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:24:48 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:13:55 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:13:00 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:11:29 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:11:17 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:10:12 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:09:18 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:09:14 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:08:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:45:48 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:44:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:44:02 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:41:32 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:41:12 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:38:44 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:38:04 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:37:29 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:37:03 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:35:18 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:34:36 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:32:43 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:31:16 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:28:06 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:27:30 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:26:38 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:26:22 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:42:58 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:42:36 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:42:01 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:40:17 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:40:00 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:39:15 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:36:40 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:36:01 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:35:39 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:35:27 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:34:11 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:33:54 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:33:01 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:32:26 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:31:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:30:32 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:28:46 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:27:27 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:26:11 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:25:52 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:24:18 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:20:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:07:35 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/* /*
* v0.5.1 generated at Tue Feb 11 11:52:02 AM CET 2025 * v0.5.1 generated at Tue Feb 11 11:52:02 AM CET 2025
* https://xrfragment.org * https://xrfragment.org

File diff suppressed because one or more lines are too long

113832
dist/xrfragment.module.js vendored

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/* /*
* v0.5.1 generated at Tue Feb 18 02:26:59 PM CET 2025 * v0.5.1 generated at Tue Feb 11 11:52:02 AM CET 2025
* https://xrfragment.org * https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later * SPDX-License-Identifier: AGPL-3.0-or-later
*/ */

View file

@ -1,5 +1,5 @@
/* /*
* v0.5.1 generated at Tue Feb 18 02:26:59 PM CET 2025 * v0.5.1 generated at Tue Feb 11 11:52:02 AM CET 2025
* https://xrfragment.org * https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later * SPDX-License-Identifier: AGPL-3.0-or-later
*/ */

View file

@ -1,5 +1,5 @@
/* /*
* v0.5.1 generated at Tue Feb 18 02:26:59 PM CET 2025 * v0.5.1 generated at Tue Feb 11 11:52:02 AM CET 2025
* https://xrfragment.org * https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later * SPDX-License-Identifier: AGPL-3.0-or-later
*/ */

View file

@ -1,5 +1,5 @@
/* /*
* v0.5.1 generated at Tue Feb 18 02:26:59 PM CET 2025 * v0.5.1 generated at Tue Feb 11 11:52:03 AM CET 2025
* https://xrfragment.org * https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later * SPDX-License-Identifier: AGPL-3.0-or-later
*/ */

View file

@ -1,5 +1,5 @@
/* /*
* v0.5.1 generated at Tue Feb 18 02:26:59 PM CET 2025 * v0.5.1 generated at Tue Feb 11 11:52:03 AM CET 2025
* https://xrfragment.org * https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later * SPDX-License-Identifier: AGPL-3.0-or-later
*/ */

View file

@ -1,5 +1,5 @@
/* /*
* v0.5.1 generated at Tue Feb 18 02:26:59 PM CET 2025 * v0.5.1 generated at Tue Feb 11 11:52:03 AM CET 2025
* https://xrfragment.org * https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later * SPDX-License-Identifier: AGPL-3.0-or-later
*/ */

View file

@ -1,260 +1,5 @@
/* /*
* v0.5.1 generated at Tue Feb 18 02:26:59 PM CET 2025 * v0.5.1 generated at Tue Feb 11 11:52:03 AM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:26:52 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:24:48 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:13:55 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:13:00 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:11:29 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:11:17 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:10:12 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:09:18 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:09:14 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:08:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:45:48 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:44:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:44:02 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:41:32 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:41:12 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:38:44 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:38:04 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:37:29 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:37:03 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:35:18 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:34:36 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:32:43 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:31:16 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:28:06 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:27:30 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:26:38 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:26:22 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:42:58 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:42:36 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:42:01 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:40:17 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:40:00 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:39:15 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:36:40 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:36:01 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:35:39 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:35:27 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:34:11 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:33:54 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:33:01 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:32:26 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:31:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:30:32 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:28:46 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:27:27 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:26:11 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:25:52 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:24:18 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:20:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:07:35 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 11 11:52:02 AM CET 2025
* https://xrfragment.org * https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later * SPDX-License-Identifier: AGPL-3.0-or-later
*/ */
@ -2370,7 +2115,6 @@ var xrf = {}
xrf.init = function(opts){ xrf.init = function(opts){
opts = opts || {} opts = opts || {}
xrf.debug = document.location.hostname.match(/^(localhost|[0-9]\.[0-9])/) || document.location.port == '8080' ? 0 : false xrf.debug = document.location.hostname.match(/^(localhost|[0-9]\.[0-9])/) || document.location.port == '8080' ? 0 : false
if( document.location.hash.match(/debug=([0-9])/) ){ if( document.location.hash.match(/debug=([0-9])/) ){
xrf.debug = parseInt( ( document.location.hash.match(/debug=([0-9])/) || [0,'0'] )[1] ) xrf.debug = parseInt( ( document.location.hash.match(/debug=([0-9])/) || [0,'0'] )[1] )
@ -3089,14 +2833,10 @@ xrf.frag.href = function(v, opts){
.catch( console.error ) .catch( console.error )
} }
let selected = mesh.userData.XRF.href.selected = (state) => () => { let selected = mesh.userData.XRF.href.selected = (state) => () => {
if( !mesh.material || !mesh.material?.visible || mesh.isSRC ) return // ignore invisible nodes if( (!mesh.material && !mesh.material.visible) && !mesh.isSRC ) return // ignore invisible nodes
if( mesh.selected == state ) return // nothing changed if( mesh.selected == state ) return // nothing changed
console.dir({state, mselected:mesh.selected})
xrf.interactive.objects.map( (o) => { xrf.interactive.objects.map( (o) => {
let newState = o.name == mesh.name ? state : false let newState = o.name == mesh.name ? state : false
if( o.material ){ if( o.material ){
@ -3105,7 +2845,7 @@ xrf.frag.href = function(v, opts){
if( o.material.emissive ){ if( o.material.emissive ){
if( !o.material.emissive.original ) o.material.emissive.original = o.material.emissive.clone() if( !o.material.emissive.original ) o.material.emissive.original = o.material.emissive.clone()
o.material.emissive.r = o.material.emissive.g = o.material.emissive.b = o.material.emissive.r = o.material.emissive.g = o.material.emissive.b =
newState ? o.material.emissive.original.r + 0.2 : o.material.emissive.original.r newState ? o.material.emissive.original.r + 0.5 : o.material.emissive.original.r
} }
} }
}) })
@ -3166,7 +2906,6 @@ xrf.addEventListener('audioInited', function(opts){
}) })
xrf.addEventListener('navigateLoading', (e) => { xrf.addEventListener('navigateLoading', (e) => {
if( !e.url || !e.url.match(/.*#.*pos=/) ) return
xrf.frag.href.audio.click.stop() xrf.frag.href.audio.click.stop()
xrf.frag.href.audio.teleport.stop() xrf.frag.href.audio.teleport.stop()
xrf.frag.href.audio.teleport.play() xrf.frag.href.audio.teleport.play()
@ -3592,8 +3331,6 @@ xrf.addEventListener('parseModel', (opts) => {
mixer.loop.timeStart = t.x != undefined ? t.x : mixer.loop.timeStart mixer.loop.timeStart = t.x != undefined ? t.x : mixer.loop.timeStart
mixer.loop.timeStop = t.y != undefined ? t.y : mixer.loop.timeStop mixer.loop.timeStop = t.y != undefined ? t.y : mixer.loop.timeStop
} }
const singleShotEnded = mixer.loop.timeStop != 'undefined' &&mixer.time == mixer.loop.timeStop && !mixer.loop.enabled
if( singleShotEnded ) return // do nothing
mixer.actions.map( (action) => { mixer.actions.map( (action) => {
if( mixer.loop.timeStart != undefined ){ if( mixer.loop.timeStart != undefined ){
action.time = mixer.loop.timeStart action.time = mixer.loop.timeStart
@ -3613,14 +3350,15 @@ xrf.addEventListener('parseModel', (opts) => {
let update = mixer.update let update = mixer.update
mixer.update = function(time){ mixer.update = function(time){
if( mixer.time == 0 || time == 0 ) return update.call(this,time)
mixer.time = Math.abs(mixer.time) mixer.time = Math.abs(mixer.time)
if( time == 0 ) return update.call(this,time)
// loop jump // loop jump
if( mixer.loop.timeStop > 0 && mixer.time != mixer.loop.timeStop && mixer.time >= mixer.loop.timeStop-0.02 ){ if( mixer.loop.timeStop > 0 && mixer.time > mixer.loop.timeStop ){
if( mixer.loop.enabled ){ if( mixer.loop.enabled ){
setTimeout( () => mixer.updateLoop(), 0 ) // prevent recursion setTimeout( () => mixer.updateLoop(), 0 ) // prevent recursion
}else{ }else{
mixer.setTime( mixer.time = mixer.loop.timeStop ) mixer.setTime( mixer.time = mixer.loop.timeStop )
//mixer.update(mixer.time )
mixer.timeScale = 0 mixer.timeScale = 0
} }
} }

View file

@ -1,260 +1,5 @@
/* /*
* v0.5.1 generated at Tue Feb 18 02:26:59 PM CET 2025 * v0.5.1 generated at Tue Feb 11 11:52:03 AM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:26:52 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:24:48 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:13:55 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:13:00 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:11:29 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:11:17 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:10:12 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:09:18 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:09:14 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 02:08:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:45:48 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:44:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:44:02 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:41:32 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:41:12 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:38:44 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:38:04 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:37:29 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:37:03 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:35:18 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:34:36 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:32:43 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:31:16 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:28:06 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:27:30 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:26:38 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 01:26:22 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:42:58 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:42:36 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:42:01 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:40:17 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:40:00 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:39:15 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:36:40 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:36:01 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:35:39 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:35:27 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:34:11 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:33:54 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:33:01 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:32:26 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:31:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:30:32 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:28:46 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:27:27 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:26:11 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:25:52 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:24:18 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:20:49 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 18 12:07:35 PM CET 2025
* https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/*
* v0.5.1 generated at Tue Feb 11 11:52:02 AM CET 2025
* https://xrfragment.org * https://xrfragment.org
* SPDX-License-Identifier: AGPL-3.0-or-later * SPDX-License-Identifier: AGPL-3.0-or-later
*/ */
@ -2370,7 +2115,6 @@ var xrf = {}
xrf.init = function(opts){ xrf.init = function(opts){
opts = opts || {} opts = opts || {}
xrf.debug = document.location.hostname.match(/^(localhost|[0-9]\.[0-9])/) || document.location.port == '8080' ? 0 : false xrf.debug = document.location.hostname.match(/^(localhost|[0-9]\.[0-9])/) || document.location.port == '8080' ? 0 : false
if( document.location.hash.match(/debug=([0-9])/) ){ if( document.location.hash.match(/debug=([0-9])/) ){
xrf.debug = parseInt( ( document.location.hash.match(/debug=([0-9])/) || [0,'0'] )[1] ) xrf.debug = parseInt( ( document.location.hash.match(/debug=([0-9])/) || [0,'0'] )[1] )
@ -3089,14 +2833,10 @@ xrf.frag.href = function(v, opts){
.catch( console.error ) .catch( console.error )
} }
let selected = mesh.userData.XRF.href.selected = (state) => () => { let selected = mesh.userData.XRF.href.selected = (state) => () => {
if( !mesh.material || !mesh.material?.visible || mesh.isSRC ) return // ignore invisible nodes if( (!mesh.material && !mesh.material.visible) && !mesh.isSRC ) return // ignore invisible nodes
if( mesh.selected == state ) return // nothing changed if( mesh.selected == state ) return // nothing changed
console.dir({state, mselected:mesh.selected})
xrf.interactive.objects.map( (o) => { xrf.interactive.objects.map( (o) => {
let newState = o.name == mesh.name ? state : false let newState = o.name == mesh.name ? state : false
if( o.material ){ if( o.material ){
@ -3105,7 +2845,7 @@ xrf.frag.href = function(v, opts){
if( o.material.emissive ){ if( o.material.emissive ){
if( !o.material.emissive.original ) o.material.emissive.original = o.material.emissive.clone() if( !o.material.emissive.original ) o.material.emissive.original = o.material.emissive.clone()
o.material.emissive.r = o.material.emissive.g = o.material.emissive.b = o.material.emissive.r = o.material.emissive.g = o.material.emissive.b =
newState ? o.material.emissive.original.r + 0.2 : o.material.emissive.original.r newState ? o.material.emissive.original.r + 0.5 : o.material.emissive.original.r
} }
} }
}) })
@ -3166,7 +2906,6 @@ xrf.addEventListener('audioInited', function(opts){
}) })
xrf.addEventListener('navigateLoading', (e) => { xrf.addEventListener('navigateLoading', (e) => {
if( !e.url || !e.url.match(/.*#.*pos=/) ) return
xrf.frag.href.audio.click.stop() xrf.frag.href.audio.click.stop()
xrf.frag.href.audio.teleport.stop() xrf.frag.href.audio.teleport.stop()
xrf.frag.href.audio.teleport.play() xrf.frag.href.audio.teleport.play()
@ -3592,8 +3331,6 @@ xrf.addEventListener('parseModel', (opts) => {
mixer.loop.timeStart = t.x != undefined ? t.x : mixer.loop.timeStart mixer.loop.timeStart = t.x != undefined ? t.x : mixer.loop.timeStart
mixer.loop.timeStop = t.y != undefined ? t.y : mixer.loop.timeStop mixer.loop.timeStop = t.y != undefined ? t.y : mixer.loop.timeStop
} }
const singleShotEnded = mixer.loop.timeStop != 'undefined' &&mixer.time == mixer.loop.timeStop && !mixer.loop.enabled
if( singleShotEnded ) return // do nothing
mixer.actions.map( (action) => { mixer.actions.map( (action) => {
if( mixer.loop.timeStart != undefined ){ if( mixer.loop.timeStart != undefined ){
action.time = mixer.loop.timeStart action.time = mixer.loop.timeStart
@ -3613,14 +3350,15 @@ xrf.addEventListener('parseModel', (opts) => {
let update = mixer.update let update = mixer.update
mixer.update = function(time){ mixer.update = function(time){
if( mixer.time == 0 || time == 0 ) return update.call(this,time)
mixer.time = Math.abs(mixer.time) mixer.time = Math.abs(mixer.time)
if( time == 0 ) return update.call(this,time)
// loop jump // loop jump
if( mixer.loop.timeStop > 0 && mixer.time != mixer.loop.timeStop && mixer.time >= mixer.loop.timeStop-0.02 ){ if( mixer.loop.timeStop > 0 && mixer.time > mixer.loop.timeStop ){
if( mixer.loop.enabled ){ if( mixer.loop.enabled ){
setTimeout( () => mixer.updateLoop(), 0 ) // prevent recursion setTimeout( () => mixer.updateLoop(), 0 ) // prevent recursion
}else{ }else{
mixer.setTime( mixer.time = mixer.loop.timeStop ) mixer.setTime( mixer.time = mixer.loop.timeStop )
//mixer.update(mixer.time )
mixer.timeScale = 0 mixer.timeScale = 0
} }
} }

File diff suppressed because one or more lines are too long

View file

@ -162,9 +162,9 @@ window.AFRAME.registerComponent('xrf', {
el.setAttribute("class","ray") // expose to raycaster el.setAttribute("class","ray") // expose to raycaster
// respond to cursor via laser-controls (https://aframe.io/docs/1.4.0/components/laser-controls.html) // respond to cursor via laser-controls (https://aframe.io/docs/1.4.0/components/laser-controls.html)
el.addEventListener("click", (e) => xrf.renderer.xr.isPresenting && clickHandler(e) ) el.addEventListener("click", clickHandler )
el.addEventListener("mouseenter", (e) => xrf.renderer.xr.isPresenting && mesh.userData.XRF.href.selected(true) ) el.addEventListener("mouseenter", mesh.userData.XRF.href.selected(true) )
el.addEventListener("mouseleave", (e) => xrf.renderer.xr.isPresenting && mesh.userData.XRF.href.selected(false) ) el.addEventListener("mouseleave", mesh.userData.XRF.href.selected(false) )
$('a-scene').appendChild(el) $('a-scene').appendChild(el)
} }
createEl(mesh) createEl(mesh)

View file

@ -37,7 +37,6 @@ AFRAME.registerSystem('xrf-hands',{
// wait for bones get initialized // wait for bones get initialized
setTimeout( () => { setTimeout( () => {
let bones = handEl.components['hand-tracking-controls'].bones let bones = handEl.components['hand-tracking-controls'].bones
if( !bones ) return // dont bother
let indexFinger let indexFinger
for( let j = 0; j < bones.length; j++){ for( let j = 0; j < bones.length; j++){
if( bones[j].name == "index-finger-tip" ){ if( bones[j].name == "index-finger-tip" ){

View file

@ -1,52 +0,0 @@
window.hrefCycle = (e) => {
if( !xrf || !xrf.scene || e.key != "Tab" && e.key != "Enter" ) return
console.log("ja")
let subScene = xrf.scene.getObjectByName( xrf.frag.pos.last )
if( !subScene ) subScene = xrf.scene
let cache = window.hrefCycle.cache = window.hrefCycle.cache || {current: -1}
let objects = []
subScene.traverse( (n) => (n.userData.href || n.userData['aria-description']) && objects.push(n) )
const highlight = (n) => {
if( this.helper){
if( this.helper.selected == n.uuid ) return // already selected
xrf.scene.remove(this.helper)
}
this.selected = n
this.helper = new THREE.BoxHelper( n, 0xFF00FF )
this.helper.computeLineDistances()
this.helper.material.linewidth = 8
this.helper.material.color = xrf.focusLine.material.color
this.helper.material.dashSize = xrf.focusLine.material.dashSize
this.helper.material.gapSize = xrf.focusLine.material.gapSize
this.helper.selected = n.uuid
xrf.scene.add(this.helper)
const isAction = n.userData.href
if( typeof notify != 'undefined'){
notify(`${n.userData['aria-description']||''}` + (n.userData.href ? `<br><b>name:</b> ${n.name}<br><b>href:</b> ${n.userData['href']}` :'') )
}
if( typeof term != 'undefined'){
term.send(`\n\r${isAction?'press enter for option ':''}${n.userData['aria-description']||n.userData['aria-label']||n.name}`)
}
}
if( e.key == 'Enter' && objects[cache.current]?.userData.href ){
xrf.navigator.to( objects[cache.current].userData.href )
}
// increment to next
cache.current = (cache.current + 1) % objects.length
if( e.key == 'Tab'){
highlight( objects[cache.current] )
}
e.preventDefault()
return false
}
window.addEventListener('keydown', window.hrefCycle )

View file

@ -68,14 +68,10 @@ xrf.frag.href = function(v, opts){
.catch( console.error ) .catch( console.error )
} }
let selected = mesh.userData.XRF.href.selected = (state) => () => { let selected = mesh.userData.XRF.href.selected = (state) => () => {
if( !mesh.material || !mesh.material?.visible || mesh.isSRC ) return // ignore invisible nodes if( (!mesh.material && !mesh.material.visible) && !mesh.isSRC ) return // ignore invisible nodes
if( mesh.selected == state ) return // nothing changed if( mesh.selected == state ) return // nothing changed
console.dir({state, mselected:mesh.selected})
xrf.interactive.objects.map( (o) => { xrf.interactive.objects.map( (o) => {
let newState = o.name == mesh.name ? state : false let newState = o.name == mesh.name ? state : false
if( o.material ){ if( o.material ){
@ -84,7 +80,7 @@ xrf.frag.href = function(v, opts){
if( o.material.emissive ){ if( o.material.emissive ){
if( !o.material.emissive.original ) o.material.emissive.original = o.material.emissive.clone() if( !o.material.emissive.original ) o.material.emissive.original = o.material.emissive.clone()
o.material.emissive.r = o.material.emissive.g = o.material.emissive.b = o.material.emissive.r = o.material.emissive.g = o.material.emissive.b =
newState ? o.material.emissive.original.r + 0.2 : o.material.emissive.original.r newState ? o.material.emissive.original.r + 0.5 : o.material.emissive.original.r
} }
} }
}) })
@ -145,7 +141,6 @@ xrf.addEventListener('audioInited', function(opts){
}) })
xrf.addEventListener('navigateLoading', (e) => { xrf.addEventListener('navigateLoading', (e) => {
if( !e.url || !e.url.match(/.*#.*pos=/) ) return
xrf.frag.href.audio.click.stop() xrf.frag.href.audio.click.stop()
xrf.frag.href.audio.teleport.stop() xrf.frag.href.audio.teleport.stop()
xrf.frag.href.audio.teleport.play() xrf.frag.href.audio.teleport.play()

View file

@ -73,8 +73,6 @@ xrf.addEventListener('parseModel', (opts) => {
mixer.loop.timeStart = t.x != undefined ? t.x : mixer.loop.timeStart mixer.loop.timeStart = t.x != undefined ? t.x : mixer.loop.timeStart
mixer.loop.timeStop = t.y != undefined ? t.y : mixer.loop.timeStop mixer.loop.timeStop = t.y != undefined ? t.y : mixer.loop.timeStop
} }
const singleShotEnded = mixer.loop.timeStop != 'undefined' &&mixer.time == mixer.loop.timeStop && !mixer.loop.enabled
if( singleShotEnded ) return // do nothing
mixer.actions.map( (action) => { mixer.actions.map( (action) => {
if( mixer.loop.timeStart != undefined ){ if( mixer.loop.timeStart != undefined ){
action.time = mixer.loop.timeStart action.time = mixer.loop.timeStart
@ -94,14 +92,15 @@ xrf.addEventListener('parseModel', (opts) => {
let update = mixer.update let update = mixer.update
mixer.update = function(time){ mixer.update = function(time){
if( mixer.time == 0 || time == 0 ) return update.call(this,time)
mixer.time = Math.abs(mixer.time) mixer.time = Math.abs(mixer.time)
if( time == 0 ) return update.call(this,time)
// loop jump // loop jump
if( mixer.loop.timeStop > 0 && mixer.time != mixer.loop.timeStop && mixer.time >= mixer.loop.timeStop-0.02 ){ if( mixer.loop.timeStop > 0 && mixer.time > mixer.loop.timeStop ){
if( mixer.loop.enabled ){ if( mixer.loop.enabled ){
setTimeout( () => mixer.updateLoop(), 0 ) // prevent recursion setTimeout( () => mixer.updateLoop(), 0 ) // prevent recursion
}else{ }else{
mixer.setTime( mixer.time = mixer.loop.timeStop ) mixer.setTime( mixer.time = mixer.loop.timeStop )
//mixer.update(mixer.time )
mixer.timeScale = 0 mixer.timeScale = 0
} }
} }