topazcube 0.1.30 → 0.1.33
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 +18200 -0
- package/dist/Renderer.cjs.map +1 -0
- package/dist/Renderer.js +18183 -0
- package/dist/Renderer.js.map +1 -0
- package/dist/client.cjs +94 -260
- package/dist/client.cjs.map +1 -1
- package/dist/client.js +71 -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} +173 -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 +572 -0
- package/src/renderer/Geometry.js +1049 -0
- package/src/renderer/Material.js +61 -0
- package/src/renderer/Mesh.js +211 -0
- package/src/renderer/Node.js +112 -0
- package/src/renderer/Pipeline.js +643 -0
- package/src/renderer/Renderer.js +1324 -0
- package/src/renderer/Skin.js +792 -0
- package/src/renderer/Texture.js +584 -0
- package/src/renderer/core/AssetManager.js +359 -0
- package/src/renderer/core/CullingSystem.js +307 -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 +546 -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 +2064 -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 +417 -0
- package/src/renderer/rendering/passes/FogPass.js +419 -0
- package/src/renderer/rendering/passes/GBufferPass.js +706 -0
- package/src/renderer/rendering/passes/HiZPass.js +714 -0
- package/src/renderer/rendering/passes/LightingPass.js +739 -0
- package/src/renderer/rendering/passes/ParticlePass.js +835 -0
- package/src/renderer/rendering/passes/PlanarReflectionPass.js +456 -0
- package/src/renderer/rendering/passes/PostProcessPass.js +282 -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 +265 -0
- package/src/renderer/rendering/passes/SSGITilePass.js +296 -0
- package/src/renderer/rendering/passes/ShadowPass.js +1822 -0
- package/src/renderer/rendering/passes/TransparentPass.js +831 -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/depth_copy.wgsl +17 -0
- package/src/renderer/rendering/shaders/geometry.wgsl +550 -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 +525 -0
- package/src/renderer/rendering/shaders/particle_simulate.wgsl +440 -0
- package/src/renderer/rendering/shaders/postproc.wgsl +272 -0
- package/src/renderer/rendering/shaders/render_post.wgsl +289 -0
- package/src/renderer/rendering/shaders/shadow.wgsl +76 -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/utils/BoundingSphere.js +439 -0
- package/src/renderer/utils/Frustum.js +281 -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.js
CHANGED
|
@@ -1,136 +1,7 @@
|
|
|
1
|
-
// src/client.ts
|
|
2
1
|
import { applyOperation } from "fast-json-patch";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { FLOAT32_OPTIONS } from "msgpackr";
|
|
7
|
-
var { ALWAYS } = FLOAT32_OPTIONS;
|
|
8
|
-
var packr = new Packr({
|
|
9
|
-
useFloat32: ALWAYS
|
|
10
|
-
});
|
|
11
|
-
function encode(obj) {
|
|
12
|
-
return packr.pack(obj);
|
|
13
|
-
}
|
|
14
|
-
function decode(data) {
|
|
15
|
-
return packr.unpack(data);
|
|
16
|
-
}
|
|
17
|
-
function reactive(name, object, callback, path = "", excludedProperties = false) {
|
|
18
|
-
if (object === null || typeof object !== "object") {
|
|
19
|
-
return object;
|
|
20
|
-
}
|
|
21
|
-
function isReactive(p) {
|
|
22
|
-
let r = true;
|
|
23
|
-
if (p.startsWith("_")) {
|
|
24
|
-
r = false;
|
|
25
|
-
}
|
|
26
|
-
if (excludedProperties) {
|
|
27
|
-
if (excludedProperties[p]) {
|
|
28
|
-
r = false;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
if (path == "/entities") {
|
|
32
|
-
r = false;
|
|
33
|
-
}
|
|
34
|
-
return r;
|
|
35
|
-
}
|
|
36
|
-
for (const property in object) {
|
|
37
|
-
if (isReactive(property)) {
|
|
38
|
-
object[property] = reactive(
|
|
39
|
-
name,
|
|
40
|
-
object[property],
|
|
41
|
-
callback,
|
|
42
|
-
path + "/" + property,
|
|
43
|
-
excludedProperties
|
|
44
|
-
);
|
|
45
|
-
} else {
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return new Proxy(object, {
|
|
49
|
-
get(target, property, receiver) {
|
|
50
|
-
return Reflect.get(target, property, receiver);
|
|
51
|
-
},
|
|
52
|
-
set(target, property, value) {
|
|
53
|
-
let newvalue;
|
|
54
|
-
let pn = path + "/" + String(property);
|
|
55
|
-
if (isReactive(String(property))) {
|
|
56
|
-
newvalue = reactive(name, value, callback, pn, excludedProperties);
|
|
57
|
-
callback(name, "replace", target, pn, newvalue);
|
|
58
|
-
} else {
|
|
59
|
-
newvalue = value;
|
|
60
|
-
}
|
|
61
|
-
return Reflect.set(target, property, newvalue);
|
|
62
|
-
},
|
|
63
|
-
deleteProperty(target, property) {
|
|
64
|
-
let pn = path + "/" + String(property);
|
|
65
|
-
if (isReactive(String(property))) {
|
|
66
|
-
callback(name, "remove", target, pn, null);
|
|
67
|
-
}
|
|
68
|
-
delete target[property];
|
|
69
|
-
return true;
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
function msgop(op) {
|
|
74
|
-
let nop = {};
|
|
75
|
-
if (!op.o) {
|
|
76
|
-
nop.op = "replace";
|
|
77
|
-
} else {
|
|
78
|
-
nop.op = {
|
|
79
|
-
a: "add",
|
|
80
|
-
r: "remove",
|
|
81
|
-
d: "delete",
|
|
82
|
-
t: "test"
|
|
83
|
-
}[op.o];
|
|
84
|
-
}
|
|
85
|
-
nop.path = op.p;
|
|
86
|
-
nop.value = op.v;
|
|
87
|
-
return nop;
|
|
88
|
-
}
|
|
89
|
-
function opmsg(op, target, path, value) {
|
|
90
|
-
let c = { p: path, v: value };
|
|
91
|
-
if (op != "replace") {
|
|
92
|
-
c.o = {
|
|
93
|
-
add: "a",
|
|
94
|
-
remove: "r",
|
|
95
|
-
delete: "d",
|
|
96
|
-
test: "t"
|
|
97
|
-
}[op];
|
|
98
|
-
}
|
|
99
|
-
return c;
|
|
100
|
-
}
|
|
101
|
-
function decode_uint32(byteArray, offset = 0) {
|
|
102
|
-
let p = offset;
|
|
103
|
-
return (byteArray[p++] & 127) << 24 | byteArray[p++] << 16 | byteArray[p++] << 8 | byteArray[p];
|
|
104
|
-
}
|
|
105
|
-
function decode_uint24(byteArray, offset = 0) {
|
|
106
|
-
let p = offset;
|
|
107
|
-
return byteArray[p++] << 16 | byteArray[p++] << 8 | byteArray[p];
|
|
108
|
-
}
|
|
109
|
-
function decode_uint16(byteArray, offset = 0) {
|
|
110
|
-
let p = offset;
|
|
111
|
-
return byteArray[p++] << 8 | byteArray[p];
|
|
112
|
-
}
|
|
113
|
-
function decode_fp168(byteArray, offset = 0) {
|
|
114
|
-
const divider = (byteArray[offset] & 128) === 128 ? -256 : 256;
|
|
115
|
-
byteArray[offset] &= 127;
|
|
116
|
-
const fp = decode_uint24(byteArray, offset);
|
|
117
|
-
return fp / divider;
|
|
118
|
-
}
|
|
119
|
-
function decode_fp1616(byteArray, offset = 0) {
|
|
120
|
-
const divider = (byteArray[offset] & 128) === 128 ? -65536 : 65536;
|
|
121
|
-
byteArray[offset] &= 127;
|
|
122
|
-
const fp = decode_uint32(byteArray, offset);
|
|
123
|
-
return fp / divider;
|
|
124
|
-
}
|
|
125
|
-
function decode_fp412(byteArray, offset = 0) {
|
|
126
|
-
const divider = (byteArray[offset] & 128) === 128 ? -4096 : 4096;
|
|
127
|
-
byteArray[offset] &= 127;
|
|
128
|
-
const fp = decode_uint16(byteArray, offset);
|
|
129
|
-
return fp / divider;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// src/compress-browser.ts
|
|
133
|
-
var browserFormat = "gzip";
|
|
2
|
+
import { d as decode, e as encode, r as reactive, m as msgop, o as opmsg, a as decode_uint32, b as decode_fp168, c as decode_fp412, f as decode_fp1616 } from "./utils-D7tXt6-2.js";
|
|
3
|
+
import { vec3, quat } from "gl-matrix";
|
|
4
|
+
const browserFormat = "gzip";
|
|
134
5
|
async function decompress(buffer) {
|
|
135
6
|
if (typeof DecompressionStream !== "undefined") {
|
|
136
7
|
try {
|
|
@@ -146,13 +17,9 @@ async function decompress(buffer) {
|
|
|
146
17
|
throw new Error("DecompressionStream not supported");
|
|
147
18
|
}
|
|
148
19
|
}
|
|
149
|
-
|
|
150
|
-
// src/client.ts
|
|
151
|
-
import { vec3, quat } from "gl-matrix";
|
|
152
|
-
var TopazCubeClient = class {
|
|
20
|
+
class TopazCubeClient {
|
|
153
21
|
DEBUG = false;
|
|
154
22
|
CYCLE = 200;
|
|
155
|
-
// update/patch rate in ms
|
|
156
23
|
url = "";
|
|
157
24
|
documents = {};
|
|
158
25
|
autoReconnect = true;
|
|
@@ -170,13 +37,11 @@ var TopazCubeClient = class {
|
|
|
170
37
|
recRTCBps: 0,
|
|
171
38
|
ping: 0,
|
|
172
39
|
stdiff: 0
|
|
173
|
-
// server time difference
|
|
174
40
|
};
|
|
175
41
|
lastFullState = 0;
|
|
176
42
|
lastPatch = 0;
|
|
177
43
|
_chunks = {};
|
|
178
44
|
le = true;
|
|
179
|
-
// Server is little endian
|
|
180
45
|
_documentChanges = {};
|
|
181
46
|
ID = 0;
|
|
182
47
|
socket = null;
|
|
@@ -185,9 +50,7 @@ var TopazCubeClient = class {
|
|
|
185
50
|
_remoteCandidates = [];
|
|
186
51
|
_offerSent = false;
|
|
187
52
|
_dataChannel = null;
|
|
188
|
-
// our data channel
|
|
189
53
|
_serverDataChannel = null;
|
|
190
|
-
// server data channel
|
|
191
54
|
_webRTCConnected = false;
|
|
192
55
|
isInterpolated = false;
|
|
193
56
|
_lastInterpolate = Date.now();
|
|
@@ -202,11 +65,8 @@ var TopazCubeClient = class {
|
|
|
202
65
|
_pingiv = null;
|
|
203
66
|
constructor({
|
|
204
67
|
url,
|
|
205
|
-
// server url
|
|
206
68
|
autoReconnect = true,
|
|
207
|
-
// auto reconnect on disconnect
|
|
208
69
|
allowSync = true,
|
|
209
|
-
// allow sync on connect
|
|
210
70
|
allowWebRTC = false,
|
|
211
71
|
DEBUG = false
|
|
212
72
|
}) {
|
|
@@ -232,7 +92,6 @@ var TopazCubeClient = class {
|
|
|
232
92
|
error(...args) {
|
|
233
93
|
console.error(...args);
|
|
234
94
|
}
|
|
235
|
-
/*= UPDATE ===================================================================*/
|
|
236
95
|
_startLoop() {
|
|
237
96
|
if (this._loopiv) {
|
|
238
97
|
clearInterval(this._loopiv);
|
|
@@ -278,27 +137,25 @@ var TopazCubeClient = class {
|
|
|
278
137
|
this.isPatched = false;
|
|
279
138
|
this.le = true;
|
|
280
139
|
}
|
|
281
|
-
/*= INTERPOLATION ============================================================*/
|
|
282
|
-
// to be called in display rate (like 60fps) to interpolate .position, .rotation and .scale
|
|
283
140
|
interpolate() {
|
|
284
|
-
|
|
285
|
-
|
|
141
|
+
const now = Date.now();
|
|
142
|
+
const dt = now - this._lastInterpolate;
|
|
286
143
|
this._lastInterpolate = now;
|
|
287
144
|
if (dt <= 0 || dt > 200) {
|
|
288
145
|
return;
|
|
289
146
|
}
|
|
290
147
|
this.isInterpolated = true;
|
|
291
|
-
for (
|
|
292
|
-
|
|
293
|
-
|
|
148
|
+
for (const name in this.documents) {
|
|
149
|
+
const doc = this.documents[name];
|
|
150
|
+
const entities = doc?.entities;
|
|
294
151
|
if (!entities) {
|
|
295
152
|
continue;
|
|
296
153
|
}
|
|
297
|
-
for (
|
|
298
|
-
|
|
154
|
+
for (const id in entities) {
|
|
155
|
+
const e = entities[id];
|
|
299
156
|
if (e._lpostime1 && e._lpostime2) {
|
|
300
|
-
|
|
301
|
-
|
|
157
|
+
const t1 = e._lpostime1;
|
|
158
|
+
const t2 = e._lpostime2;
|
|
302
159
|
const interval = t2 - t1;
|
|
303
160
|
const elapsed = now - t1;
|
|
304
161
|
e.pelapsed = elapsed;
|
|
@@ -313,8 +170,8 @@ var TopazCubeClient = class {
|
|
|
313
170
|
}
|
|
314
171
|
}
|
|
315
172
|
if (e._lrottime1 && e._lrottime2) {
|
|
316
|
-
|
|
317
|
-
|
|
173
|
+
const t1 = e._lrottime1;
|
|
174
|
+
const t2 = e._lrottime2;
|
|
318
175
|
const interval = t2 - t1;
|
|
319
176
|
const elapsed = now - t1;
|
|
320
177
|
e.relapsed = elapsed;
|
|
@@ -332,7 +189,6 @@ var TopazCubeClient = class {
|
|
|
332
189
|
}
|
|
333
190
|
this.isInterpolated = false;
|
|
334
191
|
}
|
|
335
|
-
/*= CONNECTION ===============================================================*/
|
|
336
192
|
subscribe(name) {
|
|
337
193
|
this.documents[name] = {};
|
|
338
194
|
this.send({ c: "sub", n: name });
|
|
@@ -350,11 +206,11 @@ var TopazCubeClient = class {
|
|
|
350
206
|
this.log("connecting...");
|
|
351
207
|
this.socket = new WebSocket(this.url);
|
|
352
208
|
this.socket.onmessage = async (event) => {
|
|
353
|
-
|
|
209
|
+
const buffer = await event.data.arrayBuffer();
|
|
354
210
|
this.stats.rec += buffer.byteLength;
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
211
|
+
const dec = await decompress(buffer);
|
|
212
|
+
const decu = new Uint8Array(dec);
|
|
213
|
+
const message = decode(decu);
|
|
358
214
|
this._onMessage(message);
|
|
359
215
|
};
|
|
360
216
|
this.socket.onclose = (_event) => {
|
|
@@ -441,14 +297,16 @@ var TopazCubeClient = class {
|
|
|
441
297
|
this.send({ c: "ping", ct: Date.now() });
|
|
442
298
|
}
|
|
443
299
|
}
|
|
444
|
-
/*= MESSAGES =================================================================*/
|
|
445
300
|
onChange(_name, _doc, patch) {
|
|
446
301
|
}
|
|
447
302
|
onMessage(_message) {
|
|
448
303
|
}
|
|
449
304
|
send(operation) {
|
|
305
|
+
if (!this.isConnected) {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
450
308
|
try {
|
|
451
|
-
|
|
309
|
+
const enc = encode(operation);
|
|
452
310
|
this.stats.send += enc.byteLength;
|
|
453
311
|
if (this.socket) {
|
|
454
312
|
this.socket.send(enc);
|
|
@@ -458,14 +316,14 @@ var TopazCubeClient = class {
|
|
|
458
316
|
}
|
|
459
317
|
}
|
|
460
318
|
get document() {
|
|
461
|
-
|
|
319
|
+
const names = "" + Object.keys(this.documents);
|
|
462
320
|
return this.documents["" + names[0]];
|
|
463
321
|
}
|
|
464
322
|
async _onMessage(message) {
|
|
465
323
|
let time = Date.now();
|
|
466
324
|
if (message.c == "full") {
|
|
467
|
-
|
|
468
|
-
|
|
325
|
+
const name = "" + message.n;
|
|
326
|
+
const doc = message.doc;
|
|
469
327
|
this.documents[name] = doc;
|
|
470
328
|
this._decodeFastChanges(message);
|
|
471
329
|
this.isPatched = false;
|
|
@@ -484,15 +342,15 @@ var TopazCubeClient = class {
|
|
|
484
342
|
}
|
|
485
343
|
} else if (message.c == "patch") {
|
|
486
344
|
this.lastPatch = message.t;
|
|
487
|
-
|
|
345
|
+
const name = message.n;
|
|
488
346
|
if (!this.documents[name]) {
|
|
489
347
|
this.warn("Patch for unknown document", name);
|
|
490
348
|
return;
|
|
491
349
|
}
|
|
492
350
|
if (message.doc) {
|
|
493
351
|
this.isPatched = true;
|
|
494
|
-
for (
|
|
495
|
-
|
|
352
|
+
for (const op of message.doc) {
|
|
353
|
+
const dop = msgop(op);
|
|
496
354
|
try {
|
|
497
355
|
applyOperation(this.documents[name], dop);
|
|
498
356
|
} catch (e) {
|
|
@@ -508,13 +366,13 @@ var TopazCubeClient = class {
|
|
|
508
366
|
this._chunks[message.mid + "-" + message.seq] = message;
|
|
509
367
|
if (message.last) {
|
|
510
368
|
let cfound = 0;
|
|
511
|
-
|
|
512
|
-
|
|
369
|
+
const ts = message.ts;
|
|
370
|
+
const cdata = new Uint8Array(ts);
|
|
513
371
|
for (const cid in this._chunks) {
|
|
514
|
-
|
|
372
|
+
const chunk = this._chunks[cid];
|
|
515
373
|
if (chunk.mid == message.mid) {
|
|
516
|
-
|
|
517
|
-
|
|
374
|
+
const offset = chunk.ofs;
|
|
375
|
+
chunk.chs;
|
|
518
376
|
cdata.set(new Uint8Array(chunk.data), offset);
|
|
519
377
|
cfound++;
|
|
520
378
|
delete this._chunks[cid];
|
|
@@ -522,9 +380,9 @@ var TopazCubeClient = class {
|
|
|
522
380
|
}
|
|
523
381
|
if (cfound == message.seq + 1) {
|
|
524
382
|
try {
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
383
|
+
const cdec = await decompress(cdata);
|
|
384
|
+
const cdecu = new Uint8Array(cdec);
|
|
385
|
+
const nmessage = decode(cdecu);
|
|
528
386
|
this._onMessage(nmessage);
|
|
529
387
|
} catch (error) {
|
|
530
388
|
this.error("Error decoding chunks:", error);
|
|
@@ -535,13 +393,13 @@ var TopazCubeClient = class {
|
|
|
535
393
|
}
|
|
536
394
|
} else if (message.c == "fpatch") {
|
|
537
395
|
time = Date.now();
|
|
538
|
-
|
|
396
|
+
const name = message.n;
|
|
539
397
|
let doPatch = true;
|
|
540
398
|
if (!this._lastUpdateId[name]) {
|
|
541
399
|
this._lastUpdateId[name] = message.u;
|
|
542
400
|
} else {
|
|
543
401
|
if (this._lastUpdateId[name] < message.u) {
|
|
544
|
-
|
|
402
|
+
const lp = message.u - this._lastUpdateId[name] - 1;
|
|
545
403
|
if (lp > 0) {
|
|
546
404
|
this.warn("Lost " + lp + " updates");
|
|
547
405
|
}
|
|
@@ -557,9 +415,9 @@ var TopazCubeClient = class {
|
|
|
557
415
|
} else if (message.c == "pong") {
|
|
558
416
|
this.ID = message.ID;
|
|
559
417
|
time = Date.now();
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
418
|
+
const lastct = message.ct;
|
|
419
|
+
const ping = time - lastct;
|
|
420
|
+
const stime = message.t;
|
|
563
421
|
this.send({ c: "peng", ct: Date.now(), st: stime });
|
|
564
422
|
this.stats.stdiff = stime + ping / 2 - time;
|
|
565
423
|
this.stats.ping = ping;
|
|
@@ -577,7 +435,7 @@ var TopazCubeClient = class {
|
|
|
577
435
|
await this._peerConnection.setRemoteDescription(sessionDesc);
|
|
578
436
|
}
|
|
579
437
|
this.log("RTC: Remote description set successfully");
|
|
580
|
-
for (
|
|
438
|
+
for (const candidate of this._remoteCandidates) {
|
|
581
439
|
try {
|
|
582
440
|
await this._peerConnection?.addIceCandidate(candidate);
|
|
583
441
|
this.log("RTC: Added remote ICE candidate:", candidate);
|
|
@@ -613,12 +471,12 @@ var TopazCubeClient = class {
|
|
|
613
471
|
this._documentChanges[name].push(opmsg(op, target, path, value));
|
|
614
472
|
}
|
|
615
473
|
_sendPatches() {
|
|
616
|
-
for (
|
|
617
|
-
|
|
474
|
+
for (const name in this._documentChanges) {
|
|
475
|
+
const dc = this._documentChanges[name];
|
|
618
476
|
if (!dc || dc.length == 0) {
|
|
619
477
|
continue;
|
|
620
478
|
}
|
|
621
|
-
|
|
479
|
+
const record = {
|
|
622
480
|
n: name,
|
|
623
481
|
c: "sync",
|
|
624
482
|
ct: Date.now(),
|
|
@@ -635,17 +493,17 @@ var TopazCubeClient = class {
|
|
|
635
493
|
}
|
|
636
494
|
}
|
|
637
495
|
_decodeFastChanges(message) {
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
496
|
+
const time = Date.now();
|
|
497
|
+
const name = message.n;
|
|
498
|
+
const fdata = message.fdata;
|
|
641
499
|
if (!fdata) {
|
|
642
500
|
return;
|
|
643
501
|
}
|
|
644
|
-
|
|
502
|
+
const doc = this.documents[name];
|
|
645
503
|
if (!doc) {
|
|
646
504
|
return;
|
|
647
505
|
}
|
|
648
|
-
|
|
506
|
+
const entities = doc.entities;
|
|
649
507
|
if (!entities) {
|
|
650
508
|
return;
|
|
651
509
|
}
|
|
@@ -653,34 +511,34 @@ var TopazCubeClient = class {
|
|
|
653
511
|
if (!origin) {
|
|
654
512
|
origin = [0, 0, 0];
|
|
655
513
|
}
|
|
656
|
-
for (
|
|
657
|
-
|
|
514
|
+
for (const key in fdata) {
|
|
515
|
+
const changes = fdata[key];
|
|
658
516
|
if (changes.dict) {
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
for (
|
|
517
|
+
const pdata = changes.pdata;
|
|
518
|
+
const dict = changes.dict;
|
|
519
|
+
const rdict = {};
|
|
520
|
+
for (const key2 in dict) {
|
|
663
521
|
rdict[dict[key2]] = key2;
|
|
664
522
|
}
|
|
665
523
|
let offset = 0;
|
|
666
524
|
while (offset < pdata.byteLength) {
|
|
667
|
-
|
|
525
|
+
const id = "" + decode_uint32(pdata, offset);
|
|
668
526
|
offset += 4;
|
|
669
|
-
|
|
527
|
+
const did = "" + decode_uint32(pdata, offset);
|
|
670
528
|
offset += 4;
|
|
671
|
-
|
|
529
|
+
const e = entities[id];
|
|
672
530
|
if (!e) {
|
|
673
531
|
continue;
|
|
674
532
|
}
|
|
675
|
-
|
|
533
|
+
const value = rdict[did];
|
|
676
534
|
e[key] = value;
|
|
677
535
|
e["_changed_" + key] = time;
|
|
678
536
|
}
|
|
679
537
|
} else {
|
|
680
|
-
|
|
538
|
+
const pdata = changes.pdata;
|
|
681
539
|
let offset = 0;
|
|
682
540
|
while (offset < pdata.byteLength) {
|
|
683
|
-
|
|
541
|
+
const id = "" + decode_uint32(pdata, offset);
|
|
684
542
|
let e = entities[id];
|
|
685
543
|
if (!e) {
|
|
686
544
|
if (key == "position") {
|
|
@@ -775,7 +633,6 @@ var TopazCubeClient = class {
|
|
|
775
633
|
}
|
|
776
634
|
}
|
|
777
635
|
}
|
|
778
|
-
/*= WEBRTC ===================================================================*/
|
|
779
636
|
sendRTC(message) {
|
|
780
637
|
if (this._dataChannel && this._dataChannel.readyState === "open") {
|
|
781
638
|
this._dataChannel.send(encode(message));
|
|
@@ -791,10 +648,10 @@ var TopazCubeClient = class {
|
|
|
791
648
|
}
|
|
792
649
|
async _onRTCMessage(data) {
|
|
793
650
|
this.stats.recRTC += data.byteLength;
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
651
|
+
const datau = new Uint8Array(data);
|
|
652
|
+
const dec = await decompress(datau);
|
|
653
|
+
const decu = new Uint8Array(dec);
|
|
654
|
+
const message = decode(decu);
|
|
798
655
|
this._onMessage(message);
|
|
799
656
|
}
|
|
800
657
|
async _initializeWebRTC() {
|
|
@@ -830,7 +687,7 @@ var TopazCubeClient = class {
|
|
|
830
687
|
this._peerConnection.onicegatheringstatechange = () => {
|
|
831
688
|
this.log(`RTC: ICE gathering state. _candidates:`, this._candidates.length, this._peerConnection?.iceGatheringState);
|
|
832
689
|
if (this._peerConnection?.iceGatheringState == "complete" && this._offerSent) {
|
|
833
|
-
for (
|
|
690
|
+
for (const candidate of this._candidates) {
|
|
834
691
|
this.send({
|
|
835
692
|
c: "rtc-candidate",
|
|
836
693
|
type: "ice-candidate",
|
|
@@ -880,7 +737,7 @@ var TopazCubeClient = class {
|
|
|
880
737
|
const offer = await this._peerConnection.createOffer(offerOptions);
|
|
881
738
|
await this._peerConnection.setLocalDescription(offer);
|
|
882
739
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
883
|
-
|
|
740
|
+
const ld = this._peerConnection.localDescription;
|
|
884
741
|
if (ld) {
|
|
885
742
|
const offerPayload = {
|
|
886
743
|
c: "rtc-offer",
|
|
@@ -902,7 +759,6 @@ var TopazCubeClient = class {
|
|
|
902
759
|
this.error("RTC: error:", error);
|
|
903
760
|
}
|
|
904
761
|
}
|
|
905
|
-
// Add this method to restart ICE if needed
|
|
906
762
|
async _restartIce() {
|
|
907
763
|
try {
|
|
908
764
|
const offerOptions = {
|
|
@@ -935,8 +791,8 @@ var TopazCubeClient = class {
|
|
|
935
791
|
}
|
|
936
792
|
this._webRTCConnected = false;
|
|
937
793
|
}
|
|
938
|
-
}
|
|
794
|
+
}
|
|
939
795
|
export {
|
|
940
796
|
TopazCubeClient as default
|
|
941
797
|
};
|
|
942
|
-
//# sourceMappingURL=client.js.map
|
|
798
|
+
//# sourceMappingURL=client.js.map
|