This commit is contained in:
Leon van Kammen 2023-10-26 18:45:13 +02:00
parent 291b87f94a
commit 997173adb8
10 changed files with 424 additions and 669 deletions

View file

@ -223,8 +223,8 @@ These are automatic fragment-to-metadata mappings, which only trigger if the 3D
| `#<cameraname>` | string | `#cam01` | set camera as active camera | | `#<cameraname>` | string | `#cam01` | set camera as active camera |
| `#<objectname_with_src=x,x,x`| vector3 | `#person=1,1,0` | play src-metadata of object `person` using `#t=` timeline-value (see #t)| | `#<objectname_with_src=x,x,x`| vector3 | `#person=1,1,0` | play src-metadata of object `person` using `#t=` timeline-value (see #t)|
| `#<animname>=x,x,x` | vector3 | `#myanim=1,1,0` | play (non-global) animation ID | | `#<animname>=x,x,x` | vector3 | `#myanim=1,1,0` | play (non-global) animation ID |
| `#<materialname>=<x,x,x|objectname>`| string | `horizon=fader` | animate r/g/b/o(pacity) of material `horizon` with `fader` obj (xyzw=rgbo) | | `#<materialname>=<x,x,x|animationname>`| string | `horizon=fader` | animate o(pacity) of material `horizon` with `fader` obj (xyzw=o...) |
| `#<texturename>=<x,x,x|objectname>`| string | `page=scroller` | animate x/y/r(otation) of texture `page` with `scroller` object (xyz=xyr) | | `#<texturename>=<x,x,x|animationname>`| string | `page=scroller` | animate x/y/r(otation) of texture `page` with `scroller` object (xyz=xyr) |
| `#<varname>=<x,x,x|string>` | string|vector3 | `myvar=fader` | set/animate shaderuniform- or scene-specific vars with `fader` object (*) | | `#<varname>=<x,x,x|string>` | string|vector3 | `myvar=fader` | set/animate shaderuniform- or scene-specific vars with `fader` object (*) |
# Spatial Referencing 3D # Spatial Referencing 3D

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

File diff suppressed because one or more lines are too long

View file

@ -15,24 +15,20 @@
*/ */
xrf.addEventListener = function(eventName, callback, scene) { xrf.addEventListener = function(eventName, callback, scene) {
if( !this._listeners ) this._listeners = [] if( !this._listeners ) this._listeners = []
if (!this._listeners[eventName]) { if (!this._listeners[eventName]) {
// create a new array for this event name if it doesn't exist yet // create a new array for this event name if it doesn't exist yet
this._listeners[eventName] = []; this._listeners[eventName] = [];
}
if( scene ) callback.scene = scene
// add the callback to the listeners array for this event name
this._listeners[eventName].push(callback);
};
xrf.removeEventListeners = function( everything ){
if( everything ) this._listeners = []
else{
for( let eventName in this._listener ){
this._listener[eventName] = this._listener[eventName].filter( (e) => e.callback ? null : e )
}
} }
} if( scene ) callback.scene = scene
// add the callback to the listeners array for this event name
this._listeners[eventName].push(callback);
return () => {
console.log("size = "+this._listeners[eventName].length)
this._listeners[eventName] = this._listeners[eventName].filter( (c) => c != callback )
console.log("size = "+this._listeners[eventName].length)
}
};
xrf.emit = function(eventName, data){ xrf.emit = function(eventName, data){
if( typeof data != 'object' ) throw 'emit() requires passing objects' if( typeof data != 'object' ) throw 'emit() requires passing objects'

View file

@ -19,7 +19,9 @@ xrf.patchRenderer = function(renderer){
renderer.xr.addEventListener( 'sessionstart', () => xrf.baseReferenceSpace = renderer.xr.getReferenceSpace() ); renderer.xr.addEventListener( 'sessionstart', () => xrf.baseReferenceSpace = renderer.xr.getReferenceSpace() );
renderer.xr.enabled = true; renderer.xr.enabled = true;
renderer.render = ((render) => function(scene,camera){ renderer.render = ((render) => function(scene,camera){
// update clock
let time = xrf.model && xrf.model.clock ? xrf.model.clock.getDelta() : 0 let time = xrf.model && xrf.model.clock ? xrf.model.clock.getDelta() : 0
// allow entities to do stuff during render (onBeforeRender and onAfterRender don't always fire)
xrf.emit('render',{scene,camera,time}) // allow fragments to do something at renderframe xrf.emit('render',{scene,camera,time}) // allow fragments to do something at renderframe
render(scene,camera) render(scene,camera)
})(renderer.render.bind(renderer)) })(renderer.render.bind(renderer))
@ -46,7 +48,14 @@ xrf.parseModel = function(model,url){
let file = xrf.getFile(url) let file = xrf.getFile(url)
model.file = file model.file = file
// eval embedded XR fragments // eval embedded XR fragments
model.scene.traverse( (mesh) => xrf.hashbus.pub.mesh(mesh,model) ) model.scene.traverse( (mesh) => {
xrf.hashbus.pub.mesh(mesh,model)
let obj = [ `'${mesh.name}'` ]
if( mesh.material ) obj.push([`material:'${mesh.material.name}'`])
if( mesh.material && mesh.material.map ) obj.push([`texture: '${mesh.material.map.name}'`])
console.log("obj "+obj.join(" ") )
})
model.animations.map( (a) => console.log("anim: "+a.name) )
xrf.emit('parseModel',{model,url,file}) xrf.emit('parseModel',{model,url,file})
} }

View file

@ -1,26 +1,30 @@
xrf.addEventListener('dynamicKeyValue', (opts) => { xrf.addEventListener('dynamicKeyValue', (opts) => {
let {scene,match,v} = opts let {scene,match,v} = opts
let texture = v.fragment let texture = v.fragment
let found = false
scene.traverse( (mesh) => { scene.traverse( (mesh) => {
if( mesh.material){ if( mesh.material && !found ){
if( mesh.material.map && mesh.material.map.name == texture ){ if( mesh.material.map && mesh.material.map.name == texture ){
found = true
let mat = mesh.material let mat = mesh.material
delete mesh.onBeforeRender // remove render listener if any
delete mesh.driver if( mesh.material.map.removeListener ) mesh.material.map.removeListener()
if( v.x != undefined ){ if( v.x != undefined ){
delete mesh.onBeforeRender
mat.map.offset.x = v.x mat.map.offset.x = v.x
mat.map.offset.y = v.y mat.map.offset.y = v.y
mat.map.rotation = v.z mat.map.rotation = v.z
}else{ }else{
mesh.driver = xrf.scene.getObjectByName(v.string) mesh.driver = xrf.model.animations.find( (a) => a.name == v.string )
if( !mesh.driver ) return if( !mesh.driver ) return
mesh.onBeforeRender = function(){ let everyFrame = (mesh) => () => {
let model = xrf.model let value = mesh.driver.action._propertyBindings[0].binding.resolvedProperty
if( !model || !model.clock ) return mesh.material.map.offset.x = value.x
this.material.map.offset.x = this.driver.position.x mesh.material.map.offset.y = value.y
this.material.map.offset.y = this.driver.position.y mesh.material.map.rotation = value.z
this.material.map.rotation = this.driver.position.z
} }
mesh.material.map.removeListener = xrf.addEventListener('render', everyFrame(mesh) )
} }
} }
} }

View file

@ -14,22 +14,24 @@ xrf.frag.t = function(v, opts){
mixer.setTime(time) mixer.setTime(time)
mixer.time = Math.abs(mixer.time) mixer.time = Math.abs(mixer.time)
mixer.update(0) // (forgetting) this little buddy costed me lots of time :] mixer.update(0) // (forgetting) this little buddy costed me lots of time :]
xrf.model.animations.map( (anim) => {
anim.action.setLoop( v.z == 0 ? THREE.LoopOnce : THREE.LoopRepeat)
})
} }
// play animations // play animations
mixer.play( v.x == 1 ) mixer.play( v.x == 1 )
if( v.y > 0 || v.z > 0 ) updateTime( mixer.loop.timeStart ) if( v.y > 0 || v.z > 0 ) updateTime( mixer.loop.timeStart )
if( v.y > 0 && v.z > 0 ){
xrf.model.animations.map( (anim) => {
anim.action.setLoop( v.z == 0 ? THREE.LoopOnce : THREE.LoopRepeat, v.z == 0 ? 0 : 99999999)
})
}
// update loop when needed // update loop when needed
if( !mixer.update.patched ){ if( !mixer.update.patched ){
let update = mixer.update let update = mixer.update
mixer.update = function(time){ mixer.update = function(time){
mixer.time = Math.abs(mixer.time) mixer.time = Math.abs(mixer.time)
if( time == 0 ) return update.call(mixer,time) if( time == 0 ) return update.call(this,time)
if( mixer.loop.speed > 0.0 && mixer.time > mixer.loop.timeStop * mixer.loop.speedAbs ){ if( mixer.loop.speed > 0.0 && mixer.time > mixer.loop.timeStop * mixer.loop.speedAbs ){
setTimeout( (time) => updateTime(time),0,mixer.loop.timeStart) // prevent recursion setTimeout( (time) => updateTime(time),0,mixer.loop.timeStart) // prevent recursion