@shapediver/viewer.rendering-engine.intersection-engine 2.8.5 → 2.9.1

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.
@@ -1,20 +1,27 @@
1
1
  import { ITreeNode } from "@shapediver/viewer.shared.node-tree";
2
- import { IIntersection } from "../interfaces/IIntersection";
3
- import { IIntersectionEngine } from "../interfaces/IIntersectionEngine";
2
+ import { RENDERER_TYPE } from "@shapediver/viewer.rendering-engine.rendering-engine";
4
3
  import { IIntersectionFilter } from "../interfaces/IIntersectionFilter";
5
4
  import { IRay } from "../interfaces/IRay";
6
- import { RENDERER_TYPE } from "@shapediver/viewer.rendering-engine.rendering-engine";
5
+ import { IIntersection } from "../interfaces/IIntersection";
6
+ import { IIntersectionEngine } from "../interfaces/IIntersectionEngine";
7
7
  export declare class IntersectionEngine implements IIntersectionEngine {
8
+ private readonly _eventEngine;
8
9
  private readonly _tree;
9
10
  private static _instance;
11
+ private _intersectNodes;
12
+ private constructor();
10
13
  static get instance(): IntersectionEngine;
11
14
  intersect(ray: IRay, filterCriteria?: IIntersectionFilter[], intersectionOptions?: {
12
15
  opacity: number;
13
16
  rendererType: RENDERER_TYPE;
14
17
  }, root?: ITreeNode, viewerID?: string): IIntersection[];
18
+ intersectNode(node: ITreeNode, rayIn: IRay, intersectionOptions?: {
19
+ opacity: number;
20
+ rendererType: RENDERER_TYPE;
21
+ }): IIntersection[] | undefined;
15
22
  private checkIntersection;
16
23
  private checkLineIntersection;
17
24
  private checkPointIntersection;
18
- private intersectNode;
25
+ private gatherNodes;
19
26
  }
20
27
  //# sourceMappingURL=IntersectionEngine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IntersectionEngine.d.ts","sourceRoot":"","sources":["../../src/implementation/IntersectionEngine.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,SAAS,EAAkB,MAAM,qCAAqC,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,sDAAsD,CAAC;AAErF,qBAAa,kBAAmB,YAAW,mBAAmB;IAG1D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAE9C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAqB;IAM7C,WAAkB,QAAQ,uBAEzB;IAMM,SAAS,CACZ,GAAG,EAAE,IAAI,EACT,cAAc,GAAE,mBAAmB,EAAO,EAC1C,mBAAmB,GAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,aAAa,CAAA;KAAyD,EAC5H,IAAI,GAAE,SAA2B,EACjC,QAAQ,CAAC,EAAE,MAAM,GAClB,aAAa,EAAE;IAkClB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,qBAAqB;IA2C7B,OAAO,CAAC,sBAAsB;IAuB9B,OAAO,CAAC,aAAa;CA+KxB"}
1
+ {"version":3,"file":"IntersectionEngine.d.ts","sourceRoot":"","sources":["../../src/implementation/IntersectionEngine.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,SAAS,EAAkB,MAAM,qCAAqC,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,sDAAsD,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAGxE,qBAAa,kBAAmB,YAAW,mBAAmB;IAG1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqC;IAClE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAE9C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAqB;IAE7C,OAAO,CAAC,eAAe,CAKd;IAMT,OAAO;IAWP,WAAkB,QAAQ,uBAEzB;IAOM,SAAS,CACZ,GAAG,EAAE,IAAI,EACT,cAAc,CAAC,EAAE,mBAAmB,EAAE,EACtC,mBAAmB,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,aAAa,CAAA;KAAE,EACtE,IAAI,GAAE,SAA2B,EACjC,QAAQ,CAAC,EAAE,MAAM,GAClB,aAAa,EAAE;IAuCX,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,aAAa,CAAA;KAAE,GAAG,aAAa,EAAE,GAAG,SAAS;IA6LvJ,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,qBAAqB;IA2C7B,OAAO,CAAC,sBAAsB;IAuB9B,OAAO,CAAC,WAAW;CA8BtB"}
@@ -6,131 +6,65 @@ const gl_matrix_1 = require("gl-matrix");
6
6
  const viewer_shared_math_1 = require("@shapediver/viewer.shared.math");
7
7
  const viewer_shared_node_tree_1 = require("@shapediver/viewer.shared.node-tree");
8
8
  const viewer_rendering_engine_rendering_engine_1 = require("@shapediver/viewer.rendering-engine.rendering-engine");
9
+ const viewer_shared_services_1 = require("@shapediver/viewer.shared.services");
9
10
  class IntersectionEngine {
11
+ // #endregion Properties (4)
12
+ // #region Constructors (1)
10
13
  constructor() {
11
- // #region Properties (2)
14
+ // #region Properties (4)
15
+ this._eventEngine = viewer_shared_services_1.EventEngine.instance;
12
16
  this._tree = viewer_shared_node_tree_1.Tree.instance;
13
- // #endregion Private Methods (4)
17
+ this._intersectNodes = [];
18
+ this.gatherNodes();
19
+ this._eventEngine.addListener(viewer_shared_services_1.EVENTTYPE.VIEWPORT.VIEWPORT_UPDATED, () => {
20
+ this.gatherNodes();
21
+ });
14
22
  }
15
- // #endregion Properties (2)
23
+ // #endregion Constructors (1)
16
24
  // #region Public Static Accessors (1)
17
25
  static get instance() {
18
26
  return this._instance || (this._instance = new this());
19
27
  }
20
28
  // #endregion Public Static Accessors (1)
21
- // #region Public Methods (1)
22
- intersect(ray, filterCriteria = [], intersectionOptions = { opacity: 0, rendererType: viewer_rendering_engine_rendering_engine_1.RENDERER_TYPE.STANDARD }, root = this._tree.root, viewerID) {
29
+ // #region Public Methods (2)
30
+ intersect(ray, filterCriteria, intersectionOptions, root = this._tree.root, viewerID) {
23
31
  let intersections = [];
24
- const intersectNode = (node) => {
25
- if (node.visible === false)
32
+ const intersectNode = (node, visible, excludeViewports, restrictViewports) => {
33
+ if (visible === false)
26
34
  return;
27
35
  if (viewerID !== undefined) {
28
- if (node.excludeViewports.includes(viewerID))
36
+ if (excludeViewports.includes(viewerID))
29
37
  return;
30
- if (node.restrictViewports.length > 0 && !node.restrictViewports.includes(viewerID))
38
+ if (restrictViewports.length > 0 && !restrictViewports.includes(viewerID))
31
39
  return;
32
40
  }
33
- for (let i = 0; i < filterCriteria.length; i++) {
34
- if (filterCriteria[i](node)) {
35
- const intersection = this.intersectNode(node, ray, intersectionOptions);
36
- if (intersection) {
37
- intersection.forEach(i => i.node = node);
38
- intersections = intersections.concat(intersection);
41
+ if (filterCriteria) {
42
+ for (let i = 0; i < filterCriteria.length; i++) {
43
+ if (filterCriteria[i](node)) {
44
+ const intersection = this.intersectNode(node, ray, intersectionOptions);
45
+ if (intersection) {
46
+ intersection.forEach(i => i.node = node);
47
+ intersections = intersections.concat(intersection);
48
+ }
49
+ break;
39
50
  }
40
- break;
51
+ }
52
+ }
53
+ else {
54
+ const intersection = this.intersectNode(node, ray);
55
+ if (intersection) {
56
+ intersection.forEach(i => i.node = node);
57
+ intersections = intersections.concat(intersection);
41
58
  }
42
59
  }
43
60
  for (let i = 0; i < node.children.length; i++)
44
- intersectNode(node.children[i]);
61
+ intersectNode(node.children[i], visible && node.children[i].visible, excludeViewports.concat(node.children[i].excludeViewports), restrictViewports.concat(node.children[i].restrictViewports));
45
62
  };
46
- intersectNode(root);
63
+ for (let i = 0; i < this._intersectNodes.length; i++)
64
+ intersectNode(this._intersectNodes[i].node, this._intersectNodes[i].visible, this._intersectNodes[i].excludeViewports, this._intersectNodes[i].restrictViewports);
47
65
  intersections.sort((a, b) => a.distance - b.distance);
48
66
  return intersections;
49
67
  }
50
- // #endregion Public Methods (1)
51
- // #region Private Methods (4)
52
- checkIntersection(node, material, ray, pA, pB, pC) {
53
- let point;
54
- if (material && material.side === viewer_shared_types_1.MATERIAL_SIDE.BACK) {
55
- const triangle = new viewer_shared_math_1.Triangle(pC, pB, pA);
56
- point = triangle.intersect(ray.origin, ray.direction);
57
- }
58
- else {
59
- const triangle = new viewer_shared_math_1.Triangle(pA, pB, pC);
60
- point = triangle.intersect(ray.origin, ray.direction);
61
- }
62
- if (point === null)
63
- return;
64
- const distance = gl_matrix_1.vec3.distance(ray.origin, point);
65
- return {
66
- distance: distance,
67
- point: gl_matrix_1.vec3.clone(point),
68
- node
69
- };
70
- }
71
- checkLineIntersection(node, ray, radius, pA, pB) {
72
- const direction = gl_matrix_1.vec3.sub(gl_matrix_1.vec3.create(), pB, pA);
73
- const lineLength = gl_matrix_1.vec3.length(direction);
74
- const lineRay = {
75
- origin: pA,
76
- direction: gl_matrix_1.vec3.divide(gl_matrix_1.vec3.create(), direction, gl_matrix_1.vec3.fromValues(lineLength, lineLength, lineLength))
77
- };
78
- const planeNormal = gl_matrix_1.vec3.cross(gl_matrix_1.vec3.create(), ray.direction, lineRay.direction);
79
- const Na = gl_matrix_1.vec3.normalize(gl_matrix_1.vec3.create(), gl_matrix_1.vec3.cross(gl_matrix_1.vec3.create(), ray.direction, planeNormal));
80
- const Nb = gl_matrix_1.vec3.normalize(gl_matrix_1.vec3.create(), gl_matrix_1.vec3.cross(gl_matrix_1.vec3.create(), lineRay.direction, planeNormal));
81
- const da = gl_matrix_1.vec3.dot(gl_matrix_1.vec3.sub(gl_matrix_1.vec3.create(), pA, ray.origin), Nb) / gl_matrix_1.vec3.dot(ray.direction, Nb);
82
- const db = gl_matrix_1.vec3.dot(gl_matrix_1.vec3.sub(gl_matrix_1.vec3.create(), ray.origin, pA), Na) / gl_matrix_1.vec3.dot(lineRay.direction, Na);
83
- let pointA = gl_matrix_1.vec3.create();
84
- if (da < 0) {
85
- gl_matrix_1.vec3.copy(pointA, ray.origin);
86
- }
87
- else {
88
- pointA = gl_matrix_1.vec3.add(gl_matrix_1.vec3.create(), ray.origin, gl_matrix_1.vec3.mul(gl_matrix_1.vec3.create(), ray.direction, gl_matrix_1.vec3.fromValues(da, da, da)));
89
- }
90
- let pointB = gl_matrix_1.vec3.create();
91
- if (db < 0) {
92
- gl_matrix_1.vec3.copy(pointB, pA);
93
- }
94
- else if (db < lineLength) {
95
- pointB = gl_matrix_1.vec3.add(gl_matrix_1.vec3.create(), pA, gl_matrix_1.vec3.mul(gl_matrix_1.vec3.create(), lineRay.direction, gl_matrix_1.vec3.fromValues(db, db, db)));
96
- }
97
- else {
98
- gl_matrix_1.vec3.copy(pointB, pB);
99
- }
100
- const distance = gl_matrix_1.vec3.distance(pointA, pointB);
101
- if (distance < radius) {
102
- return {
103
- distance: distance,
104
- point: gl_matrix_1.vec3.clone(pointB),
105
- node
106
- };
107
- }
108
- else {
109
- return;
110
- }
111
- }
112
- checkPointIntersection(node, ray, radius, p) {
113
- const closestPoint = gl_matrix_1.vec3.sub(gl_matrix_1.vec3.create(), p, ray.origin);
114
- const directionDistance = gl_matrix_1.vec3.dot(closestPoint, ray.direction);
115
- if (directionDistance < 0) {
116
- gl_matrix_1.vec3.copy(closestPoint, ray.origin);
117
- }
118
- else {
119
- gl_matrix_1.vec3.multiply(closestPoint, gl_matrix_1.vec3.copy(closestPoint, ray.direction), gl_matrix_1.vec3.fromValues(directionDistance, directionDistance, directionDistance));
120
- gl_matrix_1.vec3.add(closestPoint, closestPoint, ray.origin);
121
- }
122
- const distance = gl_matrix_1.vec3.distance(closestPoint, p);
123
- if (distance < radius) {
124
- return {
125
- distance: distance,
126
- point: gl_matrix_1.vec3.clone(closestPoint),
127
- node
128
- };
129
- }
130
- else {
131
- return;
132
- }
133
- }
134
68
  intersectNode(node, rayIn, intersectionOptions) {
135
69
  if (node.visible === false)
136
70
  return;
@@ -147,16 +81,16 @@ class IntersectionEngine {
147
81
  }
148
82
  }
149
83
  // quick out if the material does not fit the intersection options
150
- if (geometryData) {
84
+ if (geometryData && intersectionOptions) {
151
85
  let materialData = null;
152
- if (geometryData.primitive.effectMaterials.length > 0) {
153
- materialData = geometryData.primitive.effectMaterials[geometryData.primitive.effectMaterials.length - 1].material;
86
+ if (geometryData.effectMaterials.length > 0) {
87
+ materialData = geometryData.effectMaterials[geometryData.effectMaterials.length - 1].material;
154
88
  }
155
89
  else if (intersectionOptions.rendererType === viewer_rendering_engine_rendering_engine_1.RENDERER_TYPE.ATTRIBUTES) {
156
- materialData = geometryData.primitive.attributeMaterial;
90
+ materialData = geometryData.attributeMaterial;
157
91
  }
158
92
  else {
159
- materialData = geometryData.primitive.material;
93
+ materialData = geometryData.material;
160
94
  }
161
95
  // if opacity <= intersectionOptions.opacity
162
96
  if (materialData && materialData.opacity <= intersectionOptions.opacity)
@@ -175,9 +109,9 @@ class IntersectionEngine {
175
109
  }
176
110
  return;
177
111
  }
178
- else if (geometryData.primitive.mode === viewer_shared_types_1.PRIMITIVE_MODE.LINES) {
179
- // if (node.boundingBox.boundingSphere.intersect(ray.origin, ray.direction) === null) return;
180
- if (node.boundingBox.intersect(rayIn.origin, rayIn.direction) === null)
112
+ else if (geometryData.mode === viewer_shared_types_1.PRIMITIVE_MODE.LINES) {
113
+ // if (node.boundingBox.boundingSphere.intersects(ray.origin, ray.direction) === false) return;
114
+ if (node.boundingBox.intersects(rayIn.origin, rayIn.direction) === false)
181
115
  return;
182
116
  const index = geometryData.primitive.indices;
183
117
  const position = geometryData.primitive.attributes['POSITION'];
@@ -190,7 +124,7 @@ class IntersectionEngine {
190
124
  const b = index.array[(i + 1) * index.itemSize];
191
125
  let intersection = this.checkLineIntersection(node, ray, radius, gl_matrix_1.vec3.fromValues(position.array[a * position.itemSize], position.array[a * position.itemSize + 1], position.array[a * position.itemSize + 2]), gl_matrix_1.vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2]));
192
126
  if (intersection)
193
- intersections.push(intersection);
127
+ intersections.push(Object.assign(intersection, { geometryData }));
194
128
  }
195
129
  }
196
130
  else if (position !== undefined) {
@@ -200,16 +134,16 @@ class IntersectionEngine {
200
134
  const b = i + 1;
201
135
  let intersection = this.checkLineIntersection(node, ray, radius, gl_matrix_1.vec3.fromValues(position.array[a * position.itemSize], position.array[a * position.itemSize + 1], position.array[a * position.itemSize + 2]), gl_matrix_1.vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2]));
202
136
  if (intersection)
203
- intersections.push(intersection);
137
+ intersections.push(Object.assign(intersection, { geometryData }));
204
138
  }
205
139
  }
206
140
  intersections.sort((a, b) => a.distance - b.distance);
207
141
  intersections.forEach(i => i.point = gl_matrix_1.vec3.transformMat4(i.point, i.point, node.worldMatrix));
208
142
  return intersections;
209
143
  }
210
- else if (geometryData.primitive.mode === viewer_shared_types_1.PRIMITIVE_MODE.LINE_LOOP || geometryData.primitive.mode === viewer_shared_types_1.PRIMITIVE_MODE.LINE_STRIP) {
211
- // if (node.boundingBox.boundingSphere.intersect(ray.origin, ray.direction) === null) return;
212
- if (node.boundingBox.intersect(rayIn.origin, rayIn.direction) === null)
144
+ else if (geometryData.mode === viewer_shared_types_1.PRIMITIVE_MODE.LINE_LOOP || geometryData.mode === viewer_shared_types_1.PRIMITIVE_MODE.LINE_STRIP) {
145
+ // if (node.boundingBox.boundingSphere.intersects(ray.origin, ray.direction) === false) return;
146
+ if (node.boundingBox.intersects(rayIn.origin, rayIn.direction) === false)
213
147
  return;
214
148
  const index = geometryData.primitive.indices;
215
149
  const position = geometryData.primitive.attributes['POSITION'];
@@ -222,7 +156,7 @@ class IntersectionEngine {
222
156
  const b = index.array[(i + 1) * index.itemSize];
223
157
  let intersection = this.checkLineIntersection(node, ray, radius, gl_matrix_1.vec3.fromValues(position.array[a * position.itemSize], position.array[a * position.itemSize + 1], position.array[a * position.itemSize + 2]), gl_matrix_1.vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2]));
224
158
  if (intersection)
225
- intersections.push(intersection);
159
+ intersections.push(Object.assign(intersection, { geometryData }));
226
160
  }
227
161
  }
228
162
  else if (position !== undefined) {
@@ -232,14 +166,14 @@ class IntersectionEngine {
232
166
  const b = i + 1;
233
167
  let intersection = this.checkLineIntersection(node, ray, radius, gl_matrix_1.vec3.fromValues(position.array[a * position.itemSize], position.array[a * position.itemSize + 1], position.array[a * position.itemSize + 2]), gl_matrix_1.vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2]));
234
168
  if (intersection)
235
- intersections.push(intersection);
169
+ intersections.push(Object.assign(intersection, { geometryData }));
236
170
  }
237
171
  }
238
172
  intersections.sort((a, b) => a.distance - b.distance);
239
173
  intersections.forEach(i => i.point = gl_matrix_1.vec3.transformMat4(i.point, i.point, node.worldMatrix));
240
174
  return intersections;
241
175
  }
242
- else if (geometryData.primitive.mode === viewer_shared_types_1.PRIMITIVE_MODE.POINTS) {
176
+ else if (geometryData.mode === viewer_shared_types_1.PRIMITIVE_MODE.POINTS) {
243
177
  const position = geometryData.primitive.attributes['POSITION'];
244
178
  const radius = 0.1;
245
179
  let intersections = [];
@@ -248,7 +182,7 @@ class IntersectionEngine {
248
182
  for (let i = 0, il = +position.count; i < il; i++) {
249
183
  let intersection = this.checkPointIntersection(node, ray, radius, gl_matrix_1.vec3.fromValues(position.array[i * position.itemSize], position.array[i * position.itemSize + 1], position.array[i * position.itemSize + 2]));
250
184
  if (intersection)
251
- intersections.push(intersection);
185
+ intersections.push(Object.assign(intersection, { geometryData }));
252
186
  }
253
187
  }
254
188
  intersections.sort((a, b) => a.distance - b.distance);
@@ -256,10 +190,18 @@ class IntersectionEngine {
256
190
  return intersections;
257
191
  }
258
192
  else {
259
- // if (node.boundingBox.boundingSphere.intersect(ray.origin, ray.direction) === null) return;
260
- if (node.boundingBox.intersect(rayIn.origin, rayIn.direction) === null)
193
+ // Here, Vector is a vector in Rn, not a dynamic array.
194
+ let v = gl_matrix_1.vec3.sub(gl_matrix_1.vec3.create(), node.boundingBox.boundingSphere.center, rayIn.origin);
195
+ let dotProd = gl_matrix_1.vec3.dot(v, rayIn.direction);
196
+ dotProd = Math.max(dotProd, 0.0); // if dotProd is negative, the closest point is in the opposite direction to d.
197
+ let e = gl_matrix_1.vec3.add(gl_matrix_1.vec3.create(), rayIn.origin, gl_matrix_1.vec3.scale(gl_matrix_1.vec3.create(), rayIn.direction, dotProd));
198
+ let squaredDistance = gl_matrix_1.vec3.squaredDistance(e, node.boundingBox.boundingSphere.center);
199
+ if (squaredDistance > node.boundingBox.boundingSphere.radius * node.boundingBox.boundingSphere.radius)
200
+ return;
201
+ // if (node.boundingBox.boundingSphere.intersects(ray.origin, ray.direction) === false) return;
202
+ if (node.boundingBox.intersects(rayIn.origin, rayIn.direction) === false)
261
203
  return;
262
- const material = geometryData.primitive.material;
204
+ const material = geometryData.material;
263
205
  const index = geometryData.primitive.indices;
264
206
  const position = geometryData.primitive.attributes['POSITION'];
265
207
  let intersections = [];
@@ -271,7 +213,7 @@ class IntersectionEngine {
271
213
  const c = index.array[(i + 2) * index.itemSize];
272
214
  let intersection = this.checkIntersection(node, material, ray, gl_matrix_1.vec3.fromValues(position.array[a * position.itemSize], position.array[a * position.itemSize + 1], position.array[a * position.itemSize + 2]), gl_matrix_1.vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2]), gl_matrix_1.vec3.fromValues(position.array[c * position.itemSize], position.array[c * position.itemSize + 1], position.array[c * position.itemSize + 2]));
273
215
  if (intersection)
274
- intersections.push(intersection);
216
+ intersections.push(Object.assign(intersection, { geometryData }));
275
217
  }
276
218
  }
277
219
  else if (position !== undefined) {
@@ -282,7 +224,7 @@ class IntersectionEngine {
282
224
  const c = i + 2;
283
225
  let intersection = this.checkIntersection(node, material, ray, gl_matrix_1.vec3.fromValues(position.array[a * position.itemSize], position.array[a * position.itemSize + 1], position.array[a * position.itemSize + 2]), gl_matrix_1.vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2]), gl_matrix_1.vec3.fromValues(position.array[c * position.itemSize], position.array[c * position.itemSize + 1], position.array[c * position.itemSize + 2]));
284
226
  if (intersection)
285
- intersections.push(intersection);
227
+ intersections.push(Object.assign(intersection, { geometryData }));
286
228
  }
287
229
  }
288
230
  intersections.sort((a, b) => a.distance - b.distance);
@@ -290,6 +232,115 @@ class IntersectionEngine {
290
232
  return intersections;
291
233
  }
292
234
  }
235
+ // #endregion Public Methods (2)
236
+ // #region Private Methods (4)
237
+ checkIntersection(node, material, ray, pA, pB, pC) {
238
+ let point;
239
+ if (material && material.side === viewer_shared_types_1.MATERIAL_SIDE.BACK) {
240
+ const triangle = new viewer_shared_math_1.Triangle(pC, pB, pA);
241
+ point = triangle.intersect(ray.origin, ray.direction);
242
+ }
243
+ else {
244
+ const triangle = new viewer_shared_math_1.Triangle(pA, pB, pC);
245
+ point = triangle.intersect(ray.origin, ray.direction);
246
+ }
247
+ if (point === null)
248
+ return;
249
+ const distance = gl_matrix_1.vec3.distance(ray.origin, point);
250
+ return {
251
+ distance: distance,
252
+ point: gl_matrix_1.vec3.clone(point),
253
+ node
254
+ };
255
+ }
256
+ checkLineIntersection(node, ray, radius, pA, pB) {
257
+ const direction = gl_matrix_1.vec3.sub(gl_matrix_1.vec3.create(), pB, pA);
258
+ const lineLength = gl_matrix_1.vec3.length(direction);
259
+ const lineRay = {
260
+ origin: pA,
261
+ direction: gl_matrix_1.vec3.divide(gl_matrix_1.vec3.create(), direction, gl_matrix_1.vec3.fromValues(lineLength, lineLength, lineLength))
262
+ };
263
+ const planeNormal = gl_matrix_1.vec3.cross(gl_matrix_1.vec3.create(), ray.direction, lineRay.direction);
264
+ const Na = gl_matrix_1.vec3.normalize(gl_matrix_1.vec3.create(), gl_matrix_1.vec3.cross(gl_matrix_1.vec3.create(), ray.direction, planeNormal));
265
+ const Nb = gl_matrix_1.vec3.normalize(gl_matrix_1.vec3.create(), gl_matrix_1.vec3.cross(gl_matrix_1.vec3.create(), lineRay.direction, planeNormal));
266
+ const da = gl_matrix_1.vec3.dot(gl_matrix_1.vec3.sub(gl_matrix_1.vec3.create(), pA, ray.origin), Nb) / gl_matrix_1.vec3.dot(ray.direction, Nb);
267
+ const db = gl_matrix_1.vec3.dot(gl_matrix_1.vec3.sub(gl_matrix_1.vec3.create(), ray.origin, pA), Na) / gl_matrix_1.vec3.dot(lineRay.direction, Na);
268
+ let pointA = gl_matrix_1.vec3.create();
269
+ if (da < 0) {
270
+ gl_matrix_1.vec3.copy(pointA, ray.origin);
271
+ }
272
+ else {
273
+ pointA = gl_matrix_1.vec3.add(gl_matrix_1.vec3.create(), ray.origin, gl_matrix_1.vec3.mul(gl_matrix_1.vec3.create(), ray.direction, gl_matrix_1.vec3.fromValues(da, da, da)));
274
+ }
275
+ let pointB = gl_matrix_1.vec3.create();
276
+ if (db < 0) {
277
+ gl_matrix_1.vec3.copy(pointB, pA);
278
+ }
279
+ else if (db < lineLength) {
280
+ pointB = gl_matrix_1.vec3.add(gl_matrix_1.vec3.create(), pA, gl_matrix_1.vec3.mul(gl_matrix_1.vec3.create(), lineRay.direction, gl_matrix_1.vec3.fromValues(db, db, db)));
281
+ }
282
+ else {
283
+ gl_matrix_1.vec3.copy(pointB, pB);
284
+ }
285
+ const distance = gl_matrix_1.vec3.distance(pointA, pointB);
286
+ if (distance < radius) {
287
+ return {
288
+ distance: distance,
289
+ point: gl_matrix_1.vec3.clone(pointB),
290
+ node
291
+ };
292
+ }
293
+ else {
294
+ return;
295
+ }
296
+ }
297
+ checkPointIntersection(node, ray, radius, p) {
298
+ const closestPoint = gl_matrix_1.vec3.sub(gl_matrix_1.vec3.create(), p, ray.origin);
299
+ const directionDistance = gl_matrix_1.vec3.dot(closestPoint, ray.direction);
300
+ if (directionDistance < 0) {
301
+ gl_matrix_1.vec3.copy(closestPoint, ray.origin);
302
+ }
303
+ else {
304
+ gl_matrix_1.vec3.multiply(closestPoint, gl_matrix_1.vec3.copy(closestPoint, ray.direction), gl_matrix_1.vec3.fromValues(directionDistance, directionDistance, directionDistance));
305
+ gl_matrix_1.vec3.add(closestPoint, closestPoint, ray.origin);
306
+ }
307
+ const distance = gl_matrix_1.vec3.distance(closestPoint, p);
308
+ if (distance < radius) {
309
+ return {
310
+ distance: distance,
311
+ point: gl_matrix_1.vec3.clone(closestPoint),
312
+ node
313
+ };
314
+ }
315
+ else {
316
+ return;
317
+ }
318
+ }
319
+ gatherNodes() {
320
+ this._intersectNodes = [];
321
+ this._tree.root.traverse(node => {
322
+ if (node.visible === false)
323
+ return;
324
+ for (let i = 0; i < node.data.length; i++) {
325
+ if (node.data[i] instanceof viewer_shared_types_1.GeometryData) {
326
+ let tempNode = node;
327
+ let visible = true, restrictViewports = [], excludeViewports = [];
328
+ while (tempNode.parent) {
329
+ visible = tempNode.visible && visible;
330
+ restrictViewports = restrictViewports.concat(tempNode.restrictViewports);
331
+ excludeViewports = excludeViewports.concat(tempNode.excludeViewports);
332
+ tempNode = tempNode.parent;
333
+ }
334
+ this._intersectNodes.push({
335
+ node,
336
+ visible,
337
+ restrictViewports: [...new Set(restrictViewports)],
338
+ excludeViewports: [...new Set(excludeViewports)]
339
+ });
340
+ }
341
+ }
342
+ });
343
+ }
293
344
  }
294
345
  exports.IntersectionEngine = IntersectionEngine;
295
346
  //# sourceMappingURL=IntersectionEngine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IntersectionEngine.js","sourceRoot":"","sources":["../../src/implementation/IntersectionEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IntersectionEngine.js","sourceRoot":"","sources":["../../src/implementation/IntersectionEngine.ts"],"names":[],"mappings":";;;AAAA,yEAAqH;AACrH,yCAAuC;AACvC,uEAA0D;AAC1D,iFAAuF;AACvF,mHAAqF;AAKrF,+EAA4E;AAE5E,MAAa,kBAAkB;IAe3B,4BAA4B;IAE5B,2BAA2B;IAE3B;QAlBA,yBAAyB;QAER,iBAAY,GAAgB,oCAAW,CAAC,QAAQ,CAAC;QACjD,UAAK,GAAU,8BAAI,CAAC,QAAQ,CAAC;QAItC,oBAAe,GAKjB,EAAE,CAAC;QAOL,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,kCAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACpE,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC,CAAC,CAAA;IACN,CAAC;IAED,8BAA8B;IAE9B,sCAAsC;IAE/B,MAAM,KAAK,QAAQ;QACtB,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,yCAAyC;IAEzC,6BAA6B;IAGtB,SAAS,CACZ,GAAS,EACT,cAAsC,EACtC,mBAAsE,EACtE,OAAkB,IAAI,CAAC,KAAK,CAAC,IAAI,EACjC,QAAiB;QAEjB,IAAI,aAAa,GAAoB,EAAE,CAAC;QACxC,MAAM,aAAa,GAAG,CAAC,IAAe,EAAE,OAAgB,EAAE,gBAA0B,EAAE,iBAA2B,EAAE,EAAE;YACjH,IAAG,OAAO,KAAK,KAAK;gBAAE,OAAO;YAE7B,IAAG,QAAQ,KAAK,SAAS,EAAE;gBACvB,IAAG,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAAE,OAAO;gBAC/C,IAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAAE,OAAO;aACpF;YAED,IAAG,cAAc,EAAE;gBACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC5C,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;wBACzB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAA;wBACvE,IAAI,YAAY,EAAE;4BACd,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;4BACzC,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;yBACtD;wBACD,MAAM;qBACT;iBACJ;aACJ;iBAAM;gBACH,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;gBAClD,IAAI,YAAY,EAAE;oBACd,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;oBACzC,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;iBACtD;aACJ;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE;gBACzC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAA;QACtM,CAAC,CAAA;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE;YAC/C,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAA;QAEtK,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QACtD,OAAO,aAAa,CAAC;IACzB,CAAC;IAEM,aAAa,CAAC,IAAe,EAAE,KAAW,EAAE,mBAAsE;QACrH,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;YAAE,OAAO;QAEnC,MAAM,aAAa,GAAG,gBAAI,CAAC,MAAM,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG;YACR,MAAM,EAAE,gBAAI,CAAC,aAAa,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC;YACtE,SAAS,EAAE,gBAAI,CAAC,SAAS,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,gBAAI,CAAC,UAAU,CACpD,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EACrH,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EACrH,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CACzH,CAAC;SACL,CAAC;QAEF,IAAI,YAAsC,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,kCAAY,EAAE;gBACtC,YAAY,GAAiB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC1C,MAAM;aACT;SACJ;QAED,kEAAkE;QAClE,IAAI,YAAY,IAAI,mBAAmB,EAAE;YACrC,IAAI,YAAY,GAAiC,IAAI,CAAC;YACtD,IAAI,YAAY,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzC,YAAY,GAAG,YAAY,CAAC,eAAe,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAA;aAChG;iBAAM,IAAI,mBAAmB,CAAC,YAAY,KAAK,wDAAa,CAAC,UAAU,EAAE;gBACtE,YAAY,GAAG,YAAY,CAAC,iBAAiB,CAAC;aACjD;iBAAM;gBACH,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC;aACxC;YAED,4CAA4C;YAC5C,IAAI,YAAY,IAAI,YAAY,CAAC,OAAO,IAAI,mBAAmB,CAAC,OAAO;gBACnE,OAAO;SACd;QAED,IAAI,CAAC,YAAY,EAAE;YACf,IAAI,aAAa,GAAoB,EAAE,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC3C,IAAI,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC;gBACpF,IAAI,YAAY;oBACZ,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;aAC1D;YACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC1B,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACtD,OAAO,aAAa,CAAC;aACxB;YACD,OAAO;SACV;aAAM,IAAI,YAAY,CAAC,IAAI,KAAK,oCAAc,CAAC,KAAK,EAAE;YACnD,+FAA+F;YAC/F,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,KAAK;gBAAE,OAAO;YAEjF,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,GAAG,CAAC;YACnB,IAAI,aAAa,GAAoB,EAAE,CAAC;YACxC,IAAI,KAAK,KAAK,IAAI,EAAE;gBAChB,0BAA0B;gBAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;oBAC/C,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC5C,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAEhD,IAAI,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAC3D,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAC5I,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClJ,IAAI,YAAY;wBAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;iBACtF;aACJ;iBAAM,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC/B,8BAA8B;gBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;oBAClD,MAAM,CAAC,GAAG,CAAC,CAAC;oBACZ,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAChB,IAAI,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAC3D,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAC5I,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC9I,IAAI,YAAY;wBAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;iBAC1F;aACJ;YAED,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YACtD,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,gBAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YAC7F,OAAO,aAAa,CAAC;SACxB;aAAM,IAAI,YAAY,CAAC,IAAI,KAAK,oCAAc,CAAC,SAAS,IAAI,YAAY,CAAC,IAAI,KAAK,oCAAc,CAAC,UAAU,EAAE;YAC1G,+FAA+F;YAC/F,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,KAAK;gBAAE,OAAO;YAEjF,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,GAAG,CAAC;YACnB,IAAI,aAAa,GAAoB,EAAE,CAAC;YACxC,IAAI,KAAK,KAAK,IAAI,EAAE;gBAChB,0BAA0B;gBAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;oBAChD,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC5C,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAEhD,IAAI,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAC3D,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAC5I,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClJ,IAAI,YAAY;wBAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;iBACtF;aACJ;iBAAM,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC/B,8BAA8B;gBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;oBAClD,MAAM,CAAC,GAAG,CAAC,CAAC;oBACZ,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAChB,IAAI,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAC3D,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAC5I,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC9I,IAAI,YAAY;wBAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;iBAC1F;aACJ;YAED,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YACtD,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,gBAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YAC7F,OAAO,aAAa,CAAC;SACxB;aAAM,IAAI,YAAY,CAAC,IAAI,KAAK,oCAAc,CAAC,MAAM,EAAE;YACpD,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,GAAG,CAAC;YACnB,IAAI,aAAa,GAAoB,EAAE,CAAC;YACxC,IAAI,QAAQ,KAAK,SAAS,EAAE;gBACxB,8BAA8B;gBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;oBAC/C,IAAI,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAC5D,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClJ,IAAI,YAAY;wBAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;iBACtF;aACJ;YAED,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YACtD,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,gBAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YAC7F,OAAO,aAAa,CAAC;SACxB;aAAM;YACH,uDAAuD;YACvD,IAAK,CAAC,GAAG,gBAAI,CAAC,GAAG,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACvF,IAAI,OAAO,GAAG,gBAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAC3C,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,+EAA+E;YACjH,IAAI,CAAC,GAAG,gBAAI,CAAC,GAAG,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAI,CAAC,KAAK,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAEnG,IAAI,eAAe,GAAG,gBAAI,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACtF,IAAI,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM;gBAAE,OAAO;YAE9G,+FAA+F;YAC/F,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,KAAK;gBAAE,OAAO;YAEjF,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC;YACvC,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAE/D,IAAI,aAAa,GAAoB,EAAE,CAAC;YAExC,IAAI,KAAK,KAAK,IAAI,EAAE;gBAChB,0BAA0B;gBAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;oBAC/C,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAC5C,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAChD,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAEhD,IAAI,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EACzD,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAC5I,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAC5I,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClJ,IAAI,YAAY;wBAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;iBACtF;aACJ;iBAAM,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC/B,8BAA8B;gBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;oBAClD,MAAM,CAAC,GAAG,CAAC,CAAC;oBACZ,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAChB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAChB,IAAI,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EACzD,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAC5I,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAC5I,gBAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClJ,IAAI,YAAY;wBAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;iBACtF;aACJ;YAED,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YACtD,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,gBAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YAC7F,OAAO,aAAa,CAAC;SACxB;IACL,CAAC;IAED,gCAAgC;IAEhC,8BAA8B;IAEtB,iBAAiB,CAAC,IAAe,EAAE,QAAsC,EAAE,GAAS,EAAE,EAAQ,EAAE,EAAQ,EAAE,EAAQ;QACtH,IAAI,KAAkB,CAAC;QAEvB,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,mCAAa,CAAC,IAAI,EAAE;YAClD,MAAM,QAAQ,GAAG,IAAI,6BAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;SACzD;aAAM;YACH,MAAM,QAAQ,GAAG,IAAI,6BAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;SACzD;QAED,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO;QAE3B,MAAM,QAAQ,GAAG,gBAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO;YACH,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,gBAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACxB,IAAI;SACP,CAAC;IACN,CAAC;IAEO,qBAAqB,CAAC,IAAe,EAAE,GAAS,EAAE,MAAc,EAAE,EAAQ,EAAE,EAAQ;QACxF,MAAM,SAAS,GAAG,gBAAI,CAAC,GAAG,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,gBAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG;YACZ,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,gBAAI,CAAC,MAAM,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,gBAAI,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;SACxG,CAAC;QACF,MAAM,WAAW,GAAG,gBAAI,CAAC,KAAK,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhF,MAAM,EAAE,GAAG,gBAAI,CAAC,SAAS,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,gBAAI,CAAC,KAAK,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QAChG,MAAM,EAAE,GAAG,gBAAI,CAAC,SAAS,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,gBAAI,CAAC,KAAK,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QAEpG,MAAM,EAAE,GAAG,gBAAI,CAAC,GAAG,CAAC,gBAAI,CAAC,GAAG,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,gBAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/F,MAAM,EAAE,GAAG,gBAAI,CAAC,GAAG,CAAC,gBAAI,CAAC,GAAG,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,gBAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAEnG,IAAI,MAAM,GAAS,gBAAI,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,EAAE,GAAG,CAAC,EAAE;YACR,gBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;SACjC;aAAM;YACH,MAAM,GAAG,gBAAI,CAAC,GAAG,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAI,CAAC,GAAG,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,gBAAI,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;SACrH;QAED,IAAI,MAAM,GAAS,gBAAI,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,EAAE,GAAG,CAAC,EAAE;YACR,gBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACzB;aAAM,IAAI,EAAE,GAAG,UAAU,EAAE;YACxB,MAAM,GAAG,gBAAI,CAAC,GAAG,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,gBAAI,CAAC,GAAG,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,SAAS,EAAE,gBAAI,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;SACjH;aAAM;YACH,gBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACzB;QAED,MAAM,QAAQ,GAAG,gBAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,QAAQ,GAAG,MAAM,EAAE;YACnB,OAAO;gBACH,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,gBAAI,CAAC,KAAK,CAAC,MAAM,CAAC;gBACzB,IAAI;aACP,CAAA;SACJ;aAAM;YACH,OAAO;SACV;IACL,CAAC;IAEO,sBAAsB,CAAC,IAAe,EAAE,GAAS,EAAE,MAAc,EAAE,CAAO;QAC9E,MAAM,YAAY,GAAG,gBAAI,CAAC,GAAG,CAAC,gBAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,iBAAiB,GAAG,gBAAI,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAEhE,IAAI,iBAAiB,GAAG,CAAC,EAAE;YACvB,gBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;SACvC;aAAM;YACH,gBAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,gBAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,gBAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC;YAC9I,gBAAI,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;SACpD;QAED,MAAM,QAAQ,GAAG,gBAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,QAAQ,GAAG,MAAM,EAAE;YACnB,OAAO;gBACH,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,gBAAI,CAAC,KAAK,CAAC,YAAY,CAAC;gBAC/B,IAAI;aACP,CAAA;SACJ;aAAM;YACH,OAAO;SACV;IACL,CAAC;IAEO,WAAW;QACf,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAC5B,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;gBAAE,OAAO;YAEnC,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtC,IAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,kCAAY,EAAE;oBAErC,IAAI,QAAQ,GAAG,IAAI,CAAC;oBACpB,IAAI,OAAO,GAAG,IAAI,EAAE,iBAAiB,GAAa,EAAE,EAAE,gBAAgB,GAAa,EAAE,CAAC;oBACtF,OAAM,QAAQ,CAAC,MAAM,EAAE;wBACnB,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC;wBACtC,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;wBACxE,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;wBACrE,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;qBAC9B;oBAED,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;wBACtB,IAAI;wBACJ,OAAO;wBACP,iBAAiB,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;wBAClD,gBAAgB,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC;qBACnD,CAAC,CAAA;iBAEL;aACJ;QACL,CAAC,CAAC,CAAA;IACN,CAAC;CAGJ;AAtYD,gDAsYC"}
@@ -1,5 +1,6 @@
1
1
  import { vec3 } from "gl-matrix";
2
2
  import { ITreeNode } from "@shapediver/viewer.shared.node-tree";
3
+ import { IGeometryData } from "@shapediver/viewer.shared.types";
3
4
  export interface IIntersection {
4
5
  /** The distance to the intersection. */
5
6
  distance: number;
@@ -7,5 +8,7 @@ export interface IIntersection {
7
8
  point: vec3;
8
9
  /** The intersected node. */
9
10
  node: ITreeNode;
11
+ /** The intersected geometry data */
12
+ geometryData: IGeometryData;
10
13
  }
11
14
  //# sourceMappingURL=IIntersection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IIntersection.d.ts","sourceRoot":"","sources":["../../src/interfaces/IIntersection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC1B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,KAAK,EAAE,IAAI,CAAC;IACZ,4BAA4B;IAC5B,IAAI,EAAE,SAAS,CAAA;CAClB"}
1
+ {"version":3,"file":"IIntersection.d.ts","sourceRoot":"","sources":["../../src/interfaces/IIntersection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC1B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,KAAK,EAAE,IAAI,CAAC;IACZ,4BAA4B;IAC5B,IAAI,EAAE,SAAS,CAAA;IACf,oCAAoC;IACpC,YAAY,EAAE,aAAa,CAAA;CAC9B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shapediver/viewer.rendering-engine.intersection-engine",
3
- "version": "2.8.5",
3
+ "version": "2.9.1",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "author": "Michael Oppitz <michael@shapediver.com>",
@@ -39,13 +39,13 @@
39
39
  "testEnvironment": "node"
40
40
  },
41
41
  "dependencies": {
42
- "@shapediver/viewer.rendering-engine.rendering-engine": "2.8.5",
43
- "@shapediver/viewer.shared.math": "2.8.5",
44
- "@shapediver/viewer.shared.node-tree": "2.8.5",
45
- "@shapediver/viewer.shared.services": "2.8.5",
46
- "@shapediver/viewer.shared.types": "2.8.5",
42
+ "@shapediver/viewer.rendering-engine.rendering-engine": "2.9.1",
43
+ "@shapediver/viewer.shared.math": "2.9.1",
44
+ "@shapediver/viewer.shared.node-tree": "2.9.1",
45
+ "@shapediver/viewer.shared.services": "2.9.1",
46
+ "@shapediver/viewer.shared.types": "2.9.1",
47
47
  "detect-it": "4.0.1",
48
48
  "gl-matrix": "3.3.0"
49
49
  },
50
- "gitHead": "a89e7b495fd87f1cb8bf6d412dec704190ee9585"
50
+ "gitHead": "c7b6d22d492066831588ca0e9ce66844b921dc6f"
51
51
  }
@@ -2,20 +2,40 @@ import { GeometryData, IMaterialAbstractData, MATERIAL_SIDE, PRIMITIVE_MODE } fr
2
2
  import { mat4, vec3 } from "gl-matrix";
3
3
  import { Triangle } from "@shapediver/viewer.shared.math";
4
4
  import { ITree, ITreeNode, Tree, TreeNode } from "@shapediver/viewer.shared.node-tree";
5
- import { IIntersection } from "../interfaces/IIntersection";
6
- import { IIntersectionEngine } from "../interfaces/IIntersectionEngine";
5
+ import { RENDERER_TYPE } from "@shapediver/viewer.rendering-engine.rendering-engine";
7
6
  import { IIntersectionFilter } from "../interfaces/IIntersectionFilter";
8
7
  import { IRay } from "../interfaces/IRay";
9
- import { RENDERER_TYPE } from "@shapediver/viewer.rendering-engine.rendering-engine";
8
+ import { IIntersection } from "../interfaces/IIntersection";
9
+ import { IIntersectionEngine } from "../interfaces/IIntersectionEngine";
10
+ import { EventEngine, EVENTTYPE } from "@shapediver/viewer.shared.services";
10
11
 
11
12
  export class IntersectionEngine implements IIntersectionEngine {
12
- // #region Properties (2)
13
+ // #region Properties (4)
13
14
 
15
+ private readonly _eventEngine: EventEngine = EventEngine.instance;
14
16
  private readonly _tree: ITree = Tree.instance;
15
17
 
16
18
  private static _instance: IntersectionEngine;
17
19
 
18
- // #endregion Properties (2)
20
+ private _intersectNodes: {
21
+ node: ITreeNode,
22
+ visible: boolean,
23
+ excludeViewports: string[],
24
+ restrictViewports: string[],
25
+ }[] = [];
26
+
27
+ // #endregion Properties (4)
28
+
29
+ // #region Constructors (1)
30
+
31
+ private constructor() {
32
+ this.gatherNodes();
33
+ this._eventEngine.addListener(EVENTTYPE.VIEWPORT.VIEWPORT_UPDATED, () => {
34
+ this.gatherNodes();
35
+ })
36
+ }
37
+
38
+ // #endregion Constructors (1)
19
39
 
20
40
  // #region Public Static Accessors (1)
21
41
 
@@ -25,137 +45,56 @@ export class IntersectionEngine implements IIntersectionEngine {
25
45
 
26
46
  // #endregion Public Static Accessors (1)
27
47
 
28
- // #region Public Methods (1)
48
+ // #region Public Methods (2)
49
+
29
50
 
30
51
  public intersect(
31
52
  ray: IRay,
32
- filterCriteria: IIntersectionFilter[] = [],
33
- intersectionOptions: { opacity: number, rendererType: RENDERER_TYPE } = { opacity: 0, rendererType: RENDERER_TYPE.STANDARD },
53
+ filterCriteria?: IIntersectionFilter[],
54
+ intersectionOptions?: { opacity: number, rendererType: RENDERER_TYPE },
34
55
  root: ITreeNode = this._tree.root,
35
56
  viewerID?: string
36
57
  ): IIntersection[] {
37
58
  let intersections: IIntersection[] = [];
38
- const intersectNode = (node: ITreeNode) => {
39
- if(node.visible === false) return;
59
+ const intersectNode = (node: ITreeNode, visible: boolean, excludeViewports: string[], restrictViewports: string[]) => {
60
+ if(visible === false) return;
40
61
 
41
62
  if(viewerID !== undefined) {
42
- if(node.excludeViewports.includes(viewerID)) return;
43
- if(node.restrictViewports.length > 0 && !node.restrictViewports.includes(viewerID)) return;
63
+ if(excludeViewports.includes(viewerID)) return;
64
+ if(restrictViewports.length > 0 && !restrictViewports.includes(viewerID)) return;
44
65
  }
45
66
 
46
- for (let i = 0; i < filterCriteria.length; i++) {
47
- if (filterCriteria[i](node)) {
48
- const intersection = this.intersectNode(node, ray, intersectionOptions)
49
- if (intersection) {
50
- intersection.forEach(i => i.node = node);
51
- intersections = intersections.concat(intersection);
67
+ if(filterCriteria) {
68
+ for (let i = 0; i < filterCriteria.length; i++) {
69
+ if (filterCriteria[i](node)) {
70
+ const intersection = this.intersectNode(node, ray, intersectionOptions)
71
+ if (intersection) {
72
+ intersection.forEach(i => i.node = node);
73
+ intersections = intersections.concat(intersection);
74
+ }
75
+ break;
52
76
  }
53
- break;
77
+ }
78
+ } else {
79
+ const intersection = this.intersectNode(node, ray)
80
+ if (intersection) {
81
+ intersection.forEach(i => i.node = node);
82
+ intersections = intersections.concat(intersection);
54
83
  }
55
84
  }
56
85
 
57
86
  for (let i = 0; i < node.children.length; i++)
58
- intersectNode(node.children[i])
87
+ intersectNode(node.children[i], visible && node.children[i].visible, excludeViewports.concat(node.children[i].excludeViewports), restrictViewports.concat(node.children[i].restrictViewports))
59
88
  }
60
- intersectNode(root);
89
+ for (let i = 0; i < this._intersectNodes.length; i++)
90
+ intersectNode(this._intersectNodes[i].node, this._intersectNodes[i].visible, this._intersectNodes[i].excludeViewports, this._intersectNodes[i].restrictViewports)
61
91
 
62
92
  intersections.sort((a, b) => a.distance - b.distance);
63
93
  return intersections;
64
94
  }
65
95
 
66
- // #endregion Public Methods (1)
67
-
68
- // #region Private Methods (4)
69
-
70
- private checkIntersection(node: ITreeNode, material: IMaterialAbstractData | null, ray: IRay, pA: vec3, pB: vec3, pC: vec3): { distance: number, point: vec3, node: ITreeNode } | undefined {
71
- let point: vec3 | null;
72
-
73
- if (material && material.side === MATERIAL_SIDE.BACK) {
74
- const triangle = new Triangle(pC, pB, pA);
75
- point = triangle.intersect(ray.origin, ray.direction);
76
- } else {
77
- const triangle = new Triangle(pA, pB, pC);
78
- point = triangle.intersect(ray.origin, ray.direction);
79
- }
80
-
81
- if (point === null) return;
82
-
83
- const distance = vec3.distance(ray.origin, point);
84
- return {
85
- distance: distance,
86
- point: vec3.clone(point),
87
- node
88
- };
89
- }
90
-
91
- private checkLineIntersection(node: ITreeNode, ray: IRay, radius: number, pA: vec3, pB: vec3): { distance: number, point: vec3, node: ITreeNode } | undefined {
92
- const direction = vec3.sub(vec3.create(), pB, pA);
93
- const lineLength = vec3.length(direction);
94
- const lineRay = {
95
- origin: pA,
96
- direction: vec3.divide(vec3.create(), direction, vec3.fromValues(lineLength, lineLength, lineLength))
97
- };
98
- const planeNormal = vec3.cross(vec3.create(), ray.direction, lineRay.direction);
99
-
100
- const Na = vec3.normalize(vec3.create(), vec3.cross(vec3.create(), ray.direction, planeNormal));
101
- const Nb = vec3.normalize(vec3.create(), vec3.cross(vec3.create(), lineRay.direction, planeNormal));
102
-
103
- const da = vec3.dot(vec3.sub(vec3.create(), pA, ray.origin), Nb) / vec3.dot(ray.direction, Nb);
104
- const db = vec3.dot(vec3.sub(vec3.create(), ray.origin, pA), Na) / vec3.dot(lineRay.direction, Na);
105
-
106
- let pointA: vec3 = vec3.create();
107
- if (da < 0) {
108
- vec3.copy(pointA, ray.origin);
109
- } else {
110
- pointA = vec3.add(vec3.create(), ray.origin, vec3.mul(vec3.create(), ray.direction, vec3.fromValues(da, da, da)));
111
- }
112
-
113
- let pointB: vec3 = vec3.create();
114
- if (db < 0) {
115
- vec3.copy(pointB, pA);
116
- } else if (db < lineLength) {
117
- pointB = vec3.add(vec3.create(), pA, vec3.mul(vec3.create(), lineRay.direction, vec3.fromValues(db, db, db)));
118
- } else {
119
- vec3.copy(pointB, pB);
120
- }
121
-
122
- const distance = vec3.distance(pointA, pointB);
123
- if (distance < radius) {
124
- return {
125
- distance: distance,
126
- point: vec3.clone(pointB),
127
- node
128
- }
129
- } else {
130
- return;
131
- }
132
- }
133
-
134
- private checkPointIntersection(node: ITreeNode, ray: IRay, radius: number, p: vec3): { distance: number, point: vec3, node: ITreeNode } | undefined {
135
- const closestPoint = vec3.sub(vec3.create(), p, ray.origin);
136
- const directionDistance = vec3.dot(closestPoint, ray.direction);
137
-
138
- if (directionDistance < 0) {
139
- vec3.copy(closestPoint, ray.origin);
140
- } else {
141
- vec3.multiply(closestPoint, vec3.copy(closestPoint, ray.direction), vec3.fromValues(directionDistance, directionDistance, directionDistance));
142
- vec3.add(closestPoint, closestPoint, ray.origin);
143
- }
144
-
145
- const distance = vec3.distance(closestPoint, p);
146
- if (distance < radius) {
147
- return {
148
- distance: distance,
149
- point: vec3.clone(closestPoint),
150
- node
151
- }
152
- } else {
153
- return;
154
- }
155
- }
156
-
157
- private intersectNode(node: ITreeNode, rayIn: IRay, intersectionOptions: { opacity: number, rendererType: RENDERER_TYPE }): IIntersection[] | undefined {
158
- if(node.visible === false) return;
96
+ public intersectNode(node: ITreeNode, rayIn: IRay, intersectionOptions?: { opacity: number, rendererType: RENDERER_TYPE }): IIntersection[] | undefined {
97
+ if (node.visible === false) return;
159
98
 
160
99
  const inverseMatrix = mat4.invert(mat4.create(), node.worldMatrix);
161
100
  const ray = {
@@ -176,18 +115,18 @@ export class IntersectionEngine implements IIntersectionEngine {
176
115
  }
177
116
 
178
117
  // quick out if the material does not fit the intersection options
179
- if(geometryData) {
118
+ if (geometryData && intersectionOptions) {
180
119
  let materialData: IMaterialAbstractData | null = null;
181
- if (geometryData.primitive.effectMaterials.length > 0) {
182
- materialData = geometryData.primitive.effectMaterials[geometryData.primitive.effectMaterials.length - 1].material
120
+ if (geometryData.effectMaterials.length > 0) {
121
+ materialData = geometryData.effectMaterials[geometryData.effectMaterials.length - 1].material
183
122
  } else if (intersectionOptions.rendererType === RENDERER_TYPE.ATTRIBUTES) {
184
- materialData = geometryData.primitive.attributeMaterial;
123
+ materialData = geometryData.attributeMaterial;
185
124
  } else {
186
- materialData = geometryData.primitive.material;
125
+ materialData = geometryData.material;
187
126
  }
188
127
 
189
128
  // if opacity <= intersectionOptions.opacity
190
- if(materialData && materialData.opacity <= intersectionOptions.opacity)
129
+ if (materialData && materialData.opacity <= intersectionOptions.opacity)
191
130
  return;
192
131
  }
193
132
 
@@ -203,14 +142,14 @@ export class IntersectionEngine implements IIntersectionEngine {
203
142
  return intersections;
204
143
  }
205
144
  return;
206
- } else if (geometryData.primitive.mode === PRIMITIVE_MODE.LINES) {
207
- // if (node.boundingBox.boundingSphere.intersect(ray.origin, ray.direction) === null) return;
208
- if (node.boundingBox.intersect(rayIn.origin, rayIn.direction) === null) return;
209
-
145
+ } else if (geometryData.mode === PRIMITIVE_MODE.LINES) {
146
+ // if (node.boundingBox.boundingSphere.intersects(ray.origin, ray.direction) === false) return;
147
+ if (node.boundingBox.intersects(rayIn.origin, rayIn.direction) === false) return;
148
+
210
149
  const index = geometryData.primitive.indices;
211
150
  const position = geometryData.primitive.attributes['POSITION'];
212
151
  const radius = 0.1;
213
- let intersections = [];
152
+ let intersections: IIntersection[] = [];
214
153
  if (index !== null) {
215
154
  // indexed buffer geometry
216
155
  for (let i = 0, il = +index.count; i < il; i += 2) {
@@ -220,7 +159,7 @@ export class IntersectionEngine implements IIntersectionEngine {
220
159
  let intersection = this.checkLineIntersection(node, ray, radius,
221
160
  vec3.fromValues(position.array[a * position.itemSize], position.array[a * position.itemSize + 1], position.array[a * position.itemSize + 2]),
222
161
  vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2]));
223
- if (intersection) intersections.push(intersection)
162
+ if (intersection) intersections.push(Object.assign(intersection, { geometryData }))
224
163
  }
225
164
  } else if (position !== undefined) {
226
165
  // non-indexed buffer geometry
@@ -229,21 +168,22 @@ export class IntersectionEngine implements IIntersectionEngine {
229
168
  const b = i + 1;
230
169
  let intersection = this.checkLineIntersection(node, ray, radius,
231
170
  vec3.fromValues(position.array[a * position.itemSize], position.array[a * position.itemSize + 1], position.array[a * position.itemSize + 2]),
232
- vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2])); if (intersection) intersections.push(intersection)
171
+ vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2]));
172
+ if (intersection) intersections.push(Object.assign(intersection, { geometryData }))
233
173
  }
234
174
  }
235
175
 
236
176
  intersections.sort((a, b) => a.distance - b.distance);
237
177
  intersections.forEach(i => i.point = vec3.transformMat4(i.point, i.point, node.worldMatrix));
238
178
  return intersections;
239
- } else if (geometryData.primitive.mode === PRIMITIVE_MODE.LINE_LOOP || geometryData.primitive.mode === PRIMITIVE_MODE.LINE_STRIP) {
240
- // if (node.boundingBox.boundingSphere.intersect(ray.origin, ray.direction) === null) return;
241
- if (node.boundingBox.intersect(rayIn.origin, rayIn.direction) === null) return;
242
-
179
+ } else if (geometryData.mode === PRIMITIVE_MODE.LINE_LOOP || geometryData.mode === PRIMITIVE_MODE.LINE_STRIP) {
180
+ // if (node.boundingBox.boundingSphere.intersects(ray.origin, ray.direction) === false) return;
181
+ if (node.boundingBox.intersects(rayIn.origin, rayIn.direction) === false) return;
182
+
243
183
  const index = geometryData.primitive.indices;
244
184
  const position = geometryData.primitive.attributes['POSITION'];
245
185
  const radius = 0.1;
246
- let intersections = [];
186
+ let intersections: IIntersection[] = [];
247
187
  if (index !== null) {
248
188
  // indexed buffer geometry
249
189
  for (let i = 0, il = +index.count - 1; i < il; i++) {
@@ -253,7 +193,7 @@ export class IntersectionEngine implements IIntersectionEngine {
253
193
  let intersection = this.checkLineIntersection(node, ray, radius,
254
194
  vec3.fromValues(position.array[a * position.itemSize], position.array[a * position.itemSize + 1], position.array[a * position.itemSize + 2]),
255
195
  vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2]));
256
- if (intersection) intersections.push(intersection)
196
+ if (intersection) intersections.push(Object.assign(intersection, { geometryData }))
257
197
  }
258
198
  } else if (position !== undefined) {
259
199
  // non-indexed buffer geometry
@@ -262,23 +202,24 @@ export class IntersectionEngine implements IIntersectionEngine {
262
202
  const b = i + 1;
263
203
  let intersection = this.checkLineIntersection(node, ray, radius,
264
204
  vec3.fromValues(position.array[a * position.itemSize], position.array[a * position.itemSize + 1], position.array[a * position.itemSize + 2]),
265
- vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2])); if (intersection) intersections.push(intersection)
205
+ vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2]));
206
+ if (intersection) intersections.push(Object.assign(intersection, { geometryData }))
266
207
  }
267
208
  }
268
209
 
269
210
  intersections.sort((a, b) => a.distance - b.distance);
270
211
  intersections.forEach(i => i.point = vec3.transformMat4(i.point, i.point, node.worldMatrix));
271
212
  return intersections;
272
- } else if (geometryData.primitive.mode === PRIMITIVE_MODE.POINTS) {
213
+ } else if (geometryData.mode === PRIMITIVE_MODE.POINTS) {
273
214
  const position = geometryData.primitive.attributes['POSITION'];
274
215
  const radius = 0.1;
275
- let intersections = [];
216
+ let intersections: IIntersection[] = [];
276
217
  if (position !== undefined) {
277
218
  // non-indexed buffer geometry
278
219
  for (let i = 0, il = +position.count; i < il; i++) {
279
220
  let intersection = this.checkPointIntersection(node, ray, radius,
280
221
  vec3.fromValues(position.array[i * position.itemSize], position.array[i * position.itemSize + 1], position.array[i * position.itemSize + 2]));
281
- if (intersection) intersections.push(intersection)
222
+ if (intersection) intersections.push(Object.assign(intersection, { geometryData }))
282
223
  }
283
224
  }
284
225
 
@@ -286,14 +227,23 @@ export class IntersectionEngine implements IIntersectionEngine {
286
227
  intersections.forEach(i => i.point = vec3.transformMat4(i.point, i.point, node.worldMatrix));
287
228
  return intersections;
288
229
  } else {
289
- // if (node.boundingBox.boundingSphere.intersect(ray.origin, ray.direction) === null) return;
290
- if (node.boundingBox.intersect(rayIn.origin, rayIn.direction) === null) return;
230
+ // Here, Vector is a vector in Rn, not a dynamic array.
231
+ let v = vec3.sub(vec3.create(), node.boundingBox.boundingSphere.center, rayIn.origin);
232
+ let dotProd = vec3.dot(v, rayIn.direction);
233
+ dotProd = Math.max(dotProd, 0.0); // if dotProd is negative, the closest point is in the opposite direction to d.
234
+ let e = vec3.add(vec3.create(), rayIn.origin, vec3.scale(vec3.create(), rayIn.direction, dotProd));
235
+
236
+ let squaredDistance = vec3.squaredDistance(e, node.boundingBox.boundingSphere.center);
237
+ if (squaredDistance > node.boundingBox.boundingSphere.radius * node.boundingBox.boundingSphere.radius) return;
238
+
239
+ // if (node.boundingBox.boundingSphere.intersects(ray.origin, ray.direction) === false) return;
240
+ if (node.boundingBox.intersects(rayIn.origin, rayIn.direction) === false) return;
291
241
 
292
- const material = geometryData.primitive.material;
242
+ const material = geometryData.material;
293
243
  const index = geometryData.primitive.indices;
294
244
  const position = geometryData.primitive.attributes['POSITION'];
295
245
 
296
- let intersections = [];
246
+ let intersections: IIntersection[] = [];
297
247
 
298
248
  if (index !== null) {
299
249
  // indexed buffer geometry
@@ -306,7 +256,7 @@ export class IntersectionEngine implements IIntersectionEngine {
306
256
  vec3.fromValues(position.array[a * position.itemSize], position.array[a * position.itemSize + 1], position.array[a * position.itemSize + 2]),
307
257
  vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2]),
308
258
  vec3.fromValues(position.array[c * position.itemSize], position.array[c * position.itemSize + 1], position.array[c * position.itemSize + 2]));
309
- if (intersection) intersections.push(intersection)
259
+ if (intersection) intersections.push(Object.assign(intersection, { geometryData }))
310
260
  }
311
261
  } else if (position !== undefined) {
312
262
  // non-indexed buffer geometry
@@ -318,7 +268,7 @@ export class IntersectionEngine implements IIntersectionEngine {
318
268
  vec3.fromValues(position.array[a * position.itemSize], position.array[a * position.itemSize + 1], position.array[a * position.itemSize + 2]),
319
269
  vec3.fromValues(position.array[b * position.itemSize], position.array[b * position.itemSize + 1], position.array[b * position.itemSize + 2]),
320
270
  vec3.fromValues(position.array[c * position.itemSize], position.array[c * position.itemSize + 1], position.array[c * position.itemSize + 2]));
321
- if (intersection) intersections.push(intersection)
271
+ if (intersection) intersections.push(Object.assign(intersection, { geometryData }))
322
272
  }
323
273
  }
324
274
 
@@ -328,5 +278,125 @@ export class IntersectionEngine implements IIntersectionEngine {
328
278
  }
329
279
  }
330
280
 
281
+ // #endregion Public Methods (2)
282
+
283
+ // #region Private Methods (4)
284
+
285
+ private checkIntersection(node: ITreeNode, material: IMaterialAbstractData | null, ray: IRay, pA: vec3, pB: vec3, pC: vec3): { distance: number, point: vec3, node: ITreeNode } | undefined {
286
+ let point: vec3 | null;
287
+
288
+ if (material && material.side === MATERIAL_SIDE.BACK) {
289
+ const triangle = new Triangle(pC, pB, pA);
290
+ point = triangle.intersect(ray.origin, ray.direction);
291
+ } else {
292
+ const triangle = new Triangle(pA, pB, pC);
293
+ point = triangle.intersect(ray.origin, ray.direction);
294
+ }
295
+
296
+ if (point === null) return;
297
+
298
+ const distance = vec3.distance(ray.origin, point);
299
+ return {
300
+ distance: distance,
301
+ point: vec3.clone(point),
302
+ node
303
+ };
304
+ }
305
+
306
+ private checkLineIntersection(node: ITreeNode, ray: IRay, radius: number, pA: vec3, pB: vec3): { distance: number, point: vec3, node: ITreeNode } | undefined {
307
+ const direction = vec3.sub(vec3.create(), pB, pA);
308
+ const lineLength = vec3.length(direction);
309
+ const lineRay = {
310
+ origin: pA,
311
+ direction: vec3.divide(vec3.create(), direction, vec3.fromValues(lineLength, lineLength, lineLength))
312
+ };
313
+ const planeNormal = vec3.cross(vec3.create(), ray.direction, lineRay.direction);
314
+
315
+ const Na = vec3.normalize(vec3.create(), vec3.cross(vec3.create(), ray.direction, planeNormal));
316
+ const Nb = vec3.normalize(vec3.create(), vec3.cross(vec3.create(), lineRay.direction, planeNormal));
317
+
318
+ const da = vec3.dot(vec3.sub(vec3.create(), pA, ray.origin), Nb) / vec3.dot(ray.direction, Nb);
319
+ const db = vec3.dot(vec3.sub(vec3.create(), ray.origin, pA), Na) / vec3.dot(lineRay.direction, Na);
320
+
321
+ let pointA: vec3 = vec3.create();
322
+ if (da < 0) {
323
+ vec3.copy(pointA, ray.origin);
324
+ } else {
325
+ pointA = vec3.add(vec3.create(), ray.origin, vec3.mul(vec3.create(), ray.direction, vec3.fromValues(da, da, da)));
326
+ }
327
+
328
+ let pointB: vec3 = vec3.create();
329
+ if (db < 0) {
330
+ vec3.copy(pointB, pA);
331
+ } else if (db < lineLength) {
332
+ pointB = vec3.add(vec3.create(), pA, vec3.mul(vec3.create(), lineRay.direction, vec3.fromValues(db, db, db)));
333
+ } else {
334
+ vec3.copy(pointB, pB);
335
+ }
336
+
337
+ const distance = vec3.distance(pointA, pointB);
338
+ if (distance < radius) {
339
+ return {
340
+ distance: distance,
341
+ point: vec3.clone(pointB),
342
+ node
343
+ }
344
+ } else {
345
+ return;
346
+ }
347
+ }
348
+
349
+ private checkPointIntersection(node: ITreeNode, ray: IRay, radius: number, p: vec3): { distance: number, point: vec3, node: ITreeNode } | undefined {
350
+ const closestPoint = vec3.sub(vec3.create(), p, ray.origin);
351
+ const directionDistance = vec3.dot(closestPoint, ray.direction);
352
+
353
+ if (directionDistance < 0) {
354
+ vec3.copy(closestPoint, ray.origin);
355
+ } else {
356
+ vec3.multiply(closestPoint, vec3.copy(closestPoint, ray.direction), vec3.fromValues(directionDistance, directionDistance, directionDistance));
357
+ vec3.add(closestPoint, closestPoint, ray.origin);
358
+ }
359
+
360
+ const distance = vec3.distance(closestPoint, p);
361
+ if (distance < radius) {
362
+ return {
363
+ distance: distance,
364
+ point: vec3.clone(closestPoint),
365
+ node
366
+ }
367
+ } else {
368
+ return;
369
+ }
370
+ }
371
+
372
+ private gatherNodes() {
373
+ this._intersectNodes = [];
374
+ this._tree.root.traverse(node => {
375
+ if (node.visible === false) return;
376
+
377
+ for(let i = 0; i < node.data.length; i++) {
378
+ if(node.data[i] instanceof GeometryData) {
379
+
380
+ let tempNode = node;
381
+ let visible = true, restrictViewports: string[] = [], excludeViewports: string[] = [];
382
+ while(tempNode.parent) {
383
+ visible = tempNode.visible && visible;
384
+ restrictViewports = restrictViewports.concat(tempNode.restrictViewports)
385
+ excludeViewports = excludeViewports.concat(tempNode.excludeViewports)
386
+ tempNode = tempNode.parent;
387
+ }
388
+
389
+ this._intersectNodes.push({
390
+ node,
391
+ visible,
392
+ restrictViewports: [...new Set(restrictViewports)],
393
+ excludeViewports: [...new Set(excludeViewports)]
394
+ })
395
+
396
+ }
397
+ }
398
+ })
399
+ }
400
+
331
401
  // #endregion Private Methods (4)
332
402
  }
@@ -1,5 +1,6 @@
1
1
  import { vec3 } from "gl-matrix";
2
2
  import { ITreeNode } from "@shapediver/viewer.shared.node-tree";
3
+ import { IGeometryData } from "@shapediver/viewer.shared.types";
3
4
 
4
5
  export interface IIntersection {
5
6
  /** The distance to the intersection. */
@@ -8,4 +9,6 @@ export interface IIntersection {
8
9
  point: vec3,
9
10
  /** The intersected node. */
10
11
  node: ITreeNode
12
+ /** The intersected geometry data */
13
+ geometryData: IGeometryData
11
14
  }