@openbraininstitute/morphoviewer 0.31.0 → 0.32.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 (69) hide show
  1. package/dist/components/morpho-viewer-simul/painter/manager.d.ts.map +1 -1
  2. package/dist/components/morpho-viewer-simul/painter/manager.js +2 -2
  3. package/dist/components/morpho-viewer-simul/painter/offscreen-painter/offscreen-painter.d.ts.map +1 -1
  4. package/dist/components/morpho-viewer-simul/painter/offscreen-painter/offscreen-painter.js +2 -2
  5. package/dist/components/morpho-viewer-simul/types/public.d.ts +2 -1
  6. package/dist/components/morpho-viewer-simul/types/public.d.ts.map +1 -1
  7. package/dist/components/morpho-viewer-small-circuit/index.d.ts +1 -0
  8. package/dist/components/morpho-viewer-small-circuit/index.d.ts.map +1 -1
  9. package/dist/components/morpho-viewer-small-circuit/index.js +2 -1
  10. package/dist/components/morpho-viewer-small-circuit/painter/manager.d.ts +30 -2
  11. package/dist/components/morpho-viewer-small-circuit/painter/manager.d.ts.map +1 -1
  12. package/dist/components/morpho-viewer-small-circuit/painter/manager.js +341 -5
  13. package/dist/components/morpho-viewer-small-circuit/painter/offscreen-painter/index.d.ts +1 -0
  14. package/dist/components/morpho-viewer-small-circuit/painter/offscreen-painter/index.d.ts.map +1 -1
  15. package/dist/components/morpho-viewer-small-circuit/painter/offscreen-painter/index.js +2 -1
  16. package/dist/components/morpho-viewer-small-circuit/painter/offscreen-painter/offscreen-painter.d.ts +2 -0
  17. package/dist/components/morpho-viewer-small-circuit/painter/offscreen-painter/offscreen-painter.d.ts.map +1 -1
  18. package/dist/components/morpho-viewer-small-circuit/painter/offscreen-painter/offscreen-painter.js +19 -5
  19. package/dist/components/morpho-viewer-small-circuit/painter/offscreen-painter/segment-offscreen-painter.d.ts +24 -0
  20. package/dist/components/morpho-viewer-small-circuit/painter/offscreen-painter/segment-offscreen-painter.d.ts.map +1 -0
  21. package/dist/components/morpho-viewer-small-circuit/painter/offscreen-painter/segment-offscreen-painter.js +86 -0
  22. package/dist/components/morpho-viewer-small-circuit/painter/painter-cell/factory/section-index.d.ts +19 -0
  23. package/dist/components/morpho-viewer-small-circuit/painter/painter-cell/factory/section-index.d.ts.map +1 -0
  24. package/dist/components/morpho-viewer-small-circuit/painter/painter-cell/factory/section-index.js +69 -0
  25. package/dist/components/morpho-viewer-small-circuit/painter/painter-cell/factory/tree.d.ts +2 -0
  26. package/dist/components/morpho-viewer-small-circuit/painter/painter-cell/factory/tree.d.ts.map +1 -1
  27. package/dist/components/morpho-viewer-small-circuit/painter/painter-cell/factory/tree.js +65 -18
  28. package/dist/components/morpho-viewer-small-circuit/painter/painter-cell/painter-cell.d.ts +4 -1
  29. package/dist/components/morpho-viewer-small-circuit/painter/painter-cell/painter-cell.d.ts.map +1 -1
  30. package/dist/components/morpho-viewer-small-circuit/painter/painter-cell/painter-cell.js +19 -2
  31. package/dist/components/morpho-viewer-small-circuit/painter/painter-location-markers/index.d.ts +2 -0
  32. package/dist/components/morpho-viewer-small-circuit/painter/painter-location-markers/index.d.ts.map +1 -0
  33. package/dist/components/morpho-viewer-small-circuit/painter/painter-location-markers/index.js +2 -0
  34. package/dist/components/morpho-viewer-small-circuit/painter/painter-location-markers/painter-location-markers.d.ts +27 -0
  35. package/dist/components/morpho-viewer-small-circuit/painter/painter-location-markers/painter-location-markers.d.ts.map +1 -0
  36. package/dist/components/morpho-viewer-small-circuit/painter/painter-location-markers/painter-location-markers.js +83 -0
  37. package/dist/components/morpho-viewer-small-circuit/types.d.ts +40 -1
  38. package/dist/components/morpho-viewer-small-circuit/types.d.ts.map +1 -1
  39. package/dist/components/morpho-viewer-somas-only/manager/adaptative-resolution.d.ts +6 -2
  40. package/dist/components/morpho-viewer-somas-only/manager/adaptative-resolution.d.ts.map +1 -1
  41. package/dist/components/morpho-viewer-somas-only/manager/adaptative-resolution.js +63 -31
  42. package/dist/components/morpho-viewer-somas-only/manager/manager.d.ts +1 -0
  43. package/dist/components/morpho-viewer-somas-only/manager/manager.d.ts.map +1 -1
  44. package/dist/components/morpho-viewer-somas-only/manager/manager.js +19 -9
  45. package/dist/morphology-picking/index.d.ts +6 -0
  46. package/dist/morphology-picking/index.d.ts.map +1 -0
  47. package/dist/morphology-picking/index.js +5 -0
  48. package/dist/morphology-picking/material-index.d.ts.map +1 -0
  49. package/dist/morphology-picking/material-index.js +14 -0
  50. package/dist/morphology-picking/material-segment-index.d.ts +5 -0
  51. package/dist/morphology-picking/material-segment-index.d.ts.map +1 -0
  52. package/dist/morphology-picking/material-segment-index.js +14 -0
  53. package/dist/morphology-picking/section-offset.d.ts +4 -0
  54. package/dist/morphology-picking/section-offset.d.ts.map +1 -0
  55. package/dist/morphology-picking/section-offset.js +33 -0
  56. package/dist/morphology-picking/segment-index-codec.d.ts +4 -0
  57. package/dist/morphology-picking/segment-index-codec.d.ts.map +1 -0
  58. package/dist/morphology-picking/segment-index-codec.js +22 -0
  59. package/dist/morphology-picking/types.d.ts +12 -0
  60. package/dist/morphology-picking/types.d.ts.map +1 -0
  61. package/dist/morphology-picking/types.js +2 -0
  62. package/dist/package.json +2 -2
  63. package/package.json +1 -1
  64. package/dist/components/morpho-viewer-simul/painter/math.d.ts +0 -4
  65. package/dist/components/morpho-viewer-simul/painter/math.d.ts.map +0 -1
  66. package/dist/components/morpho-viewer-simul/painter/math.js +0 -33
  67. package/dist/components/morpho-viewer-simul/painter/offscreen-painter/material-index.d.ts.map +0 -1
  68. package/dist/components/morpho-viewer-simul/painter/offscreen-painter/material-index.js +0 -14
  69. /package/dist/{components/morpho-viewer-simul/painter/offscreen-painter → morphology-picking}/material-index.d.ts +0 -0
@@ -1,2 +1,3 @@
1
1
  export * from "./offscreen-painter";
2
+ export * from "./segment-offscreen-painter";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/morpho-viewer-small-circuit/painter/offscreen-painter/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/morpho-viewer-small-circuit/painter/offscreen-painter/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export * from "./offscreen-painter";
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb3JwaG8tdmlld2VyLXNtYWxsLWNpcmN1aXQvcGFpbnRlci9vZmZzY3JlZW4tcGFpbnRlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDIn0=
2
+ export * from "./segment-offscreen-painter";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb3JwaG8tdmlld2VyLXNtYWxsLWNpcmN1aXQvcGFpbnRlci9vZmZzY3JlZW4tcGFpbnRlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsNkJBQTZCLENBQUMifQ==
@@ -10,6 +10,7 @@ export declare class OffscreenPainter {
10
10
  private readonly onscreenContext;
11
11
  mix: number;
12
12
  readonly context: TgdContext;
13
+ resolutionDivider: number;
13
14
  private readonly offscreenCanvas;
14
15
  private readonly offscreenContext;
15
16
  private readonly group;
@@ -17,6 +18,7 @@ export declare class OffscreenPainter {
17
18
  private isDeleted;
18
19
  constructor(onscreenContext: TgdContext, options: OffscreenPainterOptions);
19
20
  getItemAt(xScreen: number, yScreen: number): MorphoViewerSmallCircuitCell | undefined;
21
+ getItemNear(xScreen: number, yScreen: number, radiusInPixels: number): MorphoViewerSmallCircuitCell | undefined;
20
22
  private readonly paint;
21
23
  delete(): void;
22
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"offscreen-painter.d.ts","sourceRoot":"","sources":["../../../../../src/components/morpho-viewer-small-circuit/painter/offscreen-painter/offscreen-painter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EAKX,MAAM,gBAAgB,CAAC;AAMxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,4BAA4B,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAElG,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,4BAA4B,EAAE,CAAC;IACxC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;IAC3E,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC,CAAC;CACzE;AAID,qBAAa,gBAAgB;IAWzB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAV3B,GAAG,SAAK;IACf,SAAgB,OAAO,EAAE,UAAU,CAAC;IAEpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,SAAS,CAAS;gBAGP,eAAe,EAAE,UAAU,EAC5C,OAAO,EAAE,uBAAuB;IAkClC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,4BAA4B,GAAG,SAAS;IAUrF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAWpB;IAEF,MAAM;CAKP"}
1
+ {"version":3,"file":"offscreen-painter.d.ts","sourceRoot":"","sources":["../../../../../src/components/morpho-viewer-small-circuit/painter/offscreen-painter/offscreen-painter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EAKX,MAAM,gBAAgB,CAAC;AAOxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,4BAA4B,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAElG,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,4BAA4B,EAAE,CAAC;IACxC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;IAC3E,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC,CAAC;CACzE;AAUD,qBAAa,gBAAgB;IAoBzB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAnB3B,GAAG,SAAK;IACf,SAAgB,OAAO,EAAE,UAAU,CAAC;IAS7B,iBAAiB,SAA8B;IAEtD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,SAAS,CAAS;gBAGP,eAAe,EAAE,UAAU,EAC5C,OAAO,EAAE,uBAAuB;IAkClC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,4BAA4B,GAAG,SAAS;IAiBrF,WAAW,CACT,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,4BAA4B,GAAG,SAAS;IAc3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CASpB;IAEF,MAAM;CAKP"}
@@ -1,11 +1,14 @@
1
1
  import { TgdContext, TgdPainterClear, TgdPainterGroup, TgdPainterState, webglPresetDepth, } from "@tolokoban/tgd";
2
+ import { spiralPixelOffsets } from "./../../../../morphology-picking";
2
3
  import { vec3ToInt16 } from "./../../../../utils";
3
4
  import { PainterCellId } from "../painter-cell";
4
5
  const FIRST_INDEX = 1;
6
+ const DEFAULT_RESOLUTION_DIVIDER = 4;
5
7
  export class OffscreenPainter {
6
8
  constructor(onscreenContext, options) {
7
9
  this.onscreenContext = onscreenContext;
8
10
  this.mix = 0;
11
+ this.resolutionDivider = DEFAULT_RESOLUTION_DIVIDER;
9
12
  this.offscreenCanvas = new OffscreenCanvas(1, 1);
10
13
  this.group = new TgdPainterGroup();
11
14
  this.isDeleted = false;
@@ -15,10 +18,8 @@ export class OffscreenPainter {
15
18
  const { onscreenContext, offscreenContext, offscreenCanvas } = this;
16
19
  offscreenContext.camera = onscreenContext.camera;
17
20
  const { canvas } = onscreenContext;
18
- const w = Math.ceil(canvas.width / 4);
19
- const h = Math.ceil(canvas.height / 4);
20
- offscreenCanvas.width = w;
21
- offscreenCanvas.height = h;
21
+ offscreenCanvas.width = Math.ceil(canvas.width / this.resolutionDivider);
22
+ offscreenCanvas.height = Math.ceil(canvas.height / this.resolutionDivider);
22
23
  offscreenContext.paint();
23
24
  };
24
25
  this.circuit = options.circuit;
@@ -59,10 +60,23 @@ export class OffscreenPainter {
59
60
  const index = vec3ToInt16([R * divider, G * divider, B * divider]) - FIRST_INDEX;
60
61
  return (_a = circuit[index]) !== null && _a !== void 0 ? _a : undefined;
61
62
  }
63
+ getItemNear(xScreen, yScreen, radiusInPixels) {
64
+ if (this.isDeleted)
65
+ return;
66
+ const { offscreenCanvas } = this;
67
+ const stepX = 2 / Math.max(1, offscreenCanvas.width);
68
+ const stepY = 2 / Math.max(1, offscreenCanvas.height);
69
+ for (const [dx, dy] of spiralPixelOffsets(radiusInPixels)) {
70
+ const found = this.getItemAt(xScreen + dx * stepX, yScreen + dy * stepY);
71
+ if (found)
72
+ return found;
73
+ }
74
+ return undefined;
75
+ }
62
76
  delete() {
63
77
  this.onscreenContext.eventPaint.removeListener(this.paint);
64
78
  this.offscreenContext.delete();
65
79
  this.isDeleted = true;
66
80
  }
67
81
  }
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2Zmc2NyZWVuLXBhaW50ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb3JwaG8tdmlld2VyLXNtYWxsLWNpcmN1aXQvcGFpbnRlci9vZmZzY3JlZW4tcGFpbnRlci9vZmZzY3JlZW4tcGFpbnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLGVBQWUsRUFDZixlQUFlLEVBQ2YsZUFBZSxFQUNmLGdCQUFnQixHQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBV2hELE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQUV0QixNQUFNLE9BQU8sZ0JBQWdCO0lBVTNCLFlBQ21CLGVBQTJCLEVBQzVDLE9BQWdDO1FBRGYsb0JBQWUsR0FBZixlQUFlLENBQVk7UUFWdkMsUUFBRyxHQUFHLENBQUMsQ0FBQztRQUdFLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTVDLFVBQUssR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBRXZDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFnRFQsVUFBSyxHQUFHLEdBQUcsRUFBRTtZQUM1QixJQUFJLElBQUksQ0FBQyxTQUFTO2dCQUFFLE9BQU87WUFFM0IsTUFBTSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDcEUsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDakQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQztZQUNuQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcs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
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2Zmc2NyZWVuLXBhaW50ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb3JwaG8tdmlld2VyLXNtYWxsLWNpcmN1aXQvcGFpbnRlci9vZmZzY3JlZW4tcGFpbnRlci9vZmZzY3JlZW4tcGFpbnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLGVBQWUsRUFDZixlQUFlLEVBQ2YsZUFBZSxFQUNmLGdCQUFnQixHQUNqQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBV2hELE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQU10QixNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQztBQUVyQyxNQUFNLE9BQU8sZ0JBQWdCO0lBbUIzQixZQUNtQixlQUEyQixFQUM1QyxPQUFnQztRQURmLG9CQUFlLEdBQWYsZUFBZSxDQUFZO1FBbkJ2QyxRQUFHLEdBQUcsQ0FBQyxDQUFDO1FBVVIsc0JBQWlCLEdBQUcsMEJBQTBCLENBQUM7UUFFckMsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFNUMsVUFBSyxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFFdkMsY0FBUyxHQUFHLEtBQUssQ0FBQztRQXlFVCxVQUFLLEdBQUcsR0FBRyxFQUFFO1lBQzVCLElBQUksSUFBSSxDQUFDLFNBQVM7Z0JBQUUsT0FBTztZQUUzQixNQUFNLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQztZQUNwRSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDLE1B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
@@ -0,0 +1,24 @@
1
+ import { TgdContext } from "@tolokoban/tgd";
2
+ import type { MorphoViewerSmallCircuitCell, MorphoViewerSmallCircuitCellData } from "../../types";
3
+ import type { CellSectionIndex, CellSegment } from "../painter-cell/factory/section-index";
4
+ export interface SegmentOffscreenPainterOptions {
5
+ circuit: MorphoViewerSmallCircuitCell[];
6
+ loadCell: (id: string) => Promise<MorphoViewerSmallCircuitCellData | null>;
7
+ onCellLoaded?: () => void;
8
+ }
9
+ export declare class SegmentOffscreenPainter {
10
+ private readonly onscreenContext;
11
+ readonly context: TgdContext;
12
+ private readonly offscreenCanvas;
13
+ private readonly offscreenContext;
14
+ private readonly group;
15
+ private readonly cellPainters;
16
+ private isDeleted;
17
+ constructor(onscreenContext: TgdContext, options: SegmentOffscreenPainterOptions);
18
+ getSections(cell: MorphoViewerSmallCircuitCell): CellSectionIndex | null;
19
+ getSegmentNear(cell: MorphoViewerSmallCircuitCell, xScreen: number, yScreen: number, radiusInPixels: number): CellSegment | undefined;
20
+ private getSegmentAt;
21
+ private readonly paint;
22
+ delete(): void;
23
+ }
24
+ //# sourceMappingURL=segment-offscreen-painter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment-offscreen-painter.d.ts","sourceRoot":"","sources":["../../../../../src/components/morpho-viewer-small-circuit/painter/offscreen-painter/segment-offscreen-painter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAKX,MAAM,gBAAgB,CAAC;AAMxB,OAAO,KAAK,EAAE,4BAA4B,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAa3F,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,4BAA4B,EAAE,CAAC;IACxC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;IAO3E,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,qBAAa,uBAAuB;IAWhC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAVlC,SAAgB,OAAO,EAAE,UAAU,CAAC;IAEpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAC7D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAE/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,SAAS,CAAS;gBAGP,eAAe,EAAE,UAAU,EAC5C,OAAO,EAAE,8BAA8B;IAmCzC,WAAW,CAAC,IAAI,EAAE,4BAA4B,GAAG,gBAAgB,GAAG,IAAI;IAWxE,cAAc,CACZ,IAAI,EAAE,4BAA4B,EAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,WAAW,GAAG,SAAS;IAa1B,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CASpB;IAEF,MAAM;CAUP"}
@@ -0,0 +1,86 @@
1
+ import { TgdContext, TgdPainterClear, TgdPainterGroup, TgdPainterState, webglPresetDepth, } from "@tolokoban/tgd";
2
+ import { decodeSegmentIndex, spiralPixelOffsets } from "./../../../../morphology-picking";
3
+ import { PainterCell } from "../painter-cell";
4
+ const RESOLUTION_DIVIDER = 2;
5
+ export class SegmentOffscreenPainter {
6
+ constructor(onscreenContext, options) {
7
+ this.onscreenContext = onscreenContext;
8
+ this.offscreenCanvas = new OffscreenCanvas(1, 1);
9
+ this.group = new TgdPainterGroup();
10
+ this.cellPainters = new Map();
11
+ this.isDeleted = false;
12
+ this.paint = () => {
13
+ if (this.isDeleted)
14
+ return;
15
+ const { onscreenContext, offscreenContext, offscreenCanvas } = this;
16
+ offscreenContext.camera = onscreenContext.camera;
17
+ const { canvas } = onscreenContext;
18
+ offscreenCanvas.width = Math.ceil(canvas.width / RESOLUTION_DIVIDER);
19
+ offscreenCanvas.height = Math.ceil(canvas.height / RESOLUTION_DIVIDER);
20
+ offscreenContext.paint();
21
+ };
22
+ onscreenContext.eventPaint.addListener(this.paint);
23
+ const context = new TgdContext(this.offscreenCanvas, {
24
+ preserveDrawingBuffer: true,
25
+ antialias: false,
26
+ alpha: false,
27
+ depth: true,
28
+ name: "SegmentOffscreenPainter",
29
+ });
30
+ this.context = context;
31
+ context.camera = onscreenContext.camera;
32
+ this.offscreenContext = context;
33
+ context.add(new TgdPainterClear(context, { color: [0, 0, 0, 0], depth: 1 }), new TgdPainterState(context, {
34
+ depth: webglPresetDepth.less,
35
+ children: [this.group],
36
+ }));
37
+ for (const cell of options.circuit) {
38
+ const painter = new PainterCell(context, {
39
+ cell,
40
+ loadCell: options.loadCell,
41
+ matrerial: "segment",
42
+ onCellLoaded: () => { var _a; return (_a = options.onCellLoaded) === null || _a === void 0 ? void 0 : _a.call(options); },
43
+ });
44
+ this.cellPainters.set(cell.id, painter);
45
+ this.group.add(painter);
46
+ }
47
+ this.paint();
48
+ }
49
+ getSections(cell) {
50
+ var _a, _b;
51
+ return (_b = (_a = this.cellPainters.get(cell.id)) === null || _a === void 0 ? void 0 : _a.sections) !== null && _b !== void 0 ? _b : null;
52
+ }
53
+ getSegmentNear(cell, xScreen, yScreen, radiusInPixels) {
54
+ if (this.isDeleted)
55
+ return;
56
+ const { offscreenCanvas } = this;
57
+ const stepX = 2 / Math.max(1, offscreenCanvas.width);
58
+ const stepY = 2 / Math.max(1, offscreenCanvas.height);
59
+ for (const [dx, dy] of spiralPixelOffsets(radiusInPixels)) {
60
+ const found = this.getSegmentAt(cell, xScreen + dx * stepX, yScreen + dy * stepY);
61
+ if (found)
62
+ return found;
63
+ }
64
+ return undefined;
65
+ }
66
+ getSegmentAt(cell, xScreen, yScreen) {
67
+ const sections = this.getSections(cell);
68
+ if (!sections)
69
+ return;
70
+ const [R, G, B] = this.offscreenContext.readPixel(xScreen, yScreen);
71
+ const value = (R + G * 256 + B * 256 * 256) / 0xffffff;
72
+ const index = decodeSegmentIndex(value, sections.length);
73
+ if (index < 0)
74
+ return;
75
+ return sections.get(index);
76
+ }
77
+ delete() {
78
+ this.onscreenContext.eventPaint.removeListener(this.paint);
79
+ for (const painter of this.cellPainters.values())
80
+ painter.delete();
81
+ this.offscreenContext.delete();
82
+ this.cellPainters.clear();
83
+ this.isDeleted = true;
84
+ }
85
+ }
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudC1vZmZzY3JlZW4tcGFpbnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vcnBoby12aWV3ZXItc21hbGwtY2lyY3VpdC9wYWludGVyL29mZnNjcmVlbi1wYWludGVyL3NlZ21lbnQtb2Zmc2NyZWVuLXBhaW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsRUFDVixlQUFlLEVBQ2YsZUFBZSxFQUNmLGVBQWUsRUFDZixnQkFBZ0IsR0FDakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFjOUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFjN0IsTUFBTSxPQUFPLHVCQUF1QjtJQVVsQyxZQUNtQixlQUEyQixFQUM1QyxPQUF1QztRQUR0QixvQkFBZSxHQUFmLGVBQWUsQ0FBWTtRQVI3QixvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU1QyxVQUFLLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUU5QixpQkFBWSxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBQ3ZELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFvRlQsVUFBSyxHQUFHLEdBQUcsRUFBRTtZQUM1QixJQUFJLElBQUksQ0FBQyxTQUFTO2dCQUFFLE9BQU87WUFFM0IsTUFBTSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDcEUsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDakQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQztZQUNuQyxlQUFlLENB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
@@ -0,0 +1,19 @@
1
+ import type { ArrayNumber3 } from "@tolokoban/tgd";
2
+ import type { MorphoViewerTreeItem, MorphoViewerTreeItemType } from "../../../../morpho-viewer-simul";
3
+ import type { PickableSegment, SectionSegmentIndex } from "../../../../../morphology-picking";
4
+ export interface CellSegment extends PickableSegment {
5
+ index: number;
6
+ sonataSectionId?: number;
7
+ sectionType: MorphoViewerTreeItemType;
8
+ }
9
+ export declare class CellSectionIndex implements SectionSegmentIndex {
10
+ private readonly segments;
11
+ private readonly bySection;
12
+ add(item: MorphoViewerTreeItem, start: ArrayNumber3, end: ArrayNumber3): CellSegment;
13
+ get length(): number;
14
+ get(index: number): CellSegment | undefined;
15
+ getSegmentsOfSection(sectionName: string): CellSegment[];
16
+ getSectionType(sectionName: string): MorphoViewerTreeItemType | undefined;
17
+ getPointAtOffset(sectionName: string, offset: number): ArrayNumber3 | null;
18
+ }
19
+ //# sourceMappingURL=section-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/morpho-viewer-small-circuit/painter/painter-cell/factory/section-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EACV,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGjF,MAAM,WAAW,WAAY,SAAQ,eAAe;IAElD,KAAK,EAAE,MAAM,CAAC;IAEd,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,WAAW,EAAE,wBAAwB,CAAC;CACvC;AASD,qBAAa,gBAAiB,YAAW,mBAAmB;IAC1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAQ9D,GAAG,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,GAAG,WAAW;IAuBpF,IAAI,MAAM,IAAI,MAAM,CAEnB;IAGD,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI3C,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE;IASxD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS;IASzE,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;CAkB3E"}
@@ -0,0 +1,69 @@
1
+ export class CellSectionIndex {
2
+ constructor() {
3
+ this.segments = [];
4
+ this.bySection = new Map();
5
+ }
6
+ add(item, start, end) {
7
+ var _a;
8
+ const sectionName = item.sectionId;
9
+ const siblings = (_a = this.bySection.get(sectionName)) !== null && _a !== void 0 ? _a : [];
10
+ const parsed = Number.parseInt(item.segmentId, 10);
11
+ const segment = {
12
+ index: this.segments.length,
13
+ sectionName,
14
+ segmentIndex: Number.isNaN(parsed) ? siblings.length : parsed,
15
+ segmentLength: distance(start, end),
16
+ start,
17
+ end,
18
+ sonataSectionId: item.sonataSectionId,
19
+ sectionType: item.type,
20
+ };
21
+ this.segments.push(segment);
22
+ siblings.push(segment);
23
+ this.bySection.set(sectionName, siblings);
24
+ return segment;
25
+ }
26
+ get length() {
27
+ return this.segments.length;
28
+ }
29
+ get(index) {
30
+ return this.segments[index];
31
+ }
32
+ getSegmentsOfSection(sectionName) {
33
+ var _a;
34
+ return (_a = this.bySection.get(sectionName)) !== null && _a !== void 0 ? _a : [];
35
+ }
36
+ getSectionType(sectionName) {
37
+ var _a, _b;
38
+ return (_b = (_a = this.bySection.get(sectionName)) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.sectionType;
39
+ }
40
+ getPointAtOffset(sectionName, offset) {
41
+ const segments = this.getSegmentsOfSection(sectionName);
42
+ if (segments.length === 0)
43
+ return null;
44
+ const total = segments.reduce((sum, segment) => sum + segment.segmentLength, 0);
45
+ if (total <= 0)
46
+ return segments[0].start;
47
+ const target = Math.min(Math.max(offset, 0), 1) * total;
48
+ let walked = 0;
49
+ for (const segment of segments) {
50
+ if (walked + segment.segmentLength >= target) {
51
+ const within = segment.segmentLength > 0 ? (target - walked) / segment.segmentLength : 0;
52
+ return lerp(segment.start, segment.end, within);
53
+ }
54
+ walked += segment.segmentLength;
55
+ }
56
+ return segments[segments.length - 1].end;
57
+ }
58
+ }
59
+ function lerp(from, to, alpha) {
60
+ return [
61
+ from[0] + (to[0] - from[0]) * alpha,
62
+ from[1] + (to[1] - from[1]) * alpha,
63
+ from[2] + (to[2] - from[2]) * alpha,
64
+ ];
65
+ }
66
+ function distance([x1, y1, z1], [x2, y2, z2]) {
67
+ return Math.sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2) + Math.pow((z1 - z2), 2));
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi1pbmRleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vcnBoby12aWV3ZXItc21hbGwtY2lyY3VpdC9wYWludGVyL3BhaW50ZXItY2VsbC9mYWN0b3J5L3NlY3Rpb24taW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0JBLE1BQU0sT0FBTyxnQkFBZ0I7SUFBN0I7UUFDbUIsYUFBUSxHQUFrQixFQUFFLENBQUM7UUFDN0IsY0FBUyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBNEVoRSxDQUFDO0lBcEVDLEdBQUcsQ0FBQyxJQUEwQixFQUFFLEtBQW1CLEVBQUUsR0FBaUI7O1FBQ3BFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsTUFBQSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsbUNBQUksRUFBRSxDQUFDO1FBQ3ZELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxNQUFNLE9BQU8sR0FBZ0I7WUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUMzQixXQUFXO1lBR1gsWUFBWSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDN0QsYUFBYSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ25DLEtBQUs7WUFDTCxHQUFHO1lBQ0gsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSTtTQUN2QixDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFD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
@@ -1,7 +1,9 @@
1
1
  import { TgdBoundingBox, type TgdContext, type TgdMaterial, TgdPainterNode } from "@tolokoban/tgd";
2
2
  import { type MorphoViewerTree } from "../../../../morpho-viewer-simul";
3
+ import { CellSectionIndex } from "./section-index";
3
4
  export declare function createCellFromTree(context: TgdContext, material: TgdMaterial, tree: MorphoViewerTree, forSelection: boolean): {
4
5
  bbox: TgdBoundingBox;
5
6
  node: TgdPainterNode;
7
+ sections: CellSectionIndex;
6
8
  };
7
9
  //# sourceMappingURL=tree.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../../../../../src/components/morpho-viewer-small-circuit/painter/painter-cell/factory/tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,cAAc,EAGf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,kCAAkC,CAAC;AAE1C,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,gBAAgB,EACtB,YAAY,EAAE,OAAO,GACpB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAoChD"}
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../../../../../src/components/morpho-viewer-small-circuit/painter/painter-cell/factory/tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,cAAc,EACd,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,cAAc,EAGf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAenD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,gBAAgB,EACtB,YAAY,EAAE,OAAO,GACpB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAA;CAAE,CAgF5E"}
@@ -1,10 +1,34 @@
1
1
  import { TgdBoundingBox, TgdPainterNode, TgdPainterSegments, TgdPainterSegmentsData, } from "@tolokoban/tgd";
2
2
  import { MorphoViewerTreeItemType, } from "./../../../../morpho-viewer-simul";
3
+ import { encodeSegmentIndex } from "./../../../../../morphology-picking";
4
+ import { CellSectionIndex } from "./section-index";
3
5
  export function createCellFromTree(context, material, tree, forSelection) {
6
+ var _a;
7
+ const pending = [];
8
+ for (const item of tree.roots) {
9
+ collectSegments(undefined, item, pending);
10
+ }
11
+ const sections = new CellSectionIndex();
4
12
  const segmentsSoma = new TgdPainterSegmentsData();
5
13
  const segmentsNeurites = new TgdPainterSegmentsData();
6
- for (const item of tree.roots) {
7
- fillSegments(undefined, item, segmentsSoma, segmentsNeurites);
14
+ const somaSphere = fitSomaSphere(pending);
15
+ let somaDrawn = false;
16
+ for (const segment of pending) {
17
+ const recorded = sections.add(segment.item, segment.start, segment.end);
18
+ const uv0 = makeUV(segment.parentType, recorded.index, pending.length);
19
+ const uv1 = makeUV(segment.item.type, recorded.index, pending.length);
20
+ const target = segment.isSoma ? segmentsSoma : segmentsNeurites;
21
+ if (segment.isSoma) {
22
+ const radius = somaDrawn ? 0 : somaSphere.radius;
23
+ somaDrawn = true;
24
+ target.add([...somaSphere.center, radius], [...somaSphere.center, radius], uv1, uv1);
25
+ continue;
26
+ }
27
+ const stubOffSoma = ((_a = segment.parent) === null || _a === void 0 ? void 0 : _a.type) === MorphoViewerTreeItemType.Soma;
28
+ target.add([
29
+ ...(stubOffSoma ? somaSphere.center : segment.start),
30
+ stubOffSoma ? Math.min(segment.radiusStart, segment.radiusEnd) : segment.radiusStart,
31
+ ], [...segment.end, segment.radiusEnd], stubOffSoma ? uv1 : uv0, uv1);
8
32
  }
9
33
  const bbox = new TgdBoundingBox();
10
34
  for (const segments of [segmentsSoma, segmentsNeurites]) {
@@ -32,32 +56,55 @@ export function createCellFromTree(context, material, tree, forSelection) {
32
56
  painterNeurites.name = "painterNeurites";
33
57
  return {
34
58
  bbox,
59
+ sections,
35
60
  node: new TgdPainterNode({
36
61
  children: [painterSoma, painterNeurites],
37
62
  }),
38
63
  };
39
64
  }
40
- function fillSegments(parent, item, segmentsSoma, segmentsNeurites) {
41
- var _a, _b;
42
- const u1 = computeCoordU(item.type);
43
- const v1 = 0;
44
- const uv1 = [u1, v1];
45
- const u0 = computeCoordU((_a = parent === null || parent === void 0 ? void 0 : parent.type) !== null && _a !== void 0 ? _a : u1);
46
- const v0 = v1;
47
- const uv0 = [u0, v0];
48
- if (!parent) {
49
- segmentsSoma.add([item.x, item.y, item.z, item.radius], [item.x, item.y, item.z, item.radius], uv1, uv1);
65
+ function fitSomaSphere(pending) {
66
+ const points = [];
67
+ for (const segment of pending) {
68
+ if (segment.isSoma)
69
+ points.push({ p: segment.end, r: segment.radiusEnd });
50
70
  }
51
- else if (item.type === MorphoViewerTreeItemType.Soma) {
52
- segmentsSoma.add([parent.x, parent.y, parent.z, parent.radius], [item.x, item.y, item.z, item.radius], uv0, uv1);
71
+ if (!points.length)
72
+ return { center: [0, 0, 0], radius: 0 };
73
+ const center = [0, 0, 0];
74
+ for (const { p } of points) {
75
+ center[0] += p[0] / points.length;
76
+ center[1] += p[1] / points.length;
77
+ center[2] += p[2] / points.length;
53
78
  }
54
- else {
55
- segmentsNeurites.add([parent.x, parent.y, parent.z, parent.radius], [item.x, item.y, item.z, item.radius], uv0, uv1);
79
+ let meanDistance = 0;
80
+ let maxRadius = 0;
81
+ for (const { p, r } of points) {
82
+ meanDistance +=
83
+ Math.hypot(p[0] - center[0], p[1] - center[1], p[2] - center[2]) / points.length;
84
+ maxRadius = Math.max(maxRadius, r);
56
85
  }
86
+ return { center, radius: Math.max(meanDistance, maxRadius) };
87
+ }
88
+ function collectSegments(parent, item, pending) {
89
+ var _a, _b;
90
+ const from = parent !== null && parent !== void 0 ? parent : item;
91
+ pending.push({
92
+ item,
93
+ parent,
94
+ parentType: (_a = parent === null || parent === void 0 ? void 0 : parent.type) !== null && _a !== void 0 ? _a : item.type,
95
+ start: [from.x, from.y, from.z],
96
+ end: [item.x, item.y, item.z],
97
+ radiusStart: from.radius,
98
+ radiusEnd: item.radius,
99
+ isSoma: !parent || item.type === MorphoViewerTreeItemType.Soma,
100
+ });
57
101
  for (const child of (_b = item.children) !== null && _b !== void 0 ? _b : []) {
58
- fillSegments(item, child, segmentsSoma, segmentsNeurites);
102
+ collectSegments(item, child, pending);
59
103
  }
60
104
  }
105
+ function makeUV(type, segmentIndex, segmentCount) {
106
+ return [computeCoordU(type), encodeSegmentIndex(segmentIndex, segmentCount)];
107
+ }
61
108
  function computeCoordU(type) {
62
109
  const types = [
63
110
  MorphoViewerTreeItemType.Soma,
@@ -69,4 +116,4 @@ function computeCoordU(type) {
69
116
  ];
70
117
  return (types.indexOf(type) + 0.5) / types.length;
71
118
  }
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vcnBoby12aWV3ZXItc21hbGwtY2lyY3VpdC9wYWludGVyL3BhaW50ZXItY2VsbC9mYWN0b3J5L3RyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGNBQWMsRUFHZCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLHNCQUFzQixHQUN2QixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFHTCx3QkFBd0IsR0FDekIsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxQyxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLE9BQW1CLEVBQ25CLFFBQXFCLEVBQ3JCLElBQXNCLEVBQ3RCLFlBQXFCO0lBRXJCLE1BQU0sWUFBWSxHQUFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQztJQUNsRCxNQUFNLGdCQUFnQixHQUFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQztJQUN0RCxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixZQUFZLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztJQUNsQyxLQUFLLE1BQU0sUUFBUSxJQUFJLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUN4RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUU7UUFDbEQsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2hDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLFFBQVE7UUFDUixPQUFPLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRTtLQUNwQyxDQUFDLENBQUM7SUFDSCxXQUFXLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztJQUNqQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGtCQUFrQixDQUFDLE9BQU8sRUFBRTtRQUN0RCxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsU0FBUyxFQUFFLENBQUM7UUFDWixnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxRQUFRO1FBQ1IsT0FBTyxFQUFFLGdCQUFnQixDQUFDLFdBQVcsRUFBRTtLQUN4QyxDQUFDLENBQUM7SUFDSCxlQUFlLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO0lBQ3pDLE9BQU87UUFDTCxJQUFJO1FBQ0osSUFBSSxFQUFFLElBQUksY0FBYyxDQUFDO1lBQ3ZCLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUM7U0FDekMsQ0FBQztLQUNILENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQ25CLE1BQXdDLEVBQ3hDLElBQTBCLEVBQzFCLFlBQW9DLEVBQ3BDLGdCQUF3Qzs7SUFFeEMsTUFBTSxFQUFFLEdBQVcsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDYixNQUFNLEdBQUcsR0FBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkMsTUFBTSxFQUFFLEdBQVcsYUFBYSxDQUFDLE1BQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLElBQUksbUNBQUksRUFBRSxDQUFDLENBQUM7SUFDckQsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2QsTUFBTSxHQUFHLEdBQWlCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLFlBQVksQ0FBQyxHQUFHLENBQ2QsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQ3JDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUNyQyxHQUFHLEVBQ0gsR0FBRyxDQUNKLENBQUM7SUFDSixDQUFDO1NBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZELFlBQVksQ0FBQyxHQUFHLENBQ2QsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQzdDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUNyQyxHQUFHLEVBQ0gsR0FBRyxDQUNKLENBQUM7SUFDSixDQUFDO1NBQU0sQ0FBQztRQUNOLGdCQUFnQixDQUFDLEdBQUcsQ0FDbEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQzdDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUNyQyxHQUFHLEVBQ0gsR0FBRyxDQUNKLENBQUM7SUFDSixDQUFDO0lBQ0QsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFBLElBQUksQ0FBQyxRQUFRLG1DQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3hDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzVELENBQUM7QUFDSCxDQUFDO0FBTUQsU0FBUyxhQUFhLENBQUMsSUFBOEI7SUFDbkQsTUFBTSxLQUFLLEdBQStCO1FBQ3hDLHdCQUF3QixDQUFDLElBQUk7UUFDN0Isd0JBQXdCLENBQUMsSUFBSTtRQUM3Qix3QkFBd0IsQ0FBQyxhQUFhO1FBQ3RDLHdCQUF3QixDQUFDLGNBQWM7UUFDdkMsd0JBQXdCLENBQUMsTUFBTTtRQUMvQix3QkFBd0IsQ0FBQyxPQUFPO0tBQ2pDLENBQUM7SUFDRixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ3BELENBQUMifQ==
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vcnBoby12aWV3ZXItc21hbGwtY2lyY3VpdC9wYWludGVyL3BhaW50ZXItY2VsbC9mYWN0b3J5L3RyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlMLGNBQWMsRUFHZCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLHNCQUFzQixHQUN2QixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFHTCx3QkFBd0IsR0FDekIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWVuRCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLE9BQW1CLEVBQ25CLFFBQXFCLEVBQ3JCLElBQXNCLEVBQ3RCLFlBQXFCOztJQUlyQixNQUFNLE9BQU8sR0FBcUIsRUFBRSxDQUFDO0lBQ3JDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLGVBQWUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFJRCxNQUFNLFFBQVEsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7SUFDeEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO0lBQ3RELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFdEIsS0FBSyxNQUFNLE9BQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFD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QUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBRTVELE1BQU0sTUFBTSxHQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkMsS0FBSyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDcEMsQ0FBQztJQUNELElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztJQUNyQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbEIsS0FBSyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzlCLFlBQVk7WUFDVixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNuRixTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7QUFDL0QsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUN0QixNQUF3QyxFQUN4QyxJQUEwQixFQUMxQixPQUF5Qjs7SUFFekIsTUFBTSxJQUFJLEdBQUcsTUFBTSxhQUFOLE1BQU0sY0FBTixNQUFNLEdBQUksSUFBSSxDQUFDO0lBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDWCxJQUFJO1FBQ0osTUFBTTtRQUNOLFVBQVUsRUFBRSxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxJQUFJLG1DQUFJLElBQUksQ0FBQyxJQUFJO1FBQ3JDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9CLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdCLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTTtRQUN4QixTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU07UUFHdEIsTUFBTSxFQUFFLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsSUFBSTtLQUMvRCxDQUFDLENBQUM7SUFDSCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQUEsSUFBSSxDQUFDLFFBQVEsbUNBQUksRUFBRSxFQUFFLENBQUM7UUFDeEMsZUFBZSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztBQUNILENBQUM7QUFTRCxTQUFTLE1BQU0sQ0FDYixJQUE4QixFQUM5QixZQUFvQixFQUNwQixZQUFvQjtJQUVwQixPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLGtCQUFrQixDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFNRCxTQUFTLGFBQWEsQ0FBQyxJQUE4QjtJQUNuRCxNQUFNLEtBQUssR0FBK0I7UUFDeEMsd0JBQXdCLENBQUMsSUFBSTtRQUM3Qix3QkFBd0IsQ0FBQyxJQUFJO1FBQzdCLHdCQUF3QixDQUFDLGFBQWE7UUFDdEMsd0JBQXdCLENBQUMsY0FBYztRQUN2Qyx3QkFBd0IsQ0FBQyxNQUFNO1FBQy9CLHdCQUF3QixDQUFDLE9BQU87S0FDakMsQ0FBQztJQUNGLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDcEQsQ0FBQyJ9
@@ -1,5 +1,6 @@
1
1
  import { TgdBoundingBox, type TgdContext, TgdPainterGroup } from "@tolokoban/tgd";
2
2
  import type { MorphoViewerSmallCircuitCell, MorphoViewerSmallCircuitCellData } from "../../types";
3
+ import type { CellSectionIndex } from "./factory/section-index";
3
4
  export interface PainterCellOptions {
4
5
  name?: string;
5
6
  matrerial?: PainterCellMaterialName;
@@ -8,7 +9,7 @@ export interface PainterCellOptions {
8
9
  onCellLoaded?(bbox: TgdBoundingBox | null): void;
9
10
  opacity?: number;
10
11
  }
11
- export type PainterCellMaterialName = "full" | "flat" | number;
12
+ export type PainterCellMaterialName = "full" | "flat" | "segment" | number;
12
13
  export declare class PainterCell extends TgdPainterGroup {
13
14
  readonly context: TgdContext;
14
15
  protected readonly options: PainterCellOptions;
@@ -19,8 +20,10 @@ export declare class PainterCell extends TgdPainterGroup {
19
20
  private readonly textureBlack;
20
21
  private _isDeleted;
21
22
  private _bbox;
23
+ private _sections;
22
24
  constructor(context: TgdContext, options: PainterCellOptions);
23
25
  get bbox(): Readonly<TgdBoundingBox>;
26
+ get sections(): CellSectionIndex | null;
24
27
  get isDeleted(): boolean;
25
28
  private set isDeleted(value);
26
29
  get black(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"painter-cell.d.ts","sourceRoot":"","sources":["../../../../../src/components/morpho-viewer-small-circuit/painter/painter-cell/painter-cell.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,KAAK,UAAU,EAQf,eAAe,EAOhB,MAAM,gBAAgB,CAAC;AAQxB,OAAO,KAAK,EACV,4BAA4B,EAC5B,gCAAgC,EAEjC,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,IAAI,EAAE,4BAA4B,CAAC;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;IAKvE,YAAY,CAAC,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;IAEjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE/D,qBAAa,WAAY,SAAQ,eAAe;aAW5B,OAAO,EAAE,UAAU;IACnC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB;IAXhD,OAAO,CAAC,MAAM,CAAC,EAAE,CAAK;IAEtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAe;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAwB;gBAGnB,OAAO,EAAE,UAAU,EAChB,OAAO,EAAE,kBAAkB;IAmDhD,IAAI,IAAI,IAAI,QAAQ,CAAC,cAAc,CAAC,CAEnC;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IACD,OAAO,KAAK,SAAS,QAIpB;IAGD,IAAI,KAAK,IAGQ,OAAO,CADvB;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,EAQvB;IAED,IAAI,OAAO,IAAI,MAAM,CAMpB;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAK1B;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;YAM1B,QAAQ;IAoCtB,MAAM,IAAI,IAAI;CAKf"}
1
+ {"version":3,"file":"painter-cell.d.ts","sourceRoot":"","sources":["../../../../../src/components/morpho-viewer-small-circuit/painter/painter-cell/painter-cell.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,KAAK,UAAU,EAQf,eAAe,EAOhB,MAAM,gBAAgB,CAAC;AASxB,OAAO,KAAK,EACV,4BAA4B,EAC5B,gCAAgC,EAEjC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,IAAI,EAAE,4BAA4B,CAAC;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;IAKvE,YAAY,CAAC,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;IAEjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAO3E,qBAAa,WAAY,SAAQ,eAAe;aAY5B,OAAO,EAAE,UAAU;IACnC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB;IAZhD,OAAO,CAAC,MAAM,CAAC,EAAE,CAAK;IAEtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAe;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,SAAS,CAAiC;gBAGhC,OAAO,EAAE,UAAU,EAChB,OAAO,EAAE,kBAAkB;IAuDhD,IAAI,IAAI,IAAI,QAAQ,CAAC,cAAc,CAAC,CAEnC;IAQD,IAAI,QAAQ,IAAI,gBAAgB,GAAG,IAAI,CAEtC;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IACD,OAAO,KAAK,SAAS,QAIpB;IAGD,IAAI,KAAK,IAGQ,OAAO,CADvB;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,EAQvB;IAED,IAAI,OAAO,IAAI,MAAM,CAMpB;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAK1B;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;YAM1B,QAAQ;IAgDtB,MAAM,IAAI,IAAI;CAKf"}