From ffeb9466a6c2320bb31973d99252235699c93cc1 Mon Sep 17 00:00:00 2001 From: goynov Date: Wed, 11 Mar 2026 17:00:34 +0200 Subject: [PATCH] #66 --- public/static/meshes/quiz/quiz.bin | Bin 7328 -> 24704 bytes public/static/meshes/quiz/quiz.gltf | 259 ++++++++++++------ .../InteractiveObjects/InteractiveObject.js | 27 +- .../MazeQuizGame/MazeObject.js | 8 +- src/lib/Dashboard.js | 6 +- src/lib/GameEngine.js | 30 +- 6 files changed, 226 insertions(+), 104 deletions(-) diff --git a/public/static/meshes/quiz/quiz.bin b/public/static/meshes/quiz/quiz.bin index c4795ec74940334792d61049f7884f6b8104e27e..b650170319183dee11d4f44ee13769c3da66cd6e 100644 GIT binary patch literal 24704 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 aEaX#^l~|n=9W${ z7zhFYkPY*J`2c_t^!LSvMj&V%iie;Dh|QtDC9s#fAy_(LGr=KFV*uc&00CY&0C2Q% z3J?y$d11h&ZV*7j-@#-Uj0?!^TnZ}DJQh-kyOBkY-3Pimy^FmfE^m06)Y(32Fy3Q= zDOcOc?}NCTa_c}e80KYfiU@jdp~7lOsHv_0-K^y<06Z&QaxNRHTqt8dS=o*42` zvdyVUzk@w8zpu8->w}7{GYPI_vapRQd{a`~S^nM2WArU+su+@AIlbtBj5jW(X3u5~;HcW$zP<;% zLyHUt{9UaYaYD#k1iaVyWdD0B{;f}DBt9w)X3E|n7{0uHartGVK`^&EM@jy9bAHp6$A%g-m2WwS#D3s@PN`{g&#*E&n!RF z9W!(_Aveqp%Rf4~b*TK_nNTE87Y;1V)jn%JQZz+hAW73F<(}~eh@hpCkqpYI?7|p| zZmW|Sp&TW&W%?$p+$#whfDY$AYenSxcvW-!92l zymo`nG(VHdElsI8hl{@k#GKoCTkS!hRSc6Stp?^1sLC!dp)A zbR{;w+XX0Hfe*am?-)CEiu;Na@YcCk35%P=*6O!}qz{t8H0^{SE3S1fzP^*ZLis_d z^{3>{Blt4tp9sK7o8EEN0;@ms)7(s~5L{+7TgOHDBYyWNmAvxy3a9Ts&KG*3pl-|F95;1$6P1P8#lTdN#gAT=b@}1alw=aVf@Ae^LlOe%YIF z`csv*e8fB@4iUlU-2Mo%G=C#TiQehN?|g&D#Y)dvyF)700~lO%>=~jJIc~c%u*;SA z&SapRAZ;ssig`%fHz^Zo8%6vAotxEE~U#U|*iP^zRw}J7W3xU*h3r}-XFW*9z?}F6XXycLy zwu_3zJ;I>?$;W2h$N|TS=LRa8E1xtHBF>c8KC6wZ?(a;xQCjX?+8s8iuWl(q&rINI zK&0s1eiWzRvFqaQt#mN{{)Hdm<01P+FSx=Og~;`3AkF3MWE4x-FpRZ9%u@8dd9>a4 zR`u&Gxo4<>)?|{+LQmq?7{oT5)K2T>&gm47)B>~96giv9*?S!;r8sqxXez$vMX0Y6yR;iltxd#bJbegg=^rxWBG77mMKb8 z1i*0r;87!&`{*mqQSGv%1@dF|lIzrIS=TLVRrtG`Jn<#0sW;o-VxC5m+xU>)BiMm1i!~NXxyui{#N0|M*=g=`KIaO%TBn5#3MBdFbFcPspZU{P0a}~^gm7h_N(=Ob7VLwkiXQN05=QB zyM{rH!bX{xV53feqMV-5jvN8z1h^f9Y8jkcdKrwG8VD&2Mty)y&u_z;j-L(exGani z*iL^Mc|UE|Y+`$NZe&ma&*LPwCl}8VBp%x29JrLyUj(i7y|nn0^MU+rqP<@&O^?1~ zt%#Yf;q`LYnsh7j?p3R?jEMCV=ES-o69B?^6a-J2J#d~|NA zuXc;xCA+jTrb+nHvk%97ZWMlL`SR)I!zSs8A2*DnwS(s$vG>@e7lu}t;HAR0`IW!7 zunqpPZw%9UvtH%y%uGXYu0Y^|u1^N+z@TzPO6aS(hC8aZCP73-O4O-52bTSloXjHr zzH#?7-38a8LZ5)#gSyp4x%g4fhCq^hT^r)PtE>J$>{aT@fv%uuAC*t1Air zRMxtfGw&}bdRRBkSkA$r_!m6U0N~hy!k>R;i+|(RZN_i)k98CS)&=8`DR4f%|L)h3 z@Yyx}m^}T#<+(rW!Z!*Uy9>TW|2Y1sE-rZa^!o7hhaZi9R(}irp%wh}^M``)uWSGF z-$<|D4gc1|_R1@dua1naHtiiQ^XOkVbL$MJUkwOmV-CTL12)sYS)nO9!c!1Wc*gkM z#jFK`!KHqQlLZai)~31}<(lgra923RnW^pMKD^_uYO{xpQDEsE149Sa{`ogG3x0A< zvK_k_UD5G-ME}ryGgMh3WjB7bc-%ozwX66&B+UHqJ>b>%j-Lv>I7dZQLSL~+#zL`e&ofX5wqj0GO1NUepD6)@iTAY!G)^Mu#3I5$`VOa=GX^wYrkakh>f?qo%8? Fd~uk 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 dstm && o.visible){ - o.visible = false; - } - }); + engine.hideIfFar(this.object, obj.distance) + // const o = this.object; + // let dstm = obj.distance; + // let v = new Vector3(); + // o.visible = false; + // engine.addEventListener('beforeRender', function () { + // o.getWorldPosition(v); + // var dst = engine.cameraWorld.position.distanceTo(v); + // if (dst <= dstm && !o.visible) { + // o.visible = true; + // }else if (dst > dstm && o.visible){ + // o.visible = false; + // } + // }); } resolve(this); }); diff --git a/src/components/InteractiveObjects/MazeQuizGame/MazeObject.js b/src/components/InteractiveObjects/MazeQuizGame/MazeObject.js index 50dad0e..ee02fad 100644 --- a/src/components/InteractiveObjects/MazeQuizGame/MazeObject.js +++ b/src/components/InteractiveObjects/MazeQuizGame/MazeObject.js @@ -1,4 +1,4 @@ -import { Group, Vector3, Matrix4, Mesh, Quaternion, PlaneGeometry, MeshStandardMaterial, DoubleSide, RepeatWrapping, Vector2} from 'three'; +import { Group, Vector3, Matrix4, Quaternion, RepeatWrapping, Vector2} from 'three'; import { InteractiveObject } from '../InteractiveObject'; import { getBoundingBox, getBoundingBoxSize } from '@/lib/MeshUtils'; @@ -79,6 +79,9 @@ class MazeObject { bbox.l = Math.min(g.position.x, bbox.l) bbox.r = Math.max(g.position.x, bbox.r) bbox.f = Math.max(g.position.z, bbox.f) + if (g.userData?.['io.maxDistance']){ + engine.hideIfFar(g, g.userData?.['io.maxDistance']); + } }); //the floor: @@ -101,6 +104,9 @@ class MazeObject { let t = o.tunnel.clone(); t.position.set(0, 0, i * tubeSize); def.matrix && t.applyMatrix4(def.matrix); + if (t.userData?.['io.maxDistance']){ + engine.hideIfFar(t, t.userData?.['io.maxDistance']); + } root.add(t); } offsetZ = def.len * tubeSize; diff --git a/src/lib/Dashboard.js b/src/lib/Dashboard.js index 35200d1..c1ecadb 100644 --- a/src/lib/Dashboard.js +++ b/src/lib/Dashboard.js @@ -27,6 +27,7 @@ class DashBoard extends EventManager { hud.add(hudTarget) hudTarget.position.set(0,0,0.52); dash.visible = false; + dash.renderOrder = 1000; const k = 3.11; const dashWidth = engine.aspect * k, dashHeight = k; const dashDistance = 1.77; @@ -76,7 +77,8 @@ class DashBoard extends EventManager { new MeshBasicMaterial({ map, opacity: 0.52, - transparent:true + transparent:true, + depthTest: false, }) ); textPlane.position.z = -0.002; @@ -84,7 +86,7 @@ class DashBoard extends EventManager { textPlane.visible = false; dash.add(textPlane) // fix #44 - textPlane.material.depthTest = false; + //textPlane.material.depthTest = false; //hudPlane.material.depthTest = false; this.sceneHeader = sceneHeader = await new SceneHeader(engine, {dashWidth, dashHeight}); dash.add(sceneHeader.object); diff --git a/src/lib/GameEngine.js b/src/lib/GameEngine.js index 765267b..f3bbe9e 100644 --- a/src/lib/GameEngine.js +++ b/src/lib/GameEngine.js @@ -100,7 +100,7 @@ class GameEngine extends EventManager{ renderer.setSize(this.w, this.h); renderer.setViewport(0, 0, this.w, this.h); renderer.autoClear = true; - renderer.alpha = true + //renderer.alpha = true this.renderer = renderer; this.anaglyph = new AnaglyphEffect(renderer); @@ -163,6 +163,7 @@ class GameEngine extends EventManager{ gameEngine.hero?.update(delta); gameEngine.mixers.forEach(m => m.update(delta)); gameEngine.dispatchEvent({type: 'beforeRender'}) + gameEngine.processHideIfFar(); this.motionQueue.update(delta); gameEngine.render(scene, gameEngine.camera); @@ -454,6 +455,13 @@ class GameEngine extends EventManager{ if (object.material.map) { object.material.map.colorSpace = THREE.SRGBColorSpace; } + + if (object.userData){ + if (object.userData['re.renderOrder'] !== undefined){ + object.renderOrder = object.userData['re.renderOrder']; + //object.material.alphaTest = true; + } + } } object.frustumCulled = false; object.castShadow = true; @@ -604,6 +612,26 @@ class GameEngine extends EventManager{ this.stats?.update() } + farArray = []; + + hideIfFar(object, distance){ + object.visible = false; + this.farArray.push({object, distance}) + } + + processHideIfFar(){ + let v = new THREE.Vector3(); + this.farArray.forEach(e=>{ + e.object.getWorldPosition(v); + let dst = this.cameraWorld.position.distanceTo(v); + if (dst <= e.distance && !e.object.visible) { + e.object.visible = true; + }else if (dst > e.distance && e.object.visible){ + e.object.visible = false; + } + }) + } + clearScene(){ this.hero?.destroy(); this.dashboard?.reset();