@shapediver/viewer.rendering-engine.rendering-engine-threejs 3.16.7 → 3.16.9

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 (181) hide show
  1. package/dist/RenderingEngine.d.ts +294 -294
  2. package/dist/RenderingEngine.js +987 -977
  3. package/dist/RenderingEngine.js.map +1 -1
  4. package/dist/index.d.ts +16 -16
  5. package/dist/index.js +57 -57
  6. package/dist/injectors/TextureUnifierInjector.d.ts +13 -13
  7. package/dist/injectors/TextureUnifierInjector.js +181 -171
  8. package/dist/injectors/TextureUnifierInjector.js.map +1 -1
  9. package/dist/interfaces/ILoader.d.ts +3 -3
  10. package/dist/interfaces/ILoader.js +2 -2
  11. package/dist/interfaces/IRenderingEngine.d.ts +45 -45
  12. package/dist/interfaces/IRenderingEngine.js +2 -2
  13. package/dist/loaders/EnvironmentMapLoader.d.ts +119 -119
  14. package/dist/loaders/EnvironmentMapLoader.js +512 -502
  15. package/dist/loaders/EnvironmentMapLoader.js.map +1 -1
  16. package/dist/loaders/GeometryLoader.d.ts +39 -39
  17. package/dist/loaders/GeometryLoader.d.ts.map +1 -1
  18. package/dist/loaders/GeometryLoader.js +603 -593
  19. package/dist/loaders/GeometryLoader.js.map +1 -1
  20. package/dist/loaders/HTMLElementAnchorLoader.d.ts +15 -15
  21. package/dist/loaders/HTMLElementAnchorLoader.js +98 -98
  22. package/dist/loaders/HTMLElementAnchorLoader.js.map +1 -1
  23. package/dist/loaders/LightLoader.d.ts +19 -19
  24. package/dist/loaders/LightLoader.js +197 -187
  25. package/dist/loaders/LightLoader.js.map +1 -1
  26. package/dist/loaders/MaterialLoader.d.ts +115 -115
  27. package/dist/loaders/MaterialLoader.d.ts.map +1 -1
  28. package/dist/loaders/MaterialLoader.js +1612 -1602
  29. package/dist/loaders/MaterialLoader.js.map +1 -1
  30. package/dist/managers/ARManager.d.ts +17 -17
  31. package/dist/managers/ARManager.js +128 -128
  32. package/dist/managers/ARManager.js.map +1 -1
  33. package/dist/managers/CameraManager.d.ts +19 -19
  34. package/dist/managers/CameraManager.js +244 -234
  35. package/dist/managers/CameraManager.js.map +1 -1
  36. package/dist/managers/EnvironmentGeometryManager.d.ts +32 -32
  37. package/dist/managers/EnvironmentGeometryManager.js +114 -114
  38. package/dist/managers/EnvironmentGeometryManager.js.map +1 -1
  39. package/dist/managers/FlagManager.d.ts +19 -19
  40. package/dist/managers/FlagManager.js +143 -143
  41. package/dist/managers/FlagManager.js.map +1 -1
  42. package/dist/managers/PostProcessingManager.d.ts +1019 -1019
  43. package/dist/managers/PostProcessingManager.js +1306 -1296
  44. package/dist/managers/PostProcessingManager.js.map +1 -1
  45. package/dist/managers/RenderingManager.d.ts +84 -84
  46. package/dist/managers/RenderingManager.d.ts.map +1 -1
  47. package/dist/managers/RenderingManager.js +679 -669
  48. package/dist/managers/RenderingManager.js.map +1 -1
  49. package/dist/managers/SceneTracingManager.d.ts +28 -28
  50. package/dist/managers/SceneTracingManager.js +160 -150
  51. package/dist/managers/SceneTracingManager.js.map +1 -1
  52. package/dist/managers/SceneTreeManager.d.ts +81 -81
  53. package/dist/managers/SceneTreeManager.d.ts.map +1 -1
  54. package/dist/managers/SceneTreeManager.js +500 -490
  55. package/dist/managers/SceneTreeManager.js.map +1 -1
  56. package/dist/managers/SettingsManager.d.ts +28 -28
  57. package/dist/managers/SettingsManager.js +284 -284
  58. package/dist/managers/SettingsManager.js.map +1 -1
  59. package/dist/managers/environmentGeometry/ContactShadow.d.ts +42 -42
  60. package/dist/managers/environmentGeometry/ContactShadow.js +295 -285
  61. package/dist/managers/environmentGeometry/ContactShadow.js.map +1 -1
  62. package/dist/managers/environmentGeometry/Grid.d.ts +20 -20
  63. package/dist/managers/environmentGeometry/Grid.js +110 -100
  64. package/dist/managers/environmentGeometry/Grid.js.map +1 -1
  65. package/dist/managers/environmentGeometry/GroundPlane.d.ts +21 -21
  66. package/dist/managers/environmentGeometry/GroundPlane.js +105 -95
  67. package/dist/managers/environmentGeometry/GroundPlane.js.map +1 -1
  68. package/dist/managers/environmentGeometry/GroundPlaneShadow.d.ts +21 -21
  69. package/dist/managers/environmentGeometry/GroundPlaneShadow.js +96 -86
  70. package/dist/managers/environmentGeometry/GroundPlaneShadow.js.map +1 -1
  71. package/dist/managers/environmentGeometry/IEnvironmentGeometry.d.ts +8 -8
  72. package/dist/managers/environmentGeometry/IEnvironmentGeometry.js +2 -2
  73. package/dist/managers/postprocessing/GodRaysManager.d.ts +12 -12
  74. package/dist/managers/postprocessing/GodRaysManager.js +73 -63
  75. package/dist/managers/postprocessing/GodRaysManager.js.map +1 -1
  76. package/dist/managers/postprocessing/OutlineManager.d.ts +15 -15
  77. package/dist/managers/postprocessing/OutlineManager.js +86 -76
  78. package/dist/managers/postprocessing/OutlineManager.js.map +1 -1
  79. package/dist/managers/postprocessing/SSAARenderPass.d.ts +53 -53
  80. package/dist/managers/postprocessing/SSAARenderPass.js +281 -281
  81. package/dist/managers/postprocessing/SSAARenderPass.js.map +1 -1
  82. package/dist/managers/postprocessing/SelectiveBloomManager.d.ts +14 -14
  83. package/dist/managers/postprocessing/SelectiveBloomManager.js +76 -66
  84. package/dist/managers/postprocessing/SelectiveBloomManager.js.map +1 -1
  85. package/dist/managers/postprocessing/ao/ao/AOEffect.d.ts +46 -46
  86. package/dist/managers/postprocessing/ao/ao/AOEffect.js +142 -142
  87. package/dist/managers/postprocessing/ao/ao/AOEffect.js.map +1 -1
  88. package/dist/managers/postprocessing/ao/ao/AOPass.d.ts +12 -12
  89. package/dist/managers/postprocessing/ao/ao/AOPass.js +108 -108
  90. package/dist/managers/postprocessing/ao/ao/AOPass.js.map +1 -1
  91. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.d.ts +1 -1
  92. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.js +4 -4
  93. package/dist/managers/postprocessing/ao/ao/shader/ao_utils.d.ts +1 -1
  94. package/dist/managers/postprocessing/ao/ao/shader/ao_utils.js +4 -4
  95. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.d.ts +14 -14
  96. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.js +24 -24
  97. package/dist/managers/postprocessing/ao/hbao/shader/hbao.d.ts +1 -1
  98. package/dist/managers/postprocessing/ao/hbao/shader/hbao.js +4 -4
  99. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.d.ts +33 -33
  100. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js +211 -211
  101. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js.map +1 -1
  102. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.d.ts +1 -1
  103. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.js +4 -4
  104. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.d.ts +14 -14
  105. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js +82 -82
  106. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js.map +1 -1
  107. package/dist/managers/postprocessing/ao/ssao/shader/ssao.d.ts +1 -1
  108. package/dist/managers/postprocessing/ao/ssao/shader/ssao.js +4 -4
  109. package/dist/managers/postprocessing/ao/utils/shader/basic.d.ts +1 -1
  110. package/dist/managers/postprocessing/ao/utils/shader/basic.js +4 -4
  111. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.d.ts +1 -1
  112. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.js +4 -4
  113. package/dist/managers/postprocessing/effects/tone-mapping/ToneMappingEffect.d.ts +165 -165
  114. package/dist/managers/postprocessing/effects/tone-mapping/ToneMappingEffect.js +299 -299
  115. package/dist/managers/postprocessing/effects/tone-mapping/ToneMappingEffect.js.map +1 -1
  116. package/dist/managers/postprocessing/effects/tone-mapping/tone-mapping.d.ts +1 -1
  117. package/dist/managers/postprocessing/effects/tone-mapping/tone-mapping.js +4 -4
  118. package/dist/managers/postprocessing/utils/CopyMaterial.d.ts +37 -37
  119. package/dist/managers/postprocessing/utils/CopyMaterial.js +69 -69
  120. package/dist/managers/postprocessing/utils/CopyShader.d.ts +13 -13
  121. package/dist/managers/postprocessing/utils/CopyShader.js +12 -12
  122. package/dist/managers/postprocessing/utils/FullScreenQuad.d.ts +9 -9
  123. package/dist/managers/postprocessing/utils/FullScreenQuad.js +28 -28
  124. package/dist/managers/postprocessing/utils/NormalPass.d.ts +87 -87
  125. package/dist/managers/postprocessing/utils/NormalPass.js +156 -156
  126. package/dist/managers/postprocessing/utils/NormalPass.js.map +1 -1
  127. package/dist/managers/postprocessing/utils/RenderPass.d.ts +114 -114
  128. package/dist/managers/postprocessing/utils/RenderPass.js +259 -259
  129. package/dist/managers/postprocessing/utils/RenderPass.js.map +1 -1
  130. package/dist/managers/sceneTree/SDTFUtils.d.ts +6 -6
  131. package/dist/managers/sceneTree/SDTFUtils.d.ts.map +1 -1
  132. package/dist/managers/sceneTree/SDTFUtils.js +50 -50
  133. package/dist/managers/sceneTree/SDTFUtils.js.map +1 -1
  134. package/dist/managers/sceneTree/SceenTreeManagerUtils.d.ts +7 -7
  135. package/dist/managers/sceneTree/SceenTreeManagerUtils.d.ts.map +1 -1
  136. package/dist/managers/sceneTree/SceenTreeManagerUtils.js +175 -165
  137. package/dist/managers/sceneTree/SceenTreeManagerUtils.js.map +1 -1
  138. package/dist/managers/sceneTree/ThreeJsDataUtils.d.ts +6 -6
  139. package/dist/managers/sceneTree/ThreeJsDataUtils.d.ts.map +1 -1
  140. package/dist/managers/sceneTree/ThreeJsDataUtils.js +80 -70
  141. package/dist/managers/sceneTree/ThreeJsDataUtils.js.map +1 -1
  142. package/dist/materials/GemMaterial.d.ts +37 -37
  143. package/dist/materials/GemMaterial.js +262 -252
  144. package/dist/materials/GemMaterial.js.map +1 -1
  145. package/dist/materials/MeshUnlitMaterialParameters.d.ts +3 -3
  146. package/dist/materials/MeshUnlitMaterialParameters.js +2 -2
  147. package/dist/materials/MultiPointsMaterial.d.ts +93 -93
  148. package/dist/materials/MultiPointsMaterial.js +577 -567
  149. package/dist/materials/MultiPointsMaterial.js.map +1 -1
  150. package/dist/materials/SpecularGlossinessMaterial.d.ts +13 -13
  151. package/dist/materials/SpecularGlossinessMaterial.js +171 -161
  152. package/dist/materials/SpecularGlossinessMaterial.js.map +1 -1
  153. package/dist/objects/SDColor.d.ts +16 -16
  154. package/dist/objects/SDColor.js +52 -52
  155. package/dist/objects/SDColor.js.map +1 -1
  156. package/dist/objects/SDObject.d.ts +27 -27
  157. package/dist/objects/SDObject.js +112 -102
  158. package/dist/objects/SDObject.js.map +1 -1
  159. package/dist/shaders/PCSS.d.ts +2 -2
  160. package/dist/shaders/PCSS.js +5 -5
  161. package/dist/shaders/gem.d.ts +2 -2
  162. package/dist/shaders/gem.js +5 -5
  163. package/dist/shaders/multi_points.d.ts +2 -2
  164. package/dist/shaders/multi_points.js +5 -5
  165. package/dist/styling/viewport-css.d.ts +1 -1
  166. package/dist/styling/viewport-css.js +4 -4
  167. package/dist/three/CSS2DRenderer.d.ts +31 -31
  168. package/dist/three/CSS2DRenderer.d.ts.map +1 -1
  169. package/dist/three/CSS2DRenderer.js +152 -152
  170. package/dist/three/CSS2DRenderer.js.map +1 -1
  171. package/dist/three/geometries/TextGeometry.d.ts +21 -21
  172. package/dist/three/geometries/TextGeometry.js +45 -45
  173. package/dist/three/geometries/TextGeometry.js.map +1 -1
  174. package/dist/three/loaders/RGBELoader.d.ts +23 -23
  175. package/dist/three/loaders/RGBELoader.js +311 -311
  176. package/dist/three/loaders/RGBELoader.js.map +1 -1
  177. package/dist/types/IThreejsData.d.ts +6 -6
  178. package/dist/types/IThreejsData.js +2 -2
  179. package/dist/types/ThreejsData.d.ts +10 -10
  180. package/dist/types/ThreejsData.js +41 -41
  181. package/package.json +18 -18
@@ -1,386 +1,396 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.GeometryLoader = void 0;
27
- const viewer_shared_node_tree_1 = require("@shapediver/viewer.shared.node-tree");
28
- const viewer_shared_services_1 = require("@shapediver/viewer.shared.services");
29
- const viewer_shared_types_1 = require("@shapediver/viewer.shared.types");
30
- const gl_matrix_1 = require("gl-matrix");
31
- const THREE = __importStar(require("three"));
32
- const GemMaterial_1 = require("../materials/GemMaterial");
33
- class GeometryLoader {
34
- // #endregion Properties (8)
35
- // #region Constructors (1)
36
- constructor(_renderingEngine) {
37
- this._renderingEngine = _renderingEngine;
38
- this._gemSphericalMapsCache = {};
39
- this._geometryCache = {};
40
- this._logger = viewer_shared_services_1.Logger.instance;
41
- this._primitiveCache = {};
42
- }
43
- // #endregion Constructors (1)
44
- // #region Public Methods (6)
45
- emptyGeometryCache() {
46
- for (const key in this._geometryCache)
47
- this.removeFromGeometryCache(key);
48
- this._geometryCache = {};
49
- for (const key in this._primitiveCache)
50
- this.removeFromPrimitiveCache(key);
51
- this._primitiveCache = {};
52
- }
53
- init() { }
54
- /**
55
- * Create a geometry object with the provided geometry data.
56
- *
57
- * @param geometry the geometry data
58
- * @returns the geometry object
59
- */
60
- load(geometry, instanceData) {
61
- // Cache key to avoid repeated string concatenation
62
- const primitiveCacheKey = geometry.primitive.id + "_" + geometry.primitive.version;
63
- const threeGeometry = (() => {
64
- const cachedPrimitive = this._primitiveCache[primitiveCacheKey];
65
- if (!cachedPrimitive) {
66
- return this.loadPrimitive(geometry.primitive);
67
- }
68
- else {
69
- cachedPrimitive.counter++;
70
- const clone = cachedPrimitive.threeGeometry.clone();
71
- cachedPrimitive.clones.push(clone);
72
- return clone;
73
- }
74
- })();
75
- let incomingMaterialData;
76
- if (geometry.effectMaterials.length > 0) {
77
- incomingMaterialData =
78
- geometry.effectMaterials[geometry.effectMaterials.length - 1]
79
- .material;
80
- }
81
- else if (this._renderingEngine.type === viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES) {
82
- incomingMaterialData = geometry.attributeMaterial;
83
- }
84
- else {
85
- incomingMaterialData = geometry.material;
86
- }
87
- const attributes = threeGeometry.attributes;
88
- const morphAttributes = threeGeometry.morphAttributes;
89
- const hasMorphTargets = Object.keys(morphAttributes).length > 0;
90
- // Performance: Normalize settings to maximize shader program sharing
91
- // These settings affect shader generation, so keep them consistent across materials
92
- const materialSettings = {
93
- mode: geometry.mode,
94
- useVertexTangents: attributes.tangent !== undefined,
95
- useVertexColors: attributes.color !== undefined &&
96
- this._renderingEngine.type !== viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES,
97
- useFlatShading: attributes.normal === undefined,
98
- useMorphTargets: hasMorphTargets,
99
- useMorphNormals: hasMorphTargets && morphAttributes.normal !== undefined,
100
- };
101
- if (incomingMaterialData instanceof viewer_shared_node_tree_1.MaterialGemData) {
102
- const gemMaterialData = incomingMaterialData;
103
- // Only compute if not already computed
104
- if (!threeGeometry.boundingSphere) {
105
- threeGeometry.computeBoundingSphere();
106
- }
107
- const sphericalNormalMap = this.createCubeNormalMap(geometry, threeGeometry);
108
- const center = threeGeometry.boundingSphere.center, radius = threeGeometry.boundingSphere.radius;
109
- gemMaterialData.side = viewer_shared_types_1.MATERIAL_SIDE.FRONT;
110
- gemMaterialData.center = gl_matrix_1.vec3.fromValues(center.x, center.y, center.z);
111
- gemMaterialData.radius = radius;
112
- gemMaterialData.sphericalNormalMap = sphericalNormalMap;
113
- }
114
- const material = this._renderingEngine.materialLoader.load(incomingMaterialData || geometry, materialSettings);
115
- // Performance: Disable unnecessary material features for static materials
116
- if (!hasMorphTargets) {
117
- // For non-transparent materials, ensure depth write/test are optimized
118
- if (!material.transparent) {
119
- material.depthWrite = true;
120
- material.depthTest = true;
121
- }
122
- }
123
- // Performance: Mark material as not needing update to avoid shader recompilation
124
- // unless properties that affect the shader have changed
125
- material.needsUpdate = false;
126
- let threeGeometryObject;
127
- if (this._geometryCache[geometry.id + "_" + geometry.version]) {
128
- this._geometryCache[geometry.id + "_" + geometry.version].counter++;
129
- threeGeometryObject =
130
- this._geometryCache[geometry.id + "_" + geometry.version].obj;
131
- threeGeometryObject.material = material;
132
- // Clear instance colors when in ATTRIBUTES mode to prevent them
133
- // from multiplying with the attribute material color
134
- if (threeGeometryObject instanceof THREE.InstancedMesh) {
135
- if (this._renderingEngine.type === viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES) {
136
- threeGeometryObject.instanceColor = null;
137
- }
138
- else if (instanceData && !threeGeometryObject.instanceColor) {
139
- for (let i = 0; i < instanceData.instanceColors.length; i++) {
140
- threeGeometryObject.setColorAt(i, this._renderingEngine.createThreeJsColor(instanceData.instanceColors[i]));
141
- }
142
- // setColorAt creates instanceColor; re-read after mutation
143
- threeGeometryObject.instanceColor.needsUpdate = true;
144
- }
145
- }
146
- }
147
- else {
148
- threeGeometryObject = this.createMesh(geometry, threeGeometry, material, instanceData);
149
- threeGeometryObject.userData.cacheKey =
150
- geometry.id + "_" + geometry.version;
151
- this._geometryCache[geometry.id + "_" + geometry.version] = {
152
- obj: threeGeometryObject,
153
- counter: 1,
154
- clones: [],
155
- primitiveCacheId: geometry.primitive.id + "_" + geometry.primitive.version,
156
- };
157
- }
158
- threeGeometryObject.castShadow = geometry.castShadow;
159
- threeGeometryObject.receiveShadow = !(material instanceof GemMaterial_1.GemMaterial)
160
- ? geometry.receiveShadow
161
- : false;
162
- return threeGeometryObject;
163
- }
164
- loadPrimitive(primitive) {
165
- const geometry = new THREE.BufferGeometry();
166
- if (primitive.indices)
167
- geometry.setIndex(new THREE.BufferAttribute(primitive.indices.array, primitive.indices.itemSize));
168
- for (const attributeId in primitive.attributes) {
169
- const buffer = this.loadAttribute(primitive.attributes[attributeId], attributeId);
170
- const attributeName = this.getAttributeName(attributeId);
171
- if (attributeId === "NORMAL")
172
- if (this.checkNormals(primitive, attributeId, buffer, geometry))
173
- continue;
174
- geometry.setAttribute(attributeName, buffer);
175
- const morphAttributeData = primitive.attributes[attributeId].morphAttributeData;
176
- if (morphAttributeData.length > 0) {
177
- geometry.morphTargetsRelative = true;
178
- const buffers = [];
179
- for (let i = 0; i < morphAttributeData.length; i++)
180
- buffers.push(this.loadAttribute(morphAttributeData[i], attributeId));
181
- geometry.morphAttributes[attributeName] = buffers;
182
- }
183
- // we copy the uv coordinates into the second set of uv coordinates if there are none
184
- // this allows for the usage of AO and light maps that share this coordinate set
185
- const attributeIdUV2 = "TEXCOORD_1", attributeNameUV2 = "uv1";
186
- if (attributeName === "uv" &&
187
- !primitive.attributes[attributeIdUV2]) {
188
- geometry.setAttribute(attributeNameUV2, buffer);
189
- const morphAttributeData = primitive.attributes[attributeId].morphAttributeData;
190
- if (morphAttributeData.length > 0) {
191
- geometry.morphTargetsRelative = true;
192
- const buffers = [];
193
- for (let i = 0; i < morphAttributeData.length; i++)
194
- buffers.push(this.loadAttribute(morphAttributeData[i], attributeId));
195
- geometry.morphAttributes[attributeNameUV2] = buffers;
196
- }
197
- }
198
- }
199
- primitive.convertedObject[this._renderingEngine.id] = geometry;
200
- const primitiveCacheKey = primitive.id + "_" + primitive.version;
201
- this._primitiveCache[primitiveCacheKey] = {
202
- threeGeometry: geometry,
203
- counter: 1,
204
- clones: [],
205
- };
206
- return geometry;
207
- }
208
- removeFromGemSphericalMapsCache(id) {
209
- if (this._gemSphericalMapsCache[id]) {
210
- if (this._gemSphericalMapsCache[id].counter === 1) {
211
- this._gemSphericalMapsCache[id].renderTarget.dispose();
212
- this._gemSphericalMapsCache[id].texture.dispose();
213
- delete this._gemSphericalMapsCache[id];
214
- }
215
- else {
216
- this._gemSphericalMapsCache[id].counter--;
217
- }
218
- }
219
- }
220
- updateGeometryMaterial(geometry) {
221
- const cacheKey = geometry.id + "_" + geometry.version;
222
- const cached = this._geometryCache[cacheKey];
223
- if (!cached)
224
- return;
225
- let incomingMaterialData;
226
- if (geometry.effectMaterials.length > 0) {
227
- incomingMaterialData =
228
- geometry.effectMaterials[geometry.effectMaterials.length - 1]
229
- .material;
230
- }
231
- else if (this._renderingEngine.type === viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES) {
232
- incomingMaterialData = geometry.attributeMaterial;
233
- }
234
- else {
235
- incomingMaterialData = geometry.material;
236
- }
237
- const threeGeometry = cached.obj.geometry;
238
- const attributes = threeGeometry.attributes;
239
- const morphAttributes = threeGeometry.morphAttributes;
240
- const hasMorphTargets = Object.keys(morphAttributes).length > 0;
241
- const materialSettings = {
242
- mode: geometry.mode,
243
- useVertexTangents: attributes.tangent !== undefined,
244
- useVertexColors: attributes.color !== undefined &&
245
- this._renderingEngine.type !== viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES,
246
- useFlatShading: attributes.normal === undefined,
247
- useMorphTargets: hasMorphTargets,
248
- useMorphNormals: hasMorphTargets && morphAttributes.normal !== undefined,
249
- };
250
- cached.obj.material = this._renderingEngine.materialLoader.load(incomingMaterialData || geometry, materialSettings);
251
- // Clear instance colors when in ATTRIBUTES mode to prevent them
252
- // from multiplying with the attribute material color
253
- if (cached.obj instanceof THREE.InstancedMesh) {
254
- if (this._renderingEngine.type === viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES) {
255
- cached.obj.instanceColor = null;
256
- }
257
- }
258
- }
259
- removeFromGeometryCache(id) {
260
- if (this._geometryCache[id]) {
261
- if (this._geometryCache[id].counter === 1) {
262
- this.removeFromPrimitiveCache(this._geometryCache[id].primitiveCacheId);
263
- this._geometryCache[id].clones.forEach((c) => {
264
- this.removeFromPrimitiveCache(this._geometryCache[id].primitiveCacheId);
265
- });
266
- delete this._geometryCache[id];
267
- }
268
- else {
269
- this._geometryCache[id].counter--;
270
- }
271
- }
272
- }
273
- // #endregion Public Methods (6)
274
- // #region Private Methods (7)
275
- checkNormals(primitive, attributeId, buffer, geometry) {
276
- let blnNormalsOk = false;
277
- for (let index = 0; index < 10; ++index) {
278
- if (Math.abs(buffer.array[index * 3]) > 0.001) {
279
- blnNormalsOk = true;
280
- break;
281
- }
282
- if (Math.abs(buffer.array[index * 3 + 1]) > 0.001) {
283
- blnNormalsOk = true;
284
- break;
285
- }
286
- if (Math.abs(buffer.array[index * 3 + 2]) > 0.001) {
287
- blnNormalsOk = true;
288
- break;
289
- }
290
- }
291
- if (!blnNormalsOk) {
292
- geometry.computeVertexNormals();
293
- const computedNormalAttribute = (geometry.getAttribute("normal"));
294
- // store the computed normals in the attribute data
295
- primitive.attributes[attributeId] = new viewer_shared_node_tree_1.AttributeData(new Float32Array(computedNormalAttribute.array), computedNormalAttribute.itemSize, 0, 0, 3, computedNormalAttribute.normalized, computedNormalAttribute.array.length / 3);
296
- return true;
297
- }
298
- return false;
299
- }
300
- convertToTriangleMode(geometry, drawMode) {
301
- let index = geometry.getIndex();
302
- // generate index if not present
303
- if (index === null) {
304
- const indices = [];
305
- const position = geometry.getAttribute("position");
306
- if (position !== undefined) {
307
- for (let i = 0; i < position.count; i++)
308
- indices.push(i);
309
- geometry.setIndex(indices);
310
- index = geometry.getIndex();
311
- }
312
- else {
313
- throw new viewer_shared_services_1.ShapeDiverViewerDataProcessingError("GeometryLoader.convertToTriangleMode: Undefined position attribute. Processing not possible.");
314
- }
315
- }
316
- if (index === null)
317
- throw new viewer_shared_services_1.ShapeDiverViewerDataProcessingError("GeometryLoader.convertToTriangleMode: Undefined index. Processing not possible.");
318
- const numberOfTriangles = index.count - 2;
319
- const newIndices = [];
320
- if (drawMode === viewer_shared_types_1.PRIMITIVE_MODE.TRIANGLE_FAN) {
321
- for (let i = 1; i <= numberOfTriangles; i++) {
322
- newIndices.push(index.getX(0));
323
- newIndices.push(index.getX(i));
324
- newIndices.push(index.getX(i + 1));
325
- }
326
- }
327
- else {
328
- for (let i = 0; i < numberOfTriangles; i++) {
329
- if (i % 2 === 0) {
330
- newIndices.push(index.getX(i));
331
- newIndices.push(index.getX(i + 1));
332
- newIndices.push(index.getX(i + 2));
333
- }
334
- else {
335
- newIndices.push(index.getX(i + 2));
336
- newIndices.push(index.getX(i + 1));
337
- newIndices.push(index.getX(i));
338
- }
339
- }
340
- }
341
- if (newIndices.length / 3 !== numberOfTriangles)
342
- throw new viewer_shared_services_1.ShapeDiverViewerDataProcessingError("GeometryLoader.convertToTriangleMode: Unable to generate correct amount of triangle.");
343
- geometry.setIndex(newIndices);
344
- }
345
- createCubeNormalMap(geometryData, geometry, resolution = 1024) {
346
- if (this._gemSphericalMapsCache[geometryData.primitive.id + "_" + geometryData.primitive.version]) {
347
- this._gemSphericalMapsCache[geometryData.primitive.id + "_" + geometryData.primitive.version].counter++;
348
- return this._gemSphericalMapsCache[geometryData.primitive.id + "_" + geometryData.primitive.version].texture;
349
- }
350
- if (!this._gemScene) {
351
- this._gemScene = new THREE.Scene();
352
- this._gemCubeCameraRenderTarget = new THREE.WebGLCubeRenderTarget(resolution, {
353
- format: THREE.RGBAFormat,
354
- magFilter: THREE.LinearFilter,
355
- minFilter: THREE.LinearFilter,
356
- });
357
- this._gemCubeCameraRenderTarget.texture.generateMipmaps = false;
358
- this._gemCubeCameraRenderTarget.texture.minFilter =
359
- THREE.NearestFilter;
360
- this._gemCubeCameraRenderTarget.texture.magFilter =
361
- THREE.NearestFilter;
362
- this._gemCubeCameraRenderTarget.texture.format = THREE.RGBAFormat;
363
- this._gemCubeCamera = new THREE.CubeCamera(0.001, 10000, this._gemCubeCameraRenderTarget);
364
- this._gemScene.add(this._gemCubeCamera);
365
- }
366
- else {
367
- this._gemCubeCameraRenderTarget = new THREE.WebGLCubeRenderTarget(resolution, {
368
- format: THREE.RGBAFormat,
369
- magFilter: THREE.LinearFilter,
370
- minFilter: THREE.LinearFilter,
371
- });
372
- this._gemCubeCameraRenderTarget.texture.generateMipmaps = false;
373
- this._gemCubeCameraRenderTarget.texture.minFilter =
374
- THREE.NearestFilter;
375
- this._gemCubeCameraRenderTarget.texture.magFilter =
376
- THREE.NearestFilter;
377
- this._gemCubeCameraRenderTarget.texture.format = THREE.RGBAFormat;
378
- this._gemCubeCamera.renderTarget = this._gemCubeCameraRenderTarget;
379
- }
380
- if (!this._gemNormalMaterial) {
381
- const _normalShader = {
382
- defines: {},
383
- uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common]),
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.GeometryLoader = void 0;
37
+ const viewer_shared_node_tree_1 = require("@shapediver/viewer.shared.node-tree");
38
+ const viewer_shared_services_1 = require("@shapediver/viewer.shared.services");
39
+ const viewer_shared_types_1 = require("@shapediver/viewer.shared.types");
40
+ const gl_matrix_1 = require("gl-matrix");
41
+ const THREE = __importStar(require("three"));
42
+ const GemMaterial_1 = require("../materials/GemMaterial");
43
+ class GeometryLoader {
44
+ // #endregion Properties (8)
45
+ // #region Constructors (1)
46
+ constructor(_renderingEngine) {
47
+ this._renderingEngine = _renderingEngine;
48
+ this._gemSphericalMapsCache = {};
49
+ this._geometryCache = {};
50
+ this._logger = viewer_shared_services_1.Logger.instance;
51
+ this._primitiveCache = {};
52
+ }
53
+ // #endregion Constructors (1)
54
+ // #region Public Methods (6)
55
+ emptyGeometryCache() {
56
+ for (const key in this._geometryCache)
57
+ this.removeFromGeometryCache(key);
58
+ this._geometryCache = {};
59
+ for (const key in this._primitiveCache)
60
+ this.removeFromPrimitiveCache(key);
61
+ this._primitiveCache = {};
62
+ }
63
+ init() { }
64
+ /**
65
+ * Create a geometry object with the provided geometry data.
66
+ *
67
+ * @param geometry the geometry data
68
+ * @returns the geometry object
69
+ */
70
+ load(geometry, instanceData) {
71
+ // Cache key to avoid repeated string concatenation
72
+ const primitiveCacheKey = geometry.primitive.id + "_" + geometry.primitive.version;
73
+ const threeGeometry = (() => {
74
+ const cachedPrimitive = this._primitiveCache[primitiveCacheKey];
75
+ if (!cachedPrimitive) {
76
+ return this.loadPrimitive(geometry.primitive);
77
+ }
78
+ else {
79
+ cachedPrimitive.counter++;
80
+ const clone = cachedPrimitive.threeGeometry.clone();
81
+ cachedPrimitive.clones.push(clone);
82
+ return clone;
83
+ }
84
+ })();
85
+ let incomingMaterialData;
86
+ if (geometry.effectMaterials.length > 0) {
87
+ incomingMaterialData =
88
+ geometry.effectMaterials[geometry.effectMaterials.length - 1]
89
+ .material;
90
+ }
91
+ else if (this._renderingEngine.type === viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES) {
92
+ incomingMaterialData = geometry.attributeMaterial;
93
+ }
94
+ else {
95
+ incomingMaterialData = geometry.material;
96
+ }
97
+ const attributes = threeGeometry.attributes;
98
+ const morphAttributes = threeGeometry.morphAttributes;
99
+ const hasMorphTargets = Object.keys(morphAttributes).length > 0;
100
+ // Performance: Normalize settings to maximize shader program sharing
101
+ // These settings affect shader generation, so keep them consistent across materials
102
+ const materialSettings = {
103
+ mode: geometry.mode,
104
+ useVertexTangents: attributes.tangent !== undefined,
105
+ useVertexColors: attributes.color !== undefined &&
106
+ this._renderingEngine.type !== viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES,
107
+ useFlatShading: attributes.normal === undefined,
108
+ useMorphTargets: hasMorphTargets,
109
+ useMorphNormals: hasMorphTargets && morphAttributes.normal !== undefined,
110
+ };
111
+ if (incomingMaterialData instanceof viewer_shared_node_tree_1.MaterialGemData) {
112
+ const gemMaterialData = incomingMaterialData;
113
+ // Only compute if not already computed
114
+ if (!threeGeometry.boundingSphere) {
115
+ threeGeometry.computeBoundingSphere();
116
+ }
117
+ const sphericalNormalMap = this.createCubeNormalMap(geometry, threeGeometry);
118
+ const center = threeGeometry.boundingSphere.center, radius = threeGeometry.boundingSphere.radius;
119
+ gemMaterialData.side = viewer_shared_types_1.MATERIAL_SIDE.FRONT;
120
+ gemMaterialData.center = gl_matrix_1.vec3.fromValues(center.x, center.y, center.z);
121
+ gemMaterialData.radius = radius;
122
+ gemMaterialData.sphericalNormalMap = sphericalNormalMap;
123
+ }
124
+ const material = this._renderingEngine.materialLoader.load(incomingMaterialData || geometry, materialSettings);
125
+ // Performance: Disable unnecessary material features for static materials
126
+ if (!hasMorphTargets) {
127
+ // For non-transparent materials, ensure depth write/test are optimized
128
+ if (!material.transparent) {
129
+ material.depthWrite = true;
130
+ material.depthTest = true;
131
+ }
132
+ }
133
+ // Performance: Mark material as not needing update to avoid shader recompilation
134
+ // unless properties that affect the shader have changed
135
+ material.needsUpdate = false;
136
+ let threeGeometryObject;
137
+ if (this._geometryCache[geometry.id + "_" + geometry.version]) {
138
+ this._geometryCache[geometry.id + "_" + geometry.version].counter++;
139
+ threeGeometryObject =
140
+ this._geometryCache[geometry.id + "_" + geometry.version].obj;
141
+ threeGeometryObject.material = material;
142
+ // Clear instance colors when in ATTRIBUTES mode to prevent them
143
+ // from multiplying with the attribute material color
144
+ if (threeGeometryObject instanceof THREE.InstancedMesh) {
145
+ if (this._renderingEngine.type === viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES) {
146
+ threeGeometryObject.instanceColor = null;
147
+ }
148
+ else if (instanceData && !threeGeometryObject.instanceColor) {
149
+ for (let i = 0; i < instanceData.instanceColors.length; i++) {
150
+ threeGeometryObject.setColorAt(i, this._renderingEngine.createThreeJsColor(instanceData.instanceColors[i]));
151
+ }
152
+ // setColorAt creates instanceColor; re-read after mutation
153
+ threeGeometryObject.instanceColor.needsUpdate = true;
154
+ }
155
+ }
156
+ }
157
+ else {
158
+ threeGeometryObject = this.createMesh(geometry, threeGeometry, material, instanceData);
159
+ threeGeometryObject.userData.cacheKey =
160
+ geometry.id + "_" + geometry.version;
161
+ this._geometryCache[geometry.id + "_" + geometry.version] = {
162
+ obj: threeGeometryObject,
163
+ counter: 1,
164
+ clones: [],
165
+ primitiveCacheId: geometry.primitive.id + "_" + geometry.primitive.version,
166
+ };
167
+ }
168
+ threeGeometryObject.castShadow = geometry.castShadow;
169
+ threeGeometryObject.receiveShadow = !(material instanceof GemMaterial_1.GemMaterial)
170
+ ? geometry.receiveShadow
171
+ : false;
172
+ return threeGeometryObject;
173
+ }
174
+ loadPrimitive(primitive) {
175
+ const geometry = new THREE.BufferGeometry();
176
+ if (primitive.indices)
177
+ geometry.setIndex(new THREE.BufferAttribute(primitive.indices.array, primitive.indices.itemSize));
178
+ for (const attributeId in primitive.attributes) {
179
+ const buffer = this.loadAttribute(primitive.attributes[attributeId], attributeId);
180
+ const attributeName = this.getAttributeName(attributeId);
181
+ if (attributeId === "NORMAL")
182
+ if (this.checkNormals(primitive, attributeId, buffer, geometry))
183
+ continue;
184
+ geometry.setAttribute(attributeName, buffer);
185
+ const morphAttributeData = primitive.attributes[attributeId].morphAttributeData;
186
+ if (morphAttributeData.length > 0) {
187
+ geometry.morphTargetsRelative = true;
188
+ const buffers = [];
189
+ for (let i = 0; i < morphAttributeData.length; i++)
190
+ buffers.push(this.loadAttribute(morphAttributeData[i], attributeId));
191
+ geometry.morphAttributes[attributeName] = buffers;
192
+ }
193
+ // we copy the uv coordinates into the second set of uv coordinates if there are none
194
+ // this allows for the usage of AO and light maps that share this coordinate set
195
+ const attributeIdUV2 = "TEXCOORD_1", attributeNameUV2 = "uv1";
196
+ if (attributeName === "uv" &&
197
+ !primitive.attributes[attributeIdUV2]) {
198
+ geometry.setAttribute(attributeNameUV2, buffer);
199
+ const morphAttributeData = primitive.attributes[attributeId].morphAttributeData;
200
+ if (morphAttributeData.length > 0) {
201
+ geometry.morphTargetsRelative = true;
202
+ const buffers = [];
203
+ for (let i = 0; i < morphAttributeData.length; i++)
204
+ buffers.push(this.loadAttribute(morphAttributeData[i], attributeId));
205
+ geometry.morphAttributes[attributeNameUV2] = buffers;
206
+ }
207
+ }
208
+ }
209
+ primitive.convertedObject[this._renderingEngine.id] = geometry;
210
+ const primitiveCacheKey = primitive.id + "_" + primitive.version;
211
+ this._primitiveCache[primitiveCacheKey] = {
212
+ threeGeometry: geometry,
213
+ counter: 1,
214
+ clones: [],
215
+ };
216
+ return geometry;
217
+ }
218
+ removeFromGemSphericalMapsCache(id) {
219
+ if (this._gemSphericalMapsCache[id]) {
220
+ if (this._gemSphericalMapsCache[id].counter === 1) {
221
+ this._gemSphericalMapsCache[id].renderTarget.dispose();
222
+ this._gemSphericalMapsCache[id].texture.dispose();
223
+ delete this._gemSphericalMapsCache[id];
224
+ }
225
+ else {
226
+ this._gemSphericalMapsCache[id].counter--;
227
+ }
228
+ }
229
+ }
230
+ updateGeometryMaterial(geometry) {
231
+ const cacheKey = geometry.id + "_" + geometry.version;
232
+ const cached = this._geometryCache[cacheKey];
233
+ if (!cached)
234
+ return;
235
+ let incomingMaterialData;
236
+ if (geometry.effectMaterials.length > 0) {
237
+ incomingMaterialData =
238
+ geometry.effectMaterials[geometry.effectMaterials.length - 1]
239
+ .material;
240
+ }
241
+ else if (this._renderingEngine.type === viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES) {
242
+ incomingMaterialData = geometry.attributeMaterial;
243
+ }
244
+ else {
245
+ incomingMaterialData = geometry.material;
246
+ }
247
+ const threeGeometry = cached.obj.geometry;
248
+ const attributes = threeGeometry.attributes;
249
+ const morphAttributes = threeGeometry.morphAttributes;
250
+ const hasMorphTargets = Object.keys(morphAttributes).length > 0;
251
+ const materialSettings = {
252
+ mode: geometry.mode,
253
+ useVertexTangents: attributes.tangent !== undefined,
254
+ useVertexColors: attributes.color !== undefined &&
255
+ this._renderingEngine.type !== viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES,
256
+ useFlatShading: attributes.normal === undefined,
257
+ useMorphTargets: hasMorphTargets,
258
+ useMorphNormals: hasMorphTargets && morphAttributes.normal !== undefined,
259
+ };
260
+ cached.obj.material = this._renderingEngine.materialLoader.load(incomingMaterialData || geometry, materialSettings);
261
+ // Clear instance colors when in ATTRIBUTES mode to prevent them
262
+ // from multiplying with the attribute material color
263
+ if (cached.obj instanceof THREE.InstancedMesh) {
264
+ if (this._renderingEngine.type === viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES) {
265
+ cached.obj.instanceColor = null;
266
+ }
267
+ }
268
+ }
269
+ removeFromGeometryCache(id) {
270
+ if (this._geometryCache[id]) {
271
+ if (this._geometryCache[id].counter === 1) {
272
+ this.removeFromPrimitiveCache(this._geometryCache[id].primitiveCacheId);
273
+ this._geometryCache[id].clones.forEach((c) => {
274
+ this.removeFromPrimitiveCache(this._geometryCache[id].primitiveCacheId);
275
+ });
276
+ delete this._geometryCache[id];
277
+ }
278
+ else {
279
+ this._geometryCache[id].counter--;
280
+ }
281
+ }
282
+ }
283
+ // #endregion Public Methods (6)
284
+ // #region Private Methods (7)
285
+ checkNormals(primitive, attributeId, buffer, geometry) {
286
+ let blnNormalsOk = false;
287
+ for (let index = 0; index < 10; ++index) {
288
+ if (Math.abs(buffer.array[index * 3]) > 0.001) {
289
+ blnNormalsOk = true;
290
+ break;
291
+ }
292
+ if (Math.abs(buffer.array[index * 3 + 1]) > 0.001) {
293
+ blnNormalsOk = true;
294
+ break;
295
+ }
296
+ if (Math.abs(buffer.array[index * 3 + 2]) > 0.001) {
297
+ blnNormalsOk = true;
298
+ break;
299
+ }
300
+ }
301
+ if (!blnNormalsOk) {
302
+ geometry.computeVertexNormals();
303
+ const computedNormalAttribute = (geometry.getAttribute("normal"));
304
+ // store the computed normals in the attribute data
305
+ primitive.attributes[attributeId] = new viewer_shared_node_tree_1.AttributeData(new Float32Array(computedNormalAttribute.array), computedNormalAttribute.itemSize, 0, 0, 3, computedNormalAttribute.normalized, computedNormalAttribute.array.length / 3);
306
+ return true;
307
+ }
308
+ return false;
309
+ }
310
+ convertToTriangleMode(geometry, drawMode) {
311
+ let index = geometry.getIndex();
312
+ // generate index if not present
313
+ if (index === null) {
314
+ const indices = [];
315
+ const position = geometry.getAttribute("position");
316
+ if (position !== undefined) {
317
+ for (let i = 0; i < position.count; i++)
318
+ indices.push(i);
319
+ geometry.setIndex(indices);
320
+ index = geometry.getIndex();
321
+ }
322
+ else {
323
+ throw new viewer_shared_services_1.ShapeDiverViewerDataProcessingError("GeometryLoader.convertToTriangleMode: Undefined position attribute. Processing not possible.");
324
+ }
325
+ }
326
+ if (index === null)
327
+ throw new viewer_shared_services_1.ShapeDiverViewerDataProcessingError("GeometryLoader.convertToTriangleMode: Undefined index. Processing not possible.");
328
+ const numberOfTriangles = index.count - 2;
329
+ const newIndices = [];
330
+ if (drawMode === viewer_shared_types_1.PRIMITIVE_MODE.TRIANGLE_FAN) {
331
+ for (let i = 1; i <= numberOfTriangles; i++) {
332
+ newIndices.push(index.getX(0));
333
+ newIndices.push(index.getX(i));
334
+ newIndices.push(index.getX(i + 1));
335
+ }
336
+ }
337
+ else {
338
+ for (let i = 0; i < numberOfTriangles; i++) {
339
+ if (i % 2 === 0) {
340
+ newIndices.push(index.getX(i));
341
+ newIndices.push(index.getX(i + 1));
342
+ newIndices.push(index.getX(i + 2));
343
+ }
344
+ else {
345
+ newIndices.push(index.getX(i + 2));
346
+ newIndices.push(index.getX(i + 1));
347
+ newIndices.push(index.getX(i));
348
+ }
349
+ }
350
+ }
351
+ if (newIndices.length / 3 !== numberOfTriangles)
352
+ throw new viewer_shared_services_1.ShapeDiverViewerDataProcessingError("GeometryLoader.convertToTriangleMode: Unable to generate correct amount of triangle.");
353
+ geometry.setIndex(newIndices);
354
+ }
355
+ createCubeNormalMap(geometryData, geometry, resolution = 1024) {
356
+ if (this._gemSphericalMapsCache[geometryData.primitive.id + "_" + geometryData.primitive.version]) {
357
+ this._gemSphericalMapsCache[geometryData.primitive.id + "_" + geometryData.primitive.version].counter++;
358
+ return this._gemSphericalMapsCache[geometryData.primitive.id + "_" + geometryData.primitive.version].texture;
359
+ }
360
+ if (!this._gemScene) {
361
+ this._gemScene = new THREE.Scene();
362
+ this._gemCubeCameraRenderTarget = new THREE.WebGLCubeRenderTarget(resolution, {
363
+ format: THREE.RGBAFormat,
364
+ magFilter: THREE.LinearFilter,
365
+ minFilter: THREE.LinearFilter,
366
+ });
367
+ this._gemCubeCameraRenderTarget.texture.generateMipmaps = false;
368
+ this._gemCubeCameraRenderTarget.texture.minFilter =
369
+ THREE.NearestFilter;
370
+ this._gemCubeCameraRenderTarget.texture.magFilter =
371
+ THREE.NearestFilter;
372
+ this._gemCubeCameraRenderTarget.texture.format = THREE.RGBAFormat;
373
+ this._gemCubeCamera = new THREE.CubeCamera(0.001, 10000, this._gemCubeCameraRenderTarget);
374
+ this._gemScene.add(this._gemCubeCamera);
375
+ }
376
+ else {
377
+ this._gemCubeCameraRenderTarget = new THREE.WebGLCubeRenderTarget(resolution, {
378
+ format: THREE.RGBAFormat,
379
+ magFilter: THREE.LinearFilter,
380
+ minFilter: THREE.LinearFilter,
381
+ });
382
+ this._gemCubeCameraRenderTarget.texture.generateMipmaps = false;
383
+ this._gemCubeCameraRenderTarget.texture.minFilter =
384
+ THREE.NearestFilter;
385
+ this._gemCubeCameraRenderTarget.texture.magFilter =
386
+ THREE.NearestFilter;
387
+ this._gemCubeCameraRenderTarget.texture.format = THREE.RGBAFormat;
388
+ this._gemCubeCamera.renderTarget = this._gemCubeCameraRenderTarget;
389
+ }
390
+ if (!this._gemNormalMaterial) {
391
+ const _normalShader = {
392
+ defines: {},
393
+ uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common]),
384
394
  vertexShader: `
385
395
  varying vec3 vNormal;
386
396
 
@@ -388,7 +398,7 @@ class GeometryLoader {
388
398
  vNormal = normal;
389
399
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
390
400
  }
391
- `,
401
+ `,
392
402
  fragmentShader: `
393
403
  varying highp vec3 vNormal;
394
404
 
@@ -425,213 +435,213 @@ class GeometryLoader {
425
435
  vec3 n = normalize(vNormal);
426
436
  gl_FragColor = vec4(decodeVec3(abs(n)), signEncoding(n));
427
437
  }
428
- `,
429
- };
430
- this._gemNormalMaterial = new THREE.ShaderMaterial({
431
- uniforms: THREE.UniformsUtils.clone(_normalShader.uniforms),
432
- defines: _normalShader.defines,
433
- vertexShader: _normalShader.vertexShader,
434
- fragmentShader: _normalShader.fragmentShader,
435
- });
436
- this._gemNormalMaterial.blending = THREE.NoBlending;
437
- this._gemNormalMaterial.side = THREE.DoubleSide;
438
- this._gemScene.overrideMaterial = this._gemNormalMaterial;
439
- }
440
- const mesh = new THREE.Mesh(geometry.clone(), this._gemNormalMaterial);
441
- mesh.geometry.center();
442
- this._gemScene.add(mesh);
443
- this._gemCubeCamera.update(this._renderingEngine.renderer, this._gemScene);
444
- this._gemScene.remove(mesh);
445
- mesh.geometry.dispose();
446
- mesh.material.dispose();
447
- this._gemCubeCamera.renderTarget.texture.userData = {
448
- SDid: geometryData.primitive.id,
449
- SDversion: geometryData.primitive.version,
450
- };
451
- this._gemSphericalMapsCache[geometryData.primitive.id + "_" + geometryData.primitive.version] = {
452
- texture: this._gemCubeCameraRenderTarget.texture,
453
- renderTarget: this._gemCubeCameraRenderTarget,
454
- counter: 1,
455
- };
456
- return this._gemSphericalMapsCache[geometryData.primitive.id + "_" + geometryData.primitive.version].texture;
457
- }
458
- createMesh(geometry, threeGeometry, material, instanceData) {
459
- let threeGeometryObject;
460
- if (geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.POINTS) {
461
- const points = new THREE.Points(threeGeometry, material);
462
- geometry.convertedObject[this._renderingEngine.id] = points;
463
- threeGeometryObject = points;
464
- }
465
- else if (geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.LINES) {
466
- const lineSegments = new THREE.LineSegments(threeGeometry, material);
467
- geometry.convertedObject[this._renderingEngine.id] = lineSegments;
468
- threeGeometryObject = lineSegments;
469
- }
470
- else if (geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.LINE_LOOP) {
471
- const lineLoop = new THREE.LineLoop(threeGeometry, material);
472
- geometry.convertedObject[this._renderingEngine.id] = lineLoop;
473
- threeGeometryObject = lineLoop;
474
- }
475
- else if (geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.LINE_STRIP) {
476
- const line = new THREE.Line(threeGeometry, material);
477
- geometry.convertedObject[this._renderingEngine.id] = line;
478
- threeGeometryObject = line;
479
- }
480
- else if (geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.TRIANGLES ||
481
- geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.TRIANGLE_STRIP ||
482
- geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.TRIANGLE_FAN) {
483
- const bufferGeometry = threeGeometry;
484
- if (geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.TRIANGLE_STRIP ||
485
- geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.TRIANGLE_FAN)
486
- this.convertToTriangleMode(bufferGeometry, geometry.mode);
487
- if (instanceData && instanceData.instanceMatrices.length > 0) {
488
- const instanceCount = instanceData.instanceMatrices.length;
489
- const instancedMesh = new THREE.InstancedMesh(bufferGeometry, material, instanceCount);
490
- // Reuse matrix object to reduce allocations
491
- const tempMatrix = new THREE.Matrix4();
492
- const useInstanceColors = this._renderingEngine.type !== viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES;
493
- for (let i = 0; i < instanceCount; i++) {
494
- tempMatrix.fromArray(instanceData.instanceMatrices[i]);
495
- instancedMesh.setMatrixAt(i, tempMatrix);
496
- if (useInstanceColors) {
497
- instancedMesh.setColorAt(i, this._renderingEngine.createThreeJsColor(instanceData.instanceColors[i]));
498
- }
499
- }
500
- if (instancedMesh.instanceColor)
501
- instancedMesh.instanceColor.needsUpdate = true;
502
- instancedMesh.instanceMatrix.needsUpdate = true;
503
- // Enable frustum culling for instanced meshes
504
- instancedMesh.frustumCulled = true;
505
- geometry.convertedObject[this._renderingEngine.id] =
506
- instancedMesh;
507
- threeGeometryObject = instancedMesh;
508
- }
509
- else {
510
- const mesh = new THREE.Mesh(bufferGeometry, material);
511
- geometry.convertedObject[this._renderingEngine.id] = mesh;
512
- threeGeometryObject = mesh;
513
- }
514
- }
515
- else {
516
- throw new viewer_shared_services_1.ShapeDiverViewerDataProcessingError(`GeometryLoader.load: Unrecognized primitive mode ${geometry.mode}.`);
517
- }
518
- // Cache userData and bounding box data to reduce allocations
519
- const userDataCache = {
520
- SDid: geometry.id,
521
- SDversion: geometry.version,
522
- primitiveSDid: geometry.primitive.id,
523
- primitiveSDversion: geometry.primitive.version,
524
- };
525
- const bbox = geometry.boundingBox;
526
- const bboxMin = new THREE.Vector3(bbox.min[0], bbox.min[1], bbox.min[2]);
527
- const bboxMax = new THREE.Vector3(bbox.max[0], bbox.max[1], bbox.max[2]);
528
- const bsphereCenter = new THREE.Vector3(bbox.boundingSphere.center[0], bbox.boundingSphere.center[1], bbox.boundingSphere.center[2]);
529
- const renderOrder = geometry.renderOrder;
530
- const threeGeom = threeGeometryObject.geometry;
531
- threeGeom.userData = userDataCache;
532
- threeGeometryObject.renderOrder = renderOrder;
533
- // Performance: Disable matrixAutoUpdate for static geometry (no animations/transforms)
534
- // This prevents Three.js from recalculating matrices every frame
535
- if (!instanceData) {
536
- threeGeometryObject.matrixAutoUpdate = false;
537
- }
538
- if (threeGeometryObject instanceof THREE.Mesh &&
539
- threeGeometryObject.userData.transparencyPlaceholder !== true) {
540
- // Assign bounding box directly without unnecessary clones
541
- threeGeom.boundingBox = new THREE.Box3(bboxMin, bboxMax);
542
- threeGeom.boundingSphere = new THREE.Sphere(bsphereCenter, bbox.boundingSphere.radius);
543
- threeGeometryObject.morphTargetInfluences =
544
- geometry.morphWeights;
545
- }
546
- return threeGeometryObject;
547
- }
548
- getAttributeName(attributeId) {
549
- switch (attributeId) {
550
- case "POSITION":
551
- return "position";
552
- case "NORMAL":
553
- return "normal";
554
- case "TEXCOORD_0":
555
- case "TEXCOORD0":
556
- case "TEXCOORD":
557
- case "UV":
558
- return "uv";
559
- case "TEXCOORD_1":
560
- return "uv1";
561
- case "TEXCOORD_2":
562
- return "uv2";
563
- case "TEXCOORD_3":
564
- return "uv3";
565
- case "COLOR_0":
566
- case "COLOR0":
567
- case "COLOR":
568
- return "color";
569
- case "TANGENT":
570
- return "tangent";
571
- case "POSITION_INDEX":
572
- return "positionIndex";
573
- default:
574
- this._logger.warn(`GeometryLoader.loadPrimitive: Unrecognized attribute id ${attributeId}.`);
575
- }
576
- return "";
577
- }
578
- loadAttribute(bufferAttribute, attributeId) {
579
- let buffer;
580
- if (bufferAttribute.byteStride &&
581
- bufferAttribute.byteStride !== bufferAttribute.itemBytes) {
582
- // Integer parameters to IB/IBA are in array elements, not bytes.
583
- const ib = new THREE.InterleavedBuffer(bufferAttribute.array, bufferAttribute.byteStride / bufferAttribute.elementBytes);
584
- buffer = new THREE.InterleavedBufferAttribute(ib, bufferAttribute.itemSize, (bufferAttribute.byteOffset % bufferAttribute.byteStride) /
585
- bufferAttribute.elementBytes, bufferAttribute.normalized);
586
- }
587
- else {
588
- buffer = new THREE.BufferAttribute(bufferAttribute.array, bufferAttribute.itemSize, attributeId === "COLOR_0" ||
589
- attributeId === "COLOR0" ||
590
- attributeId === "COLOR"
591
- ? true
592
- : bufferAttribute.normalized);
593
- }
594
- if (bufferAttribute.sparse) {
595
- if (bufferAttribute.array !== null) {
596
- // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.
597
- buffer = new THREE.BufferAttribute(bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized);
598
- }
599
- for (let i = 0, il = bufferAttribute.sparseIndices.length; i < il; i++) {
600
- const index = bufferAttribute.sparseIndices[i];
601
- buffer.setX(index, bufferAttribute.sparseValues[i * bufferAttribute.itemSize]);
602
- if (bufferAttribute.itemSize >= 2)
603
- buffer.setY(index, bufferAttribute.sparseValues[i * bufferAttribute.itemSize + 1]);
604
- if (bufferAttribute.itemSize >= 3)
605
- buffer.setZ(index, bufferAttribute.sparseValues[i * bufferAttribute.itemSize + 2]);
606
- if (bufferAttribute.itemSize >= 4)
607
- buffer.setW(index, bufferAttribute.sparseValues[i * bufferAttribute.itemSize + 3]);
608
- if (bufferAttribute.itemSize >= 5)
609
- throw new viewer_shared_services_1.ShapeDiverViewerDataProcessingError("GeometryLoader.loadPrimitive: Unsupported itemSize in sparse BufferAttribute.");
610
- }
611
- }
612
- return buffer;
613
- }
614
- removeFromPrimitiveCache(id) {
615
- if (this._primitiveCache[id]) {
616
- if (this._primitiveCache[id].counter === 1) {
617
- this._primitiveCache[id].threeGeometry.dispose();
618
- for (const key in this._primitiveCache[id].threeGeometry
619
- .attributes)
620
- this._primitiveCache[id].threeGeometry.deleteAttribute(key);
621
- this._primitiveCache[id].threeGeometry.setIndex(null);
622
- this._primitiveCache[id].clones.forEach((c) => {
623
- c.dispose();
624
- for (const key in c.attributes)
625
- c.deleteAttribute(key);
626
- c.setIndex(null);
627
- });
628
- delete this._primitiveCache[id];
629
- }
630
- else {
631
- this._primitiveCache[id].counter--;
632
- }
633
- }
634
- }
635
- }
636
- exports.GeometryLoader = GeometryLoader;
438
+ `,
439
+ };
440
+ this._gemNormalMaterial = new THREE.ShaderMaterial({
441
+ uniforms: THREE.UniformsUtils.clone(_normalShader.uniforms),
442
+ defines: _normalShader.defines,
443
+ vertexShader: _normalShader.vertexShader,
444
+ fragmentShader: _normalShader.fragmentShader,
445
+ });
446
+ this._gemNormalMaterial.blending = THREE.NoBlending;
447
+ this._gemNormalMaterial.side = THREE.DoubleSide;
448
+ this._gemScene.overrideMaterial = this._gemNormalMaterial;
449
+ }
450
+ const mesh = new THREE.Mesh(geometry.clone(), this._gemNormalMaterial);
451
+ mesh.geometry.center();
452
+ this._gemScene.add(mesh);
453
+ this._gemCubeCamera.update(this._renderingEngine.renderer, this._gemScene);
454
+ this._gemScene.remove(mesh);
455
+ mesh.geometry.dispose();
456
+ mesh.material.dispose();
457
+ this._gemCubeCamera.renderTarget.texture.userData = {
458
+ SDid: geometryData.primitive.id,
459
+ SDversion: geometryData.primitive.version,
460
+ };
461
+ this._gemSphericalMapsCache[geometryData.primitive.id + "_" + geometryData.primitive.version] = {
462
+ texture: this._gemCubeCameraRenderTarget.texture,
463
+ renderTarget: this._gemCubeCameraRenderTarget,
464
+ counter: 1,
465
+ };
466
+ return this._gemSphericalMapsCache[geometryData.primitive.id + "_" + geometryData.primitive.version].texture;
467
+ }
468
+ createMesh(geometry, threeGeometry, material, instanceData) {
469
+ let threeGeometryObject;
470
+ if (geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.POINTS) {
471
+ const points = new THREE.Points(threeGeometry, material);
472
+ geometry.convertedObject[this._renderingEngine.id] = points;
473
+ threeGeometryObject = points;
474
+ }
475
+ else if (geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.LINES) {
476
+ const lineSegments = new THREE.LineSegments(threeGeometry, material);
477
+ geometry.convertedObject[this._renderingEngine.id] = lineSegments;
478
+ threeGeometryObject = lineSegments;
479
+ }
480
+ else if (geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.LINE_LOOP) {
481
+ const lineLoop = new THREE.LineLoop(threeGeometry, material);
482
+ geometry.convertedObject[this._renderingEngine.id] = lineLoop;
483
+ threeGeometryObject = lineLoop;
484
+ }
485
+ else if (geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.LINE_STRIP) {
486
+ const line = new THREE.Line(threeGeometry, material);
487
+ geometry.convertedObject[this._renderingEngine.id] = line;
488
+ threeGeometryObject = line;
489
+ }
490
+ else if (geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.TRIANGLES ||
491
+ geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.TRIANGLE_STRIP ||
492
+ geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.TRIANGLE_FAN) {
493
+ const bufferGeometry = threeGeometry;
494
+ if (geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.TRIANGLE_STRIP ||
495
+ geometry.mode === viewer_shared_types_1.PRIMITIVE_MODE.TRIANGLE_FAN)
496
+ this.convertToTriangleMode(bufferGeometry, geometry.mode);
497
+ if (instanceData && instanceData.instanceMatrices.length > 0) {
498
+ const instanceCount = instanceData.instanceMatrices.length;
499
+ const instancedMesh = new THREE.InstancedMesh(bufferGeometry, material, instanceCount);
500
+ // Reuse matrix object to reduce allocations
501
+ const tempMatrix = new THREE.Matrix4();
502
+ const useInstanceColors = this._renderingEngine.type !== viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES;
503
+ for (let i = 0; i < instanceCount; i++) {
504
+ tempMatrix.fromArray(instanceData.instanceMatrices[i]);
505
+ instancedMesh.setMatrixAt(i, tempMatrix);
506
+ if (useInstanceColors) {
507
+ instancedMesh.setColorAt(i, this._renderingEngine.createThreeJsColor(instanceData.instanceColors[i]));
508
+ }
509
+ }
510
+ if (instancedMesh.instanceColor)
511
+ instancedMesh.instanceColor.needsUpdate = true;
512
+ instancedMesh.instanceMatrix.needsUpdate = true;
513
+ // Enable frustum culling for instanced meshes
514
+ instancedMesh.frustumCulled = true;
515
+ geometry.convertedObject[this._renderingEngine.id] =
516
+ instancedMesh;
517
+ threeGeometryObject = instancedMesh;
518
+ }
519
+ else {
520
+ const mesh = new THREE.Mesh(bufferGeometry, material);
521
+ geometry.convertedObject[this._renderingEngine.id] = mesh;
522
+ threeGeometryObject = mesh;
523
+ }
524
+ }
525
+ else {
526
+ throw new viewer_shared_services_1.ShapeDiverViewerDataProcessingError(`GeometryLoader.load: Unrecognized primitive mode ${geometry.mode}.`);
527
+ }
528
+ // Cache userData and bounding box data to reduce allocations
529
+ const userDataCache = {
530
+ SDid: geometry.id,
531
+ SDversion: geometry.version,
532
+ primitiveSDid: geometry.primitive.id,
533
+ primitiveSDversion: geometry.primitive.version,
534
+ };
535
+ const bbox = geometry.boundingBox;
536
+ const bboxMin = new THREE.Vector3(bbox.min[0], bbox.min[1], bbox.min[2]);
537
+ const bboxMax = new THREE.Vector3(bbox.max[0], bbox.max[1], bbox.max[2]);
538
+ const bsphereCenter = new THREE.Vector3(bbox.boundingSphere.center[0], bbox.boundingSphere.center[1], bbox.boundingSphere.center[2]);
539
+ const renderOrder = geometry.renderOrder;
540
+ const threeGeom = threeGeometryObject.geometry;
541
+ threeGeom.userData = userDataCache;
542
+ threeGeometryObject.renderOrder = renderOrder;
543
+ // Performance: Disable matrixAutoUpdate for static geometry (no animations/transforms)
544
+ // This prevents Three.js from recalculating matrices every frame
545
+ if (!instanceData) {
546
+ threeGeometryObject.matrixAutoUpdate = false;
547
+ }
548
+ if (threeGeometryObject instanceof THREE.Mesh &&
549
+ threeGeometryObject.userData.transparencyPlaceholder !== true) {
550
+ // Assign bounding box directly without unnecessary clones
551
+ threeGeom.boundingBox = new THREE.Box3(bboxMin, bboxMax);
552
+ threeGeom.boundingSphere = new THREE.Sphere(bsphereCenter, bbox.boundingSphere.radius);
553
+ threeGeometryObject.morphTargetInfluences =
554
+ geometry.morphWeights;
555
+ }
556
+ return threeGeometryObject;
557
+ }
558
+ getAttributeName(attributeId) {
559
+ switch (attributeId) {
560
+ case "POSITION":
561
+ return "position";
562
+ case "NORMAL":
563
+ return "normal";
564
+ case "TEXCOORD_0":
565
+ case "TEXCOORD0":
566
+ case "TEXCOORD":
567
+ case "UV":
568
+ return "uv";
569
+ case "TEXCOORD_1":
570
+ return "uv1";
571
+ case "TEXCOORD_2":
572
+ return "uv2";
573
+ case "TEXCOORD_3":
574
+ return "uv3";
575
+ case "COLOR_0":
576
+ case "COLOR0":
577
+ case "COLOR":
578
+ return "color";
579
+ case "TANGENT":
580
+ return "tangent";
581
+ case "POSITION_INDEX":
582
+ return "positionIndex";
583
+ default:
584
+ this._logger.warn(`GeometryLoader.loadPrimitive: Unrecognized attribute id ${attributeId}.`);
585
+ }
586
+ return "";
587
+ }
588
+ loadAttribute(bufferAttribute, attributeId) {
589
+ let buffer;
590
+ if (bufferAttribute.byteStride &&
591
+ bufferAttribute.byteStride !== bufferAttribute.itemBytes) {
592
+ // Integer parameters to IB/IBA are in array elements, not bytes.
593
+ const ib = new THREE.InterleavedBuffer(bufferAttribute.array, bufferAttribute.byteStride / bufferAttribute.elementBytes);
594
+ buffer = new THREE.InterleavedBufferAttribute(ib, bufferAttribute.itemSize, (bufferAttribute.byteOffset % bufferAttribute.byteStride) /
595
+ bufferAttribute.elementBytes, bufferAttribute.normalized);
596
+ }
597
+ else {
598
+ buffer = new THREE.BufferAttribute(bufferAttribute.array, bufferAttribute.itemSize, attributeId === "COLOR_0" ||
599
+ attributeId === "COLOR0" ||
600
+ attributeId === "COLOR"
601
+ ? true
602
+ : bufferAttribute.normalized);
603
+ }
604
+ if (bufferAttribute.sparse) {
605
+ if (bufferAttribute.array !== null) {
606
+ // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.
607
+ buffer = new THREE.BufferAttribute(bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized);
608
+ }
609
+ for (let i = 0, il = bufferAttribute.sparseIndices.length; i < il; i++) {
610
+ const index = bufferAttribute.sparseIndices[i];
611
+ buffer.setX(index, bufferAttribute.sparseValues[i * bufferAttribute.itemSize]);
612
+ if (bufferAttribute.itemSize >= 2)
613
+ buffer.setY(index, bufferAttribute.sparseValues[i * bufferAttribute.itemSize + 1]);
614
+ if (bufferAttribute.itemSize >= 3)
615
+ buffer.setZ(index, bufferAttribute.sparseValues[i * bufferAttribute.itemSize + 2]);
616
+ if (bufferAttribute.itemSize >= 4)
617
+ buffer.setW(index, bufferAttribute.sparseValues[i * bufferAttribute.itemSize + 3]);
618
+ if (bufferAttribute.itemSize >= 5)
619
+ throw new viewer_shared_services_1.ShapeDiverViewerDataProcessingError("GeometryLoader.loadPrimitive: Unsupported itemSize in sparse BufferAttribute.");
620
+ }
621
+ }
622
+ return buffer;
623
+ }
624
+ removeFromPrimitiveCache(id) {
625
+ if (this._primitiveCache[id]) {
626
+ if (this._primitiveCache[id].counter === 1) {
627
+ this._primitiveCache[id].threeGeometry.dispose();
628
+ for (const key in this._primitiveCache[id].threeGeometry
629
+ .attributes)
630
+ this._primitiveCache[id].threeGeometry.deleteAttribute(key);
631
+ this._primitiveCache[id].threeGeometry.setIndex(null);
632
+ this._primitiveCache[id].clones.forEach((c) => {
633
+ c.dispose();
634
+ for (const key in c.attributes)
635
+ c.deleteAttribute(key);
636
+ c.setIndex(null);
637
+ });
638
+ delete this._primitiveCache[id];
639
+ }
640
+ else {
641
+ this._primitiveCache[id].counter--;
642
+ }
643
+ }
644
+ }
645
+ }
646
+ exports.GeometryLoader = GeometryLoader;
637
647
  //# sourceMappingURL=GeometryLoader.js.map