diff --git a/metaverse_modules/land/index.js b/metaverse_modules/land/index.js index d0e9f70eb4..df29a85e40 100644 --- a/metaverse_modules/land/index.js +++ b/metaverse_modules/land/index.js @@ -1,9 +1,19 @@ -// import * as THREE from 'three'; +import * as THREE from 'three'; import metaversefile from 'metaversefile'; -const {useApp, useCleanup} = metaversefile; +const {useApp, useLocalPlayer, useCamera, useProcGenManager, useFrame, useCleanup} = metaversefile; + +const localVector = new THREE.Vector3(); +const localVector2 = new THREE.Vector3(); +const localVector3 = new THREE.Vector3(); +const localQuaternion = new THREE.Quaternion(); +const localMatrix = new THREE.Matrix4(); +const localMatrix2 = new THREE.Matrix4(); export default e => { const app = useApp(); + const localPlayer = useLocalPlayer(); + const camera = useCamera(); + const procGenManager = useProcGenManager(); app.name = 'land'; @@ -39,7 +49,7 @@ export default e => { ]; const passComponents = []; const seed = app.getComponent('seed'); - const clipRange = app.getComponent('clipRange'); + let clipRange = app.getComponent('clipRange'); const physicsInstance = app.getComponent('physicsInstance'); const wait = app.getComponent('wait'); const debug = app.getComponent('debug'); @@ -96,6 +106,15 @@ export default e => { }); } + if (clipRange) { + clipRange = new THREE.Box3( + new THREE.Vector3().fromArray(clipRange[0]), + new THREE.Vector3().fromArray(clipRange[1]), + ); + } + + const procGenInstance = procGenManager.getInstance(seed, clipRange); + app.addEventListener('componentsupdate', e => { const {keys} = e; const components = {}; @@ -154,6 +173,31 @@ export default e => { return null; } + if (!renderPosition) { + useFrame(() => { + const appMatrixWorldInverse = localMatrix2.copy(app.matrixWorld).invert(); + localMatrix + .copy(localPlayer.matrixWorld) + .premultiply(appMatrixWorldInverse) + .decompose(localVector, localQuaternion, localVector2); + const playerPosition = localVector; + + localMatrix + .copy(camera.matrixWorld) + .premultiply(appMatrixWorldInverse) + .decompose(localVector2, localQuaternion, localVector3); + const cameraPosition = localVector2; + const cameraQuaternion = localQuaternion; + + procGenInstance.dcWorkerManager.setCamera( + playerPosition, + cameraPosition, + cameraQuaternion, + camera.projectionMatrix + ); + }); + } + useCleanup(() => { for (const subApp of subApps) { subApp.destroy(); diff --git a/webaverse-render-pass.js b/webaverse-render-pass.js index 284bc1ac4a..0327bd2ee1 100644 --- a/webaverse-render-pass.js +++ b/webaverse-render-pass.js @@ -19,6 +19,30 @@ class WebaverseRenderPass extends Pass { this.internalRenderPass = null; this.onBeforeRender = null; this.onAfterRender = null; + + this.foamInvisibleList = []; + this.foamDepthMaterial = null; + this.foamRenderTarget = null; + this.scene = null; + this.camera = null; + } + renderFoam(renderer){ + if(this.foamDepthMaterial && this.foamRenderTarget){ + renderer.setRenderTarget(this.foamRenderTarget); + renderer.clear(); + for(const invisibleObject of this.foamInvisibleList){ + invisibleObject.visible = false; + } + this.scene.overrideMaterial = this.foamDepthMaterial; + + renderer.render(this.scene, this.camera); + renderer.setRenderTarget(null); + + this.scene.overrideMaterial = null; + for(const invisibleObject of this.foamInvisibleList){ + invisibleObject.visible = true; + } + } } setSize(width, height) { if (this.internalDepthPass) { @@ -30,6 +54,7 @@ class WebaverseRenderPass extends Pass { } render(renderer, renderTarget, readBuffer, deltaTime, maskActive) { + this.renderFoam(renderer); this.onBeforeRender && this.onBeforeRender(); // render