various tweaks (timeline, href)
This commit is contained in:
parent
4518117414
commit
9049b7a176
5 changed files with 68 additions and 9 deletions
|
|
@ -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", clickHandler )
|
el.addEventListener("click", (e) => xrf.renderer.xr.isPresenting && clickHandler(e) )
|
||||||
el.addEventListener("mouseenter", mesh.userData.XRF.href.selected(true) )
|
el.addEventListener("mouseenter", (e) => xrf.renderer.xr.isPresenting && mesh.userData.XRF.href.selected(true) )
|
||||||
el.addEventListener("mouseleave", mesh.userData.XRF.href.selected(false) )
|
el.addEventListener("mouseleave", (e) => xrf.renderer.xr.isPresenting && mesh.userData.XRF.href.selected(false) )
|
||||||
$('a-scene').appendChild(el)
|
$('a-scene').appendChild(el)
|
||||||
}
|
}
|
||||||
createEl(mesh)
|
createEl(mesh)
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ 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" ){
|
||||||
|
|
|
||||||
52
src/3rd/js/plugin/frontend/tab-to-href.js
Normal file
52
src/3rd/js/plugin/frontend/tab-to-href.js
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
|
||||||
|
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 )
|
||||||
|
|
@ -46,7 +46,7 @@ xrf.frag.href = function(v, opts){
|
||||||
let URI = xrf.URI.template( mesh.userData.href, xrf.URI.vars.__object )
|
let URI = xrf.URI.template( mesh.userData.href, xrf.URI.vars.__object )
|
||||||
xrf.Parser.parse( "href", URI, frag )
|
xrf.Parser.parse( "href", URI, frag )
|
||||||
const v = frag.href
|
const v = frag.href
|
||||||
|
|
||||||
// bubble up!
|
// bubble up!
|
||||||
mesh.traverseAncestors( (n) => n.userData && n.userData.href && n.dispatchEvent({type:e.type,data:{}}) )
|
mesh.traverseAncestors( (n) => n.userData && n.userData.href && n.dispatchEvent({type:e.type,data:{}}) )
|
||||||
|
|
||||||
|
|
@ -68,10 +68,14 @@ 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 ){
|
||||||
|
|
@ -80,7 +84,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.5 : o.material.emissive.original.r
|
newState ? o.material.emissive.original.r + 0.2 : o.material.emissive.original.r
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -141,6 +145,7 @@ 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()
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,8 @@ 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
|
||||||
|
|
@ -92,15 +94,14 @@ 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 ){
|
if( mixer.loop.timeStop > 0 && mixer.time != mixer.loop.timeStop && mixer.time >= mixer.loop.timeStop-0.02 ){
|
||||||
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue