From 5fa3e6262765839d6f30990850ac6a3b8b551f60 Mon Sep 17 00:00:00 2001 From: Leon van Kammen Date: Fri, 27 Oct 2023 14:37:20 +0200 Subject: [PATCH] removed texture.js material.js (replaced with uvscroll) --- doc/RFC_XR_Fragments.md | 8 ++---- src/3rd/js/three/xrf/dynamic/material.js | 32 ------------------------ src/3rd/js/three/xrf/dynamic/texture.js | 32 ------------------------ src/3rd/js/three/xrf/dynamic/uvscroll.js | 16 ++++++++++++ src/3rd/js/three/xrf/src/image.js | 4 +++ 5 files changed, 22 insertions(+), 70 deletions(-) delete mode 100644 src/3rd/js/three/xrf/dynamic/material.js delete mode 100644 src/3rd/js/three/xrf/dynamic/texture.js create mode 100644 src/3rd/js/three/xrf/dynamic/uvscroll.js diff --git a/doc/RFC_XR_Fragments.md b/doc/RFC_XR_Fragments.md index 09e0696..3f6b47f 100644 --- a/doc/RFC_XR_Fragments.md +++ b/doc/RFC_XR_Fragments.md @@ -212,7 +212,7 @@ Supported popular compatible 3D fileformats: `.gltf`, `.obj`, `.fbx`, `.usdz`, ` > NOTE: XR Fragments are optional but also file- and protocol-agnostic, which means that programmatic 3D scene(nodes) can also use the mechanism/metadata. -## Dynamic XR Fragments (databindings) +## Dynamic XR Fragments (+databindings) These are automatic fragment-to-metadata mappings, which only trigger if the 3D scene metadata matches a specific identifier (`aliasname` e.g.) @@ -221,11 +221,7 @@ These are automatic fragment-to-metadata mappings, which only trigger if the 3D | `#` | string | `#cubes` | evaluate predefined views (`#cubes: #foo&bar` e.g.) | | `#` | string | `#person` | focus object(s) with `tag: person` or name `person` by looking up XRWG | | `#` | string | `#cam01` | set camera as active camera | -| `#=x,x,x` | vector3 | `#myanim=1,1,0` | play (non-global) animation ID | -| `#=`| string | `horizon=fader` | animate o(pacity) of material `horizon` with `fader` obj (xyzw=o...) | -| `#=`| string | `page=scroller` | animate x/y/r(otation) of texture `page` with `scroller` object (xyz=xyr) | -| `#=` | string|vector3 | `myvar=fader` | set/animate shaderuniform- or scene-specific vars with `fader` object (*) | +| `#=x,y` | string | `#sky=0,0.5` | set scroll-position of object by offsetting (uv) coordinates (uv scrolling)| # Spatial Referencing 3D diff --git a/src/3rd/js/three/xrf/dynamic/material.js b/src/3rd/js/three/xrf/dynamic/material.js deleted file mode 100644 index 1d04ced..0000000 --- a/src/3rd/js/three/xrf/dynamic/material.js +++ /dev/null @@ -1,32 +0,0 @@ -xrf.addEventListener('dynamicKeyValue', (opts) => { - let {scene,match,v} = opts - let material = v.fragment - - const setMaterial = (mesh,v) => { - let mat = mesh.material - mat.transparent = v.x < 1.0 - mat.opacity = v.x - } - console.dir(v) - - scene.traverse( (mesh) => { - if( mesh.material){ - if( mesh.material && mesh.material.name == material ){ - delete mesh.onBeforeRender - delete mesh.driver - let opacity = v.float || v.x - if( opacity != undefined ){ - setMaterial( mesh, {x:opacity}) - }else{ - mesh.driver = xrf.scene.getObjectByName(v.string) - if( !mesh.driver ) return - mesh.onBeforeRender = function(){ - let model = xrf.model - if( !model || !model.clock ) return - setMaterial( this, this.driver.position ) - } - } - } - } - }) -}) diff --git a/src/3rd/js/three/xrf/dynamic/texture.js b/src/3rd/js/three/xrf/dynamic/texture.js deleted file mode 100644 index 005b801..0000000 --- a/src/3rd/js/three/xrf/dynamic/texture.js +++ /dev/null @@ -1,32 +0,0 @@ -xrf.addEventListener('dynamicKeyValue', (opts) => { - let {scene,match,v} = opts - let texture = v.fragment - let found = false - scene.traverse( (mesh) => { - if( mesh.material && !found ){ - if( mesh.material.map && mesh.material.map.name == texture ){ - found = true - let mat = mesh.material - // remove render listener if any - if( mesh.material.map.removeListener ) mesh.material.map.removeListener() - - if( v.x != undefined ){ - delete mesh.onBeforeRender - mat.map.offset.x = v.x - mat.map.offset.y = v.y - mat.map.rotation = v.z - }else{ - mesh.driver = xrf.model.animations.find( (a) => a.name == v.string ) - if( !mesh.driver ) return - let everyFrame = (mesh) => () => { - let value = mesh.driver.action._propertyBindings[0].binding.resolvedProperty - mesh.material.map.offset.x = value.x - mesh.material.map.offset.y = value.y - mesh.material.map.rotation = value.z - } - mesh.material.map.removeListener = xrf.addEventListener('render', everyFrame(mesh) ) - } - } - } - }) -}) diff --git a/src/3rd/js/three/xrf/dynamic/uvscroll.js b/src/3rd/js/three/xrf/dynamic/uvscroll.js new file mode 100644 index 0000000..5ac155e --- /dev/null +++ b/src/3rd/js/three/xrf/dynamic/uvscroll.js @@ -0,0 +1,16 @@ +xrf.addEventListener('dynamicKeyValue', (opts) => { + let {scene,match,v} = opts + let objname = v.fragment + + scene.traverse( (mesh) => { + if( mesh.name == objname ){ + if( !mesh.geometry ) return console.warn(`mesh '${objname}' has no uvcoordinates to offset`) + let uv = mesh.geometry.getAttribute("uv") + if( !uv.old ) uv.old = uv.clone() + for( let i = 0; i < uv.count; i++ ){ + uv.setXY(i, uv.old.getX(i) + v.x, uv.old.getY(i) + v.y ) + } + uv.needsUpdate = true + } + }) +}) diff --git a/src/3rd/js/three/xrf/src/image.js b/src/3rd/js/three/xrf/src/image.js index 3441430..b41afd5 100644 --- a/src/3rd/js/three/xrf/src/image.js +++ b/src/3rd/js/three/xrf/src/image.js @@ -60,6 +60,8 @@ xrf.frag.src.type['image/png'] = function(url,opts){ } let renderImage = (texture) => { + let img = {w: texture.source.data.width, h: texture.source.data.height} + // stretch image by pinning uv-coordinates to corners if( mesh.geometry ){ if( mesh.geometry.attributes.uv ){ // buffergeometries @@ -88,6 +90,8 @@ xrf.frag.src.type['image/png'] = function(url,opts){ let onLoad = (texture) => { texture.colorSpace = THREE.SRGBColorSpace; + texture.wrapS = THREE.RepeatWrapping; + texture.wrapT = THREE.RepeatWrapping; // detect equirectangular image if( texture && texture.source.data.height == texture.source.data.width/2 ){ renderEquirect(texture)