From 40449310e9912997f31593b177d68ccd4fbfc4d5 Mon Sep 17 00:00:00 2001 From: Remy Mellet Date: Tue, 8 Mar 2022 13:39:05 +0100 Subject: [PATCH 1/4] Handle transparency, force update the canvas (when size change) and add example - handle transparency : do we lose ms if the texture is transparent for nothing ? (canvas is not) - dispose the canvasTexture when the canvas size changed. Do not understand why this is needed - shadow root : finally won't use it to avoid adding not so usefull code : LitElement can stop using shadowRoot (`createRenderRoot() {return this;}`) - add vanilly/lit/react html for htmlmesh with interactions - commit the screenshot jpg to not avoid that CI error `Make screenshot for example(s): webxr_vr_htmlmesh` - webxr_vr_htmlmesh.html won't probably be in dev, but that to have a green CI --- examples/files.json | 1 + examples/js/interactive/HTMLMesh.js | 17 +- examples/jsm/interactive/HTMLMesh.js | 10 +- examples/screenshots/webxr_vr_htmlmesh.jpg | Bin 0 -> 32508 bytes examples/webxr_vr_htmlmesh.html | 385 +++++++++++++++++++++ 5 files changed, 410 insertions(+), 3 deletions(-) create mode 100644 examples/screenshots/webxr_vr_htmlmesh.jpg create mode 100644 examples/webxr_vr_htmlmesh.html diff --git a/examples/files.json b/examples/files.json index e837caa35967ba..4c6c54460d1448 100644 --- a/examples/files.json +++ b/examples/files.json @@ -338,6 +338,7 @@ "webxr_vr_handinput_pointerdrag", "webxr_vr_handinput_pressbutton", "webxr_vr_haptics", + "webxr_vr_htmlmesh", "webxr_vr_layers", "webxr_vr_panorama", "webxr_vr_panorama_depth", diff --git a/examples/js/interactive/HTMLMesh.js b/examples/js/interactive/HTMLMesh.js index ae7eeba4698999..ced34fdfb2101a 100644 --- a/examples/js/interactive/HTMLMesh.js +++ b/examples/js/interactive/HTMLMesh.js @@ -8,7 +8,8 @@ const geometry = new THREE.PlaneGeometry( texture.image.width * 0.001, texture.image.height * 0.001 ); const material = new THREE.MeshBasicMaterial( { map: texture, - toneMapped: false + toneMapped: false, + transparent: true } ); super( geometry, material ); @@ -83,7 +84,19 @@ update() { - this.image = html2canvas( this.dom ); + this.image = html2canvas( this.dom ); //when canvas size changed, this is needed; but I don't understand why! Do we lose time to call it at every update? + + if ( ! this.prevCanvasSize || this.image.width !== this.prevCanvasSize.width || this.image.height !== this.prevCanvasSize.height ) { + + this.prevCanvasSize = { + width: this.image.width, + height: this.image.height + }; + super.dispose(); + console.log( 'canvas size changed, dispose' ); //I'll remove that later + + } + this.needsUpdate = true; this.scheduleUpdate = null; diff --git a/examples/jsm/interactive/HTMLMesh.js b/examples/jsm/interactive/HTMLMesh.js index d9212e8f15ce1e..2bb58fafc9e60b 100644 --- a/examples/jsm/interactive/HTMLMesh.js +++ b/examples/jsm/interactive/HTMLMesh.js @@ -14,7 +14,7 @@ class HTMLMesh extends Mesh { const texture = new HTMLTexture( dom ); const geometry = new PlaneGeometry( texture.image.width * 0.001, texture.image.height * 0.001 ); - const material = new MeshBasicMaterial( { map: texture, toneMapped: false } ); + const material = new MeshBasicMaterial( { map: texture, toneMapped: false, transparent: true } ); super( geometry, material ); @@ -92,6 +92,14 @@ class HTMLTexture extends CanvasTexture { update() { this.image = html2canvas( this.dom ); + + //when canvas size changed, this is needed; but I don't understand why! Do we lose time to call it at every update? + if ( !this.prevCanvasSize || this.image.width !== this.prevCanvasSize.width || this.image.height !== this.prevCanvasSize.height) { + this.prevCanvasSize = { width: this.image.width, height: this.image.height }; + super.dispose(); + console.log("canvas size changed, dispose"); //I'll remove that later + } + this.needsUpdate = true; this.scheduleUpdate = null; diff --git a/examples/screenshots/webxr_vr_htmlmesh.jpg b/examples/screenshots/webxr_vr_htmlmesh.jpg new file mode 100644 index 0000000000000000000000000000000000000000..64fc93648574aeea4c2fe6e4af1202205dc245ac GIT binary patch literal 32508 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 YQlVfu^)cffql#g{xYy3V&Hq;Z7vupeSO5S3 literal 0 HcmV?d00001 diff --git a/examples/webxr_vr_htmlmesh.html b/examples/webxr_vr_htmlmesh.html new file mode 100644 index 00000000000000..15ae1bd104f961 --- /dev/null +++ b/examples/webxr_vr_htmlmesh.html @@ -0,0 +1,385 @@ + + + + three.js vr - sandbox + + + + + +
+ Stantard JS + + +
    +
  • one
  • +
  • two
  • +
+
+ + + + + + + + + + + + + + + +
+ + + + + + + From f68dfcb3804308e7b22abcdc6632fc307bd2eafd Mon Sep 17 00:00:00 2001 From: Remy Mellet Date: Tue, 8 Mar 2022 18:47:49 +0100 Subject: [PATCH 2/4] finally handle shadowRoot. Note that the dom changes update is handled in the html example not in the HTMLMesh.js (see `lit-updated` event). Because MutationObserver doesn't trigger when shadow changes, not even when it is attached the the dom, thus this is easier and cleaner to handle in Lit --- examples/jsm/interactive/HTMLMesh.js | 17 ++++++ examples/webxr_vr_htmlmesh.html | 77 ++++++++++++++++++++-------- 2 files changed, 72 insertions(+), 22 deletions(-) diff --git a/examples/jsm/interactive/HTMLMesh.js b/examples/jsm/interactive/HTMLMesh.js index 2bb58fafc9e60b..4b215b27203837 100644 --- a/examples/jsm/interactive/HTMLMesh.js +++ b/examples/jsm/interactive/HTMLMesh.js @@ -316,6 +316,14 @@ function html2canvas( element ) { } + if(element.shadowRoot) { + for ( let i = 0; i < element.shadowRoot.childNodes.length; i ++ ) { + + drawElement( element.shadowRoot.childNodes[ i ], style ); + + } + } + if ( isClipping ) clipper.remove(); } @@ -383,6 +391,15 @@ function htmlevent( element, event, x, y ) { } + if(element.shadowRoot) { + + for ( let i = 0; i < element.shadowRoot.childNodes.length; i ++ ) { + + traverse( element.shadowRoot.childNodes[ i ] ); + + } + } + } } diff --git a/examples/webxr_vr_htmlmesh.html b/examples/webxr_vr_htmlmesh.html index 15ae1bd104f961..3dd5353b841d2d 100644 --- a/examples/webxr_vr_htmlmesh.html +++ b/examples/webxr_vr_htmlmesh.html @@ -32,6 +32,33 @@