Skip to content

Commit d723d79

Browse files
initial editor class + on demand rendering
1 parent b3bd089 commit d723d79

File tree

5 files changed

+86
-15
lines changed

5 files changed

+86
-15
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
dist
22
build
33
node_modules
4+
.vscode/**/*
5+
demo/assets/data/**/*

demo/index.html

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@
335335
document.getElementById('check-icon').style.display = visible ? 'block' : 'none';
336336
}
337337

338-
window.viewSplat = function() {
338+
window.viewSplat = function(options = {}) {
339339

340340
const viewFile = document.getElementById("viewFile");
341341
const alphaRemovalThreshold = parseInt(document.getElementById("alphaRemovalThresholdView").value);
@@ -399,11 +399,12 @@
399399
currentCameraUpArray = cameraUpArray;
400400
currentCameraPositionArray = cameraPositionArray;
401401
currentCameraLookAtArray = cameraLookAtArray;
402+
402403
try {
403404
const fileReader = new FileReader();
404405
fileReader.onload = function(){
405406
try {
406-
runViewer(fileReader.result, isPly, alphaRemovalThreshold, cameraUpArray, cameraPositionArray, cameraLookAtArray);
407+
runViewer(fileReader.result, isPly, alphaRemovalThreshold, cameraUpArray, cameraPositionArray, cameraLookAtArray, options.editMode);
407408
} catch (e) {
408409
setViewError("Could not view scene.");
409410
}
@@ -440,11 +441,11 @@
440441
}
441442
});
442443

443-
function runViewer(splatBufferData, isPly, alphaRemovalThreshold, cameraUpArray, cameraPositionArray, cameraLookAtArray) {
444+
function runViewer(splatBufferData, isPly, alphaRemovalThreshold, cameraUpArray, cameraPositionArray, cameraLookAtArray, editMode) {
444445
const viewerOptions = {
445446
'cameraUp': cameraUpArray,
446447
'initialCameraPosition': cameraPositionArray,
447-
'initialCameraLookAt': cameraLookAtArray
448+
'initialCameraLookAt': cameraLookAtArray,
448449
};
449450
const sceneOptions = {
450451
'halfPrecisionCovariancesOnGPU': true,
@@ -461,7 +462,12 @@
461462
document.getElementById("demo-content").style.display = 'none';
462463
document.body.style.backgroundColor = "#000000";
463464
history.pushState("ViewSplat", null);
464-
const viewer = new GaussianSplats3D.Viewer(viewerOptions);
465+
let viewer;
466+
if (editMode) {
467+
viewer = new GaussianSplats3D.Editor(viewerOptions);
468+
} else {
469+
viewer = new GaussianSplats3D.Viewer(viewerOptions);
470+
}
465471
viewer.loadSplatBuffer(splatBuffer, sceneOptions)
466472
.then(() => {
467473
viewer.start();
@@ -574,6 +580,8 @@
574580
<br>
575581
<span class="button" onclick="window.viewSplat()">View</span>
576582
&nbsp;&nbsp;
583+
<span class="button" onclick="window.viewSplat({editMode: true})">Edit</span>
584+
&nbsp;&nbsp;
577585
<span class="button" onclick="reset()">Reset</span>
578586
<br>
579587
<br>

src/Editor.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { Viewer } from './Viewer.js';
2+
3+
export class Editor extends Viewer {
4+
constructor(params = {}) {
5+
super(params);
6+
7+
this.editPanel = null;
8+
this.editPanelCells = {};
9+
10+
this.initializedEditor = false;
11+
this.initEditor();
12+
}
13+
14+
initEditor() {
15+
if (this.initializedEditor) return;
16+
17+
if (this.useBuiltInControls) {
18+
this.rootElement.addEventListener('pointerup', this.onMouseUpEdit.bind(this), false);
19+
}
20+
21+
this.initializedEditor = true;
22+
}
23+
24+
onMouseUpEdit = function() {
25+
return function(mouse) {
26+
console.log('Editor.onMouseUpEdit', mouse);
27+
};
28+
};
29+
30+
// onMouseUp = function() {
31+
// return function(mouse) {
32+
// console.log('Editor.onMouseUp', mouse);
33+
// };
34+
// }();
35+
}

src/Viewer.js

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import * as THREE from 'three';
2+
import { Constants } from './Constants.js';
3+
import { LoadingSpinner } from './LoadingSpinner.js';
24
import { OrbitControls } from './OrbitControls.js';
35
import { PlyLoader } from './PlyLoader.js';
4-
import { SplatLoader } from './SplatLoader.js';
5-
import { LoadingSpinner } from './LoadingSpinner.js';
6-
import { SceneHelper } from './SceneHelper.js';
76
import { Raycaster } from './raycaster/Raycaster.js';
7+
import { SceneHelper } from './SceneHelper.js';
8+
import { SplatLoader } from './SplatLoader.js';
89
import { SplatMesh } from './SplatMesh.js';
9-
import { createSortWorker } from './worker/SortWorker.js';
10-
import { Constants } from './Constants.js';
1110
import { getCurrentTime } from './Util.js';
11+
import { createSortWorker } from './worker/SortWorker.js';
1212

1313
const THREE_CAMERA_FOV = 50;
1414
const MINIMUM_DISTANCE_TO_NEW_FOCAL_POINT = .75;
@@ -76,6 +76,12 @@ export class Viewer {
7676
this.mouseDownPosition = new THREE.Vector2();
7777
this.mouseDownTime = null;
7878

79+
this.loadingSpinner = new LoadingSpinner();
80+
this.loadingSpinner.hide();
81+
82+
this.frameloop = 'demand'; // 'demand' | 'always'
83+
this.viewerNeedsUpdate = true;
84+
7985
this.initialized = false;
8086
this.init();
8187
}
@@ -125,11 +131,12 @@ export class Viewer {
125131
this.controls.maxPolarAngle = Math.PI * .75;
126132
this.controls.minPolarAngle = 0.1;
127133
this.controls.enableDamping = true;
128-
this.controls.dampingFactor = 0.05;
134+
this.controls.dampingFactor = 0.25;
129135
this.controls.target.copy(this.initialCameraLookAt);
130136
this.rootElement.addEventListener('pointermove', this.onMouseMove.bind(this), false);
131137
this.rootElement.addEventListener('pointerdown', this.onMouseDown.bind(this), false);
132138
this.rootElement.addEventListener('pointerup', this.onMouseUp.bind(this), false);
139+
this.controls.addEventListener('change', this.onControlsChange.bind(this), false);
133140
window.addEventListener('keydown', this.onKeyDown.bind(this), false);
134141
}
135142

@@ -170,6 +177,7 @@ export class Viewer {
170177
break;
171178
case 'KeyC':
172179
this.showMeshCursor = !this.showMeshCursor;
180+
this.invalidate();
173181
break;
174182
case 'KeyP':
175183
this.showControlPlane = !this.showControlPlane;
@@ -189,6 +197,9 @@ export class Viewer {
189197

190198
onMouseMove(mouse) {
191199
this.mousePosition.set(mouse.offsetX, mouse.offsetY);
200+
if (this.showMeshCursor) {
201+
this.invalidate();
202+
}
192203
}
193204

194205
onMouseDown() {
@@ -228,6 +239,14 @@ export class Viewer {
228239

229240
}();
230241

242+
onControlsChange() {
243+
this.invalidate();
244+
}
245+
246+
invalidate() {
247+
this.viewerNeedsUpdate = true;
248+
}
249+
231250
getRenderDimensions(outDimensions) {
232251
if (this.rootElement) {
233252
outDimensions.x = this.rootElement.offsetWidth;
@@ -558,6 +577,7 @@ export class Viewer {
558577
this.updateSplatMeshUniforms();
559578
}
560579
lastRendererSize.copy(currentRendererSize);
580+
this.invalidate();
561581
}
562582
};
563583

@@ -568,7 +588,11 @@ export class Viewer {
568588
requestAnimationFrame(this.selfDrivenUpdateFunc);
569589
}
570590
this.update();
571-
this.render();
591+
592+
if (this.frameloop === 'always' || this.viewerNeedsUpdate) {
593+
this.render();
594+
this.viewerNeedsUpdate = false;
595+
}
572596
}
573597

574598
update() {

src/index.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
import { PlyParser } from './PlyParser.js';
1+
import { Editor } from './Editor.js';
22
import { PlyLoader } from './PlyLoader.js';
3-
import { SplatLoader } from './SplatLoader.js';
3+
import { PlyParser } from './PlyParser.js';
44
import { SplatBuffer } from './SplatBuffer.js';
5+
import { SplatLoader } from './SplatLoader.js';
56
import { Viewer } from './Viewer.js';
67

78
export {
89
PlyParser,
910
PlyLoader,
1011
SplatLoader,
1112
SplatBuffer,
12-
Viewer
13+
Viewer,
14+
Editor,
1315
};

0 commit comments

Comments
 (0)