Spaces:
Running
Running
Commit
·
5f32ba4
1
Parent(s):
1b5e137
reformat export
Browse files- viewer/src/lib/splat.js/cameras/Camera.ts +3 -1
- viewer/src/lib/splat.js/cameras/PerspectiveCamera.ts +3 -2
- viewer/src/lib/splat.js/core/EventDispatcher.ts +38 -0
- viewer/src/lib/splat.js/core/Object3D.ts +3 -1
- viewer/src/lib/splat.js/core/Renderer.ts +0 -6
- viewer/src/lib/splat.js/core/Scene.ts +18 -0
- viewer/src/lib/splat.js/index.ts +8 -7
- viewer/src/lib/splat.js/loaders/Loader.ts +6 -4
- viewer/src/lib/splat.js/math/Matrix4.ts +3 -1
- viewer/src/lib/splat.js/math/Quaternion.ts +3 -1
- viewer/src/lib/splat.js/math/Vector3.ts +3 -1
- viewer/src/lib/splat.js/renderers/Renderer.ts +9 -0
- viewer/src/lib/splat.js/renderers/WebGLRenderer.ts +9 -6
- viewer/src/lib/splat.js/renderers/webgl/shaders/frag.glsl.ts +13 -0
- viewer/src/lib/splat.js/renderers/webgl/shaders/vertex.glsl.ts +75 -0
viewer/src/lib/splat.js/cameras/Camera.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
import { Object3D } from "../core/Object3D";
|
2 |
import { Matrix4 } from "../math/Matrix4";
|
3 |
|
4 |
-
|
5 |
projectionMatrix: Matrix4;
|
6 |
|
7 |
constructor() {
|
@@ -10,3 +10,5 @@ export class Camera extends Object3D {
|
|
10 |
this.projectionMatrix = new Matrix4();
|
11 |
}
|
12 |
}
|
|
|
|
|
|
1 |
import { Object3D } from "../core/Object3D";
|
2 |
import { Matrix4 } from "../math/Matrix4";
|
3 |
|
4 |
+
class Camera extends Object3D {
|
5 |
projectionMatrix: Matrix4;
|
6 |
|
7 |
constructor() {
|
|
|
10 |
this.projectionMatrix = new Matrix4();
|
11 |
}
|
12 |
}
|
13 |
+
|
14 |
+
export { Camera };
|
viewer/src/lib/splat.js/cameras/PerspectiveCamera.ts
CHANGED
@@ -1,7 +1,6 @@
|
|
1 |
import { Camera } from "./Camera";
|
2 |
-
import { Matrix4 } from "../math/Matrix4";
|
3 |
|
4 |
-
|
5 |
fx: number;
|
6 |
fy: number;
|
7 |
|
@@ -27,3 +26,5 @@ export class PerspectiveCamera extends Camera {
|
|
27 |
);
|
28 |
}
|
29 |
}
|
|
|
|
|
|
1 |
import { Camera } from "./Camera";
|
|
|
2 |
|
3 |
+
class PerspectiveCamera extends Camera {
|
4 |
fx: number;
|
5 |
fy: number;
|
6 |
|
|
|
26 |
);
|
27 |
}
|
28 |
}
|
29 |
+
|
30 |
+
export { PerspectiveCamera };
|
viewer/src/lib/splat.js/core/EventDispatcher.ts
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
class EventDispatcher {
|
2 |
+
listeners: { [key: string]: Function[] } = {};
|
3 |
+
|
4 |
+
addEventListener(type: string, listener: Function): void {
|
5 |
+
if (this.listeners[type] === undefined) {
|
6 |
+
this.listeners[type] = [];
|
7 |
+
}
|
8 |
+
if (this.listeners[type].indexOf(listener) === -1) {
|
9 |
+
this.listeners[type].push(listener);
|
10 |
+
}
|
11 |
+
}
|
12 |
+
|
13 |
+
hasEventListener(type: string, listener: Function): boolean {
|
14 |
+
return this.listeners[type] !== undefined && this.listeners[type].indexOf(listener) !== -1;
|
15 |
+
}
|
16 |
+
|
17 |
+
removeEventListener(type: string, listener: Function): void {
|
18 |
+
const listenerArray = this.listeners[type];
|
19 |
+
if (listenerArray !== undefined) {
|
20 |
+
const index = listenerArray.indexOf(listener);
|
21 |
+
if (index !== -1) {
|
22 |
+
listenerArray.splice(index, 1);
|
23 |
+
}
|
24 |
+
}
|
25 |
+
}
|
26 |
+
|
27 |
+
dispatchEvent(event: { type: string }): void {
|
28 |
+
const listenerArray = this.listeners[event.type];
|
29 |
+
if (listenerArray !== undefined) {
|
30 |
+
const array = listenerArray.slice(0);
|
31 |
+
for (let i = 0, l = array.length; i < l; i++) {
|
32 |
+
array[i].call(this, event);
|
33 |
+
}
|
34 |
+
}
|
35 |
+
}
|
36 |
+
}
|
37 |
+
|
38 |
+
export { EventDispatcher };
|
viewer/src/lib/splat.js/core/Object3D.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
import { Vector3 } from "../math/Vector3";
|
2 |
import { Quaternion } from "../math/Quaternion";
|
3 |
|
4 |
-
|
5 |
position: Vector3;
|
6 |
rotation: Quaternion;
|
7 |
|
@@ -10,3 +10,5 @@ export class Object3D {
|
|
10 |
this.rotation = new Quaternion();
|
11 |
}
|
12 |
}
|
|
|
|
|
|
1 |
import { Vector3 } from "../math/Vector3";
|
2 |
import { Quaternion } from "../math/Quaternion";
|
3 |
|
4 |
+
class Object3D {
|
5 |
position: Vector3;
|
6 |
rotation: Quaternion;
|
7 |
|
|
|
10 |
this.rotation = new Quaternion();
|
11 |
}
|
12 |
}
|
13 |
+
|
14 |
+
export { Object3D };
|
viewer/src/lib/splat.js/core/Renderer.ts
DELETED
@@ -1,6 +0,0 @@
|
|
1 |
-
import type { Camera } from "../cameras/Camera";
|
2 |
-
|
3 |
-
export interface Renderer {
|
4 |
-
render(camera: Camera): void;
|
5 |
-
setData(data: Uint8Array): void;
|
6 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
viewer/src/lib/splat.js/core/Scene.ts
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { Object3D } from "./Object3D";
|
2 |
+
|
3 |
+
class Scene extends Object3D {
|
4 |
+
data: Uint8Array;
|
5 |
+
|
6 |
+
constructor() {
|
7 |
+
super();
|
8 |
+
|
9 |
+
this.data = new Uint8Array(0);
|
10 |
+
}
|
11 |
+
|
12 |
+
setData(data: Uint8Array): void {
|
13 |
+
this.data = data;
|
14 |
+
console.log(data);
|
15 |
+
}
|
16 |
+
}
|
17 |
+
|
18 |
+
export { Scene };
|
viewer/src/lib/splat.js/index.ts
CHANGED
@@ -1,10 +1,11 @@
|
|
1 |
-
export
|
2 |
-
export
|
|
|
3 |
|
4 |
-
export
|
5 |
|
6 |
-
export
|
7 |
|
8 |
-
export
|
9 |
-
export
|
10 |
-
export
|
|
|
1 |
+
export { Camera } from "./cameras/Camera";
|
2 |
+
export { Renderer } from "./renderers/Renderer";
|
3 |
+
export { Scene } from "./core/Scene";
|
4 |
|
5 |
+
export { Loader } from "./loaders/Loader";
|
6 |
|
7 |
+
export { WebGLRenderer } from "./renderers/WebGLRenderer";
|
8 |
|
9 |
+
export { Quaternion } from "./math/Quaternion";
|
10 |
+
export { Vector3 } from "./math/Vector3";
|
11 |
+
export { Matrix4 } from "./math/Matrix4";
|
viewer/src/lib/splat.js/loaders/Loader.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
-
import type {
|
2 |
|
3 |
-
|
4 |
-
static async LoadAsync(url: string,
|
5 |
const req = await fetch(url, {
|
6 |
mode: "cors",
|
7 |
credentials: "omit",
|
@@ -27,6 +27,8 @@ export class Loader {
|
|
27 |
onProgress?.(bytesRead / contentLength);
|
28 |
}
|
29 |
|
30 |
-
|
31 |
}
|
32 |
}
|
|
|
|
|
|
1 |
+
import type { Scene } from "../core/Scene";
|
2 |
|
3 |
+
class Loader {
|
4 |
+
static async LoadAsync(url: string, scene: Scene, onProgress?: (progress: number) => void): Promise<void> {
|
5 |
const req = await fetch(url, {
|
6 |
mode: "cors",
|
7 |
credentials: "omit",
|
|
|
27 |
onProgress?.(bytesRead / contentLength);
|
28 |
}
|
29 |
|
30 |
+
scene.setData(data);
|
31 |
}
|
32 |
}
|
33 |
+
|
34 |
+
export { Loader };
|
viewer/src/lib/splat.js/math/Matrix4.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
|
2 |
elements: number[];
|
3 |
|
4 |
// prettier-ignore
|
@@ -31,3 +31,5 @@ export class Matrix4 {
|
|
31 |
return this;
|
32 |
}
|
33 |
}
|
|
|
|
|
|
1 |
+
class Matrix4 {
|
2 |
elements: number[];
|
3 |
|
4 |
// prettier-ignore
|
|
|
31 |
return this;
|
32 |
}
|
33 |
}
|
34 |
+
|
35 |
+
export { Matrix4 };
|
viewer/src/lib/splat.js/math/Quaternion.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
|
2 |
x: number;
|
3 |
y: number;
|
4 |
z: number;
|
@@ -20,3 +20,5 @@ export class Quaternion {
|
|
20 |
return this;
|
21 |
}
|
22 |
}
|
|
|
|
|
|
1 |
+
class Quaternion {
|
2 |
x: number;
|
3 |
y: number;
|
4 |
z: number;
|
|
|
20 |
return this;
|
21 |
}
|
22 |
}
|
23 |
+
|
24 |
+
export { Quaternion };
|
viewer/src/lib/splat.js/math/Vector3.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
|
2 |
x: number;
|
3 |
y: number;
|
4 |
z: number;
|
@@ -17,3 +17,5 @@ export class Vector3 {
|
|
17 |
return this;
|
18 |
}
|
19 |
}
|
|
|
|
|
|
1 |
+
class Vector3 {
|
2 |
x: number;
|
3 |
y: number;
|
4 |
z: number;
|
|
|
17 |
return this;
|
18 |
}
|
19 |
}
|
20 |
+
|
21 |
+
export { Vector3 };
|
viewer/src/lib/splat.js/renderers/Renderer.ts
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import type { Camera } from "../cameras/Camera";
|
2 |
+
import type { Scene } from "../core/Scene";
|
3 |
+
|
4 |
+
class Renderer {
|
5 |
+
render(scene: Scene, camera: Camera): void {}
|
6 |
+
dispose(): void {}
|
7 |
+
}
|
8 |
+
|
9 |
+
export { Renderer };
|
viewer/src/lib/splat.js/renderers/WebGLRenderer.ts
CHANGED
@@ -1,17 +1,20 @@
|
|
1 |
import type { Camera } from "../cameras/Camera";
|
2 |
-
import type {
|
|
|
3 |
|
4 |
export class WebGLRenderer implements Renderer {
|
5 |
canvas: HTMLCanvasElement;
|
6 |
|
|
|
|
|
|
|
7 |
constructor(canvas?: HTMLCanvasElement) {
|
8 |
this.canvas =
|
9 |
canvas ?? (document.createElementNS("http://www.w3.org/1999/xhtml", "canvas") as HTMLCanvasElement);
|
|
|
|
|
10 |
}
|
11 |
|
12 |
-
render(camera: Camera): void {}
|
13 |
-
|
14 |
-
setData(data: Uint8Array): void {
|
15 |
-
console.log("setData", data);
|
16 |
-
}
|
17 |
}
|
|
|
1 |
import type { Camera } from "../cameras/Camera";
|
2 |
+
import type { Scene } from "../core/Scene";
|
3 |
+
import type { Renderer } from "./Renderer";
|
4 |
|
5 |
export class WebGLRenderer implements Renderer {
|
6 |
canvas: HTMLCanvasElement;
|
7 |
|
8 |
+
gl: WebGLRenderingContext;
|
9 |
+
ext: ANGLE_instanced_arrays;
|
10 |
+
|
11 |
constructor(canvas?: HTMLCanvasElement) {
|
12 |
this.canvas =
|
13 |
canvas ?? (document.createElementNS("http://www.w3.org/1999/xhtml", "canvas") as HTMLCanvasElement);
|
14 |
+
this.gl = this.canvas.getContext("webgl") as WebGLRenderingContext;
|
15 |
+
this.ext = this.gl.getExtension("ANGLE_instanced_arrays") as ANGLE_instanced_arrays;
|
16 |
}
|
17 |
|
18 |
+
render(scene: Scene, camera: Camera): void {}
|
19 |
+
dispose(): void {}
|
|
|
|
|
|
|
20 |
}
|
viewer/src/lib/splat.js/renderers/webgl/shaders/frag.glsl.ts
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const frag = /* glsl */ `
|
2 |
+
precision mediump float;
|
3 |
+
|
4 |
+
varying vec4 vColor;
|
5 |
+
varying vec2 vPosition;
|
6 |
+
|
7 |
+
void main () {
|
8 |
+
float A = -dot(vPosition, vPosition);
|
9 |
+
if (A < -4.0) discard;
|
10 |
+
float B = exp(A) * vColor.a;
|
11 |
+
gl_FragColor = vec4(B * vColor.rgb, B);
|
12 |
+
}
|
13 |
+
`;
|
viewer/src/lib/splat.js/renderers/webgl/shaders/vertex.glsl.ts
ADDED
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export const vertex = /* glsl */ `
|
2 |
+
precision mediump float;
|
3 |
+
attribute vec2 position;
|
4 |
+
|
5 |
+
attribute vec4 color;
|
6 |
+
attribute vec3 center;
|
7 |
+
attribute vec3 covA;
|
8 |
+
attribute vec3 covB;
|
9 |
+
|
10 |
+
uniform mat4 projection, view;
|
11 |
+
uniform vec2 focal;
|
12 |
+
uniform vec2 viewport;
|
13 |
+
|
14 |
+
varying vec4 vColor;
|
15 |
+
varying vec2 vPosition;
|
16 |
+
|
17 |
+
mat3 transpose(mat3 m) {
|
18 |
+
return mat3(
|
19 |
+
m[0][0], m[1][0], m[2][0],
|
20 |
+
m[0][1], m[1][1], m[2][1],
|
21 |
+
m[0][2], m[1][2], m[2][2]
|
22 |
+
);
|
23 |
+
}
|
24 |
+
|
25 |
+
void main () {
|
26 |
+
vec4 camspace = view * vec4(center, 1);
|
27 |
+
vec4 pos2d = projection * camspace;
|
28 |
+
|
29 |
+
float bounds = 1.2 * pos2d.w;
|
30 |
+
if (pos2d.z < -pos2d.w || pos2d.x < -bounds || pos2d.x > bounds
|
31 |
+
|| pos2d.y < -bounds || pos2d.y > bounds) {
|
32 |
+
gl_Position = vec4(0.0, 0.0, 2.0, 1.0);
|
33 |
+
return;
|
34 |
+
}
|
35 |
+
|
36 |
+
mat3 Vrk = mat3(
|
37 |
+
covA.x, covA.y, covA.z,
|
38 |
+
covA.y, covB.x, covB.y,
|
39 |
+
covA.z, covB.y, covB.z
|
40 |
+
);
|
41 |
+
|
42 |
+
mat3 J = mat3(
|
43 |
+
focal.x / camspace.z, 0., -(focal.x * camspace.x) / (camspace.z * camspace.z),
|
44 |
+
0., -focal.y / camspace.z, (focal.y * camspace.y) / (camspace.z * camspace.z),
|
45 |
+
0., 0., 0.
|
46 |
+
);
|
47 |
+
|
48 |
+
mat3 W = transpose(mat3(view));
|
49 |
+
mat3 T = W * J;
|
50 |
+
mat3 cov = transpose(T) * Vrk * T;
|
51 |
+
|
52 |
+
vec2 vCenter = vec2(pos2d) / pos2d.w;
|
53 |
+
|
54 |
+
float diagonal1 = cov[0][0] + 0.3;
|
55 |
+
float offDiagonal = cov[0][1];
|
56 |
+
float diagonal2 = cov[1][1] + 0.3;
|
57 |
+
|
58 |
+
float mid = 0.5 * (diagonal1 + diagonal2);
|
59 |
+
float radius = length(vec2((diagonal1 - diagonal2) / 2.0, offDiagonal));
|
60 |
+
float lambda1 = mid + radius;
|
61 |
+
float lambda2 = max(mid - radius, 0.1);
|
62 |
+
vec2 diagonalVector = normalize(vec2(offDiagonal, lambda1 - diagonal1));
|
63 |
+
vec2 v1 = min(sqrt(2.0 * lambda1), 1024.0) * diagonalVector;
|
64 |
+
vec2 v2 = min(sqrt(2.0 * lambda2), 1024.0) * vec2(diagonalVector.y, -diagonalVector.x);
|
65 |
+
|
66 |
+
vColor = color;
|
67 |
+
vPosition = position;
|
68 |
+
|
69 |
+
gl_Position = vec4(
|
70 |
+
vCenter
|
71 |
+
+ position.x * v1 / viewport * 2.0
|
72 |
+
+ position.y * v2 / viewport * 2.0, 0.0, 1.0
|
73 |
+
);
|
74 |
+
}
|
75 |
+
`;
|