@miris-inc/core 0.0.8-08ebd50 → 0.0.8-0ce42f4

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/package.json CHANGED
@@ -1,41 +1,35 @@
1
1
  {
2
2
  "name": "@miris-inc/core",
3
- "version": "0.0.8-08ebd50",
3
+ "version": "0.0.8-0ce42f4",
4
4
  "description": "Core scene-graph runtime for the Miris 3D streaming SDK. WASM-backed Engine, Client, Scene, Stream, and LOD primitives shared by all higher-level packages.",
5
- "license": "Apache-2.0",
6
- "homepage": "https://miris.com",
7
- "author": "Miris, Inc.",
8
- "engines": {
9
- "node": ">=18"
10
- },
11
- "publishConfig": {
12
- "access": "public"
13
- },
14
5
  "keywords": [
15
- "miris",
16
6
  "3d",
17
- "gaussian-splatting",
18
7
  "3dgs",
19
8
  "4dgs",
9
+ "gaussian-splatting",
10
+ "miris",
20
11
  "splats",
21
12
  "streaming",
22
13
  "wasm"
23
14
  ],
24
- "type": "module",
25
- "sideEffects": false,
15
+ "homepage": "https://miris.com",
16
+ "license": "Apache-2.0",
17
+ "author": "Miris, Inc.",
26
18
  "files": [
27
19
  "banner.svg",
20
+ "webshark.d.ts",
21
+ "webshark.js",
22
+ "webshark.wasm",
28
23
  "dist/*.js",
29
24
  "dist/*.d.ts",
30
25
  "dist/*.wasm",
31
- "!dist/*.map",
32
- "webshark.js",
33
- "webshark.wasm",
34
- "webshark.d.ts"
26
+ "!dist/**/*.map"
35
27
  ],
36
- "types": "./dist/core.d.ts",
28
+ "type": "module",
29
+ "sideEffects": false,
37
30
  "main": "./dist/core.prod.js",
38
31
  "module": "./dist/core.prod.js",
32
+ "types": "./dist/core.d.ts",
39
33
  "unpkg": "./dist/core.standalone.prod.js",
40
34
  "jsdelivr": "./dist/core.standalone.prod.js",
41
35
  "exports": {
@@ -46,21 +40,27 @@
46
40
  "import": "./dist/core.prod.js",
47
41
  "default": "./dist/core.prod.js"
48
42
  },
43
+ "./webshark": {
44
+ "types": "./webshark.d.ts",
45
+ "default": "./webshark.js"
46
+ },
49
47
  "./standalone": {
50
48
  "types": "./dist/core.d.ts",
51
49
  "development": "./dist/core.standalone.js",
52
50
  "import": "./dist/core.standalone.prod.js",
53
51
  "default": "./dist/core.standalone.prod.js"
54
- },
55
- "./webshark": {
56
- "types": "./webshark.d.ts",
57
- "default": "./webshark.js"
58
52
  }
59
53
  },
54
+ "publishConfig": {
55
+ "access": "public"
56
+ },
60
57
  "scripts": {
61
58
  "d": "bun dev",
62
59
  "dev": "vite",
63
60
  "b": "cd ../.. && vite build --mode packages/core",
64
61
  "build": "cd ../.. && vite build --mode packages/core"
62
+ },
63
+ "engines": {
64
+ "node": ">=18"
65
65
  }
66
66
  }
package/webshark.d.ts CHANGED
@@ -5,38 +5,11 @@ export interface Camera {
5
5
  eye: vec4;
6
6
  l: number;
7
7
  fov: number;
8
- }
9
-
10
- export interface Ellipsoid {
11
- pos: vec4;
12
- radii: vec4;
13
- orientation: vec4;
14
- }
15
-
16
- export interface SphericalHarmonic {
17
- col: vec4;
18
- sh_0_1: vec4;
19
- sh_0_2: vec4;
20
- sh_0_3: vec4;
21
- }
22
-
23
- export interface AABB {
24
- minExt: vec4;
25
- maxExt: vec4;
26
- }
27
-
28
- export interface EmVector<T> {
29
- push_back(value: T): void;
30
- resize(count: number, value: T): void;
31
- size(): number;
32
- get(index: number): T | undefined;
33
- set(index: number, value: T): boolean;
8
+ zNear: number;
9
+ zFar: number;
34
10
  delete(): void;
35
11
  }
36
12
 
37
- export type EllipsoidVector = EmVector<Ellipsoid>;
38
- export type SphericalHarmonicVector = EmVector<SphericalHarmonic>;
39
-
40
13
  export interface SortTypeValue {
41
14
  value: number;
42
15
  }
@@ -45,38 +18,27 @@ export interface TextureFormatValue {
45
18
  value: number;
46
19
  }
47
20
 
48
- export interface SharkComputeInfo {
49
- dispatchCalls: number;
50
- frameDispatchCalls: number;
51
- }
52
-
53
21
  export interface SharkRenderInfo {
54
- totalRenderCalls: number;
55
- frameRenderCalls: number;
56
22
  triangles: number;
57
- splats: number;
58
23
  }
59
24
 
60
25
  export interface SharkInfo {
61
26
  renderCalls: number;
62
- compute: SharkComputeInfo;
63
27
  render: SharkRenderInfo;
64
28
  reset(): void;
65
29
  }
66
30
 
67
31
  export interface RendererWGPU {
68
- configureSurface(width: number, height: number): boolean;
69
32
  getProgramCount(): number;
70
33
  getTextureCount(): number;
71
34
  getEstimatedTextureSize(): number;
72
- getBufferCount(): number;
73
35
  getTotalBufferSize(): number;
74
- getBufferTypeSize(type: number): number;
75
- surfaceFormat: TextureFormatValue;
76
36
  info: SharkInfo;
37
+ delete(): void;
77
38
  }
78
39
 
79
40
  export interface RenderState {
41
+ delete(): void;
80
42
  initRenderState(
81
43
  renderer: RendererWGPU,
82
44
  width: number,
@@ -91,16 +53,34 @@ export interface RenderState {
91
53
  initGraphicsState(
92
54
  width: number,
93
55
  height: number,
94
- renderTextureFormat: TextureFormat,
56
+ renderTextureFormat: TextureFormatValue,
57
+ depthTextureFormat: TextureFormatValue,
95
58
  ): void;
96
59
  updateRenderDetails(
97
60
  width: number,
98
61
  height: number,
99
62
  splatTriangles: number,
100
63
  ): void;
101
- uploadEllipsoids(ellipsoids: EllipsoidVector): void;
102
- uploadSphericalHarmonics(sh: SphericalHarmonicVector): void;
103
- uploadSphericalHarmonicsSOGs(sh: SphericalHarmonicVector): void;
64
+ // Decodes Radiance .hdr bytes into roughness-ladder level `level` (0 is the sharp mirror).
65
+ // hdrPtr must address THIS module's heap - _malloc here and copy the bytes in.
66
+ // Returns false for bytes that are not a usable Radiance image, or a level out of range.
67
+ uploadEnvironmentLadderLevelFromHdr(
68
+ level: number,
69
+ sigmaDeg: number,
70
+ hdrPtr: number,
71
+ hdrSizeBytes: number,
72
+ ): boolean;
73
+ // Republish the ladder's shape. Call after any level lands, or it is sampled at whatever shape
74
+ // the last uploadSplatSetData declared. Pass SplatSet.hasReflectionParams().
75
+ uploadReflectionLadderParams(reflectionsEnabled: boolean): void;
76
+ // Debug controls. Drop the reflection term, or replace the surfel colour with one of the layers
77
+ // it is shaded from, numbered as RenderViewModes.h's AOV_* defines. setRenderView below sets
78
+ // the AOV together with the rest of a named view.
79
+ setReflectionsEnabled(enabled: boolean): void;
80
+ // Render textured gaussians on pixels no surfel covers, resolved as fvdb's open gate does.
81
+ // Off by default: those pixels show the clear colour.
82
+ setSurfelLessTextureSplatsEnabled(enabled: boolean): void;
83
+ setDebugAovMode(mode: number): void;
104
84
  }
105
85
 
106
86
  export interface vec4 {
@@ -116,20 +96,22 @@ export interface SplatSet {
116
96
  // Number of splats actually drawn: ordering[0, activeSplats) holds the unmasked splat indices.
117
97
  // Set alongside orderingView() to restrict the draw to unmasked octant ranges.
118
98
  activeSplats: number;
119
- setData(
120
- splatCount: number,
121
- ellipsoids: number,
122
- sphericalHarmonics: number,
123
- ): void;
99
+ // Selects which ellipsoid layout to allocate and what ellipsoidsView() exposes:
100
+ // packed (16 bytes/splat) or uncompressed (48). Must be set before the first resize.
101
+ usePackedEllipsoids: boolean;
124
102
  // direct-write upload: resize -> write into the views -> finalize.
125
103
  // views are valid only until the next resize.
126
104
  resize(splatCount: number): void;
127
105
  ellipsoidsView(): Uint32Array;
128
- sphericalHarmonicsView(): Uint32Array;
106
+ colorsView(): Uint32Array;
129
107
  sh1View(): Uint32Array;
130
108
  sh2View(): Uint32Array;
131
109
  sh3aView(): Uint32Array;
132
110
  sh3bView(): Uint32Array;
111
+ // mod_depth is a half-float per primitive slot (dense, padded for non-surfels), so this is a
112
+ // Uint16Array unlike every other view here -- do not address it with the uint32 splat strides
113
+ // used for ellipsoids/colors/sh*.
114
+ modDepthView(): Uint16Array;
133
115
  // Per-chunk fade (opacity multiplier), one float per chunk, defaults to 1.0.
134
116
  // Also sizes the chunk slot to model root slot map below, since both are indexed by chunk slot
135
117
  resizeChunkFades(chunkCount: number): void;
@@ -149,88 +131,97 @@ export interface SplatSet {
149
131
  modelRootInverseTransformsView(): Float32Array;
150
132
  // Sized by resizeChunkFades. Defaults to slot 0 (identity) for every chunk
151
133
  chunkModelRootsView(): Int32Array;
134
+ // resizeModelRootSlots resets every slot to the absolute decode. False for a slot outside the table
135
+ setModelRootRootRelativeDecode(
136
+ slot: number,
137
+ originX: number,
138
+ originY: number,
139
+ originZ: number,
140
+ step: number,
141
+ lnScaleOffset: number,
142
+ ): boolean;
152
143
  // int32 render-order buffer (sized 2*splatCount after finalize). Valid only until the next resize.
153
144
  orderingView(): Int32Array;
154
145
  finalize(): void;
155
146
  // like finalize() but keeps splats in their delivered (octant-sorted) order — no kd-tree reorder —
156
147
  // so sparse-octant range masking can index child-octant ranges directly. RADIX_SORT only.
157
148
  finalizeBounds(): void;
149
+ // Whether the asset carries per-surfel reflectance records, which is what decides whether
150
+ // reflections are shaded at all. Pass to RenderState.uploadReflectionLadderParams.
151
+ hasReflectionParams(): boolean;
152
+ // Widens packed reflectance records - recordVersion 2 for 18-byte reflectanceDataV2, 1 for
153
+ // 26-byte reflectanceDataV1 - into the per-splat GPU records at bufferOffset. wirePtr must
154
+ // address THIS module's heap - _malloc here and copy the bytes in, since the attribute lives in
155
+ // the engine module's. Records cover a node's surfel range, which starts at its first splat.
156
+ // Returns the records written; 0 if the data was rejected.
157
+ decodeReflectionParams(
158
+ recordVersion: number,
159
+ wirePtr: number,
160
+ wireSizeBytes: number,
161
+ elementCount: number,
162
+ bufferOffset: number,
163
+ nodeSplatCount: number,
164
+ logId: number,
165
+ ): number;
166
+ // Zeroes records in [startSplat, endSplat). Needed wherever splats are re-packed at fresh
167
+ // offsets, or a reused slot shades its splat from the previous occupant's material.
168
+ clearReflectionParams(startSplat: number, endSplat: number): void;
169
+ // Splats in [0, count) holding a non-zero record. Diagnostic.
170
+ populatedReflectionParamCount(count: number): number;
171
+ delete(): void;
158
172
  }
159
173
 
160
- export interface WebGPUInternals {
161
- jsObjects: unknown[];
162
- bufferOnUnmaps: Record<number, unknown>;
163
- futures: Promise<unknown>[];
164
- jsObjectInsert(ptr: number, obj: unknown): void;
165
- futureInsert(futureId: number, promise: Promise<unknown>): void;
174
+ export interface GlassMeshRegistry {
175
+ // Decodes one octree node's glass payload and registers it, replacing any previous entry for
176
+ // that object. False for a malformed or empty payload, leaving the registry unchanged.
177
+ //
178
+ // The two slot arguments are different numbers here, unlike on the native path, and swapping
179
+ // them renders glass that does not follow its asset: modelRootSlot scopes the panel dedupe to
180
+ // one asset instance, while chunkModelRootIndex is stamped into every vertex and read back as
181
+ // chunkModelRoots[pos.w], so that one takes the chunk's fade slot.
182
+ //
183
+ // geometryPtr/panelPtr address THIS module's heap - _malloc here and copy the bytes in, since
184
+ // the attributes live in the engine module's. The AABB is the geometry attribute's own range.
185
+ registerObject(
186
+ objectId: number,
187
+ lodIndex: number,
188
+ modelRootSlot: number,
189
+ chunkModelRootIndex: number,
190
+ geometryPtr: number,
191
+ geometryByteCount: number,
192
+ panelPtr: number,
193
+ panelByteCount: number,
194
+ aabbMinX: number,
195
+ aabbMinY: number,
196
+ aabbMinZ: number,
197
+ aabbMaxX: number,
198
+ aabbMaxY: number,
199
+ aabbMaxZ: number,
200
+ ): boolean;
201
+ // Returns true if the object had glass, which is what says the buffers need rebuilding.
202
+ removeObject(objectId: number): boolean;
203
+ clear(): void;
204
+ isDirty(): boolean;
205
+ // Rebuilds the flattened buffers, keeping each panel from its deepest resident LOD. Stays dirty
206
+ // so uploadIfDirty still fires. Walks every registered object, so not per frame.
207
+ flattenIfDirty(): void;
208
+ uploadIfDirty(renderState: RenderState): void;
209
+ vertexCount(): number;
210
+ panelCount(): number;
211
+ delete(): void;
166
212
  }
167
213
 
168
214
  export interface WebGPUInterface {
169
- Internals: WebGPUInternals;
170
-
171
215
  importJsAdapter(adapter: GPUAdapter, parentPtr?: number): number;
172
216
  importJsDevice(device: GPUDevice, parentPtr?: number): number;
173
- importJsBindGroup(obj: GPUBindGroup, parentPtr?: number): number;
174
- importJsBindGroupLayout(obj: GPUBindGroupLayout, parentPtr?: number): number;
175
- importJsBuffer(buffer: GPUBuffer, parentPtr?: number): number;
176
- importJsCommandBuffer(obj: GPUCommandBuffer, parentPtr?: number): number;
177
- importJsCommandEncoder(obj: GPUCommandEncoder, parentPtr?: number): number;
178
- importJsComputePassEncoder(
179
- obj: GPUComputePassEncoder,
180
- parentPtr?: number,
181
- ): number;
182
- importJsComputePipeline(obj: GPUComputePipeline, parentPtr?: number): number;
183
- importJsPipelineLayout(obj: GPUPipelineLayout, parentPtr?: number): number;
184
- importJsQuerySet(obj: GPUQuerySet, parentPtr?: number): number;
185
- importJsQueue(obj: GPUQueue, parentPtr?: number): number;
186
- importJsRenderBundle(obj: GPURenderBundle, parentPtr?: number): number;
187
- importJsRenderBundleEncoder(
188
- obj: GPURenderBundleEncoder,
189
- parentPtr?: number,
190
- ): number;
191
- importJsRenderPassEncoder(
192
- obj: GPURenderPassEncoder,
193
- parentPtr?: number,
194
- ): number;
195
- importJsRenderPipeline(obj: GPURenderPipeline, parentPtr?: number): number;
196
- importJsSampler(obj: GPUSampler, parentPtr?: number): number;
197
- importJsShaderModule(obj: GPUShaderModule, parentPtr?: number): number;
198
217
  importJsTexture(obj: GPUTexture, parentPtr?: number): number;
199
- importJsTextureView(obj: GPUTextureView, parentPtr?: number): number;
200
-
201
- getJsObject(ptr: number): unknown;
202
-
203
- makeStringFromStringView(stringViewPtr: number): string;
204
- makeStringFromOptionalStringView(
205
- stringViewPtr: number,
206
- ): string | undefined | "";
207
- setStringView(ptr: number, data: number, length: number): void;
208
- makeColor(ptr: number): { r: number; g: number; b: number; a: number };
209
- makeExtent3D(ptr: number): {
210
- width: number;
211
- height: number;
212
- depthOrArrayLayers: number;
213
- };
214
- makeOrigin3D(ptr: number): { x: number; y: number; z: number };
215
- fillLimitStruct(limits: GPUSupportedLimits, limitsOutPtr: number): void;
216
- fillAdapterInfoStruct(adapterInfo: GPUAdapterInfo, infoStruct: number): void;
217
- errorCallback(
218
- callback: number,
219
- type: number,
220
- message: string,
221
- userdata: number,
222
- ): void;
223
218
  }
224
219
 
225
220
  export interface MainModule {
226
221
  Camera: new () => Camera;
227
222
  RenderState: new () => RenderState;
228
223
  SplatSet: new () => SplatSet;
229
- AABB: new () => AABB;
230
- Ellipsoid: new () => Ellipsoid;
231
- SphericalHarmonic: new () => SphericalHarmonic;
232
- EllipsoidVector: new () => EllipsoidVector;
233
- SphericalHarmonicVector: new () => SphericalHarmonicVector;
224
+ GlassMeshRegistry: new () => GlassMeshRegistry;
234
225
  vec4: new (x: number, y: number, z: number, w: number) => vec4;
235
226
 
236
227
  SortType: {
@@ -243,6 +234,7 @@ export interface MainModule {
243
234
  TextureFormat: {
244
235
  RGBA32_Float: TextureFormatValue;
245
236
  RGBA16_Float: TextureFormatValue;
237
+ RG16_Float: TextureFormatValue;
246
238
  RGBA32_UInt: TextureFormatValue;
247
239
  RGBA32_SInt: TextureFormatValue;
248
240
  RGBA16_UInt: TextureFormatValue;
@@ -260,38 +252,19 @@ export interface MainModule {
260
252
  BC7RGBA_UNormSrgb: TextureFormatValue;
261
253
  BC3RGBA_UNorm: TextureFormatValue;
262
254
  BC3RGBA_UNormSrgb: TextureFormatValue;
255
+ Depth16Unorm: TextureFormatValue;
256
+ Depth24Plus: TextureFormatValue;
257
+ Depth32Float: TextureFormatValue;
263
258
  };
264
259
 
265
- Usage_CopySrc: number;
266
- Usage_CopyDest: number;
267
- Usage_MapRead: number;
268
- Usage_MapWrite: number;
269
- Usage_Uniform: number;
270
- Usage_Storage: number;
271
- Usage_Index: number;
272
- Usage_Vertex: number;
273
- Usage_QueryResolve: number;
274
-
275
260
  WebGPU: WebGPUInterface;
276
261
 
277
- _malloc(bytes: number): number;
262
+ // Emscripten runtime, exported by modules/shark/CMakeLists.txt. The pointer-taking bindings
263
+ // above address THIS heap, so bytes from the engine module have to be staged through it.
264
+ // HEAPU8 is replaced whenever the heap grows, so read it fresh rather than caching it.
265
+ _malloc(byteCount: number): number;
278
266
  _free(ptr: number): void;
279
- HEAPU32: Uint32Array;
280
-
281
- setupCamera(
282
- minExt: vec4,
283
- maxExt: vec4,
284
- axis: number,
285
- direction: number,
286
- width: number,
287
- height: number,
288
- camera: Camera,
289
- ): void;
290
-
291
- createRendererWGPU(canvasSelector: string): RendererWGPU;
292
- createRendererWGPUWithoutSurface(
293
- colorTargetFormat: TextureFormatValue,
294
- ): RendererWGPU;
267
+ readonly HEAPU8: Uint8Array;
295
268
 
296
269
  uploadSplatSetData(
297
270
  set: SplatSet,
@@ -316,33 +289,29 @@ export interface MainModule {
316
289
  rasterizeWithCompute: boolean,
317
290
  useSOGS: boolean,
318
291
  sortType: SortTypeValue,
292
+ skipSort: boolean,
319
293
  ): number;
320
- renderSplatSet(
321
- splats: number,
322
- set: SplatSet,
323
- renderState: RenderState,
324
- width: number,
325
- height: number,
326
- triangles: number,
327
- rasterizeWithCompute: boolean,
328
- textureView: number,
329
- ): void;
294
+ createRendererWGPUWithoutSurface(
295
+ colorTargetFormat: TextureFormatValue,
296
+ ): RendererWGPU;
297
+ /// Gives back the reference WebGPU.importJsTexture returned for a texture.
298
+ releaseImportedTexture(texture: number): void;
330
299
  renderSplatSetToSceneTextures(
331
300
  splatSet: SplatSet,
332
301
  renderState: RenderState,
333
302
  colorTarget: number,
334
303
  depthTarget: number,
304
+ renderGES: boolean,
335
305
  ): void;
336
- mapToAABB(scale: number, minExt: vec4, maxExt: vec4, set: SplatSet): void;
337
- loadPLYIntoSplatSet(filename: string, set: SplatSet): number;
338
- getBoundsSplatSet(set: SplatSet, minExt: vec4, maxExt: vec4): void;
339
- loadPLY(
340
- filename: string,
341
- count: number,
342
- maxSplats: number,
343
- ellipsoids: EllipsoidVector,
344
- sphericalHarmonics: SphericalHarmonicVector,
345
- ): number;
306
+ // Render view registry, indexed as RenderViews.h orders it. setRenderView ignores an index
307
+ // Shark cannot produce.
308
+ setRenderView(viewIndex: number): void;
309
+ renderView(): number;
310
+ renderViewCount(): number;
311
+ renderViewName(viewIndex: number): string;
312
+ renderViewSupported(viewIndex: number): boolean;
313
+ // The next supported view, forwards for direction 1 and backwards for -1.
314
+ stepRenderView(from: number, direction: number): number;
346
315
  }
347
316
 
348
317
  declare function WebShark(