xrfragment-haxe/src/3rd/js/three/xrf/t.js

55 lines
1.8 KiB
JavaScript
Raw Normal View History

xrf.frag.t = function(v, opts){
let { frag, mesh, model, camera, scene, renderer, THREE} = opts
console.log(` └ setting animation loop to ${v.x} ${v.y} ${v.z}` )
if( !model.animations || model.animations[0] == undefined ) return console.warn('no animation in scene')
model.mixer.t = v
let duration = model.animations[0].duration
let frames = model.animations[0].tracks[0].times.length
let mixer = model.mixer
mixer.loop = mixer.loop || {frameStart:0,frameStop:99999999,speed: 1}
2023-10-18 22:07:20 +02:00
mixer.loop.fps = frames / duration
2023-10-18 22:07:20 +02:00
xrf.frag.t.calculateLoop( v, mixer.loop, mixer.loop.fps )
// update speed
mixer.timeScale = mixer.loop.speed
let updateTime = (time) => {
mixer.setTime(time)
mixer.time = Math.abs(mixer.time)
mixer.update(0) // (forgetting) this little buddy costed me lots of time :]
2023-10-16 16:58:56 +02:00
// (re)trigger audio
}
2023-10-18 22:07:20 +02:00
//if( v.x != 0 ) xrf.emit('play',v) *TODO* touchend/usergesture
if( v.y > 0 || v.z > 0 ) updateTime( mixer.loop.timeStart )
2023-10-11 20:12:48 +02:00
// update loop when needed
if( !mixer.update.patched ){
let update = mixer.update
mixer.update = function(time){
mixer.time = Math.abs(mixer.time)
if( time == 0 ) return update.call(mixer,time)
if( mixer.loop.speed > 0.0 && mixer.time > mixer.loop.timeStop * mixer.loop.speedAbs ){
setTimeout( (time) => updateTime(time),0,mixer.loop.timeStart) // prevent recursion
}
return update.call( mixer, time )
}
mixer.update.patched = true
}
}
2023-10-18 22:07:20 +02:00
xrf.frag.t.default = {x:1, y:0, z:0}
xrf.frag.t.calculateLoop = (t,obj,fps) => {
obj.speed = t.x
obj.speedAbs = Math.abs(t.x)
obj.frameStart = t.y || obj.frameStart
obj.frameStop = t.z || obj.frameStop
// always recalculate time using frameStart/Stop
obj.timeStart = obj.frameStart / (fps * obj.speedAbs)
obj.timeStop = obj.frameStop / (fps * obj.speedAbs)
}