@synchronized-console/viewer 2.26.0-rev.1 → 2.31.14

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 (58) hide show
  1. package/dist/IViewer.d.ts +8 -2
  2. package/dist/index.d.ts +10 -6
  3. package/dist/index.js +4 -4
  4. package/dist/modules/EventEmitter.d.ts +5 -4
  5. package/dist/modules/LegacyViewer.d.ts +1 -1
  6. package/dist/modules/SynchronizedRenderer.d.ts +9 -1
  7. package/dist/modules/Viewer.d.ts +2 -1
  8. package/dist/modules/batching/Batch.d.ts +7 -0
  9. package/dist/modules/batching/BatchObject.d.ts +2 -1
  10. package/dist/modules/batching/Batcher.d.ts +3 -0
  11. package/dist/modules/batching/LineBatch.d.ts +7 -3
  12. package/dist/modules/batching/MeshBatch.d.ts +1 -1
  13. package/dist/modules/batching/PointBatch.d.ts +1 -1
  14. package/dist/modules/batching/TextBatch.d.ts +27 -8
  15. package/dist/modules/batching/TextBatchObject.d.ts +9 -0
  16. package/dist/modules/converter/Geometry.d.ts +18 -6
  17. package/dist/modules/converter/MeshTriangulationHelper.d.ts +2 -41
  18. package/dist/modules/converter/VirtualArray.d.ts +30 -0
  19. package/dist/modules/extensions/ExplodeExtension.d.ts +4 -0
  20. package/dist/modules/extensions/controls/FlyControls.d.ts +6 -3
  21. package/dist/modules/extensions/measurements/AreaMeasurement.d.ts +8 -2
  22. package/dist/modules/extensions/measurements/Measurement.d.ts +6 -0
  23. package/dist/modules/extensions/measurements/MeasurementPointGizmo.d.ts +8 -6
  24. package/dist/modules/extensions/measurements/MeasurementsExtension.d.ts +22 -16
  25. package/dist/modules/extensions/measurements/PerpendicularMeasurement.d.ts +4 -1
  26. package/dist/modules/extensions/measurements/PointMeasurement.d.ts +6 -4
  27. package/dist/modules/extensions/measurements/PointToPointMeasurement.d.ts +2 -0
  28. package/dist/modules/extensions/sections/SectionTool.d.ts +49 -2
  29. package/dist/modules/input/Input.d.ts +6 -2
  30. package/dist/modules/loaders/Synchronized/SynchronizedConverter.d.ts +7 -1
  31. package/dist/modules/loaders/Synchronized/SynchronizedGeometryConverter.d.ts +7 -3
  32. package/dist/modules/loaders/Synchronized/SynchronizedLoader.d.ts +5 -3
  33. package/dist/modules/materials/Materials.d.ts +1 -0
  34. package/dist/modules/materials/SynchronizedBasicMaterial.d.ts +8 -7
  35. package/dist/modules/materials/SynchronizedTextColoredMaterial.d.ts +8 -0
  36. package/dist/modules/materials/SynchronizedTextMaterial.d.ts +9 -17
  37. package/dist/modules/materials/shaders/synchronized-basic-vert.d.ts +1 -1
  38. package/dist/modules/materials/shaders/synchronized-depth-normal-id-vert.d.ts +1 -1
  39. package/dist/modules/materials/shaders/synchronized-depth-normal-vert.d.ts +1 -1
  40. package/dist/modules/materials/shaders/synchronized-displace.vert.d.ts +1 -1
  41. package/dist/modules/materials/shaders/synchronized-ghost-vert.d.ts +1 -1
  42. package/dist/modules/materials/shaders/synchronized-normal-vert.d.ts +1 -1
  43. package/dist/modules/materials/shaders/synchronized-standard-colored-vert.d.ts +1 -1
  44. package/dist/modules/materials/shaders/synchronized-standard-vert.d.ts +1 -1
  45. package/dist/modules/materials/shaders/synchronized-text-frag.d.ts +1 -1
  46. package/dist/modules/materials/shaders/synchronized-text-vert.d.ts +1 -1
  47. package/dist/modules/materials/shaders/synchronized-viewport-vert.d.ts +1 -1
  48. package/dist/modules/objects/AccelerationStructure.d.ts +1 -1
  49. package/dist/modules/objects/SynchronizedBatchedText.d.ts +59 -0
  50. package/dist/modules/objects/TextLabel.d.ts +51 -0
  51. package/dist/modules/pipeline/Passes/GPass.d.ts +9 -3
  52. package/dist/modules/pipeline/Pipelines/EdgesPipeline.d.ts +2 -0
  53. package/dist/modules/tree/NodeMap.d.ts +9 -0
  54. package/dist/modules/tree/NodeRenderView.d.ts +13 -5
  55. package/dist/modules/tree/RenderTree.d.ts +5 -1
  56. package/dist/modules/tree/WorldTree.d.ts +6 -0
  57. package/package.json +9 -7
  58. package/dist/modules/objects/SynchronizedText.d.ts +0 -39
@@ -1,7 +1,8 @@
1
1
  export default class EventEmitter {
2
- _events: {};
3
- on(name: any, listener: any): void;
4
- removeListener(name: any, listenerToRemove: any): void;
5
- emit(name: any, ...args: any[]): void;
2
+ protected _events: Record<string, Function[]>;
3
+ constructor();
4
+ on(name: string, listener: Function): void;
5
+ removeListener(name: string, listenerToRemove: Function): void;
6
+ emit(name: string, ...args: unknown[]): void;
6
7
  dispose(): void;
7
8
  }
@@ -4,11 +4,11 @@ import type { Query, QueryArgsResultMap, QueryResult } from './queries/Query.js'
4
4
  import { type SynchronizedView, type SunLightConfiguration, type ViewerParams } from '../IViewer.js';
5
5
  import { Viewer } from './Viewer.js';
6
6
  import { WorldTree } from './tree/WorldTree.js';
7
- import { type MeasurementOptions } from './extensions/measurements/MeasurementsExtension.js';
8
7
  import { type DiffResult, VisualDiffMode } from './extensions/DiffExtension.js';
9
8
  import { type PropertyInfo } from './filtering/PropertyManager.js';
10
9
  import { BatchObject } from './batching/BatchObject.js';
11
10
  import { SynchronizedViewer } from '@synchronized-console/shared';
11
+ import { MeasurementOptions } from '@synchronized-console/shared/viewer/state';
12
12
  export declare class LegacyViewer extends Viewer {
13
13
  private cameraController;
14
14
  private selection;
@@ -38,6 +38,12 @@ export declare class RenderingStats {
38
38
  frameStart(): void;
39
39
  frameEnd(): void;
40
40
  }
41
+ export interface ObjectPickConfiguration {
42
+ pickedObjectsFilter: ((arg: [NodeRenderView, Material]) => boolean) | null;
43
+ }
44
+ export declare const DefaultObjectPickConfiguration: {
45
+ pickedObjectsFilter: (arg: [NodeRenderView, Material]) => boolean;
46
+ };
41
47
  export default class SynchronizedRenderer {
42
48
  protected readonly SHOW_HELPERS = false;
43
49
  protected readonly IGNORE_ZERO_OPACITY_OBJECTS = true;
@@ -62,6 +68,7 @@ export default class SynchronizedRenderer {
62
68
  protected _clippingPlanes: Plane[];
63
69
  protected _clippingVolume: OBB;
64
70
  protected _renderOverride: (() => void) | null;
71
+ objectPickConfiguration: ObjectPickConfiguration;
65
72
  viewer: Viewer;
66
73
  batcher: Batcher;
67
74
  input: Input;
@@ -73,6 +80,7 @@ export default class SynchronizedRenderer {
73
80
  /**********************
74
81
  * Bounds and volumes */
75
82
  get sceneBox(): Box3;
83
+ get visibleSceneBox(): Box3;
76
84
  get sceneSphere(): Sphere;
77
85
  get sceneCenter(): Vector3;
78
86
  get clippingVolume(): OBB;
@@ -146,7 +154,7 @@ export default class SynchronizedRenderer {
146
154
  nodeId: string;
147
155
  point: Vector3;
148
156
  }> | null;
149
- renderViewFromIntersection(intersection: ExtendedIntersection): NodeRenderView | null;
157
+ renderViewFromIntersection(intersection: ExtendedIntersection): [NodeRenderView, Material];
150
158
  private onClick;
151
159
  private onDoubleClick;
152
160
  boxFromObjects(objectIds: string[]): Box3;
@@ -27,7 +27,6 @@ export declare class Viewer extends EventEmitter implements IViewer {
27
27
  synchronizedRenderer: SynchronizedRenderer;
28
28
  protected propertyManager: PropertyManager;
29
29
  /** Misc members */
30
- protected inProgressOperations: number;
31
30
  protected clock: Clock;
32
31
  protected loaders: {
33
32
  [id: string]: Loader;
@@ -41,6 +40,7 @@ export declare class Viewer extends EventEmitter implements IViewer {
41
40
  get World(): World;
42
41
  get Utils(): Utils;
43
42
  get input(): Input;
43
+ get params(): ViewerParams;
44
44
  private getConstructorChain;
45
45
  createExtension<T extends Extension>(type: Constructor<T>): T;
46
46
  getExtension<T extends Extension>(type: Constructor<T>): T;
@@ -48,6 +48,7 @@ export declare class Viewer extends EventEmitter implements IViewer {
48
48
  private getExtensionInternal;
49
49
  constructor(container: HTMLElement, params?: ViewerParams);
50
50
  getContainer(): HTMLElement;
51
+ getCanvas(): HTMLCanvasElement;
51
52
  getRenderer(): SynchronizedRenderer;
52
53
  resize(): void;
53
54
  requestRender(flags?: UpdateFlags): void;
@@ -1,6 +1,9 @@
1
1
  import { Box3, Material, Object3D, WebGLRenderer } from 'three';
2
2
  import { type FilterMaterialOptions } from '../materials/Materials.js';
3
3
  import { NodeRenderView } from '../tree/NodeRenderView.js';
4
+ import { MeshBatch } from './MeshBatch.js';
5
+ import { InstancedMeshBatch } from './InstancedMeshBatch.js';
6
+ import TextBatch from './TextBatch.js';
4
7
  export declare enum GeometryType {
5
8
  MESH = 0,
6
9
  LINE = 1,
@@ -60,3 +63,7 @@ export declare const AllBatchUpdateRange: BatchUpdateRange;
60
63
  export declare const INSTANCE_TRANSFORM_BUFFER_STRIDE = 16;
61
64
  export declare const INSTANCE_GRADIENT_BUFFER_STRIDE = 1;
62
65
  export declare const getNextBatchIndex: () => number;
66
+ export type AcceleratedBatchTypes = MeshBatch | InstancedMeshBatch | TextBatch;
67
+ export declare function isAcceleratedBatchType(batch: Batch): batch is AcceleratedBatchTypes;
68
+ export declare function isNoneBatchUpdateRange(range: BatchUpdateRange): boolean;
69
+ export declare function isAllBatchUpdateRange(range: BatchUpdateRange, totalCount?: number): boolean;
@@ -48,6 +48,7 @@ export declare class BatchObject {
48
48
  set euler(euler: Euler);
49
49
  set scale(scale: Vector3);
50
50
  constructor(renderView: NodeRenderView, batchIndex: number);
51
- buildAccelerationStructure(bvh?: MeshBVH): void;
51
+ buildAccelerationStructure(position: Float32Array | Float64Array, indices: Uint16Array | Uint32Array): void;
52
+ buildAccelerationStructure(bvh: MeshBVH): void;
52
53
  transformTRS(translation: Vector3Like, euler?: Vector3Like, scale?: Vector3Like, pivot?: Vector3Like): void;
53
54
  }
@@ -23,6 +23,7 @@ export default class Batcher {
23
23
  private maxBatchObjects;
24
24
  private maxBatchVertices;
25
25
  private minInstancedBatchVertices;
26
+ private maxBatchTextObjects;
26
27
  materials: Materials;
27
28
  batches: {
28
29
  [id: string]: Batch;
@@ -30,6 +31,7 @@ export default class Batcher {
30
31
  constructor(caps: WebGLCapabilities);
31
32
  makeBatches(worldTree: WorldTree, renderTree: RenderTree, synchronizedType: SynchronizedType[], batchType?: GeometryType): AsyncGenerator<Batch, void, unknown>;
32
33
  private splitBatch;
34
+ private getMaxObjectCount;
33
35
  private buildInstancedBatch;
34
36
  private buildBatch;
35
37
  update(deltaTime: number): void;
@@ -47,6 +49,7 @@ export default class Batcher {
47
49
  restoreBatchMaterial(ranges: Record<string, BatchUpdateRange>): void;
48
50
  purgeBatches(subtreeId: string): void;
49
51
  getBatches<K extends GeometryType>(subtreeId?: string, geometryType?: K): BatchTypeMap[K][];
52
+ getBatches<K extends GeometryType>(subtreeId?: string, geometryType?: Array<K>): BatchTypeMap[K][];
50
53
  private isBatchType;
51
54
  getBatch(rv: NodeRenderView): Batch | undefined;
52
55
  getRenderView(batchId: string, index: number): NodeRenderView | null;
@@ -3,7 +3,7 @@ import { LineSegments2 } from 'three/examples/jsm/lines/LineSegments2.js';
3
3
  import { LineSegmentsGeometry } from 'three/examples/jsm/lines/LineSegmentsGeometry.js';
4
4
  import SynchronizedLineMaterial from '../materials/SynchronizedLineMaterial.js';
5
5
  import { NodeRenderView } from '../tree/NodeRenderView.js';
6
- import { type Batch, type BatchUpdateRange, type DrawGroup, GeometryType } from './Batch.js';
6
+ import { type Batch, type BatchUpdateRange, DrawGroup, GeometryType } from './Batch.js';
7
7
  export default class LineBatch implements Batch {
8
8
  id: string;
9
9
  subtreeId: string;
@@ -14,24 +14,28 @@ export default class LineBatch implements Batch {
14
14
  protected batchOpacity: number;
15
15
  protected mesh: LineSegments2;
16
16
  colorBuffer: InstancedInterleavedBuffer;
17
- private static readonly vector4Buffer;
17
+ protected visibilityRanges: {
18
+ [offset: number]: boolean;
19
+ };
18
20
  get bounds(): Box3;
19
21
  get drawCalls(): number;
20
22
  get minDrawCalls(): number;
21
23
  get triCount(): number;
22
24
  get vertCount(): number;
23
25
  constructor(id: string, subtreeId: string, renderViews: NodeRenderView[]);
26
+ get groups(): DrawGroup[];
24
27
  get pointCount(): number;
25
28
  get lineCount(): number;
26
29
  get renderObject(): Object3D;
27
30
  get geometryType(): GeometryType;
28
31
  get materials(): Material[];
29
- get groups(): DrawGroup[];
30
32
  getCount(): number;
31
33
  setBatchMaterial(material: SynchronizedLineMaterial): void;
32
34
  onUpdate(deltaTime: number): void;
33
35
  onRender(renderer: WebGLRenderer): void;
34
36
  setVisibleRange(ranges: BatchUpdateRange[]): void;
37
+ /** Line batches do not sort their ranges. This means we can have hidden/transparent objects anywhere inside the batch.
38
+ */
35
39
  getVisibleRange(): BatchUpdateRange;
36
40
  getOpaque(): BatchUpdateRange;
37
41
  getDepth(): BatchUpdateRange;
@@ -29,7 +29,7 @@ export declare class MeshBatch extends PrimitiveBatch {
29
29
  setDrawRanges(ranges: BatchUpdateRange[]): void;
30
30
  resetDrawRanges(): void;
31
31
  buildBatch(): Promise<void>;
32
- protected makeMeshGeometry(indices: Uint32Array | Uint16Array, position: Float64Array, normals: Float32Array, batchIndices: Float32Array, color?: Float32Array): BufferGeometry;
32
+ protected makeMeshGeometry(indices: Uint32Array | Uint16Array, position: Float64Array | Float32Array, normals: Float32Array, batchIndices: Float32Array, color?: Float32Array): BufferGeometry;
33
33
  getRenderView(index: number): NodeRenderView | null;
34
34
  getMaterialAtIndex(index: number): Material | null;
35
35
  }
@@ -23,7 +23,7 @@ export declare class PointBatch extends PrimitiveBatch {
23
23
  maxIndex: number;
24
24
  };
25
25
  buildBatch(): Promise<void>;
26
- protected makePointGeometry(index: Int32Array, position: Float64Array, color: Float32Array): BufferGeometry;
26
+ protected makePointGeometry(index: Uint32Array | Uint16Array, position: Float64Array | Float32Array, color: Float32Array): BufferGeometry;
27
27
  getRenderView(index: number): NodeRenderView | null;
28
28
  getMaterialAtIndex(index: number): Material | null;
29
29
  }
@@ -1,41 +1,60 @@
1
1
  import { Box3, Material, Object3D, WebGLRenderer } from 'three';
2
2
  import { NodeRenderView } from '../tree/NodeRenderView.js';
3
3
  import { type Batch, type BatchUpdateRange, type DrawGroup, GeometryType } from './Batch.js';
4
- import { SynchronizedText } from '../objects/SynchronizedText.js';
4
+ import { SynchronizedBatchedText } from '../objects/SynchronizedBatchedText.js';
5
+ import { AnchorX, AnchorY } from 'troika-three-text';
6
+ import { DrawRanges } from './DrawRanges.js';
5
7
  export default class TextBatch implements Batch {
6
8
  id: string;
7
9
  subtreeId: string;
8
10
  renderViews: NodeRenderView[];
9
11
  batchMaterial: Material;
10
- mesh: SynchronizedText;
12
+ mesh: SynchronizedBatchedText;
13
+ protected drawRanges: DrawRanges;
11
14
  get bounds(): Box3;
12
15
  get drawCalls(): number;
13
16
  get minDrawCalls(): number;
17
+ get maxDrawCalls(): number;
14
18
  get triCount(): number;
15
19
  get vertCount(): number;
16
- constructor(id: string, subtreeId: string, renderViews: NodeRenderView[]);
17
20
  get pointCount(): number;
18
21
  get lineCount(): number;
19
22
  get geometryType(): GeometryType;
20
23
  get renderObject(): Object3D;
21
24
  getCount(): number;
22
25
  get materials(): Material[];
23
- get groups(): DrawGroup[];
26
+ get groups(): Array<DrawGroup>;
27
+ constructor(id: string, subtreeId: string, renderViews: NodeRenderView[]);
24
28
  setBatchMaterial(material: Material): void;
25
29
  onUpdate(deltaTime: number): void;
26
30
  onRender(renderer: WebGLRenderer): void;
27
31
  setVisibleRange(ranges: BatchUpdateRange[]): void;
28
32
  getVisibleRange(): BatchUpdateRange;
33
+ /** TODO: Need to give this a glow up */
29
34
  getOpaque(): BatchUpdateRange;
35
+ /** TODO: Need to give this a glow up */
30
36
  getDepth(): BatchUpdateRange;
37
+ /** TODO: Need to give this a glow up */
31
38
  getTransparent(): BatchUpdateRange;
39
+ /** TODO: Need to give this a glow up */
32
40
  getStencil(): BatchUpdateRange;
33
- setBatchBuffers(range: BatchUpdateRange[]): void;
41
+ /** Text batches are mix between how mesh and line batches work.
42
+ * - They still keep track of various draw groups each with it's material
43
+ * - However that material is not really being used, but rather the properies are copied over to the batch fp32 data texture
44
+ * - For filtering we cheat and use `SynchronizedTextColoredMaterial` only to store the gradient/ramp texture + gradient indices for each text in the batch
45
+ * - The color from the gradient/ramp texture will be used only if the gradient index > 0, otherwise the regular color will be used
46
+ * - The gradient index is stored in each text object in it's `userData` and written to the 27'th float in the batch data texture, where the shader reads if from
47
+ * - Even if, the **text batch does not use the materials in it's draw groups**, it emulates the behavior as if it would
48
+ */
49
+ setBatchBuffers(ranges: BatchUpdateRange[]): void;
34
50
  setDrawRanges(ranges: BatchUpdateRange[]): void;
51
+ private cleanMaterials;
35
52
  resetDrawRanges(): void;
53
+ protected alignmentXToAnchorX(value: number): AnchorX;
54
+ protected alignmentYToAnchorY(value: number): AnchorY;
36
55
  buildBatch(): Promise<void>;
37
- getRenderView(index: number): NodeRenderView;
38
- getMaterialAtIndex(index: number): Material;
39
- getMaterial(rv: NodeRenderView): Material;
56
+ getRenderView(index: number): NodeRenderView | null;
57
+ getMaterialAtIndex(index: number): Material | null;
58
+ getMaterial(rv: NodeRenderView): Material | null;
40
59
  purge(): void;
41
60
  }
@@ -0,0 +1,9 @@
1
+ import { Box3, Matrix4 } from 'three';
2
+ import { BatchObject, Vector3Like } from './BatchObject.js';
3
+ import { NodeRenderView } from '../tree/NodeRenderView.js';
4
+ export declare class TextBatchObject extends BatchObject {
5
+ textTransform: Matrix4;
6
+ constructor(renderView: NodeRenderView, batchIndex: number);
7
+ get aabb(): Box3;
8
+ transformTRS(translation: Vector3Like, euler: Vector3Like, scale: Vector3Like, pivot: Vector3Like): void;
9
+ }
@@ -1,5 +1,6 @@
1
1
  import { Box3, BufferGeometry, Matrix4, Vector2, Vector3 } from 'three';
2
2
  import { type SynchronizedObject } from '../../IViewer.js';
3
+ import { ChunkArray } from './VirtualArray.js';
3
4
  export declare enum GeometryAttributes {
4
5
  POSITION = "POSITION",
5
6
  COLOR = "COLOR",
@@ -8,21 +9,29 @@ export declare enum GeometryAttributes {
8
9
  TANGENT = "TANGENT",
9
10
  INDEX = "INDEX"
10
11
  }
12
+ type RequiredKeys = GeometryAttributes.POSITION | GeometryAttributes.INDEX;
13
+ type OptionalKeys = Exclude<GeometryAttributes, RequiredKeys>;
14
+ type GeometryAttributesShape = {
15
+ [K in RequiredKeys]: ChunkArray;
16
+ } & {
17
+ [K in OptionalKeys]?: ChunkArray;
18
+ };
11
19
  export interface GeometryData {
12
- attributes: ({
13
- [GeometryAttributes.POSITION]: number[];
14
- } & Partial<Record<Exclude<GeometryAttributes, GeometryAttributes.POSITION>, number[]>>) | null;
20
+ attributes: GeometryAttributesShape | null;
15
21
  bakeTransform: Matrix4 | null;
16
22
  transform: Matrix4 | null;
17
23
  metaData?: SynchronizedObject;
18
24
  instanced?: boolean;
25
+ flipNormals?: boolean;
19
26
  }
20
27
  export declare class Geometry {
21
28
  static updateRTEGeometry(geometry: BufferGeometry, doublePositions: Float64Array | Float32Array): void;
22
- static mergeGeometryAttribute(attributes: (number[] | undefined)[], target: Float32Array | Float64Array): ArrayLike<number>;
23
- static mergeIndexAttribute(indexAttributes: (number[] | undefined)[], positionAttributes: (number[] | undefined)[]): number[];
29
+ static mergeGeometryAttribute(attributes: ChunkArray[], target: Float32Array | Float64Array): ArrayLike<number>;
30
+ static mergeIndexAttribute(indexAttributes: ChunkArray[], positionAttributes: ChunkArray[]): number[];
24
31
  static mergeGeometryData(geometries: GeometryData[]): GeometryData;
25
32
  static transformGeometryData(geometryData: GeometryData, m: Matrix4 | null): void;
33
+ static transformArray(array: number[] | Float32Array | Float64Array, m: Matrix4 | null, offset?: number, count?: number): void;
34
+ static isMatrix4Identity(matrix: Matrix4): boolean;
26
35
  static unpackColors(int32Colors: number[]): number[];
27
36
  /** Please see https://bim2bi.ir/blog/improving-synchronizeds-rte-implementation/ for additional details
28
37
  * regarding double -> <float low; float high> encoding.
@@ -33,6 +42,9 @@ export declare class Geometry {
33
42
  static getFP32ProjectionDelta(point: Vector3, projection: Matrix4, screenSize: Vector2, relativeOffset?: number): Vector2;
34
43
  /** Only supports indexed geometry */
35
44
  static computeVertexNormalsBuffer(buffer: number[], position: number[], index: number[]): void;
36
- static computeVertexNormals(buffer: BufferGeometry, doublePositions: Float64Array): void;
45
+ static computeVertexNormalsBufferVirtual(buffer: number[], position: ChunkArray, index: ChunkArray, flip?: boolean): void;
46
+ static flipNormalsBuffer(buffer: Float32Array): void;
47
+ static computeVertexNormals(buffer: BufferGeometry, positions: Float64Array | Float32Array): void;
37
48
  static triangulatePolygon(points: Vector2[]): number[];
38
49
  }
50
+ export {};
@@ -1,7 +1,3 @@
1
- /**
2
- * Set of functions to triangulate n-gon faces (i.e. polygon faces with an arbitrary (n) number of vertices).
3
- * This class is a JavaScript port of https://github.com/KingDaryush1/synchronized-sharp/blob/main/Objects/Objects/Utils/MeshTriangulationHelper.cs
4
- */
5
1
  export default class MeshTriangulationHelper {
6
2
  /**
7
3
  * Calculates the triangulation of the face at given faceIndex.
@@ -9,42 +5,7 @@ export default class MeshTriangulationHelper {
9
5
  * @param {Number} faceIndex The index of the face's cardinality indicator `n`
10
6
  * @param {Number[]} faces The list of faces in the mesh
11
7
  * @param {Number[]} vertices The list of vertices in the mesh
12
- * @return {Number[]} flat list of triangle faces (without cardinality indicators)
8
+ * @return {Number} flat list of triangle faces (without cardinality indicators)
13
9
  */
14
- static triangulateFace(faceIndex: number, faces: number[], vertices: number[]): number[];
15
- /**
16
- * Tests if point v is within the triangle *abc*.
17
- * @param {Vector3} v
18
- * @param {Vector3} a
19
- * @param {Vector3} b
20
- * @param {Vector3} c
21
- * @returns {boolean} true if v is within triangle.
22
- */
23
- static testPointTriangle(v: Vector3, a: Vector3, b: Vector3, c: Vector3): boolean;
24
- /**
25
- * Checks that triangle abc is clockwise with reference to referenceNormal.
26
- * @param {Vector3} referenceNormal The normal direction of the face.
27
- * @param {Vector3} a
28
- * @param {Vector3} b
29
- * @param {Vector3} c
30
- * @returns {boolean} true if triangle is ccw
31
- */
32
- static triangleIsCCW(referenceNormal: Vector3, a: Vector3, b: Vector3, c: Vector3): boolean;
33
- }
34
- /**
35
- * Encapsulates vector maths operations required for polygon triangulation
36
- */
37
- declare class Vector3 {
38
- constructor(x: any, y: any, z: any);
39
- x: any;
40
- y: any;
41
- z: any;
42
- add(v: any): Vector3;
43
- sub(v: any): Vector3;
44
- mul(n: any): Vector3;
45
- dot(v: any): number;
46
- cross(v: any): Vector3;
47
- squareSum(): number;
48
- normalize(): void;
10
+ static triangulateFace(faceIndex: number, faces: number[], vertices: number[], _inout_targetArray: any, _in_offset: any): number;
49
11
  }
50
- export {};
@@ -0,0 +1,30 @@
1
+ import { TypedArray } from 'type-fest';
2
+ import { DataChunk } from '../../IViewer.js';
3
+ import { Box3 } from 'three';
4
+ export declare class VirtualArray {
5
+ chunks: Array<Array<number>>;
6
+ private offsets;
7
+ constructor(chunks: Array<Array<number>>);
8
+ get length(): number;
9
+ get(index: number): number;
10
+ set(index: number, value: number): void;
11
+ findChunkIndex(index: number): number;
12
+ updateOffsets(): void;
13
+ }
14
+ export declare class ChunkArray extends VirtualArray {
15
+ chunkArray: Array<DataChunk>;
16
+ protected flatArray: TypedArray;
17
+ constructor(chunks: Array<DataChunk>);
18
+ slice(): ChunkArray;
19
+ copyToBuffer(buffer: TypedArray, offset: number): void;
20
+ computeBox3(): Box3;
21
+ protected getFlatArray<T extends TypedArray>(Type: {
22
+ new (length: number): T;
23
+ }): T;
24
+ getFloat32Array(): Float32Array;
25
+ getFloat64Array(): Float64Array;
26
+ getInt16Array(): Int16Array;
27
+ getInt32Array(): Int32Array;
28
+ getUint16Array(): Uint16Array;
29
+ getUint32Array(): Uint32Array;
30
+ }
@@ -1,3 +1,4 @@
1
+ import { Box3 } from 'three';
1
2
  import { Extension } from './Extension.js';
2
3
  export declare enum ExplodeEvent {
3
4
  Finshed = "explode-finished"
@@ -9,8 +10,11 @@ export declare class ExplodeExtension extends Extension {
9
10
  protected _enabled: boolean;
10
11
  get enabled(): boolean;
11
12
  set enabled(value: boolean);
13
+ /** Similar to SynchronizedRenderer's visibleSceneBox, but with static boxes from render views */
14
+ get visibleWorld(): Box3;
12
15
  private explodeTime;
13
16
  private explodeRange;
17
+ private explodeOrigin;
14
18
  onEarlyUpdate(): void;
15
19
  setExplode(time: number): void;
16
20
  private explode;
@@ -3,6 +3,7 @@ import { Damper } from '../../utils/Damper.js';
3
3
  import { SynchronizedControls } from './SynchronizedControls.js';
4
4
  import { World } from '../../World.js';
5
5
  import { AngleDamper } from '../../utils/AngleDamper.js';
6
+ import Input from '../../input/Input.js';
6
7
  type MoveType = 'forward' | 'back' | 'left' | 'right' | 'up' | 'down';
7
8
  export interface FlyControlsOptions {
8
9
  [name: string]: unknown;
@@ -13,9 +14,9 @@ export interface FlyControlsOptions {
13
14
  relativeUpDown?: boolean;
14
15
  }
15
16
  declare class FlyControls extends SynchronizedControls {
17
+ protected input: Input;
16
18
  protected _options: Required<FlyControlsOptions>;
17
19
  protected _targetCamera: PerspectiveCamera | OrthographicCamera;
18
- protected container: HTMLElement;
19
20
  protected velocity: Vector3;
20
21
  protected euler: Euler;
21
22
  protected position: Vector3;
@@ -43,7 +44,7 @@ declare class FlyControls extends SynchronizedControls {
43
44
  get up(): Vector3;
44
45
  set up(value: Vector3);
45
46
  set minDist(value: number);
46
- constructor(camera: PerspectiveCamera | OrthographicCamera, container: HTMLElement, world: World, options: Required<FlyControlsOptions>);
47
+ constructor(camera: PerspectiveCamera | OrthographicCamera, input: Input, world: World, options: Required<FlyControlsOptions>);
47
48
  isStationary(): boolean;
48
49
  update(delta?: number): boolean;
49
50
  protected updatePositionRotation(delta: number): void;
@@ -73,7 +74,9 @@ declare class FlyControls extends SynchronizedControls {
73
74
  protected disconnect(): void;
74
75
  dispose(): void;
75
76
  protected rotate(euler: Euler): void;
76
- protected onMouseMove: (event: PointerEvent) => void;
77
+ protected onMouseMove: (arg: Vector2 & {
78
+ event: PointerEvent;
79
+ }) => void;
77
80
  protected onKeyDown: (event: KeyboardEvent) => void;
78
81
  protected onKeyUp: (event: KeyboardEvent) => void;
79
82
  protected onContextMenu: () => void;
@@ -1,13 +1,16 @@
1
1
  import { Box3, Camera, Plane, Raycaster, Vector2, Vector3, type Intersection } from 'three';
2
2
  import { Measurement } from './Measurement.js';
3
3
  import { ExtendedMeshIntersection } from '../../objects/SynchronizedRaycaster.js';
4
+ import { MeasurementData, MeasurementType } from '@synchronized-console/shared/viewer/state';
4
5
  export declare class AreaMeasurement extends Measurement {
5
6
  /** We store all gizmos here */
6
7
  private pointGizmos;
7
8
  /** This stores the last touched point position and normal */
8
9
  private surfacePoint;
9
10
  private surfaceNormal;
10
- /** The plane params defined by the first placed point */
11
+ /** The plane params defined by the first placed point
12
+ * When serialized they will go in the measurements startPoint and startNormal
13
+ */
11
14
  private planeOrigin;
12
15
  private planeNormal;
13
16
  /** The location of the area text label */
@@ -24,6 +27,7 @@ export declare class AreaMeasurement extends Measurement {
24
27
  private snapDistance;
25
28
  set isVisible(value: boolean);
26
29
  get bounds(): Box3;
30
+ get measurementType(): MeasurementType;
27
31
  constructor();
28
32
  /** Frame */
29
33
  frameUpdate(camera: Camera, size: Vector2, bounds: Box3): void;
@@ -32,7 +36,7 @@ export declare class AreaMeasurement extends Measurement {
32
36
  /** Called whenver a location is selected for measuring*/
33
37
  locationSelected(): void;
34
38
  /** Adds a point to the area measurement */
35
- addPoint(): number;
39
+ addPoint(point: Vector3): number;
36
40
  /** Removes point from the measurement */
37
41
  removePoint(): number;
38
42
  /** Auto completes the measurement by joining with the first point */
@@ -61,4 +65,6 @@ export declare class AreaMeasurement extends Measurement {
61
65
  /** Area calculation */
62
66
  private shoelaceArea;
63
67
  private shoelaceArea3D;
68
+ toMeasurementData(): MeasurementData;
69
+ fromMeasurementData(data: MeasurementData): void;
64
70
  }
@@ -1,5 +1,6 @@
1
1
  import { Box3, Camera, Object3D, Plane, Raycaster, Vector2, Vector3, type Intersection } from 'three';
2
2
  import { ExtendedMeshIntersection } from '../../objects/SynchronizedRaycaster.js';
3
+ import { MeasurementData, MeasurementType } from '@synchronized-console/shared/viewer/state';
3
4
  export declare enum MeasurementState {
4
5
  HIDDEN = 0,
5
6
  DANGLING_START = 1,
@@ -16,12 +17,15 @@ export declare abstract class Measurement extends Object3D {
16
17
  value: number;
17
18
  units: string;
18
19
  precision: number;
20
+ measurementId: string;
19
21
  protected _state: MeasurementState;
20
22
  protected renderingCamera: Camera | null;
21
23
  protected renderingSize: Vector2;
24
+ constructor();
22
25
  set state(value: MeasurementState);
23
26
  get state(): MeasurementState;
24
27
  abstract set isVisible(value: boolean);
28
+ abstract get measurementType(): MeasurementType;
25
29
  get bounds(): Box3;
26
30
  frameUpdate(camera: Camera | null, size: Vector2, _bounds?: Box3): void;
27
31
  abstract update(): Promise<void>;
@@ -31,4 +35,6 @@ export declare abstract class Measurement extends Object3D {
31
35
  abstract locationUpdated(point?: Vector3, normal?: Vector3, ndcScreen?: Vector2): void;
32
36
  abstract locationSelected(point?: Vector3, normal?: Vector3, ndcScreen?: Vector2): void;
33
37
  snap?(ndcPoint: Vector2, intersection: ExtendedMeshIntersection, outPoint: Vector3, outNormal: Vector3): boolean;
38
+ toMeasurementData(): MeasurementData;
39
+ fromMeasurementData(data: MeasurementData): void;
34
40
  }
@@ -1,4 +1,7 @@
1
- import { Camera, Group, Plane, Quaternion, Raycaster, Vector2, Vector3, type Intersection } from 'three';
1
+ import { Camera, CircleGeometry, Group, Mesh, Plane, Quaternion, Raycaster, Vector2, Vector3, type Intersection } from 'three';
2
+ import { LineSegments2 } from 'three/examples/jsm/lines/LineSegments2.js';
3
+ import { TextLabel } from '../../objects/TextLabel.js';
4
+ import SynchronizedBasicMaterial from '../../materials/SynchronizedBasicMaterial.js';
2
5
  export interface MeasurementPointGizmoStyle {
3
6
  dashedLine?: boolean;
4
7
  normalIndicatorPixelSize?: number;
@@ -14,21 +17,20 @@ export interface MeasurementPointGizmoStyle {
14
17
  pointPixelHeight?: number;
15
18
  }
16
19
  export declare class MeasurementPointGizmo extends Group {
17
- private normalIndicator;
20
+ normalIndicator: LineSegments2;
18
21
  private normalIndicatorBuffer;
19
22
  private normalIndicatorNormal;
20
23
  private normalIndicatorTangent;
21
24
  private normalIndicatorBitangent;
22
- private line;
23
- private point;
24
- private text;
25
+ line: LineSegments2;
26
+ point: Mesh<CircleGeometry, SynchronizedBasicMaterial>;
27
+ text: TextLabel;
25
28
  private _style;
26
29
  set style(value: MeasurementPointGizmoStyle);
27
30
  set highlight(value: boolean);
28
31
  private getNormalIndicatorMaterial;
29
32
  private getLineMaterial;
30
33
  private getPointMaterial;
31
- private getTextMaterial;
32
34
  constructor(style?: MeasurementPointGizmoStyle);
33
35
  enable(normalIndicator: boolean, line: boolean, point: boolean, text: boolean): void;
34
36
  frameUpdate(camera: Camera, size: Vector2): void;