Skip to content

Commit 701ee0d

Browse files
initial editor class + on demand rendering
1 parent f169704 commit 701ee0d

File tree

5 files changed

+83
-15
lines changed

5 files changed

+83
-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
@@ -324,7 +324,7 @@
324324
document.getElementById('check-icon').style.display = visible ? 'block' : 'none';
325325
}
326326

327-
window.viewSplat = function() {
327+
window.viewSplat = function(options = {}) {
328328

329329
const viewFile = document.getElementById("viewFile");
330330
const alphaRemovalThreshold = parseInt(document.getElementById("alphaRemovalThresholdView").value);
@@ -388,11 +388,12 @@
388388
currentCameraUpArray = cameraUpArray;
389389
currentCameraPositionArray = cameraPositionArray;
390390
currentCameraLookAtArray = cameraLookAtArray;
391+
391392
try {
392393
const fileReader = new FileReader();
393394
fileReader.onload = function(){
394395
try {
395-
runViewer(fileReader.result, isPly, alphaRemovalThreshold, cameraUpArray, cameraPositionArray, cameraLookAtArray);
396+
runViewer(fileReader.result, isPly, alphaRemovalThreshold, cameraUpArray, cameraPositionArray, cameraLookAtArray, options.editMode);
396397
} catch (e) {
397398
setViewError("Could not view scene.");
398399
}
@@ -429,11 +430,11 @@
429430
}
430431
});
431432

432-
function runViewer(splatBufferData, isPly, alphaRemovalThreshold, cameraUpArray, cameraPositionArray, cameraLookAtArray) {
433+
function runViewer(splatBufferData, isPly, alphaRemovalThreshold, cameraUpArray, cameraPositionArray, cameraLookAtArray, editMode) {
433434
const viewerOptions = {
434435
'cameraUp': cameraUpArray,
435436
'initialCameraPosition': cameraPositionArray,
436-
'initialCameraLookAt': cameraLookAtArray
437+
'initialCameraLookAt': cameraLookAtArray,
437438
};
438439
const sceneOptions = {
439440
'halfPrecisionCovariancesOnGPU': true,
@@ -450,7 +451,12 @@
450451
document.getElementById("demo-content").style.display = 'none';
451452
document.body.style.backgroundColor = "#000000";
452453
history.pushState("ViewSplat", null);
453-
const viewer = new GaussianSplats3D.Viewer(viewerOptions);
454+
let viewer;
455+
if (editMode) {
456+
viewer = new GaussianSplats3D.Editor(viewerOptions);
457+
} else {
458+
viewer = new GaussianSplats3D.Viewer(viewerOptions);
459+
}
454460
viewer.loadSplatBuffer(splatBuffer, sceneOptions)
455461
.then(() => {
456462
viewer.start();
@@ -561,6 +567,8 @@
561567
<br>
562568
<span class="button" onclick="window.viewSplat()">View</span>
563569
&nbsp;&nbsp;
570+
<span class="button" onclick="window.viewSplat({editMode: true})">Edit</span>
571+
&nbsp;&nbsp;
564572
<span class="button" onclick="reset()">Reset</span>
565573
<br>
566574
<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: 28 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;
@@ -80,6 +80,9 @@ export class Viewer {
8080
this.loadingSpinner = new LoadingSpinner();
8181
this.loadingSpinner.hide();
8282

83+
this.frameloop = 'demand'; // 'demand' | 'always'
84+
this.viewerNeedsUpdate = true;
85+
8386
this.initialized = false;
8487
this.init();
8588
}
@@ -131,11 +134,12 @@ export class Viewer {
131134
this.controls.maxPolarAngle = Math.PI * .75;
132135
this.controls.minPolarAngle = 0.1;
133136
this.controls.enableDamping = true;
134-
this.controls.dampingFactor = 0.05;
137+
this.controls.dampingFactor = 0.25;
135138
this.controls.target.copy(this.initialCameraLookAt);
136139
this.rootElement.addEventListener('pointermove', this.onMouseMove.bind(this), false);
137140
this.rootElement.addEventListener('pointerdown', this.onMouseDown.bind(this), false);
138141
this.rootElement.addEventListener('pointerup', this.onMouseUp.bind(this), false);
142+
this.controls.addEventListener('change', this.onControlsChange.bind(this), false);
139143
window.addEventListener('keydown', this.onKeyDown.bind(this), false);
140144
}
141145

@@ -174,6 +178,7 @@ export class Viewer {
174178
break;
175179
case 'KeyC':
176180
this.showMeshCursor = !this.showMeshCursor;
181+
this.invalidate();
177182
break;
178183
case 'KeyP':
179184
this.showControlPlane = !this.showControlPlane;
@@ -193,6 +198,9 @@ export class Viewer {
193198

194199
onMouseMove(mouse) {
195200
this.mousePosition.set(mouse.offsetX, mouse.offsetY);
201+
if (this.showMeshCursor) {
202+
this.invalidate();
203+
}
196204
}
197205

198206
onMouseDown() {
@@ -232,6 +240,14 @@ export class Viewer {
232240

233241
}();
234242

243+
onControlsChange() {
244+
this.invalidate();
245+
}
246+
247+
invalidate() {
248+
this.viewerNeedsUpdate = true;
249+
}
250+
235251
getRenderDimensions(outDimensions) {
236252
if (this.rootElement) {
237253
outDimensions.x = this.rootElement.offsetWidth;
@@ -636,6 +652,7 @@ export class Viewer {
636652
this.updateSplatRenderTargetForRenderDimensions(currentRendererSize.x, currentRendererSize.y);
637653
}
638654
lastRendererSize.copy(currentRendererSize);
655+
this.invalidate();
639656
}
640657
};
641658

@@ -646,7 +663,11 @@ export class Viewer {
646663
requestAnimationFrame(this.selfDrivenUpdateFunc);
647664
}
648665
this.update();
649-
this.render();
666+
667+
if (this.frameloop === 'always' || this.viewerNeedsUpdate) {
668+
this.render();
669+
this.viewerNeedsUpdate = false;
670+
}
650671
}
651672

652673
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)