topazcube 0.1.31 → 0.1.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +0 -0
- package/README.md +0 -0
- package/dist/Renderer.cjs +20844 -0
- package/dist/Renderer.cjs.map +1 -0
- package/dist/Renderer.js +20827 -0
- package/dist/Renderer.js.map +1 -0
- package/dist/client.cjs +91 -260
- package/dist/client.cjs.map +1 -1
- package/dist/client.js +68 -215
- package/dist/client.js.map +1 -1
- package/dist/server.cjs +165 -432
- package/dist/server.cjs.map +1 -1
- package/dist/server.js +117 -370
- package/dist/server.js.map +1 -1
- package/dist/terminal.cjs +113 -200
- package/dist/terminal.cjs.map +1 -1
- package/dist/terminal.js +50 -51
- package/dist/terminal.js.map +1 -1
- package/dist/utils-CRhi1BDa.cjs +259 -0
- package/dist/utils-CRhi1BDa.cjs.map +1 -0
- package/dist/utils-D7tXt6-2.js +260 -0
- package/dist/utils-D7tXt6-2.js.map +1 -0
- package/package.json +19 -15
- package/src/{client.ts → network/client.js} +170 -403
- package/src/{compress-browser.ts → network/compress-browser.js} +2 -4
- package/src/{compress-node.ts → network/compress-node.js} +8 -14
- package/src/{server.ts → network/server.js} +229 -317
- package/src/{terminal.js → network/terminal.js} +0 -0
- package/src/{topazcube.ts → network/topazcube.js} +2 -2
- package/src/network/utils.js +375 -0
- package/src/renderer/Camera.js +191 -0
- package/src/renderer/DebugUI.js +703 -0
- package/src/renderer/Geometry.js +1049 -0
- package/src/renderer/Material.js +64 -0
- package/src/renderer/Mesh.js +211 -0
- package/src/renderer/Node.js +112 -0
- package/src/renderer/Pipeline.js +645 -0
- package/src/renderer/Renderer.js +1496 -0
- package/src/renderer/Skin.js +792 -0
- package/src/renderer/Texture.js +584 -0
- package/src/renderer/core/AssetManager.js +394 -0
- package/src/renderer/core/CullingSystem.js +308 -0
- package/src/renderer/core/EntityManager.js +541 -0
- package/src/renderer/core/InstanceManager.js +343 -0
- package/src/renderer/core/ParticleEmitter.js +358 -0
- package/src/renderer/core/ParticleSystem.js +564 -0
- package/src/renderer/core/SpriteSystem.js +349 -0
- package/src/renderer/gltf.js +563 -0
- package/src/renderer/math.js +161 -0
- package/src/renderer/rendering/HistoryBufferManager.js +333 -0
- package/src/renderer/rendering/ProbeCapture.js +1495 -0
- package/src/renderer/rendering/ReflectionProbeManager.js +352 -0
- package/src/renderer/rendering/RenderGraph.js +2258 -0
- package/src/renderer/rendering/passes/AOPass.js +308 -0
- package/src/renderer/rendering/passes/AmbientCapturePass.js +593 -0
- package/src/renderer/rendering/passes/BasePass.js +101 -0
- package/src/renderer/rendering/passes/BloomPass.js +420 -0
- package/src/renderer/rendering/passes/CRTPass.js +724 -0
- package/src/renderer/rendering/passes/FogPass.js +445 -0
- package/src/renderer/rendering/passes/GBufferPass.js +730 -0
- package/src/renderer/rendering/passes/HiZPass.js +744 -0
- package/src/renderer/rendering/passes/LightingPass.js +753 -0
- package/src/renderer/rendering/passes/ParticlePass.js +841 -0
- package/src/renderer/rendering/passes/PlanarReflectionPass.js +456 -0
- package/src/renderer/rendering/passes/PostProcessPass.js +405 -0
- package/src/renderer/rendering/passes/ReflectionPass.js +157 -0
- package/src/renderer/rendering/passes/RenderPostPass.js +364 -0
- package/src/renderer/rendering/passes/SSGIPass.js +266 -0
- package/src/renderer/rendering/passes/SSGITilePass.js +305 -0
- package/src/renderer/rendering/passes/ShadowPass.js +2072 -0
- package/src/renderer/rendering/passes/TransparentPass.js +831 -0
- package/src/renderer/rendering/passes/VolumetricFogPass.js +715 -0
- package/src/renderer/rendering/shaders/ao.wgsl +182 -0
- package/src/renderer/rendering/shaders/bloom.wgsl +97 -0
- package/src/renderer/rendering/shaders/bloom_blur.wgsl +80 -0
- package/src/renderer/rendering/shaders/crt.wgsl +455 -0
- package/src/renderer/rendering/shaders/depth_copy.wgsl +17 -0
- package/src/renderer/rendering/shaders/geometry.wgsl +580 -0
- package/src/renderer/rendering/shaders/hiz_reduce.wgsl +114 -0
- package/src/renderer/rendering/shaders/light_culling.wgsl +204 -0
- package/src/renderer/rendering/shaders/lighting.wgsl +932 -0
- package/src/renderer/rendering/shaders/lighting_common.wgsl +143 -0
- package/src/renderer/rendering/shaders/particle_render.wgsl +672 -0
- package/src/renderer/rendering/shaders/particle_simulate.wgsl +440 -0
- package/src/renderer/rendering/shaders/postproc.wgsl +293 -0
- package/src/renderer/rendering/shaders/render_post.wgsl +289 -0
- package/src/renderer/rendering/shaders/shadow.wgsl +117 -0
- package/src/renderer/rendering/shaders/ssgi.wgsl +266 -0
- package/src/renderer/rendering/shaders/ssgi_accumulate.wgsl +114 -0
- package/src/renderer/rendering/shaders/ssgi_propagate.wgsl +132 -0
- package/src/renderer/rendering/shaders/volumetric_blur.wgsl +80 -0
- package/src/renderer/rendering/shaders/volumetric_composite.wgsl +80 -0
- package/src/renderer/rendering/shaders/volumetric_raymarch.wgsl +634 -0
- package/src/renderer/utils/BoundingSphere.js +439 -0
- package/src/renderer/utils/Frustum.js +281 -0
- package/src/renderer/utils/Raycaster.js +761 -0
- package/dist/client.d.cts +0 -211
- package/dist/client.d.ts +0 -211
- package/dist/server.d.cts +0 -120
- package/dist/server.d.ts +0 -120
- package/dist/terminal.d.cts +0 -64
- package/dist/terminal.d.ts +0 -64
- package/src/utils.ts +0 -403
package/dist/client.cjs
CHANGED
|
@@ -1,160 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/client.ts
|
|
21
|
-
var client_exports = {};
|
|
22
|
-
__export(client_exports, {
|
|
23
|
-
default: () => TopazCubeClient
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(client_exports);
|
|
26
|
-
var import_fast_json_patch = require("fast-json-patch");
|
|
27
|
-
|
|
28
|
-
// src/utils.ts
|
|
29
|
-
var import_msgpackr = require("msgpackr");
|
|
30
|
-
var import_msgpackr2 = require("msgpackr");
|
|
31
|
-
var { ALWAYS } = import_msgpackr2.FLOAT32_OPTIONS;
|
|
32
|
-
var packr = new import_msgpackr.Packr({
|
|
33
|
-
useFloat32: ALWAYS
|
|
34
|
-
});
|
|
35
|
-
function encode(obj) {
|
|
36
|
-
return packr.pack(obj);
|
|
37
|
-
}
|
|
38
|
-
function decode(data) {
|
|
39
|
-
return packr.unpack(data);
|
|
40
|
-
}
|
|
41
|
-
function reactive(name, object, callback, path = "", excludedProperties = false) {
|
|
42
|
-
if (object === null || typeof object !== "object") {
|
|
43
|
-
return object;
|
|
44
|
-
}
|
|
45
|
-
function isReactive(p) {
|
|
46
|
-
let r = true;
|
|
47
|
-
if (p.startsWith("_")) {
|
|
48
|
-
r = false;
|
|
49
|
-
}
|
|
50
|
-
if (excludedProperties) {
|
|
51
|
-
if (excludedProperties[p]) {
|
|
52
|
-
r = false;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
if (path == "/entities") {
|
|
56
|
-
r = false;
|
|
57
|
-
}
|
|
58
|
-
return r;
|
|
59
|
-
}
|
|
60
|
-
for (const property in object) {
|
|
61
|
-
if (isReactive(property)) {
|
|
62
|
-
object[property] = reactive(
|
|
63
|
-
name,
|
|
64
|
-
object[property],
|
|
65
|
-
callback,
|
|
66
|
-
path + "/" + property,
|
|
67
|
-
excludedProperties
|
|
68
|
-
);
|
|
69
|
-
} else {
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return new Proxy(object, {
|
|
73
|
-
get(target, property, receiver) {
|
|
74
|
-
return Reflect.get(target, property, receiver);
|
|
75
|
-
},
|
|
76
|
-
set(target, property, value) {
|
|
77
|
-
let newvalue;
|
|
78
|
-
let pn = path + "/" + String(property);
|
|
79
|
-
if (isReactive(String(property))) {
|
|
80
|
-
newvalue = reactive(name, value, callback, pn, excludedProperties);
|
|
81
|
-
callback(name, "replace", target, pn, newvalue);
|
|
82
|
-
} else {
|
|
83
|
-
newvalue = value;
|
|
84
|
-
}
|
|
85
|
-
return Reflect.set(target, property, newvalue);
|
|
86
|
-
},
|
|
87
|
-
deleteProperty(target, property) {
|
|
88
|
-
let pn = path + "/" + String(property);
|
|
89
|
-
if (isReactive(String(property))) {
|
|
90
|
-
callback(name, "remove", target, pn, null);
|
|
91
|
-
}
|
|
92
|
-
delete target[property];
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
function msgop(op) {
|
|
98
|
-
let nop = {};
|
|
99
|
-
if (!op.o) {
|
|
100
|
-
nop.op = "replace";
|
|
101
|
-
} else {
|
|
102
|
-
nop.op = {
|
|
103
|
-
a: "add",
|
|
104
|
-
r: "remove",
|
|
105
|
-
d: "delete",
|
|
106
|
-
t: "test"
|
|
107
|
-
}[op.o];
|
|
108
|
-
}
|
|
109
|
-
nop.path = op.p;
|
|
110
|
-
nop.value = op.v;
|
|
111
|
-
return nop;
|
|
112
|
-
}
|
|
113
|
-
function opmsg(op, target, path, value) {
|
|
114
|
-
let c = { p: path, v: value };
|
|
115
|
-
if (op != "replace") {
|
|
116
|
-
c.o = {
|
|
117
|
-
add: "a",
|
|
118
|
-
remove: "r",
|
|
119
|
-
delete: "d",
|
|
120
|
-
test: "t"
|
|
121
|
-
}[op];
|
|
122
|
-
}
|
|
123
|
-
return c;
|
|
124
|
-
}
|
|
125
|
-
function decode_uint32(byteArray, offset = 0) {
|
|
126
|
-
let p = offset;
|
|
127
|
-
return (byteArray[p++] & 127) << 24 | byteArray[p++] << 16 | byteArray[p++] << 8 | byteArray[p];
|
|
128
|
-
}
|
|
129
|
-
function decode_uint24(byteArray, offset = 0) {
|
|
130
|
-
let p = offset;
|
|
131
|
-
return byteArray[p++] << 16 | byteArray[p++] << 8 | byteArray[p];
|
|
132
|
-
}
|
|
133
|
-
function decode_uint16(byteArray, offset = 0) {
|
|
134
|
-
let p = offset;
|
|
135
|
-
return byteArray[p++] << 8 | byteArray[p];
|
|
136
|
-
}
|
|
137
|
-
function decode_fp168(byteArray, offset = 0) {
|
|
138
|
-
const divider = (byteArray[offset] & 128) === 128 ? -256 : 256;
|
|
139
|
-
byteArray[offset] &= 127;
|
|
140
|
-
const fp = decode_uint24(byteArray, offset);
|
|
141
|
-
return fp / divider;
|
|
142
|
-
}
|
|
143
|
-
function decode_fp1616(byteArray, offset = 0) {
|
|
144
|
-
const divider = (byteArray[offset] & 128) === 128 ? -65536 : 65536;
|
|
145
|
-
byteArray[offset] &= 127;
|
|
146
|
-
const fp = decode_uint32(byteArray, offset);
|
|
147
|
-
return fp / divider;
|
|
148
|
-
}
|
|
149
|
-
function decode_fp412(byteArray, offset = 0) {
|
|
150
|
-
const divider = (byteArray[offset] & 128) === 128 ? -4096 : 4096;
|
|
151
|
-
byteArray[offset] &= 127;
|
|
152
|
-
const fp = decode_uint16(byteArray, offset);
|
|
153
|
-
return fp / divider;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// src/compress-browser.ts
|
|
157
|
-
var browserFormat = "gzip";
|
|
2
|
+
const fastjsonpatch = require("fast-json-patch");
|
|
3
|
+
const utils = require("./utils-CRhi1BDa.cjs");
|
|
4
|
+
const glMatrix = require("gl-matrix");
|
|
5
|
+
const browserFormat = "gzip";
|
|
158
6
|
async function decompress(buffer) {
|
|
159
7
|
if (typeof DecompressionStream !== "undefined") {
|
|
160
8
|
try {
|
|
@@ -170,13 +18,9 @@ async function decompress(buffer) {
|
|
|
170
18
|
throw new Error("DecompressionStream not supported");
|
|
171
19
|
}
|
|
172
20
|
}
|
|
173
|
-
|
|
174
|
-
// src/client.ts
|
|
175
|
-
var import_gl_matrix = require("gl-matrix");
|
|
176
|
-
var TopazCubeClient = class {
|
|
21
|
+
class TopazCubeClient {
|
|
177
22
|
DEBUG = false;
|
|
178
23
|
CYCLE = 200;
|
|
179
|
-
// update/patch rate in ms
|
|
180
24
|
url = "";
|
|
181
25
|
documents = {};
|
|
182
26
|
autoReconnect = true;
|
|
@@ -194,13 +38,11 @@ var TopazCubeClient = class {
|
|
|
194
38
|
recRTCBps: 0,
|
|
195
39
|
ping: 0,
|
|
196
40
|
stdiff: 0
|
|
197
|
-
// server time difference
|
|
198
41
|
};
|
|
199
42
|
lastFullState = 0;
|
|
200
43
|
lastPatch = 0;
|
|
201
44
|
_chunks = {};
|
|
202
45
|
le = true;
|
|
203
|
-
// Server is little endian
|
|
204
46
|
_documentChanges = {};
|
|
205
47
|
ID = 0;
|
|
206
48
|
socket = null;
|
|
@@ -209,9 +51,7 @@ var TopazCubeClient = class {
|
|
|
209
51
|
_remoteCandidates = [];
|
|
210
52
|
_offerSent = false;
|
|
211
53
|
_dataChannel = null;
|
|
212
|
-
// our data channel
|
|
213
54
|
_serverDataChannel = null;
|
|
214
|
-
// server data channel
|
|
215
55
|
_webRTCConnected = false;
|
|
216
56
|
isInterpolated = false;
|
|
217
57
|
_lastInterpolate = Date.now();
|
|
@@ -226,11 +66,8 @@ var TopazCubeClient = class {
|
|
|
226
66
|
_pingiv = null;
|
|
227
67
|
constructor({
|
|
228
68
|
url,
|
|
229
|
-
// server url
|
|
230
69
|
autoReconnect = true,
|
|
231
|
-
// auto reconnect on disconnect
|
|
232
70
|
allowSync = true,
|
|
233
|
-
// allow sync on connect
|
|
234
71
|
allowWebRTC = false,
|
|
235
72
|
DEBUG = false
|
|
236
73
|
}) {
|
|
@@ -256,7 +93,6 @@ var TopazCubeClient = class {
|
|
|
256
93
|
error(...args) {
|
|
257
94
|
console.error(...args);
|
|
258
95
|
}
|
|
259
|
-
/*= UPDATE ===================================================================*/
|
|
260
96
|
_startLoop() {
|
|
261
97
|
if (this._loopiv) {
|
|
262
98
|
clearInterval(this._loopiv);
|
|
@@ -302,53 +138,51 @@ var TopazCubeClient = class {
|
|
|
302
138
|
this.isPatched = false;
|
|
303
139
|
this.le = true;
|
|
304
140
|
}
|
|
305
|
-
/*= INTERPOLATION ============================================================*/
|
|
306
|
-
// to be called in display rate (like 60fps) to interpolate .position, .rotation and .scale
|
|
307
141
|
interpolate() {
|
|
308
|
-
|
|
309
|
-
|
|
142
|
+
const now = Date.now();
|
|
143
|
+
const dt = now - this._lastInterpolate;
|
|
310
144
|
this._lastInterpolate = now;
|
|
311
145
|
if (dt <= 0 || dt > 200) {
|
|
312
146
|
return;
|
|
313
147
|
}
|
|
314
148
|
this.isInterpolated = true;
|
|
315
|
-
for (
|
|
316
|
-
|
|
317
|
-
|
|
149
|
+
for (const name in this.documents) {
|
|
150
|
+
const doc = this.documents[name];
|
|
151
|
+
const entities = doc?.entities;
|
|
318
152
|
if (!entities) {
|
|
319
153
|
continue;
|
|
320
154
|
}
|
|
321
|
-
for (
|
|
322
|
-
|
|
155
|
+
for (const id in entities) {
|
|
156
|
+
const e = entities[id];
|
|
323
157
|
if (e._lpostime1 && e._lpostime2) {
|
|
324
|
-
|
|
325
|
-
|
|
158
|
+
const t1 = e._lpostime1;
|
|
159
|
+
const t2 = e._lpostime2;
|
|
326
160
|
const interval = t2 - t1;
|
|
327
161
|
const elapsed = now - t1;
|
|
328
162
|
e.pelapsed = elapsed;
|
|
329
163
|
if (elapsed > 1e3) {
|
|
330
|
-
|
|
164
|
+
glMatrix.vec3.copy(e.position, e._lpos2);
|
|
331
165
|
e._changed_position = now;
|
|
332
166
|
} else {
|
|
333
167
|
const alpha = Math.max(0, elapsed / interval);
|
|
334
|
-
|
|
335
|
-
|
|
168
|
+
glMatrix.vec3.lerp(this._dpos, e._lpos1, e._lpos2, alpha);
|
|
169
|
+
glMatrix.vec3.lerp(e.position, e.position, this._dpos, 0.07);
|
|
336
170
|
e._changed_position = now;
|
|
337
171
|
}
|
|
338
172
|
}
|
|
339
173
|
if (e._lrottime1 && e._lrottime2) {
|
|
340
|
-
|
|
341
|
-
|
|
174
|
+
const t1 = e._lrottime1;
|
|
175
|
+
const t2 = e._lrottime2;
|
|
342
176
|
const interval = t2 - t1;
|
|
343
177
|
const elapsed = now - t1;
|
|
344
178
|
e.relapsed = elapsed;
|
|
345
179
|
if (elapsed > 1e3) {
|
|
346
|
-
|
|
180
|
+
glMatrix.quat.copy(e.rotation, e._lrot2);
|
|
347
181
|
e._changed_rotation = now;
|
|
348
182
|
} else {
|
|
349
183
|
const alpha = Math.max(0, elapsed / interval);
|
|
350
|
-
|
|
351
|
-
|
|
184
|
+
glMatrix.quat.slerp(this._drot, e._lrot1, e._lrot2, alpha);
|
|
185
|
+
glMatrix.quat.slerp(e.rotation, e.rotation, this._drot, 0.07);
|
|
352
186
|
e._changed_rotation = now;
|
|
353
187
|
}
|
|
354
188
|
}
|
|
@@ -356,7 +190,6 @@ var TopazCubeClient = class {
|
|
|
356
190
|
}
|
|
357
191
|
this.isInterpolated = false;
|
|
358
192
|
}
|
|
359
|
-
/*= CONNECTION ===============================================================*/
|
|
360
193
|
subscribe(name) {
|
|
361
194
|
this.documents[name] = {};
|
|
362
195
|
this.send({ c: "sub", n: name });
|
|
@@ -374,11 +207,11 @@ var TopazCubeClient = class {
|
|
|
374
207
|
this.log("connecting...");
|
|
375
208
|
this.socket = new WebSocket(this.url);
|
|
376
209
|
this.socket.onmessage = async (event) => {
|
|
377
|
-
|
|
210
|
+
const buffer = await event.data.arrayBuffer();
|
|
378
211
|
this.stats.rec += buffer.byteLength;
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
212
|
+
const dec = await decompress(buffer);
|
|
213
|
+
const decu = new Uint8Array(dec);
|
|
214
|
+
const message = utils.decode(decu);
|
|
382
215
|
this._onMessage(message);
|
|
383
216
|
};
|
|
384
217
|
this.socket.onclose = (_event) => {
|
|
@@ -465,7 +298,6 @@ var TopazCubeClient = class {
|
|
|
465
298
|
this.send({ c: "ping", ct: Date.now() });
|
|
466
299
|
}
|
|
467
300
|
}
|
|
468
|
-
/*= MESSAGES =================================================================*/
|
|
469
301
|
onChange(_name, _doc, patch) {
|
|
470
302
|
}
|
|
471
303
|
onMessage(_message) {
|
|
@@ -475,7 +307,7 @@ var TopazCubeClient = class {
|
|
|
475
307
|
return;
|
|
476
308
|
}
|
|
477
309
|
try {
|
|
478
|
-
|
|
310
|
+
const enc = utils.encode(operation);
|
|
479
311
|
this.stats.send += enc.byteLength;
|
|
480
312
|
if (this.socket) {
|
|
481
313
|
this.socket.send(enc);
|
|
@@ -485,19 +317,19 @@ var TopazCubeClient = class {
|
|
|
485
317
|
}
|
|
486
318
|
}
|
|
487
319
|
get document() {
|
|
488
|
-
|
|
320
|
+
const names = "" + Object.keys(this.documents);
|
|
489
321
|
return this.documents["" + names[0]];
|
|
490
322
|
}
|
|
491
323
|
async _onMessage(message) {
|
|
492
324
|
let time = Date.now();
|
|
493
325
|
if (message.c == "full") {
|
|
494
|
-
|
|
495
|
-
|
|
326
|
+
const name = "" + message.n;
|
|
327
|
+
const doc = message.doc;
|
|
496
328
|
this.documents[name] = doc;
|
|
497
329
|
this._decodeFastChanges(message);
|
|
498
330
|
this.isPatched = false;
|
|
499
331
|
if (this.allowSync) {
|
|
500
|
-
this.documents[name] = reactive(
|
|
332
|
+
this.documents[name] = utils.reactive(
|
|
501
333
|
name,
|
|
502
334
|
this.documents[name],
|
|
503
335
|
this._onDocumentChange.bind(this)
|
|
@@ -511,17 +343,17 @@ var TopazCubeClient = class {
|
|
|
511
343
|
}
|
|
512
344
|
} else if (message.c == "patch") {
|
|
513
345
|
this.lastPatch = message.t;
|
|
514
|
-
|
|
346
|
+
const name = message.n;
|
|
515
347
|
if (!this.documents[name]) {
|
|
516
348
|
this.warn("Patch for unknown document", name);
|
|
517
349
|
return;
|
|
518
350
|
}
|
|
519
351
|
if (message.doc) {
|
|
520
352
|
this.isPatched = true;
|
|
521
|
-
for (
|
|
522
|
-
|
|
353
|
+
for (const op of message.doc) {
|
|
354
|
+
const dop = utils.msgop(op);
|
|
523
355
|
try {
|
|
524
|
-
|
|
356
|
+
fastjsonpatch.applyOperation(this.documents[name], dop);
|
|
525
357
|
} catch (e) {
|
|
526
358
|
this.warn("applyOperation failed for", name, "with op", dop, e);
|
|
527
359
|
}
|
|
@@ -535,13 +367,13 @@ var TopazCubeClient = class {
|
|
|
535
367
|
this._chunks[message.mid + "-" + message.seq] = message;
|
|
536
368
|
if (message.last) {
|
|
537
369
|
let cfound = 0;
|
|
538
|
-
|
|
539
|
-
|
|
370
|
+
const ts = message.ts;
|
|
371
|
+
const cdata = new Uint8Array(ts);
|
|
540
372
|
for (const cid in this._chunks) {
|
|
541
|
-
|
|
373
|
+
const chunk = this._chunks[cid];
|
|
542
374
|
if (chunk.mid == message.mid) {
|
|
543
|
-
|
|
544
|
-
|
|
375
|
+
const offset = chunk.ofs;
|
|
376
|
+
chunk.chs;
|
|
545
377
|
cdata.set(new Uint8Array(chunk.data), offset);
|
|
546
378
|
cfound++;
|
|
547
379
|
delete this._chunks[cid];
|
|
@@ -549,9 +381,9 @@ var TopazCubeClient = class {
|
|
|
549
381
|
}
|
|
550
382
|
if (cfound == message.seq + 1) {
|
|
551
383
|
try {
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
384
|
+
const cdec = await decompress(cdata);
|
|
385
|
+
const cdecu = new Uint8Array(cdec);
|
|
386
|
+
const nmessage = utils.decode(cdecu);
|
|
555
387
|
this._onMessage(nmessage);
|
|
556
388
|
} catch (error) {
|
|
557
389
|
this.error("Error decoding chunks:", error);
|
|
@@ -562,13 +394,13 @@ var TopazCubeClient = class {
|
|
|
562
394
|
}
|
|
563
395
|
} else if (message.c == "fpatch") {
|
|
564
396
|
time = Date.now();
|
|
565
|
-
|
|
397
|
+
const name = message.n;
|
|
566
398
|
let doPatch = true;
|
|
567
399
|
if (!this._lastUpdateId[name]) {
|
|
568
400
|
this._lastUpdateId[name] = message.u;
|
|
569
401
|
} else {
|
|
570
402
|
if (this._lastUpdateId[name] < message.u) {
|
|
571
|
-
|
|
403
|
+
const lp = message.u - this._lastUpdateId[name] - 1;
|
|
572
404
|
if (lp > 0) {
|
|
573
405
|
this.warn("Lost " + lp + " updates");
|
|
574
406
|
}
|
|
@@ -584,9 +416,9 @@ var TopazCubeClient = class {
|
|
|
584
416
|
} else if (message.c == "pong") {
|
|
585
417
|
this.ID = message.ID;
|
|
586
418
|
time = Date.now();
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
419
|
+
const lastct = message.ct;
|
|
420
|
+
const ping = time - lastct;
|
|
421
|
+
const stime = message.t;
|
|
590
422
|
this.send({ c: "peng", ct: Date.now(), st: stime });
|
|
591
423
|
this.stats.stdiff = stime + ping / 2 - time;
|
|
592
424
|
this.stats.ping = ping;
|
|
@@ -604,7 +436,7 @@ var TopazCubeClient = class {
|
|
|
604
436
|
await this._peerConnection.setRemoteDescription(sessionDesc);
|
|
605
437
|
}
|
|
606
438
|
this.log("RTC: Remote description set successfully");
|
|
607
|
-
for (
|
|
439
|
+
for (const candidate of this._remoteCandidates) {
|
|
608
440
|
try {
|
|
609
441
|
await this._peerConnection?.addIceCandidate(candidate);
|
|
610
442
|
this.log("RTC: Added remote ICE candidate:", candidate);
|
|
@@ -637,15 +469,15 @@ var TopazCubeClient = class {
|
|
|
637
469
|
if (!this._documentChanges[name]) {
|
|
638
470
|
this._documentChanges[name] = [];
|
|
639
471
|
}
|
|
640
|
-
this._documentChanges[name].push(opmsg(op, target, path, value));
|
|
472
|
+
this._documentChanges[name].push(utils.opmsg(op, target, path, value));
|
|
641
473
|
}
|
|
642
474
|
_sendPatches() {
|
|
643
|
-
for (
|
|
644
|
-
|
|
475
|
+
for (const name in this._documentChanges) {
|
|
476
|
+
const dc = this._documentChanges[name];
|
|
645
477
|
if (!dc || dc.length == 0) {
|
|
646
478
|
continue;
|
|
647
479
|
}
|
|
648
|
-
|
|
480
|
+
const record = {
|
|
649
481
|
n: name,
|
|
650
482
|
c: "sync",
|
|
651
483
|
ct: Date.now(),
|
|
@@ -662,17 +494,17 @@ var TopazCubeClient = class {
|
|
|
662
494
|
}
|
|
663
495
|
}
|
|
664
496
|
_decodeFastChanges(message) {
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
497
|
+
const time = Date.now();
|
|
498
|
+
const name = message.n;
|
|
499
|
+
const fdata = message.fdata;
|
|
668
500
|
if (!fdata) {
|
|
669
501
|
return;
|
|
670
502
|
}
|
|
671
|
-
|
|
503
|
+
const doc = this.documents[name];
|
|
672
504
|
if (!doc) {
|
|
673
505
|
return;
|
|
674
506
|
}
|
|
675
|
-
|
|
507
|
+
const entities = doc.entities;
|
|
676
508
|
if (!entities) {
|
|
677
509
|
return;
|
|
678
510
|
}
|
|
@@ -680,34 +512,34 @@ var TopazCubeClient = class {
|
|
|
680
512
|
if (!origin) {
|
|
681
513
|
origin = [0, 0, 0];
|
|
682
514
|
}
|
|
683
|
-
for (
|
|
684
|
-
|
|
515
|
+
for (const key in fdata) {
|
|
516
|
+
const changes = fdata[key];
|
|
685
517
|
if (changes.dict) {
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
for (
|
|
518
|
+
const pdata = changes.pdata;
|
|
519
|
+
const dict = changes.dict;
|
|
520
|
+
const rdict = {};
|
|
521
|
+
for (const key2 in dict) {
|
|
690
522
|
rdict[dict[key2]] = key2;
|
|
691
523
|
}
|
|
692
524
|
let offset = 0;
|
|
693
525
|
while (offset < pdata.byteLength) {
|
|
694
|
-
|
|
526
|
+
const id = "" + utils.decode_uint32(pdata, offset);
|
|
695
527
|
offset += 4;
|
|
696
|
-
|
|
528
|
+
const did = "" + utils.decode_uint32(pdata, offset);
|
|
697
529
|
offset += 4;
|
|
698
|
-
|
|
530
|
+
const e = entities[id];
|
|
699
531
|
if (!e) {
|
|
700
532
|
continue;
|
|
701
533
|
}
|
|
702
|
-
|
|
534
|
+
const value = rdict[did];
|
|
703
535
|
e[key] = value;
|
|
704
536
|
e["_changed_" + key] = time;
|
|
705
537
|
}
|
|
706
538
|
} else {
|
|
707
|
-
|
|
539
|
+
const pdata = changes.pdata;
|
|
708
540
|
let offset = 0;
|
|
709
541
|
while (offset < pdata.byteLength) {
|
|
710
|
-
|
|
542
|
+
const id = "" + utils.decode_uint32(pdata, offset);
|
|
711
543
|
let e = entities[id];
|
|
712
544
|
if (!e) {
|
|
713
545
|
if (key == "position") {
|
|
@@ -731,11 +563,11 @@ var TopazCubeClient = class {
|
|
|
731
563
|
e._lpostime1 = e._lpostime2;
|
|
732
564
|
}
|
|
733
565
|
e._lpostime2 = time;
|
|
734
|
-
e._lpos2[0] = origin[0] + decode_fp168(pdata, offset);
|
|
566
|
+
e._lpos2[0] = origin[0] + utils.decode_fp168(pdata, offset);
|
|
735
567
|
offset += 3;
|
|
736
|
-
e._lpos2[1] = origin[1] + decode_fp168(pdata, offset);
|
|
568
|
+
e._lpos2[1] = origin[1] + utils.decode_fp168(pdata, offset);
|
|
737
569
|
offset += 3;
|
|
738
|
-
e._lpos2[2] = origin[2] + decode_fp168(pdata, offset);
|
|
570
|
+
e._lpos2[2] = origin[2] + utils.decode_fp168(pdata, offset);
|
|
739
571
|
offset += 3;
|
|
740
572
|
if (!e.position) {
|
|
741
573
|
e.position = [
|
|
@@ -756,15 +588,15 @@ var TopazCubeClient = class {
|
|
|
756
588
|
e._lrottime1 = e._lrottime2;
|
|
757
589
|
}
|
|
758
590
|
e._lrottime2 = time;
|
|
759
|
-
e._lrot2[0] = decode_fp412(pdata, offset);
|
|
591
|
+
e._lrot2[0] = utils.decode_fp412(pdata, offset);
|
|
760
592
|
offset += 2;
|
|
761
|
-
e._lrot2[1] = decode_fp412(pdata, offset);
|
|
593
|
+
e._lrot2[1] = utils.decode_fp412(pdata, offset);
|
|
762
594
|
offset += 2;
|
|
763
|
-
e._lrot2[2] = decode_fp412(pdata, offset);
|
|
595
|
+
e._lrot2[2] = utils.decode_fp412(pdata, offset);
|
|
764
596
|
offset += 2;
|
|
765
|
-
e._lrot2[3] = decode_fp412(pdata, offset);
|
|
597
|
+
e._lrot2[3] = utils.decode_fp412(pdata, offset);
|
|
766
598
|
offset += 2;
|
|
767
|
-
|
|
599
|
+
glMatrix.quat.normalize(e._lrot2, e._lrot2);
|
|
768
600
|
if (!e.rotation) {
|
|
769
601
|
e.rotation = [
|
|
770
602
|
e._lrot2[0],
|
|
@@ -784,11 +616,11 @@ var TopazCubeClient = class {
|
|
|
784
616
|
e._lscatime1 = e._lscatime2;
|
|
785
617
|
}
|
|
786
618
|
e._lscatime2 = time;
|
|
787
|
-
e._lsca2[0] = decode_fp1616(pdata, offset);
|
|
619
|
+
e._lsca2[0] = utils.decode_fp1616(pdata, offset);
|
|
788
620
|
offset += 4;
|
|
789
|
-
e._lsca2[1] = decode_fp1616(pdata, offset);
|
|
621
|
+
e._lsca2[1] = utils.decode_fp1616(pdata, offset);
|
|
790
622
|
offset += 4;
|
|
791
|
-
e._lsca2[2] = decode_fp1616(pdata, offset);
|
|
623
|
+
e._lsca2[2] = utils.decode_fp1616(pdata, offset);
|
|
792
624
|
offset += 4;
|
|
793
625
|
if (!e.sca) {
|
|
794
626
|
e.sca = [
|
|
@@ -802,10 +634,9 @@ var TopazCubeClient = class {
|
|
|
802
634
|
}
|
|
803
635
|
}
|
|
804
636
|
}
|
|
805
|
-
/*= WEBRTC ===================================================================*/
|
|
806
637
|
sendRTC(message) {
|
|
807
638
|
if (this._dataChannel && this._dataChannel.readyState === "open") {
|
|
808
|
-
this._dataChannel.send(encode(message));
|
|
639
|
+
this._dataChannel.send(utils.encode(message));
|
|
809
640
|
}
|
|
810
641
|
}
|
|
811
642
|
_onRTCConnect() {
|
|
@@ -818,10 +649,10 @@ var TopazCubeClient = class {
|
|
|
818
649
|
}
|
|
819
650
|
async _onRTCMessage(data) {
|
|
820
651
|
this.stats.recRTC += data.byteLength;
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
652
|
+
const datau = new Uint8Array(data);
|
|
653
|
+
const dec = await decompress(datau);
|
|
654
|
+
const decu = new Uint8Array(dec);
|
|
655
|
+
const message = utils.decode(decu);
|
|
825
656
|
this._onMessage(message);
|
|
826
657
|
}
|
|
827
658
|
async _initializeWebRTC() {
|
|
@@ -857,7 +688,7 @@ var TopazCubeClient = class {
|
|
|
857
688
|
this._peerConnection.onicegatheringstatechange = () => {
|
|
858
689
|
this.log(`RTC: ICE gathering state. _candidates:`, this._candidates.length, this._peerConnection?.iceGatheringState);
|
|
859
690
|
if (this._peerConnection?.iceGatheringState == "complete" && this._offerSent) {
|
|
860
|
-
for (
|
|
691
|
+
for (const candidate of this._candidates) {
|
|
861
692
|
this.send({
|
|
862
693
|
c: "rtc-candidate",
|
|
863
694
|
type: "ice-candidate",
|
|
@@ -907,7 +738,7 @@ var TopazCubeClient = class {
|
|
|
907
738
|
const offer = await this._peerConnection.createOffer(offerOptions);
|
|
908
739
|
await this._peerConnection.setLocalDescription(offer);
|
|
909
740
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
910
|
-
|
|
741
|
+
const ld = this._peerConnection.localDescription;
|
|
911
742
|
if (ld) {
|
|
912
743
|
const offerPayload = {
|
|
913
744
|
c: "rtc-offer",
|
|
@@ -929,7 +760,6 @@ var TopazCubeClient = class {
|
|
|
929
760
|
this.error("RTC: error:", error);
|
|
930
761
|
}
|
|
931
762
|
}
|
|
932
|
-
// Add this method to restart ICE if needed
|
|
933
763
|
async _restartIce() {
|
|
934
764
|
try {
|
|
935
765
|
const offerOptions = {
|
|
@@ -962,5 +792,6 @@ var TopazCubeClient = class {
|
|
|
962
792
|
}
|
|
963
793
|
this._webRTCConnected = false;
|
|
964
794
|
}
|
|
965
|
-
}
|
|
966
|
-
|
|
795
|
+
}
|
|
796
|
+
module.exports = TopazCubeClient;
|
|
797
|
+
//# sourceMappingURL=client.cjs.map
|