simulationjsv2 0.10.5 → 0.11.0

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.
Files changed (48) hide show
  1. package/README.md +4 -0
  2. package/TODO.md +4 -20
  3. package/dist/backend.d.ts +38 -0
  4. package/dist/backend.js +127 -0
  5. package/dist/backends/backend.d.ts +22 -0
  6. package/dist/backends/backend.js +21 -0
  7. package/dist/backends/webgl.d.ts +19 -0
  8. package/dist/backends/webgl.js +112 -0
  9. package/dist/backends/webgpu.d.ts +25 -0
  10. package/dist/backends/webgpu.js +134 -0
  11. package/dist/buffers/buffer.d.ts +15 -0
  12. package/dist/buffers/buffer.js +42 -0
  13. package/dist/buffers/webgl.d.ts +13 -0
  14. package/dist/buffers/webgl.js +46 -0
  15. package/dist/buffers/webgpu.d.ts +12 -0
  16. package/dist/buffers/webgpu.js +40 -0
  17. package/dist/buffers.d.ts +20 -7
  18. package/dist/buffers.js +54 -20
  19. package/dist/constants.d.ts +1 -0
  20. package/dist/constants.js +1 -0
  21. package/dist/geometry.d.ts +3 -2
  22. package/dist/geometry.js +8 -4
  23. package/dist/globals.d.ts +6 -7
  24. package/dist/globals.js +7 -12
  25. package/dist/graphics.d.ts +20 -21
  26. package/dist/graphics.js +57 -59
  27. package/dist/index.d.ts +3 -1
  28. package/dist/index.js +3 -1
  29. package/dist/internalUtils.d.ts +3 -4
  30. package/dist/internalUtils.js +3 -1
  31. package/dist/shaders/shader.d.ts +18 -0
  32. package/dist/shaders/shader.js +63 -0
  33. package/dist/shaders/utils.d.ts +33 -0
  34. package/dist/shaders/utils.js +25 -0
  35. package/dist/shaders/webgl.d.ts +74 -0
  36. package/dist/shaders/webgl.js +242 -0
  37. package/dist/shaders/webgpu.d.ts +40 -0
  38. package/dist/{shaders.js → shaders/webgpu.js} +73 -114
  39. package/dist/simulation.d.ts +11 -5
  40. package/dist/simulation.js +49 -86
  41. package/dist/types.d.ts +54 -36
  42. package/dist/utils.d.ts +3 -4
  43. package/dist/utils.js +6 -9
  44. package/package.json +26 -26
  45. package/pnpm-workspace.yaml +2 -0
  46. package/dist/pipelineUtil.d.ts +0 -5
  47. package/dist/pipelineUtil.js +0 -22
  48. package/dist/shaders.d.ts +0 -37
@@ -0,0 +1,12 @@
1
+ import { ArrayTypes } from '../types.js';
2
+ import { MemoBuffer } from './buffer.js';
3
+ export declare class WebGPUMemoBuffer extends MemoBuffer {
4
+ protected device: GPUDevice;
5
+ protected buffer: GPUBuffer | null;
6
+ private usage;
7
+ constructor(device: GPUDevice, usage: GPUBufferDescriptor['usage'], initCapacity: number);
8
+ allocBuffer(): void;
9
+ getBuffer(): GPUBuffer;
10
+ write(buf: ArrayTypes, offset?: number): void;
11
+ destroy(): void;
12
+ }
@@ -0,0 +1,40 @@
1
+ import { MemoBuffer } from './buffer.js';
2
+ export class WebGPUMemoBuffer extends MemoBuffer {
3
+ device;
4
+ buffer = null;
5
+ usage;
6
+ constructor(device, usage, initCapacity) {
7
+ super('webgpu', initCapacity);
8
+ if (device === null)
9
+ throw new Error('Device is null');
10
+ this.device = device;
11
+ this.usage = usage;
12
+ }
13
+ allocBuffer() {
14
+ if (this.buffer)
15
+ this.buffer.destroy();
16
+ this.buffer = this.device.createBuffer({
17
+ size: this.bufferCapacity,
18
+ usage: this.usage
19
+ });
20
+ }
21
+ getBuffer() {
22
+ if (!this.buffer)
23
+ this.allocBuffer();
24
+ return this.buffer;
25
+ }
26
+ write(buf, offset = 0) {
27
+ const neededSize = offset + buf.byteLength;
28
+ if (!this.buffer || neededSize > this.bufferCapacity) {
29
+ this.bufferCapacity = neededSize;
30
+ this.allocBuffer();
31
+ }
32
+ this.device.queue.writeBuffer(this.buffer, offset, buf.buffer, buf.byteOffset, buf.byteLength);
33
+ }
34
+ destroy() {
35
+ if (this.buffer) {
36
+ this.buffer.destroy();
37
+ this.buffer = null;
38
+ }
39
+ }
40
+ }
package/dist/buffers.d.ts CHANGED
@@ -1,13 +1,26 @@
1
- /// <reference types="@webgpu/types" />
2
1
  import { ArrayTypes } from './types.js';
3
- export declare class MemoBuffer {
4
- private buffer;
5
- private bufferSize;
2
+ export declare abstract class MemoBuffer<T> {
3
+ protected buffer: T | null;
4
+ protected bufferCapacity: number;
5
+ constructor(initCapacity: number);
6
+ abstract allocBuffer(): void;
7
+ abstract destroy(): void;
8
+ write(_buf: ArrayTypes, _offset?: number): void;
9
+ getBuffer(): NonNullable<T>;
10
+ private growCapacity;
11
+ ensureCapacity(capacity: number): void;
12
+ setCapacityPrecise(capacity: number): void;
13
+ }
14
+ export declare class WebGPUMemoBuffer extends MemoBuffer<GPUBuffer> {
15
+ protected device: GPUDevice;
6
16
  private usage;
7
- constructor(usage: GPUBufferDescriptor['usage'], size: number);
8
- private allocBuffer;
17
+ constructor(device: GPUDevice, usage: GPUBufferDescriptor['usage'], initCapacity: number);
18
+ allocBuffer(): void;
9
19
  getBuffer(): GPUBuffer;
10
- setSize(size: number): void;
11
20
  write(buf: ArrayTypes, offset?: number): void;
12
21
  destroy(): void;
13
22
  }
23
+ export declare class WebGLMemoBuffer extends MemoBuffer<WebGLBuffer> {
24
+ allocBuffer(): void;
25
+ destroy(): void;
26
+ }
package/dist/buffers.js CHANGED
@@ -1,19 +1,55 @@
1
1
  import { globalInfo } from './globals.js';
2
2
  export class MemoBuffer {
3
3
  buffer;
4
- bufferSize;
4
+ bufferCapacity;
5
+ constructor(initCapacity) {
6
+ this.bufferCapacity = initCapacity;
7
+ this.buffer = null;
8
+ }
9
+ // cant be abstract because offset should be default param to 0
10
+ // which it wont allow (even though it could)
11
+ write(_buf, _offset = 0) { }
12
+ getBuffer() {
13
+ if (!this.buffer)
14
+ this.allocBuffer();
15
+ return this.buffer;
16
+ }
17
+ growCapacity(current, target) {
18
+ let res = Math.max(1, current);
19
+ while (res < target) {
20
+ res += Math.ceil(res / 2);
21
+ }
22
+ return res;
23
+ }
24
+ ensureCapacity(capacity) {
25
+ this.setCapacityPrecise(this.growCapacity(this.bufferCapacity, capacity));
26
+ }
27
+ setCapacityPrecise(capacity) {
28
+ if (!this.buffer) {
29
+ this.bufferCapacity = capacity;
30
+ this.allocBuffer();
31
+ }
32
+ if (capacity <= this.bufferCapacity)
33
+ return;
34
+ this.bufferCapacity = capacity;
35
+ this.allocBuffer();
36
+ }
37
+ }
38
+ export class WebGPUMemoBuffer extends MemoBuffer {
39
+ device;
5
40
  usage;
6
- constructor(usage, size) {
41
+ constructor(device, usage, initCapacity) {
42
+ super(initCapacity);
43
+ if (device === null)
44
+ throw new Error('Device is null');
45
+ this.device = device;
7
46
  this.usage = usage;
8
- this.bufferSize = size;
9
- this.buffer = null;
10
47
  }
11
48
  allocBuffer() {
12
- const device = globalInfo.getDevice();
13
- if (!device)
14
- return;
15
- this.buffer = device.createBuffer({
16
- size: this.bufferSize,
49
+ if (this.buffer)
50
+ this.buffer.destroy();
51
+ this.buffer = this.device.createBuffer({
52
+ size: this.bufferCapacity,
17
53
  usage: this.usage
18
54
  });
19
55
  }
@@ -22,18 +58,12 @@ export class MemoBuffer {
22
58
  this.allocBuffer();
23
59
  return this.buffer;
24
60
  }
25
- setSize(size) {
26
- if (!this.buffer)
27
- this.allocBuffer();
28
- if (size > this.bufferSize) {
29
- this.bufferSize = size;
30
- this.allocBuffer();
31
- }
32
- }
33
61
  write(buf, offset = 0) {
34
- const device = globalInfo.errorGetDevice();
35
- if (!this.buffer || buf.byteLength > this.bufferSize) {
36
- this.bufferSize = buf.byteLength;
62
+ // TODO - probably change
63
+ const backend = globalInfo.errorGetCanvas().getBackend();
64
+ const device = backend.getDeviceOrError();
65
+ if (!this.buffer || buf.byteLength > this.bufferCapacity) {
66
+ this.bufferCapacity = buf.byteLength;
37
67
  this.allocBuffer();
38
68
  }
39
69
  device.queue.writeBuffer(this.buffer, offset, buf.buffer, buf.byteOffset, buf.byteLength);
@@ -42,3 +72,7 @@ export class MemoBuffer {
42
72
  this.buffer?.destroy();
43
73
  }
44
74
  }
75
+ export class WebGLMemoBuffer extends MemoBuffer {
76
+ allocBuffer() { }
77
+ destroy() { }
78
+ }
@@ -5,3 +5,4 @@ export declare const xAxis: import("./types.js").Vector3;
5
5
  export declare const yAxis: import("./types.js").Vector3;
6
6
  export declare const zAxis: import("./types.js").Vector3;
7
7
  export declare const origin0: import("./types.js").Vector3;
8
+ export declare const FLOAT_SIZE = 4;
package/dist/constants.js CHANGED
@@ -7,3 +7,4 @@ export const xAxis = vector3(1);
7
7
  export const yAxis = vector3(0, 1);
8
8
  export const zAxis = vector3(0, 0, 1);
9
9
  export const origin0 = vector3();
10
+ export const FLOAT_SIZE = 4;
@@ -1,5 +1,6 @@
1
- import { CircleGeometryParams, CubeGeometryParams, EmptyParams, Spline2dGeometryParams, SquareGeometryParams, Vector3, LineGeometryParams, TraceLinesParams, LerpFunc } from './types.js';
1
+ import { CircleGeometryParams, CubeGeometryParams, Spline2dGeometryParams, SquareGeometryParams, Vector3, LineGeometryParams, TraceLinesParams, LerpFunc } from './types.js';
2
2
  import { CubicBezierCurve2d, SplinePoint2d } from './graphics.js';
3
+ export type EmptyParams = object;
3
4
  export declare abstract class Geometry<T extends EmptyParams> {
4
5
  private subdivision;
5
6
  private subdivisionVertexLimit;
@@ -12,7 +13,7 @@ export declare abstract class Geometry<T extends EmptyParams> {
12
13
  protected vertices: Vector3[];
13
14
  protected topology: 'list' | 'strip';
14
15
  constructor(geometryType?: 'list' | 'strip');
15
- getTopology(): "list" | "strip";
16
+ getTopology(): "strip" | "list";
16
17
  computeVertices(): void;
17
18
  compute(): void;
18
19
  triangulate(): void;
package/dist/geometry.js CHANGED
@@ -32,7 +32,8 @@ export class Geometry {
32
32
  outer: for (let i = 0; i < this.subdivision; i++) {
33
33
  const initialLength = initialVertices.length;
34
34
  for (let j = 0; j < initialLength - 1; j++) {
35
- if (this.subdivisionVertexLimit && this.vertices.length >= this.subdivisionVertexLimit)
35
+ if (this.subdivisionVertexLimit &&
36
+ this.vertices.length >= this.subdivisionVertexLimit)
36
37
  break outer;
37
38
  const vert = initialVertices[j];
38
39
  const nextVert = initialVertices[j + 1];
@@ -368,14 +369,17 @@ export class Spline2dGeometry extends Geometry {
368
369
  let atLimit = false;
369
370
  if (step * j * sectionRatio + distanceRatio > this.params.interpolateLimit) {
370
371
  atLimit = true;
371
- currentInterpolation = (this.params.interpolateLimit - distanceRatio) / sectionRatio;
372
+ currentInterpolation =
373
+ (this.params.interpolateLimit - distanceRatio) / sectionRatio;
372
374
  }
373
- if (currentInterpolation * sectionRatio + distanceRatio < this.params.interpolateStart) {
375
+ if (currentInterpolation * sectionRatio + distanceRatio <
376
+ this.params.interpolateStart) {
374
377
  continue;
375
378
  }
376
379
  if (!interpolationStarted) {
377
380
  interpolationStarted = true;
378
- currentInterpolation = (this.params.interpolateStart - distanceRatio) / sectionRatio;
381
+ currentInterpolation =
382
+ (this.params.interpolateStart - distanceRatio) / sectionRatio;
379
383
  j--;
380
384
  }
381
385
  if (!curveVertexIndexSet) {
package/dist/globals.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- /// <reference types="@webgpu/types" />
2
- import { Shader } from './shaders.js';
1
+ import { SimJSShader } from './shaders/shader.js';
2
+ import { SimJSWebGPUShader } from './shaders/webgpu.js';
3
3
  import { Simulation } from './simulation.js';
4
4
  import { Color } from './utils.js';
5
5
  declare class Logger {
@@ -13,23 +13,22 @@ declare class Logger {
13
13
  export declare const logger: Logger;
14
14
  export declare class GlobalInfo {
15
15
  private canvas;
16
- private device;
17
16
  private defaultColor;
17
+ private toInitShaders;
18
18
  constructor();
19
19
  setDefaultColor(color: Color): void;
20
20
  getDefaultColor(): Color;
21
21
  setCanvas(canvas: Simulation): void;
22
22
  errorGetCanvas(): Simulation;
23
23
  getCanvas(): Simulation | null;
24
- setDevice(device: GPUDevice): void;
25
- errorGetDevice(): GPUDevice;
26
- getDevice(): GPUDevice | null;
24
+ addToInitShader(shader: SimJSShader): void;
25
+ getToInitShaders(): SimJSShader[];
27
26
  }
28
27
  export declare const globalInfo: GlobalInfo;
29
28
  export declare class PipelineCache {
30
29
  private pipelines;
31
30
  constructor();
32
- getPipeline(device: GPUDevice, info: string, shader: Shader): GPURenderPipeline;
31
+ getPipeline(device: GPUDevice, info: string, shader: SimJSWebGPUShader): GPURenderPipeline;
33
32
  }
34
33
  export declare const pipelineCache: PipelineCache;
35
34
  export {};
package/dist/globals.js CHANGED
@@ -3,7 +3,7 @@ import { color } from './utils.js';
3
3
  class Logger {
4
4
  constructor() { }
5
5
  fmt(msg) {
6
- return `SimJS: ${msg}`;
6
+ return `(SimJS) ${msg}`;
7
7
  }
8
8
  log(msg) {
9
9
  console.log(this.fmt(msg));
@@ -21,12 +21,12 @@ class Logger {
21
21
  export const logger = new Logger();
22
22
  export class GlobalInfo {
23
23
  canvas;
24
- device;
25
24
  defaultColor;
25
+ toInitShaders;
26
26
  constructor() {
27
27
  this.canvas = null;
28
- this.device = null;
29
28
  this.defaultColor = null;
29
+ this.toInitShaders = [];
30
30
  }
31
31
  setDefaultColor(color) {
32
32
  this.defaultColor = color;
@@ -45,16 +45,11 @@ export class GlobalInfo {
45
45
  getCanvas() {
46
46
  return this.canvas;
47
47
  }
48
- setDevice(device) {
49
- this.device = device;
48
+ addToInitShader(shader) {
49
+ this.toInitShaders.push(shader);
50
50
  }
51
- errorGetDevice() {
52
- if (!this.device)
53
- throw logger.error('GPUDevice is null');
54
- return this.device;
55
- }
56
- getDevice() {
57
- return this.device;
51
+ getToInitShaders() {
52
+ return this.toInitShaders;
58
53
  }
59
54
  }
60
55
  export const globalInfo = new GlobalInfo();
@@ -1,17 +1,16 @@
1
- /// <reference types="@webgpu/types" />
2
1
  import type { Vector2, Vector3, LerpFunc, Mat4 } from './types.js';
3
2
  import { Vertex, Color } from './utils.js';
4
3
  import { BlankGeometry, CircleGeometry, CubeGeometry, Geometry, Line2dGeometry, Line3dGeometry, PlaneGeometry, PolygonGeometry, Spline2dGeometry, SquareGeometry, TraceLinesGeometry as TraceLinesGeometry } from './geometry.js';
5
4
  import { Float32ArrayCache } from './internalUtils.js';
6
- import { Shader } from './shaders.js';
5
+ import { SimJSShader } from './shaders/shader.js';
7
6
  import { Material } from './materials.js';
7
+ import { MemoBuffer } from './buffers/buffer.js';
8
8
  export declare abstract class SimulationElement3d {
9
9
  private children;
10
- private uniformBuffer;
11
10
  private prevInfo;
12
11
  private pipeline;
13
12
  protected id: string | null;
14
- protected shader: Shader;
13
+ protected shader: SimJSShader;
15
14
  protected material: Material;
16
15
  protected cullMode: GPUCullMode;
17
16
  protected parent: SimulationElement3d | null;
@@ -22,11 +21,15 @@ export declare abstract class SimulationElement3d {
22
21
  protected vertexCache: Float32ArrayCache;
23
22
  protected rotation: Vector3;
24
23
  protected modelMatrix: Mat4;
24
+ protected uniformBuffer: MemoBuffer | null;
25
25
  isInstance: boolean;
26
26
  isInstanced: boolean;
27
27
  is3d: boolean;
28
28
  isEmpty: boolean;
29
29
  constructor(pos: Vector3, rotation: Vector3, color?: Color);
30
+ delete(): void;
31
+ setUniformBuffer(buffer: MemoBuffer): void;
32
+ getUniformBuffer(): MemoBuffer | null;
30
33
  emptyShallow(): void;
31
34
  empty(): void;
32
35
  getId(): string | null;
@@ -49,19 +52,18 @@ export declare abstract class SimulationElement3d {
49
52
  setSubdivisionVertexLimit(limit: number): void;
50
53
  clearSubdivisionVertexLimit(): void;
51
54
  setCenterOffset(offset: Vector3): void;
52
- getShader(): Shader;
53
- setShader(shader: Shader): void;
55
+ getShader(): SimJSShader;
56
+ setShader(shader: SimJSShader): void;
54
57
  resetCenterOffset(): void;
55
58
  getModelMatrix(): Mat4;
56
59
  isTransparent(): boolean;
57
60
  getObjectInfo(): string;
58
- getUniformBuffer(): GPUBuffer;
59
61
  getPipeline(): GPURenderPipeline;
60
62
  protected mirrorParentTransforms3d(mat: Mat4): void;
61
63
  protected updateModelMatrix3d(): void;
62
64
  protected mirrorParentTransforms2d(mat: Mat4): void;
63
65
  protected updateModelMatrix2d(): void;
64
- getGeometryTopology(): "list" | "strip";
66
+ getGeometryTopology(): "strip" | "list";
65
67
  setWireframe(wireframe: boolean): void;
66
68
  isWireframe(): boolean;
67
69
  getMaterial(): Material;
@@ -81,9 +83,8 @@ export declare abstract class SimulationElement3d {
81
83
  getVertexCount(): number;
82
84
  getTreeVertexCount(): number;
83
85
  getIndexCount(): number;
84
- writeBuffers(): void;
85
- getVertexBuffer(): Float32Array;
86
- getIndexBuffer(): Uint32Array;
86
+ getVertexCallBuffer(): Float32Array<ArrayBufferLike>;
87
+ getIndexBuffer(): Uint32Array<ArrayBuffer>;
87
88
  }
88
89
  export declare class EmptyElement extends SimulationElement3d {
89
90
  protected geometry: BlankGeometry;
@@ -208,7 +209,7 @@ export declare class Spline2d extends SimulationElement2d {
208
209
  private length;
209
210
  constructor(pos: Vertex, points: SplinePoint2d[], thickness?: number, detail?: number);
210
211
  private setVertexColors;
211
- getVertexBuffer(): Float32Array;
212
+ getVertexCallBuffer(): Float32Array<ArrayBufferLike>;
212
213
  isTransparent(): boolean;
213
214
  private estimateLength;
214
215
  getLength(): number;
@@ -227,20 +228,18 @@ export declare class Instance<T extends SimulationElement3d> extends SimulationE
227
228
  private matrixBuffer;
228
229
  private baseMat;
229
230
  private maxInstances;
230
- private hasMapped;
231
231
  isInstance: boolean;
232
232
  constructor(obj: T, numInstances: number);
233
- setNumInstances(numInstances: number, forceResizeBuffer?: boolean): void;
233
+ setInstanceCount(numInstances: number, forceResizeBuffer?: boolean): void;
234
234
  setInstance(instance: number, transformation: Mat4): void;
235
- private mapBuffer;
236
- getInstances(): Mat4[];
237
- getNumInstances(): number;
238
- getInstanceBuffer(): GPUBuffer;
235
+ getInstanceMatrices(): Mat4[];
236
+ getInstanceCount(): number;
237
+ getInstanceBuffer(): Float32Array<ArrayBufferLike>;
239
238
  getTreeVertexCount(): number;
240
239
  getIndexCount(): number;
241
- getGeometryTopology(): "list" | "strip";
242
- getVertexBuffer(): Float32Array;
243
- getIndexBuffer(): Uint32Array;
240
+ getGeometryTopology(): "strip" | "list";
241
+ getVertexCallBuffer(): Float32Array<ArrayBufferLike>;
242
+ getIndexBuffer(): Uint32Array<ArrayBuffer>;
244
243
  getModelMatrix(): Mat4;
245
244
  }
246
245
  export declare class TraceLines2d extends SimulationElement2d {