From 0ff8bf8a5ce0330cbc299ca4f9bb0dab5d08d8ef Mon Sep 17 00:00:00 2001 From: soulofmischief <30357883+soulofmischief@users.noreply.github.com> Date: Sat, 17 Dec 2022 18:15:50 -0800 Subject: [PATCH 1/4] Reduce point cloud data to positional data --- zine-geometry-utils.js | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/zine-geometry-utils.js b/zine-geometry-utils.js index cdeefb7..665aff8 100644 --- a/zine-geometry-utils.js +++ b/zine-geometry-utils.js @@ -6,7 +6,7 @@ const localVector = new THREE.Vector3(); // -const pointcloudStride = 4 + 4 + 4 + 1 + 1 + 1; +const pointCloudStride = 4 + 4 + 4; // @@ -19,9 +19,9 @@ function pointCloudArrayBufferToPositionAttributeArray( pixelStride = 1, ) { // result in float32Array const dataView = new DataView(arrayBuffer); - for (let i = 0, j = 0; i < arrayBuffer.byteLength; i += pointcloudStride) { + for (let i = 0, j = 0; i < arrayBuffer.byteLength; i += pointCloudStride) { if (pixelStride !== 1) { - const i2 = i / pointcloudStride; + const i2 = i / pointCloudStride; const sx = i2 % width; const sy = Math.floor(i2 / width); if (sx % pixelStride !== 0 || sy % pixelStride !== 0) { @@ -29,12 +29,6 @@ function pointCloudArrayBufferToPositionAttributeArray( } } - // if (j >= float32Array.length) { - // console.warn('point cloud array buffer overflow', float32Array.length, arrayBuffer.byteLength, arrayBuffer.byteLength / (pointcloudStride * pixelStride)); - // console.log('fail', arrayBuffer.byteLength / (pointcloudStride * pixelStride) * 3, float32Array.length); - // debugger; - // } - let x = dataView.getFloat32(i + 0, true); let y = dataView.getFloat32(i + 4, true); let z = dataView.getFloat32(i + 8, true); @@ -296,7 +290,7 @@ export const snapPointCloudToCamera = (pointCloudArrayBuffer, width, height, cam const scaleFactor = 1 / width; const dataView = new DataView(pointCloudArrayBuffer); - for (let i = 0; i < pointCloudArrayBuffer.byteLength; i += pointcloudStride) { + for (let i = 0; i < pointCloudArrayBuffer.byteLength; i += pointCloudStride) { let x = dataView.getFloat32(i + 0, true); let y = dataView.getFloat32(i + 4, true); let z = dataView.getFloat32(i + 8, true); @@ -418,4 +412,4 @@ export const setCameraViewPositionFromOrthographicViewZ = (x, y, viewZ, camera, target.y = worldPoint.y; target.z = worldPoint.z; return target; -} \ No newline at end of file +} From 6fc858aa49be98de744c0e7376bf3cb0189e896d Mon Sep 17 00:00:00 2001 From: soulofmischief <30357883+soulofmischief@users.noreply.github.com> Date: Tue, 20 Dec 2022 14:11:05 -0800 Subject: [PATCH 2/4] Memoize point cloud strides --- zine-constants.js | 5 ++++- zine-geometry-utils.js | 17 +++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/zine-constants.js b/zine-constants.js index 940de21..9d03749 100644 --- a/zine-constants.js +++ b/zine-constants.js @@ -1,8 +1,11 @@ export const panelSize = 1024; +export const pointCloudPositionalStride = 4 + 4 + 4; +export const pointCloudFullStride = pointCloudPositionalStride + 1 + 1 + 1; + export const floorNetWorldSize = 100; export const floorNetWorldDepth = 1000; export const floorNetResolution = 0.1; export const floorNetPixelSize = floorNetWorldSize / floorNetResolution; -export const physicsPixelStride = 8; \ No newline at end of file +export const physicsPixelStride = 8; diff --git a/zine-geometry-utils.js b/zine-geometry-utils.js index 665aff8..b8a2223 100644 --- a/zine-geometry-utils.js +++ b/zine-geometry-utils.js @@ -1,4 +1,5 @@ import * as THREE from 'three'; +import { pointCloudPositionalStride } from './zine-constants.js'; // @@ -6,10 +7,6 @@ const localVector = new THREE.Vector3(); // -const pointCloudStride = 4 + 4 + 4; - -// - function pointCloudArrayBufferToPositionAttributeArray( arrayBuffer, width, @@ -19,9 +16,9 @@ function pointCloudArrayBufferToPositionAttributeArray( pixelStride = 1, ) { // result in float32Array const dataView = new DataView(arrayBuffer); - for (let i = 0, j = 0; i < arrayBuffer.byteLength; i += pointCloudStride) { + for (let i = 0, j = 0; i < arrayBuffer.byteLength; i += pointCloudPositionalStride) { if (pixelStride !== 1) { - const i2 = i / pointCloudStride; + const i2 = i / pointCloudPositionalStride; const sx = i2 % width; const sy = Math.floor(i2 / width); if (sx % pixelStride !== 0 || sy % pixelStride !== 0) { @@ -290,8 +287,12 @@ export const snapPointCloudToCamera = (pointCloudArrayBuffer, width, height, cam const scaleFactor = 1 / width; const dataView = new DataView(pointCloudArrayBuffer); - for (let i = 0; i < pointCloudArrayBuffer.byteLength; i += pointCloudStride) { - let x = dataView.getFloat32(i + 0, true); + for ( + let i = 0; + i < pointCloudArrayBuffer.byteLength; + i += pointCloudPositionalStride + ) { + let x = dataView.getFloat32(i , true); let y = dataView.getFloat32(i + 4, true); let z = dataView.getFloat32(i + 8, true); From fb3fd8c1b186b1d01e205a7a03c49a5a7dfa303c Mon Sep 17 00:00:00 2001 From: soulofmischief <30357883+soulofmischief@users.noreply.github.com> Date: Thu, 22 Dec 2022 02:42:33 -0800 Subject: [PATCH 3/4] Use pointCloudPositionalStride --- zine-renderer.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/zine-renderer.js b/zine-renderer.js index 423d91e..6febc79 100644 --- a/zine-renderer.js +++ b/zine-renderer.js @@ -19,7 +19,7 @@ import { } from './zine-camera-utils.js'; import { floorNetPixelSize, - pointcloudStride, + pointCloudPositionalStride, physicsPixelStride, } from './zine-constants.js'; @@ -218,9 +218,9 @@ class ScenePhysicsMesh extends THREE.Mesh { // } const arrayBuffer = pointCloudArrayBuffer; const pixelStride = physicsPixelStride; - for (let i = 0, j = 0; i < arrayBuffer.byteLength; i += pointcloudStride) { + for (let i = 0, j = 0; i < arrayBuffer.byteLength; i += pointCloudPositionalStride) { if (pixelStride !== 1) { - const i2 = i / pointcloudStride; + const i2 = i / pointCloudPositionalStride; const sx = i2 % width; const sy = Math.floor(i2 / width); if (sx % pixelStride !== 0 || sy % pixelStride !== 0) { // skip non-stride points @@ -228,7 +228,7 @@ class ScenePhysicsMesh extends THREE.Mesh { } } - const s = segmentSpecs.array[i / pointcloudStride]; + const s = segmentSpecs.array[i / pointCloudPositionalStride]; segments[j] = s; j++; @@ -544,4 +544,4 @@ export class ZineRenderer extends EventTarget { ); targetZineRenderer.camera.updateMatrixWorld(); } -} \ No newline at end of file +} From ccfb403754cd0f94a1c410dbda26dc37d33c5aab Mon Sep 17 00:00:00 2001 From: soulofmischief <30357883+soulofmischief@users.noreply.github.com> Date: Thu, 22 Dec 2022 03:10:26 -0800 Subject: [PATCH 4/4] Add missing getDepthFloat32ArrayWorldPositionPx declaration --- zine-geometry-utils.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/zine-geometry-utils.js b/zine-geometry-utils.js index 1677258..d98f059 100644 --- a/zine-geometry-utils.js +++ b/zine-geometry-utils.js @@ -136,6 +136,32 @@ export function depthFloat32ArrayToGeometry( // +export function getDepthFloat32ArrayWorldPositionPx( + depthFloat32Array, + px, + py, + width, + height, + camera, + scale, + target +) { + px = Math.min(Math.max(px, 0), width - 1); + py = Math.min(Math.max(py, 0), height - 1); + + let x = px / width; + let y = py / height; + + const i = py * width + px; + y = 1 - y; + + const viewZ = depthFloat32Array[i]; + const worldPoint = setCameraViewPositionFromViewZ(x, y, viewZ, camera, target); + worldPoint.multiply(scale); + worldPoint.applyMatrix4(camera.matrixWorld); + return target; +} + export function getDepthFloat32ArrayWorldPosition( depthFloat32Array, x, // 0..1