From d031412fa1c8799149555101685256d05baae0d7 Mon Sep 17 00:00:00 2001 From: HF Date: Fri, 31 Jan 2020 11:13:23 +0100 Subject: [PATCH] use url coordinates on 3D canvas --- promotion/can-you-do-zuckerberg.png | Bin 37184 -> 0 bytes src/controls/VoxelPainterControls.js | 7 ++ src/core/constants.js | 1 + src/reducers/canvas.js | 92 +++++++++++++++------------ src/store/title.js | 1 + src/ui/Renderer3D.js | 18 ++++-- 6 files changed, 71 insertions(+), 48 deletions(-) delete mode 100644 promotion/can-you-do-zuckerberg.png diff --git a/promotion/can-you-do-zuckerberg.png b/promotion/can-you-do-zuckerberg.png deleted file mode 100644 index 14a55568bc4df19fa29fc74d6c9993eb5c1574a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37184 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 U28*!2vj6}907*qoM6N<$g5{wbSO5S3 diff --git a/src/controls/VoxelPainterControls.js b/src/controls/VoxelPainterControls.js index edd63c57..c04f0493 100644 --- a/src/controls/VoxelPainterControls.js +++ b/src/controls/VoxelPainterControls.js @@ -799,6 +799,13 @@ class VoxelPainterControls extends EventDispatcher { state = STATE.NONE; }; + this.setView = (view) => { + if (view.length !== 3) { + return; + } + scope.target.set(...view); + }; + // this method is exposed, but perhaps it would be better if we can make it private... this.update = (() => { const offset = new Vector3(); diff --git a/src/core/constants.js b/src/core/constants.js index 6876390c..113e2854 100644 --- a/src/core/constants.js +++ b/src/core/constants.js @@ -50,6 +50,7 @@ export const DEFAULT_CANVASES = { [207, 110, 228], [130, 0, 128], ], + cli: 2, size: 65536, bcd: 4000, pcd: 7000, diff --git a/src/reducers/canvas.js b/src/reducers/canvas.js index 11b3c4df..aab827a0 100644 --- a/src/reducers/canvas.js +++ b/src/reducers/canvas.js @@ -43,7 +43,7 @@ export type CanvasState = { */ function getGivenCoords() { // if (window.coordx && window.coordy) return [window.coordx, window.coordy]; - return [0, 0]; + return [0, 0, 0]; } /* @@ -61,41 +61,40 @@ function getViewFromURL(canvases: Object) { // will be null if not in DEFAULT_CANVASES const canvasId = getIdFromObject(canvases, almost[0]); - let colors; - let clrIgnore; - let canvasSize; - let canvasStartDate; - let is3D; - if (canvasId == null) { - // if canvas informations are not available yet - // aka /api/me didn't load yet - colors = canvases[DEFAULT_CANVAS_ID].colors; - clrIgnore = 2; - canvasSize = 1024; - is3D = false; - canvasStartDate = null; - } else { - const canvas = canvases[canvasId]; - colors = canvas.colors; - clrIgnore = canvas.cli; - canvasSize = canvas.size; - is3D = !!canvas.v; - canvasStartDate = canvas.sd; - } + // canvasId is null if canvas data isn't loaded yet and it's not + // the default canvas. + // aka those few milliseconds before /api/me + const canvas = (canvasId === null) + ? canvases[DEFAULT_CANVAS_ID] + : canvases[canvasId]; + const { + colors, + cli: clrIgnore, + sd: canvasStartDate, + size: canvasSize, + } = canvas; + const is3D = !!canvas.v; const x = parseInt(almost[1], 10); const y = parseInt(almost[2], 10); - let urlscale = parseInt(almost[3], 10); + const z = parseInt(almost[3], 10); if (Number.isNaN(x) || Number.isNaN(y)) { - const thrown = 'NaN'; - throw thrown; + throw new Error('NaN'); } - if (!urlscale || Number.isNaN(urlscale)) { - urlscale = DEFAULT_SCALE; + const view = [x, y, z]; + + let scale = z; + if (!scale || Number.isNaN(scale)) { + scale = DEFAULT_SCALE; } else { - urlscale = 2 ** (urlscale / 10); + scale = 2 ** (scale / 10); } - urlscale = clamp(urlscale, TILE_SIZE / canvasSize, MAX_SCALE); + + if (!is3D && canvasId !== null) { + scale = clamp(scale, TILE_SIZE / canvasSize, MAX_SCALE); + view.length = 2; + } + return { canvasId, canvasIdent, @@ -105,22 +104,22 @@ function getViewFromURL(canvases: Object) { canvasMaxTiledZoom: getMaxTiledZoom(canvasSize), palette: new Palette(colors, 0), clrIgnore, - view: [x, y], - viewscale: urlscale, - scale: urlscale, + view, + viewscale: scale, + scale, canvases, }; } catch (error) { - const canvas = canvases[DEFAULT_CANVAS_ID]; + const canvasd = canvases[DEFAULT_CANVAS_ID]; return { canvasId: DEFAULT_CANVAS_ID, - canvasIdent: canvas.ident, - canvasSize: canvas.size, - is3D: !!canvas.v, + canvasIdent: canvasd.ident, + canvasSize: canvasd.size, + is3D: !!canvasd.v, canvasStartDate: null, - canvasMaxTiledZoom: getMaxTiledZoom(canvas.size), - palette: new Palette(canvas.colors, 0), - clrIgnore: canvas.cli, + canvasMaxTiledZoom: getMaxTiledZoom(canvasd.size), + palette: new Palette(canvasd.colors, 0), + clrIgnore: canvasd.cli, view: getGivenCoords(), viewscale: DEFAULT_SCALE, scale: DEFAULT_SCALE, @@ -275,7 +274,10 @@ export default function canvasReducer( } = canvas; const canvasMaxTiledZoom = getMaxTiledZoom(canvasSize); const palette = new Palette(colors, 0); - const view = (canvasId === 0) ? getGivenCoords() : [0, 0]; + const view = (canvasId === 0) ? getGivenCoords() : [0, 0, 0]; + if (!is3D) { + view.length = 2; + } return { ...state, canvasId, @@ -295,7 +297,7 @@ export default function canvasReducer( case 'RECEIVE_ME': { const { canvases } = action; - let { canvasIdent } = state; + let { canvasIdent, scale, view } = state; let canvasId = getIdFromObject(canvases, canvasIdent); if (canvasId === null) { @@ -312,6 +314,11 @@ export default function canvasReducer( const canvasMaxTiledZoom = getMaxTiledZoom(canvasSize); const palette = new Palette(colors, 0); + if (!is3D) { + scale = clamp(scale, TILE_SIZE / canvasSize, MAX_SCALE); + view = [view[0], view[1]]; + } + return { ...state, canvasId, @@ -323,6 +330,9 @@ export default function canvasReducer( palette, clrIgnore, canvases, + viewscale: scale, + scale, + view, }; } diff --git a/src/store/title.js b/src/store/title.js index 3626feff..44cbcd7b 100644 --- a/src/store/title.js +++ b/src/store/title.js @@ -32,6 +32,7 @@ export default (store) => (next) => (action) => { case 'SELECT_CANVAS': + case 'RECEIVE_ME': case 'ON_VIEW_FINISH_CHANGE': { const { view, diff --git a/src/ui/Renderer3D.js b/src/ui/Renderer3D.js index 859ee373..5719e812 100644 --- a/src/ui/Renderer3D.js +++ b/src/ui/Renderer3D.js @@ -50,7 +50,6 @@ class Renderer { this.store = store; const state = store.getState(); this.objects = []; - this.loadedChunks = new Map(); this.chunkLoader = null; // camera @@ -193,6 +192,7 @@ class Renderer { updateCanvasData(state: State) { const { canvasId, + view, } = state.canvas; if (canvasId !== this.canvasId) { this.canvasId = canvasId; @@ -200,16 +200,20 @@ class Renderer { if (this.chunkLoader) { // destroy old chunks, // meshes need to get disposed - this.loadedChunks.forEach((chunk) => { - this.scene.remove(chunk); - this.objects = [this.plane]; - }); - this.chunkLoader.destructor(); + if (this.loadedChunks) { + this.loadedChunks.forEach((chunk) => { + this.scene.remove(chunk); + this.objects = [this.plane]; + }); + this.chunkLoader.destructor(); + } } + this.loadedChunks = new Map(); this.chunkLoader = new ChunkLoader(this.store); - this.forceNextRender = true; } } + this.controls.setView(view); + this.forceNextRender = true; } // eslint-disable-next-line class-methods-use-this