-
Notifications
You must be signed in to change notification settings - Fork 0
/
app-object.js
126 lines (114 loc) · 3.49 KB
/
app-object.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import * as THREE from './three.module.js';
import {OrbitControls} from './OrbitControls.js';
import {CSS3DRenderer} from './CSS3DRenderer.js';
const canvas = document.getElementById('canvas');
const context = canvas.getContext('webgl2', {
antialias: true,
alpha: true,
preserveDrawingBuffer: false,
});
const renderer = new THREE.WebGLRenderer({
canvas,
context,
antialias: true,
alpha: true,
// preserveDrawingBuffer: false,
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(window.devicePixelRatio);
renderer.autoClear = false;
renderer.sortObjects = false;
// renderer.physicallyCorrectLights = true;
renderer.xr.enabled = true;
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 1.6, 2);
camera.rotation.order = 'YXZ';
// camera.quaternion.set(0, 0, 0, 1);
const dolly = new THREE.Object3D();
dolly.add(camera);
scene.add(dolly);
const ambientLight = new THREE.AmbientLight(0xFFFFFF);
scene.add(ambientLight);
const directionalLight = new THREE.DirectionalLight(0xFFFFFF);
directionalLight.position.set(1, 2, 3);
scene.add(directionalLight);
/* const directionalLight2 = new THREE.DirectionalLight(0xFFFFFF, 1);
scene.add(directionalLight2); */
const orbitControls = new OrbitControls(camera, canvas);
orbitControls.screenSpacePanning = true;
orbitControls.enableMiddleZoom = false;
orbitControls.target.copy(camera.position).add(new THREE.Vector3(0, camera.position.y, -3).applyQuaternion(camera.quaternion));
orbitControls.update();
const renderer2 = new CSS3DRenderer();
renderer2.setSize(window.innerWidth, window.innerHeight);
renderer2.domElement.style.position = 'absolute';
renderer2.domElement.style.top = 0;
document.body.insertBefore(renderer2.domElement, canvas);
const scene2 = new THREE.Scene();
const scene3 = new THREE.Scene();
class AppManager {
constructor() {
this.apps = [];
this.animationLoops = [];
// this.grabs = [null, null];
}
createApp(appId) {
const app = new App(appId);
this.apps.push(app);
return app;
}
destroyApp(appId) {
const appIndex = this.apps.findIndex(app => app.appId === appId);
if (appIndex !== -1) {
const app = this.apps[appIndex];
app.dispatchEvent(new MessageEvent('terminate'));
this.apps.splice(appIndex, 1);
}
this.removeAnimationLoop(appId);
}
getApp(appId) {
return this.apps.find(app => app.appId === appId);
}
setAnimationLoop(appId, fn) {
let animationLoop = this.animationLoops.find(al => al.appId === appId);
if (!animationLoop) {
animationLoop = {
appId,
fn: null,
};
this.animationLoops.push(animationLoop);
}
animationLoop.fn = fn;
}
removeAnimationLoop(appId) {
const index = this.animationLoops.findIndex(al => al.appId === appId);
if (index !== -1) {
this.animationLoops.splice(index, 1);
}
}
/* getGrab(side) {
return this.grabs[side === 'left' ? 0 : 1];
}
grab(side, mesh) {
this.grabs[side === 'left' ? 0 : 1] = mesh;
}
release(side) {
this.grabs[side === 'left' ? 0 : 1] = null;
} */
tick() {
for (const al of this.animationLoops) {
al.fn.apply(null, arguments);
}
}
}
const appManager = new AppManager();
class App extends EventTarget {
constructor(appId) {
super();
this.appId = appId;
this.files = {};
this.object = null;
}
}
export {renderer, scene, camera, dolly, orbitControls, renderer2, scene2, scene3, appManager};