@shapediver/viewer.rendering-engine.rendering-engine-threejs 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/LICENSE +73 -0
  2. package/README.md +3 -0
  3. package/dist/RenderingEngine.d.ts +296 -0
  4. package/dist/RenderingEngine.d.ts.map +1 -0
  5. package/dist/RenderingEngine.js +1079 -0
  6. package/dist/RenderingEngine.js.map +1 -0
  7. package/dist/index.d.ts +12 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +47 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/injectors/Tag3dGeometryCreationInjector.d.ts +11 -0
  12. package/dist/injectors/Tag3dGeometryCreationInjector.d.ts.map +1 -0
  13. package/dist/injectors/Tag3dGeometryCreationInjector.js +169 -0
  14. package/dist/injectors/Tag3dGeometryCreationInjector.js.map +1 -0
  15. package/dist/injectors/TextureUnifierInjector.d.ts +14 -0
  16. package/dist/injectors/TextureUnifierInjector.d.ts.map +1 -0
  17. package/dist/injectors/TextureUnifierInjector.js +227 -0
  18. package/dist/injectors/TextureUnifierInjector.js.map +1 -0
  19. package/dist/interfaces/ILoader.d.ts +4 -0
  20. package/dist/interfaces/ILoader.d.ts.map +1 -0
  21. package/dist/interfaces/ILoader.js +3 -0
  22. package/dist/interfaces/ILoader.js.map +1 -0
  23. package/dist/interfaces/IPostProcessingEffectDefinitions.d.ts +307 -0
  24. package/dist/interfaces/IPostProcessingEffectDefinitions.d.ts.map +1 -0
  25. package/dist/interfaces/IPostProcessingEffectDefinitions.js +31 -0
  26. package/dist/interfaces/IPostProcessingEffectDefinitions.js.map +1 -0
  27. package/dist/interfaces/IRenderingEngine.d.ts +43 -0
  28. package/dist/interfaces/IRenderingEngine.d.ts.map +1 -0
  29. package/dist/interfaces/IRenderingEngine.js +3 -0
  30. package/dist/interfaces/IRenderingEngine.js.map +1 -0
  31. package/dist/loaders/EnvironmentMapLoader.d.ts +98 -0
  32. package/dist/loaders/EnvironmentMapLoader.d.ts.map +1 -0
  33. package/dist/loaders/EnvironmentMapLoader.js +348 -0
  34. package/dist/loaders/EnvironmentMapLoader.js.map +1 -0
  35. package/dist/loaders/GeometryLoader.d.ts +38 -0
  36. package/dist/loaders/GeometryLoader.d.ts.map +1 -0
  37. package/dist/loaders/GeometryLoader.js +505 -0
  38. package/dist/loaders/GeometryLoader.js.map +1 -0
  39. package/dist/loaders/HTMLElementAnchorLoader.d.ts +17 -0
  40. package/dist/loaders/HTMLElementAnchorLoader.d.ts.map +1 -0
  41. package/dist/loaders/HTMLElementAnchorLoader.js +84 -0
  42. package/dist/loaders/HTMLElementAnchorLoader.js.map +1 -0
  43. package/dist/loaders/LightLoader.d.ts +19 -0
  44. package/dist/loaders/LightLoader.d.ts.map +1 -0
  45. package/dist/loaders/LightLoader.js +152 -0
  46. package/dist/loaders/LightLoader.js.map +1 -0
  47. package/dist/loaders/MaterialLoader.d.ts +99 -0
  48. package/dist/loaders/MaterialLoader.d.ts.map +1 -0
  49. package/dist/loaders/MaterialLoader.js +1175 -0
  50. package/dist/loaders/MaterialLoader.js.map +1 -0
  51. package/dist/managers/CameraManager.d.ts +20 -0
  52. package/dist/managers/CameraManager.d.ts.map +1 -0
  53. package/dist/managers/CameraManager.js +195 -0
  54. package/dist/managers/CameraManager.js.map +1 -0
  55. package/dist/managers/EnvironmentGeometryManager.d.ts +43 -0
  56. package/dist/managers/EnvironmentGeometryManager.d.ts.map +1 -0
  57. package/dist/managers/EnvironmentGeometryManager.js +210 -0
  58. package/dist/managers/EnvironmentGeometryManager.js.map +1 -0
  59. package/dist/managers/PostProcessingManager.d.ts +1014 -0
  60. package/dist/managers/PostProcessingManager.d.ts.map +1 -0
  61. package/dist/managers/PostProcessingManager.js +1013 -0
  62. package/dist/managers/PostProcessingManager.js.map +1 -0
  63. package/dist/managers/RenderingManager.d.ts +83 -0
  64. package/dist/managers/RenderingManager.d.ts.map +1 -0
  65. package/dist/managers/RenderingManager.js +567 -0
  66. package/dist/managers/RenderingManager.js.map +1 -0
  67. package/dist/managers/SceneTracingManager.d.ts +26 -0
  68. package/dist/managers/SceneTracingManager.d.ts.map +1 -0
  69. package/dist/managers/SceneTracingManager.js +122 -0
  70. package/dist/managers/SceneTracingManager.js.map +1 -0
  71. package/dist/managers/SceneTreeManager.d.ts +55 -0
  72. package/dist/managers/SceneTreeManager.d.ts.map +1 -0
  73. package/dist/managers/SceneTreeManager.js +501 -0
  74. package/dist/managers/SceneTreeManager.js.map +1 -0
  75. package/dist/managers/postprocessing/GodRaysManager.d.ts +13 -0
  76. package/dist/managers/postprocessing/GodRaysManager.d.ts.map +1 -0
  77. package/dist/managers/postprocessing/GodRaysManager.js +64 -0
  78. package/dist/managers/postprocessing/GodRaysManager.js.map +1 -0
  79. package/dist/managers/postprocessing/OutlineManager.d.ts +15 -0
  80. package/dist/managers/postprocessing/OutlineManager.d.ts.map +1 -0
  81. package/dist/managers/postprocessing/OutlineManager.js +67 -0
  82. package/dist/managers/postprocessing/OutlineManager.js.map +1 -0
  83. package/dist/managers/postprocessing/SSAARenderPass.d.ts +54 -0
  84. package/dist/managers/postprocessing/SSAARenderPass.d.ts.map +1 -0
  85. package/dist/managers/postprocessing/SSAARenderPass.js +234 -0
  86. package/dist/managers/postprocessing/SSAARenderPass.js.map +1 -0
  87. package/dist/managers/postprocessing/SelectiveBloomManager.d.ts +15 -0
  88. package/dist/managers/postprocessing/SelectiveBloomManager.d.ts.map +1 -0
  89. package/dist/managers/postprocessing/SelectiveBloomManager.js +67 -0
  90. package/dist/managers/postprocessing/SelectiveBloomManager.js.map +1 -0
  91. package/dist/managers/postprocessing/ao/ao/AOEffect.d.ts +47 -0
  92. package/dist/managers/postprocessing/ao/ao/AOEffect.d.ts.map +1 -0
  93. package/dist/managers/postprocessing/ao/ao/AOEffect.js +134 -0
  94. package/dist/managers/postprocessing/ao/ao/AOEffect.js.map +1 -0
  95. package/dist/managers/postprocessing/ao/ao/AOPass.d.ts +13 -0
  96. package/dist/managers/postprocessing/ao/ao/AOPass.d.ts.map +1 -0
  97. package/dist/managers/postprocessing/ao/ao/AOPass.js +78 -0
  98. package/dist/managers/postprocessing/ao/ao/AOPass.js.map +1 -0
  99. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.d.ts +2 -0
  100. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.d.ts.map +1 -0
  101. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.js +23 -0
  102. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.js.map +1 -0
  103. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.d.ts +15 -0
  104. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.d.ts.map +1 -0
  105. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.js +25 -0
  106. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.js.map +1 -0
  107. package/dist/managers/postprocessing/ao/hbao/shader/hbao.d.ts +2 -0
  108. package/dist/managers/postprocessing/ao/hbao/shader/hbao.d.ts.map +1 -0
  109. package/dist/managers/postprocessing/ao/hbao/shader/hbao.js +102 -0
  110. package/dist/managers/postprocessing/ao/hbao/shader/hbao.js.map +1 -0
  111. package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.d.ts +2 -0
  112. package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.d.ts.map +1 -0
  113. package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.js +99 -0
  114. package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.js.map +1 -0
  115. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.d.ts +37 -0
  116. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.d.ts.map +1 -0
  117. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js +171 -0
  118. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js.map +1 -0
  119. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.d.ts +2 -0
  120. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.d.ts.map +1 -0
  121. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.js +131 -0
  122. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.js.map +1 -0
  123. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.d.ts +15 -0
  124. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.d.ts.map +1 -0
  125. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js +76 -0
  126. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js.map +1 -0
  127. package/dist/managers/postprocessing/ao/ssao/shader/ssao.d.ts +2 -0
  128. package/dist/managers/postprocessing/ao/ssao/shader/ssao.d.ts.map +1 -0
  129. package/dist/managers/postprocessing/ao/ssao/shader/ssao.js +134 -0
  130. package/dist/managers/postprocessing/ao/ssao/shader/ssao.js.map +1 -0
  131. package/dist/managers/postprocessing/ao/utils/shader/basic.d.ts +2 -0
  132. package/dist/managers/postprocessing/ao/utils/shader/basic.d.ts.map +1 -0
  133. package/dist/managers/postprocessing/ao/utils/shader/basic.js +12 -0
  134. package/dist/managers/postprocessing/ao/utils/shader/basic.js.map +1 -0
  135. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.d.ts +2 -0
  136. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.d.ts.map +1 -0
  137. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.js +42 -0
  138. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.js.map +1 -0
  139. package/dist/managers/postprocessing/utils/CopyMaterial.d.ts +38 -0
  140. package/dist/managers/postprocessing/utils/CopyMaterial.d.ts.map +1 -0
  141. package/dist/managers/postprocessing/utils/CopyMaterial.js +106 -0
  142. package/dist/managers/postprocessing/utils/CopyMaterial.js.map +1 -0
  143. package/dist/managers/postprocessing/utils/CopyShader.d.ts +14 -0
  144. package/dist/managers/postprocessing/utils/CopyShader.d.ts.map +1 -0
  145. package/dist/managers/postprocessing/utils/CopyShader.js +36 -0
  146. package/dist/managers/postprocessing/utils/CopyShader.js.map +1 -0
  147. package/dist/managers/postprocessing/utils/FullScreenQuad.d.ts +10 -0
  148. package/dist/managers/postprocessing/utils/FullScreenQuad.d.ts.map +1 -0
  149. package/dist/managers/postprocessing/utils/FullScreenQuad.js +29 -0
  150. package/dist/managers/postprocessing/utils/FullScreenQuad.js.map +1 -0
  151. package/dist/managers/postprocessing/utils/NormalPass.d.ts +88 -0
  152. package/dist/managers/postprocessing/utils/NormalPass.d.ts.map +1 -0
  153. package/dist/managers/postprocessing/utils/NormalPass.js +157 -0
  154. package/dist/managers/postprocessing/utils/NormalPass.js.map +1 -0
  155. package/dist/managers/postprocessing/utils/RenderPass.d.ts +115 -0
  156. package/dist/managers/postprocessing/utils/RenderPass.d.ts.map +1 -0
  157. package/dist/managers/postprocessing/utils/RenderPass.js +251 -0
  158. package/dist/managers/postprocessing/utils/RenderPass.js.map +1 -0
  159. package/dist/materials/GemMaterial.d.ts +38 -0
  160. package/dist/materials/GemMaterial.d.ts.map +1 -0
  161. package/dist/materials/GemMaterial.js +253 -0
  162. package/dist/materials/GemMaterial.js.map +1 -0
  163. package/dist/materials/MeshUnlitMaterialParameters.d.ts +4 -0
  164. package/dist/materials/MeshUnlitMaterialParameters.d.ts.map +1 -0
  165. package/dist/materials/MeshUnlitMaterialParameters.js +3 -0
  166. package/dist/materials/MeshUnlitMaterialParameters.js.map +1 -0
  167. package/dist/materials/MultiPointsMaterial.d.ts +94 -0
  168. package/dist/materials/MultiPointsMaterial.d.ts.map +1 -0
  169. package/dist/materials/MultiPointsMaterial.js +567 -0
  170. package/dist/materials/MultiPointsMaterial.js.map +1 -0
  171. package/dist/materials/SpecularGlossinessMaterial.d.ts +14 -0
  172. package/dist/materials/SpecularGlossinessMaterial.d.ts.map +1 -0
  173. package/dist/materials/SpecularGlossinessMaterial.js +162 -0
  174. package/dist/materials/SpecularGlossinessMaterial.js.map +1 -0
  175. package/dist/objects/SDBone.d.ts +13 -0
  176. package/dist/objects/SDBone.d.ts.map +1 -0
  177. package/dist/objects/SDBone.js +75 -0
  178. package/dist/objects/SDBone.js.map +1 -0
  179. package/dist/objects/SDColor.d.ts +17 -0
  180. package/dist/objects/SDColor.d.ts.map +1 -0
  181. package/dist/objects/SDColor.js +49 -0
  182. package/dist/objects/SDColor.js.map +1 -0
  183. package/dist/objects/SDData.d.ts +19 -0
  184. package/dist/objects/SDData.d.ts.map +1 -0
  185. package/dist/objects/SDData.js +48 -0
  186. package/dist/objects/SDData.js.map +1 -0
  187. package/dist/objects/SDObject.d.ts +14 -0
  188. package/dist/objects/SDObject.d.ts.map +1 -0
  189. package/dist/objects/SDObject.js +81 -0
  190. package/dist/objects/SDObject.js.map +1 -0
  191. package/dist/shaders/PCSS.d.ts +3 -0
  192. package/dist/shaders/PCSS.d.ts.map +1 -0
  193. package/dist/shaders/PCSS.js +127 -0
  194. package/dist/shaders/PCSS.js.map +1 -0
  195. package/dist/shaders/gem.d.ts +3 -0
  196. package/dist/shaders/gem.d.ts.map +1 -0
  197. package/dist/shaders/gem.js +578 -0
  198. package/dist/shaders/gem.js.map +1 -0
  199. package/dist/shaders/multi_points.d.ts +3 -0
  200. package/dist/shaders/multi_points.d.ts.map +1 -0
  201. package/dist/shaders/multi_points.js +294 -0
  202. package/dist/shaders/multi_points.js.map +1 -0
  203. package/dist/styling/viewport-css.d.ts +2 -0
  204. package/dist/styling/viewport-css.d.ts.map +1 -0
  205. package/dist/styling/viewport-css.js +117 -0
  206. package/dist/styling/viewport-css.js.map +1 -0
  207. package/dist/three/font.d.ts +2365 -0
  208. package/dist/three/font.d.ts.map +1 -0
  209. package/dist/three/font.js +6 -0
  210. package/dist/three/font.js.map +1 -0
  211. package/dist/three/geometries/TextGeometry.d.ts +22 -0
  212. package/dist/three/geometries/TextGeometry.d.ts.map +1 -0
  213. package/dist/three/geometries/TextGeometry.js +45 -0
  214. package/dist/three/geometries/TextGeometry.js.map +1 -0
  215. package/dist/three/loaders/FontLoader.d.ts +15 -0
  216. package/dist/three/loaders/FontLoader.d.ts.map +1 -0
  217. package/dist/three/loaders/FontLoader.js +118 -0
  218. package/dist/three/loaders/FontLoader.js.map +1 -0
  219. package/dist/three/loaders/RGBELoader.d.ts +24 -0
  220. package/dist/three/loaders/RGBELoader.d.ts.map +1 -0
  221. package/dist/three/loaders/RGBELoader.js +299 -0
  222. package/dist/three/loaders/RGBELoader.js.map +1 -0
  223. package/dist/types/IThreejsData.d.ts +7 -0
  224. package/dist/types/IThreejsData.d.ts.map +1 -0
  225. package/dist/types/IThreejsData.js +3 -0
  226. package/dist/types/IThreejsData.js.map +1 -0
  227. package/dist/types/ThreejsData.d.ts +11 -0
  228. package/dist/types/ThreejsData.d.ts.map +1 -0
  229. package/dist/types/ThreejsData.js +42 -0
  230. package/dist/types/ThreejsData.js.map +1 -0
  231. package/package.json +65 -0
  232. package/src/RenderingEngine.ts +1342 -0
  233. package/src/index.ts +23 -0
  234. package/src/injectors/Tag3dGeometryCreationInjector.ts +170 -0
  235. package/src/injectors/TextureUnifierInjector.ts +224 -0
  236. package/src/interfaces/ILoader.ts +3 -0
  237. package/src/interfaces/IPostProcessingEffectDefinitions.ts +402 -0
  238. package/src/interfaces/IRenderingEngine.ts +48 -0
  239. package/src/loaders/EnvironmentMapLoader.ts +355 -0
  240. package/src/loaders/GeometryLoader.ts +565 -0
  241. package/src/loaders/HTMLElementAnchorLoader.ts +107 -0
  242. package/src/loaders/LightLoader.ts +171 -0
  243. package/src/loaders/MaterialLoader.ts +1418 -0
  244. package/src/managers/CameraManager.ts +178 -0
  245. package/src/managers/EnvironmentGeometryManager.ts +224 -0
  246. package/src/managers/PostProcessingManager.ts +1169 -0
  247. package/src/managers/RenderingManager.ts +657 -0
  248. package/src/managers/SceneTracingManager.ts +120 -0
  249. package/src/managers/SceneTreeManager.ts +569 -0
  250. package/src/managers/postprocessing/GodRaysManager.ts +52 -0
  251. package/src/managers/postprocessing/OutlineManager.ts +58 -0
  252. package/src/managers/postprocessing/SSAARenderPass.ts +339 -0
  253. package/src/managers/postprocessing/SelectiveBloomManager.ts +58 -0
  254. package/src/managers/postprocessing/ao/ao/AOEffect.ts +180 -0
  255. package/src/managers/postprocessing/ao/ao/AOPass.ts +128 -0
  256. package/src/managers/postprocessing/ao/ao/shader/ao_compose.glsl +17 -0
  257. package/src/managers/postprocessing/ao/ao/shader/ao_compose.ts +19 -0
  258. package/src/managers/postprocessing/ao/hbao/HBAOEffect.ts +41 -0
  259. package/src/managers/postprocessing/ao/hbao/shader/hbao.glsl +96 -0
  260. package/src/managers/postprocessing/ao/hbao/shader/hbao.ts +98 -0
  261. package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.glsl +92 -0
  262. package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.ts +95 -0
  263. package/src/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.ts +245 -0
  264. package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.glsl +125 -0
  265. package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.ts +127 -0
  266. package/src/managers/postprocessing/ao/ssao/SSAOEffect.ts +106 -0
  267. package/src/managers/postprocessing/ao/ssao/shader/ssao.glsl +128 -0
  268. package/src/managers/postprocessing/ao/ssao/shader/ssao.ts +130 -0
  269. package/src/managers/postprocessing/ao/utils/shader/basic.glsl +6 -0
  270. package/src/managers/postprocessing/ao/utils/shader/basic.ts +8 -0
  271. package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.glsl +36 -0
  272. package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.ts +38 -0
  273. package/src/managers/postprocessing/utils/CopyMaterial.ts +130 -0
  274. package/src/managers/postprocessing/utils/CopyShader.ts +39 -0
  275. package/src/managers/postprocessing/utils/FullScreenQuad.ts +47 -0
  276. package/src/managers/postprocessing/utils/NormalPass.ts +222 -0
  277. package/src/managers/postprocessing/utils/RenderPass.ts +366 -0
  278. package/src/materials/GemMaterial.ts +268 -0
  279. package/src/materials/MeshUnlitMaterialParameters.ts +4 -0
  280. package/src/materials/MultiPointsMaterial.ts +646 -0
  281. package/src/materials/SpecularGlossinessMaterial.ts +182 -0
  282. package/src/objects/SDBone.ts +51 -0
  283. package/src/objects/SDColor.ts +54 -0
  284. package/src/objects/SDData.ts +44 -0
  285. package/src/objects/SDObject.ts +58 -0
  286. package/src/shaders/PCSS.ts +124 -0
  287. package/src/shaders/gem.ts +575 -0
  288. package/src/shaders/gem_frag.glsl +517 -0
  289. package/src/shaders/gem_vert.glsl +53 -0
  290. package/src/shaders/multi_points.ts +291 -0
  291. package/src/shaders/multi_points_frag.glsl +166 -0
  292. package/src/shaders/multi_points_vert.glsl +120 -0
  293. package/src/styling/viewport-css.ts +113 -0
  294. package/src/styling/viewport.css +111 -0
  295. package/src/three/font.ts +2 -0
  296. package/src/three/geometries/TextGeometry.ts +58 -0
  297. package/src/three/loaders/FontLoader.ts +205 -0
  298. package/src/three/loaders/RGBELoader.ts +496 -0
  299. package/src/types/IThreejsData.ts +16 -0
  300. package/src/types/ThreejsData.ts +43 -0
  301. package/tsconfig.json +20 -0
@@ -0,0 +1,1418 @@
1
+ import * as THREE from 'three';
2
+ import { Converter, ShapeDiverViewerDataProcessingError, atobCustom, btoaCustom } from '@shapediver/viewer.shared.services';
3
+ import { entry, main } from '../shaders/PCSS';
4
+ import { ENVIRONMENT_MAP_TYPE } from './EnvironmentMapLoader';
5
+ import { GemMaterial, GemMaterialParameters } from '../materials/GemMaterial';
6
+ import {
7
+ GeometryData,
8
+ IMapData,
9
+ IMaterialAbstractData,
10
+ MATERIAL_ALPHA,
11
+ MATERIAL_SIDE,
12
+ MaterialBasicLineData,
13
+ MaterialGemData,
14
+ MaterialMultiPointData,
15
+ MaterialPointData,
16
+ MaterialShadowData,
17
+ MaterialSpecularGlossinessData,
18
+ MaterialStandardData,
19
+ MaterialUnlitData,
20
+ PRIMITIVE_MODE,
21
+ TEXTURE_FILTERING,
22
+ TEXTURE_WRAPPING
23
+ } from '@shapediver/viewer.shared.types';
24
+ import { ILoader } from '../interfaces/ILoader';
25
+ import { ITreeNodeData } from '@shapediver/viewer.shared.node-tree';
26
+ import { mat4, quat } from 'gl-matrix';
27
+ import { MeshUnlitMaterialParameters } from '../materials/MeshUnlitMaterialParameters';
28
+ import { MultiPointsMaterial, MultiPointsMaterialParameters } from '../materials/MultiPointsMaterial';
29
+ import { RenderingEngine } from '../RenderingEngine';
30
+ import { SDColor } from '../objects/SDColor';
31
+ import { SpecularGlossinessMaterial, SpecularGlossinessMaterialParameters } from '../materials/SpecularGlossinessMaterial';
32
+
33
+ // #region Type aliases (6)
34
+
35
+ type MaterialDataMeshTypes = MaterialStandardData | MaterialGemData | MaterialSpecularGlossinessData | MaterialUnlitData;
36
+ export type MaterialSettings = {
37
+ mode: PRIMITIVE_MODE,
38
+ useVertexTangents: boolean,
39
+ useVertexColors: boolean,
40
+ useFlatShading: boolean,
41
+ useMorphTargets: boolean,
42
+ useMorphNormals: boolean
43
+ }
44
+
45
+ type ThreeJsMaterialParameterTypes = THREE.PointsMaterialParameters | MultiPointsMaterialParameters | THREE.LineBasicMaterialParameters | MeshUnlitMaterialParameters | THREE.MeshPhysicalMaterialParameters | SpecularGlossinessMaterialParameters | GemMaterialParameters | THREE.ShadowMaterialParameters;
46
+ type ThreeJsMaterialTypes = THREE.Material | THREE.MeshPhysicalMaterial | THREE.MeshBasicMaterial | GemMaterial | THREE.PointsMaterial | MultiPointsMaterial | THREE.LineBasicMaterial | THREE.ShadowMaterial;
47
+ type ThreeJsMeshMaterialTypes = THREE.MeshPhysicalMaterial | THREE.MeshStandardMaterial | THREE.MeshBasicMaterial;
48
+ type ThreeJsTextureCacheObject = {
49
+ texture: THREE.Texture,
50
+ usage: number,
51
+ initialized: boolean
52
+ }
53
+
54
+ // #endregion Type aliases (6)
55
+
56
+ // #region Classes (1)
57
+
58
+ export class MaterialLoader implements ILoader {
59
+ // #region Properties (16)
60
+
61
+ private readonly _converter: Converter = Converter.instance;
62
+
63
+ private _blending: number = 0.0;
64
+ private _defaultLineMaterialData: MaterialBasicLineData = new MaterialBasicLineData({ color: '#199b9b' });
65
+ private _defaultMaterialData: MaterialStandardData = new MaterialStandardData({ color: '#199b9b', side: MATERIAL_SIDE.DOUBLE, metalness: 0.0 });
66
+ private _defaultPointMaterialData: MaterialPointData = new MaterialPointData({ color: '#199b9b' });
67
+ private _envMap: THREE.CubeTexture | THREE.Texture | null = null;
68
+ private _envMapIntensity: number = 1;
69
+ private _envMapType: ENVIRONMENT_MAP_TYPE = ENVIRONMENT_MAP_TYPE.NULL;
70
+ private _environmentMapRotationEuler: THREE.Euler = new THREE.Euler();
71
+ private _height: number = 1020;
72
+ private _lightSizeUV: number = 0.025;
73
+ private _materialCache: {
74
+ [key: string]: {
75
+ materialData: IMaterialAbstractData | null,
76
+ material: ThreeJsMaterialTypes,
77
+ materialSettings?: MaterialSettings
78
+ }
79
+ } = {};
80
+ private _maxMapCount: number = 0;
81
+ private _pointSize: number = 1.0;
82
+ private _textureEncoding: THREE.ColorSpace = THREE.SRGBColorSpace;
83
+ private _threeJsTextureCache: { [key: string]: ThreeJsTextureCacheObject } = {};
84
+
85
+ // #endregion Properties (16)
86
+
87
+ // #region Constructors (1)
88
+
89
+ constructor(private readonly _renderingEngine: RenderingEngine) { }
90
+
91
+ // #endregion Constructors (1)
92
+
93
+ // #region Public Getters And Setters (12)
94
+
95
+ public get defaultLineMaterialData(): MaterialBasicLineData {
96
+ return this._defaultLineMaterialData;
97
+ }
98
+
99
+ public set defaultLineMaterialData(value: MaterialBasicLineData) {
100
+ this._defaultLineMaterialData = value;
101
+ this.assignDefaultLineMaterial();
102
+ }
103
+
104
+ public get defaultMaterialData(): MaterialStandardData {
105
+ return this._defaultMaterialData;
106
+ }
107
+
108
+ public set defaultMaterialData(value: MaterialStandardData) {
109
+ this._defaultMaterialData = value;
110
+ this.assignDefaultMaterial();
111
+ }
112
+
113
+ public get defaultPointMaterialData(): MaterialPointData {
114
+ return this._defaultPointMaterialData;
115
+ }
116
+
117
+ public set defaultPointMaterialData(value: MaterialPointData) {
118
+ this._defaultPointMaterialData = value;
119
+ this.assignDefaultPointMaterial();
120
+ }
121
+
122
+ public get maxMapCount(): number {
123
+ return this._maxMapCount;
124
+ }
125
+
126
+ public set maxMapCount(value: number) {
127
+ this._maxMapCount = value;
128
+ }
129
+
130
+ public get textureEncoding(): THREE.ColorSpace {
131
+ return this._textureEncoding;
132
+ }
133
+
134
+ public set textureEncoding(value: THREE.ColorSpace) {
135
+ this._textureEncoding = value;
136
+ this.assignTextureEncoding();
137
+ }
138
+
139
+ public get threeJsTextureCache(): { [key: string]: ThreeJsTextureCacheObject } {
140
+ return this._threeJsTextureCache;
141
+ }
142
+
143
+ public set threeJsTextureCache(value: { [key: string]: ThreeJsTextureCacheObject }) {
144
+ this._threeJsTextureCache = value;
145
+ }
146
+
147
+ // #endregion Public Getters And Setters (12)
148
+
149
+ // #region Public Methods (18)
150
+
151
+ public assignColorCorrection(value: boolean) {
152
+ const convertColor = (c: THREE.Color | SDColor | undefined, toggle: boolean): THREE.Color | SDColor | undefined => {
153
+ if (!c) return;
154
+
155
+ if (c instanceof SDColor) {
156
+ c.colorCorrection(toggle);
157
+ return c;
158
+ } else {
159
+ const sdColor = this._renderingEngine.colorCache.find(color => color.equals(c));
160
+ if (sdColor) {
161
+ sdColor.colorCorrection(toggle);
162
+ return sdColor;
163
+ } else {
164
+ // we check in this case if the converted color has been stored already
165
+ const clone = c.clone();
166
+ toggle === true ? clone.convertSRGBToLinear() : clone.convertLinearToSRGB();
167
+ const sdColorClone = this._renderingEngine.colorCache.find(color => color.equals(clone));
168
+
169
+ if (sdColorClone) {
170
+ sdColorClone.colorCorrection(toggle);
171
+ return sdColorClone;
172
+ } else {
173
+ // some colors may not have been set by us, but have been set automatically
174
+ // in this case we expect the color to be linear either way and therefore omit a color correction
175
+ return c;
176
+ }
177
+ }
178
+ }
179
+ };
180
+
181
+ for (const cacheKey in this._materialCache) {
182
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
183
+ const material: any = this._materialCache[cacheKey].material;
184
+
185
+ if (material.color) material.color = convertColor(material.color, value);
186
+ if (material.specular) material.specular = convertColor(material.specular, value);
187
+ if (material.emissive) material.emissive = convertColor(material.emissive, value);
188
+ if (material.colorTransferBegin) material.colorTransferBegin = convertColor(material.colorTransferBegin, value);
189
+ if (material.colorTransferEnd) material.colorTransferEnd = convertColor(material.colorTransferEnd, value);
190
+ if (material.attenuationColor) material.attenuationColor = convertColor(material.attenuationColor, value);
191
+ if (material.sheencolor) material.sheencolor = convertColor(material.sheencolor, value);
192
+ if (material.specularColor) material.specularColor = convertColor(material.specularColor, value);
193
+
194
+ material.needsUpdate = true;
195
+ }
196
+ }
197
+
198
+ public assignDefaultLineMaterial() {
199
+ for (const cacheKey in this._materialCache) {
200
+ if (this._materialCache[cacheKey].material instanceof THREE.LineBasicMaterial && this._materialCache[cacheKey].materialData === undefined) {
201
+ const material: THREE.LineBasicMaterial = <THREE.LineBasicMaterial>this._materialCache[cacheKey].material;
202
+ if (this._materialCache[cacheKey].materialData && this._materialCache[cacheKey].materialData instanceof MaterialBasicLineData) continue;
203
+
204
+ const { properties, mapCount } = this.getMaterialProperties(this._defaultLineMaterialData, MATERIAL_TYPE.LINE, undefined);
205
+ this.maxMapCount = Math.max(this.maxMapCount, mapCount);
206
+ material.copy(new THREE.LineBasicMaterial(properties));
207
+ material.needsUpdate = true;
208
+ }
209
+ }
210
+ }
211
+
212
+ public assignDefaultMaterial() {
213
+ for (const cacheKey in this._materialCache) {
214
+ if (this._materialCache[cacheKey].material instanceof THREE.MeshPhysicalMaterial && this._materialCache[cacheKey].materialData === undefined) {
215
+ const material: THREE.MeshPhysicalMaterial = <THREE.MeshPhysicalMaterial>this._materialCache[cacheKey].material;
216
+ if (this._materialCache[cacheKey].materialData && this._materialCache[cacheKey].materialData instanceof MaterialStandardData) continue;
217
+
218
+ const { properties, mapCount } = this.getMaterialProperties(this._defaultMaterialData, MATERIAL_TYPE.MESH, this._materialCache[cacheKey].materialSettings);
219
+ this.maxMapCount = Math.max(this.maxMapCount, mapCount);
220
+ material.copy(new THREE.MeshPhysicalMaterial(properties));
221
+ material.needsUpdate = true;
222
+ }
223
+ }
224
+ }
225
+
226
+ public assignDefaultPointMaterial() {
227
+ for (const cacheKey in this._materialCache) {
228
+ if (this._materialCache[cacheKey].material instanceof THREE.PointsMaterial && this._materialCache[cacheKey].materialData === undefined) {
229
+ const material: THREE.PointsMaterial = <THREE.PointsMaterial>this._materialCache[cacheKey].material;
230
+ if (this._materialCache[cacheKey].materialData && this._materialCache[cacheKey].materialData instanceof MaterialPointData) continue;
231
+
232
+ const { properties, mapCount } = this.getMaterialProperties(this._defaultPointMaterialData, MATERIAL_TYPE.POINT, undefined);
233
+ this.maxMapCount = Math.max(this.maxMapCount, mapCount);
234
+ material.copy(new THREE.PointsMaterial(properties));
235
+ material.needsUpdate = true;
236
+ }
237
+ }
238
+ }
239
+
240
+ public assignEnvironmentMap(e: THREE.CubeTexture | THREE.Texture | null, type: ENVIRONMENT_MAP_TYPE) {
241
+ this._envMap = e;
242
+ this._envMapType = type;
243
+ for (const cacheKey in this._materialCache) {
244
+ if ((this._materialCache[cacheKey].material instanceof THREE.MeshPhysicalMaterial || this._materialCache[cacheKey].material instanceof THREE.MeshStandardMaterial || this._materialCache[cacheKey].material instanceof THREE.MeshBasicMaterial)) {
245
+ const material: ThreeJsMeshMaterialTypes = <ThreeJsMeshMaterialTypes>this._materialCache[cacheKey].material;
246
+ if (this._materialCache[cacheKey].materialData &&
247
+ (
248
+ this._materialCache[cacheKey].materialData instanceof MaterialStandardData ||
249
+ this._materialCache[cacheKey].materialData instanceof MaterialGemData ||
250
+ this._materialCache[cacheKey].materialData instanceof MaterialSpecularGlossinessData ||
251
+ this._materialCache[cacheKey].materialData instanceof MaterialUnlitData
252
+ ) &&
253
+ (<MaterialDataMeshTypes>this._materialCache[cacheKey].materialData).envMap !== undefined
254
+ ) continue;
255
+
256
+ if (this._materialCache[cacheKey].materialData instanceof MaterialUnlitData && this._renderingEngine.environmentMapForUnlitMaterials === false) return;
257
+
258
+ material.envMap = e;
259
+ material.needsUpdate = true;
260
+ for (const d in material.defines) {
261
+ if (d.startsWith('ENVMAP_TYPE_'))
262
+ delete material.defines[d];
263
+ }
264
+ if (material.defines)
265
+ material.defines['ENVMAP_TYPE_' + this._envMapType.toUpperCase()] = '';
266
+
267
+ this.assignEnvironmentMapRotation(this._renderingEngine.environmentMapRotation);
268
+ }
269
+ }
270
+ }
271
+
272
+ public assignEnvironmentMapForUnlitMaterials(toggle: boolean) {
273
+ for (const cacheKey in this._materialCache) {
274
+ if (this._materialCache[cacheKey].material instanceof THREE.MeshBasicMaterial) {
275
+ const material: THREE.MeshBasicMaterial = <THREE.MeshBasicMaterial>this._materialCache[cacheKey].material;
276
+ if (this._materialCache[cacheKey].materialData &&
277
+ this._materialCache[cacheKey].materialData instanceof MaterialUnlitData &&
278
+ (<MaterialUnlitData>this._materialCache[cacheKey].materialData).envMap !== undefined
279
+ ) continue;
280
+
281
+ if (toggle) {
282
+ material.envMap = this._envMap;
283
+ material.needsUpdate = true;
284
+ for (const d in material.defines) {
285
+ if (d.startsWith('ENVMAP_TYPE_'))
286
+ delete material.defines[d];
287
+ }
288
+ if (material.defines)
289
+ material.defines['ENVMAP_TYPE_' + this._envMapType.toUpperCase()] = '';
290
+ } else {
291
+ material.envMap = null;
292
+ material.needsUpdate = true;
293
+ }
294
+ }
295
+ }
296
+ }
297
+
298
+ public assignEnvironmentMapIntensity(value: number) {
299
+ this._envMapIntensity = value;
300
+ for (const cacheKey in this._materialCache) {
301
+ if ((this._materialCache[cacheKey].material instanceof THREE.MeshPhysicalMaterial || this._materialCache[cacheKey].material instanceof THREE.MeshStandardMaterial)) {
302
+ const material: THREE.MeshPhysicalMaterial | THREE.MeshStandardMaterial = <THREE.MeshPhysicalMaterial | THREE.MeshStandardMaterial>this._materialCache[cacheKey].material;
303
+ if (this._materialCache[cacheKey].materialData &&
304
+ (
305
+ this._materialCache[cacheKey].materialData instanceof MaterialStandardData ||
306
+ this._materialCache[cacheKey].materialData instanceof MaterialGemData ||
307
+ this._materialCache[cacheKey].materialData instanceof MaterialSpecularGlossinessData ||
308
+ this._materialCache[cacheKey].materialData instanceof MaterialUnlitData
309
+ ) &&
310
+ (<MaterialDataMeshTypes>this._materialCache[cacheKey].materialData).envMap !== undefined
311
+ ) continue;
312
+
313
+ material.envMapIntensity = value;
314
+ material.needsUpdate = true;
315
+ }
316
+ }
317
+ }
318
+
319
+ public assignEnvironmentMapRotation(value: quat) {
320
+ // we switch the y and z axis to match the three.js coordinate system
321
+ const rotationMatrix = new THREE.Matrix4().fromArray(mat4.fromQuat(mat4.create(), quat.fromValues(value[0], value[2], -value[1], value[3]))).transpose();
322
+ this._environmentMapRotationEuler = new THREE.Euler().setFromRotationMatrix(rotationMatrix);
323
+ this._renderingEngine.scene.backgroundRotation = this._environmentMapRotationEuler;
324
+
325
+ for (const cacheKey in this._materialCache) {
326
+ if ((this._materialCache[cacheKey].material instanceof THREE.MeshPhysicalMaterial || this._materialCache[cacheKey].material instanceof THREE.MeshStandardMaterial)) {
327
+ const material: THREE.MeshPhysicalMaterial | THREE.MeshStandardMaterial = <THREE.MeshPhysicalMaterial | THREE.MeshStandardMaterial>this._materialCache[cacheKey].material;
328
+ if (this._materialCache[cacheKey].materialData &&
329
+ (
330
+ this._materialCache[cacheKey].materialData instanceof MaterialStandardData ||
331
+ this._materialCache[cacheKey].materialData instanceof MaterialGemData ||
332
+ this._materialCache[cacheKey].materialData instanceof MaterialSpecularGlossinessData ||
333
+ this._materialCache[cacheKey].materialData instanceof MaterialUnlitData
334
+ ) &&
335
+ (<MaterialStandardData | MaterialGemData | MaterialSpecularGlossinessData | MaterialUnlitData>this._materialCache[cacheKey].materialData).envMap !== undefined
336
+ ) continue;
337
+
338
+ material.envMapRotation = this._environmentMapRotationEuler;
339
+ material.needsUpdate = true;
340
+ }
341
+ }
342
+ }
343
+
344
+ public assignPointSize(p: number) {
345
+ const height = this._renderingEngine.renderer ? this._renderingEngine.renderer.getSize(new THREE.Vector2()).y : 1080;
346
+ if (height === this._height && p * (this._height / 1080) === this._pointSize) return;
347
+ this._height = height;
348
+ this._pointSize = p * (this._height / 1080);
349
+
350
+ for (const cacheKey in this._materialCache) {
351
+ if (this._materialCache[cacheKey].material instanceof MultiPointsMaterial) {
352
+ const material: MultiPointsMaterial = <MultiPointsMaterial>this._materialCache[cacheKey].material;
353
+
354
+ if (this._materialCache[cacheKey].material.userData.customPointSize_0Enabled && this._materialCache[cacheKey].material.userData.customPointSize_0Enabled === true) {
355
+ material.size_0 = this._pointSize * this._materialCache[cacheKey].material.userData.customPointSize_0;
356
+ material.needsUpdate = true;
357
+ } else {
358
+ material.size_0 = this._pointSize;
359
+ material.needsUpdate = true;
360
+ }
361
+
362
+ if (this._materialCache[cacheKey].material.userData.customPointSize_1Enabled && this._materialCache[cacheKey].material.userData.customPointSize_1Enabled === true) {
363
+ material.size_1 = this._pointSize * this._materialCache[cacheKey].material.userData.customPointSize_1;
364
+ material.needsUpdate = true;
365
+ } else {
366
+ material.size_1 = this._pointSize;
367
+ material.needsUpdate = true;
368
+ }
369
+
370
+ if (this._materialCache[cacheKey].material.userData.customPointSize_2Enabled && this._materialCache[cacheKey].material.userData.customPointSize_2Enabled === true) {
371
+ material.size_2 = this._pointSize * this._materialCache[cacheKey].material.userData.customPointSize_2;
372
+ material.needsUpdate = true;
373
+ } else {
374
+ material.size_2 = this._pointSize;
375
+ material.needsUpdate = true;
376
+ }
377
+
378
+ if (this._materialCache[cacheKey].material.userData.customPointSize_3Enabled && this._materialCache[cacheKey].material.userData.customPointSize_3Enabled === true) {
379
+ material.size_3 = this._pointSize * this._materialCache[cacheKey].material.userData.customPointSize_3;
380
+ material.needsUpdate = true;
381
+ } else {
382
+ material.size_3 = this._pointSize;
383
+ material.needsUpdate = true;
384
+ }
385
+
386
+ if (this._materialCache[cacheKey].material.userData.customPointSize_4Enabled && this._materialCache[cacheKey].material.userData.customPointSize_4Enabled === true) {
387
+ material.size_4 = this._pointSize * this._materialCache[cacheKey].material.userData.customPointSize_4;
388
+ material.needsUpdate = true;
389
+ } else {
390
+ material.size_4 = this._pointSize;
391
+ material.needsUpdate = true;
392
+ }
393
+
394
+ if (this._materialCache[cacheKey].material.userData.customPointSize_5Enabled && this._materialCache[cacheKey].material.userData.customPointSize_5Enabled === true) {
395
+ material.size_5 = this._pointSize * this._materialCache[cacheKey].material.userData.customPointSize_5;
396
+ material.needsUpdate = true;
397
+ } else {
398
+ material.size_5 = this._pointSize;
399
+ material.needsUpdate = true;
400
+ }
401
+
402
+ if (this._materialCache[cacheKey].material.userData.customPointSize_6Enabled && this._materialCache[cacheKey].material.userData.customPointSize_6Enabled === true) {
403
+ material.size_6 = this._pointSize * this._materialCache[cacheKey].material.userData.customPointSize_6;
404
+ material.needsUpdate = true;
405
+ } else {
406
+ material.size_6 = this._pointSize;
407
+ material.needsUpdate = true;
408
+ }
409
+
410
+ if (this._materialCache[cacheKey].material.userData.customPointSize_7Enabled && this._materialCache[cacheKey].material.userData.customPointSize_7Enabled === true) {
411
+ material.size_7 = this._pointSize * this._materialCache[cacheKey].material.userData.customPointSize_7;
412
+ material.needsUpdate = true;
413
+ } else {
414
+ material.size_7 = this._pointSize;
415
+ material.needsUpdate = true;
416
+ }
417
+
418
+ } else if (this._materialCache[cacheKey].material instanceof THREE.PointsMaterial) {
419
+ const material: THREE.PointsMaterial = <THREE.PointsMaterial>this._materialCache[cacheKey].material;
420
+
421
+ if (this._materialCache[cacheKey].material.userData.customPointSizeEnabled && this._materialCache[cacheKey].material.userData.customPointSizeEnabled === true) {
422
+ material.size = this._pointSize * this._materialCache[cacheKey].material.userData.customPointSize;
423
+ material.needsUpdate = true;
424
+ } else {
425
+ material.size = this._pointSize;
426
+ material.needsUpdate = true;
427
+ }
428
+ }
429
+ }
430
+ }
431
+
432
+ public cacheSize() {
433
+ return Object.entries(this._materialCache).length;
434
+ }
435
+
436
+ public createMaterial(
437
+ type: MATERIAL_TYPE,
438
+ incomingData: IMaterialAbstractData | GeometryData,
439
+ materialData: IMaterialAbstractData | null,
440
+ materialSettings?: MaterialSettings
441
+ ) {
442
+ const { properties, mapCount } = this.getMaterialProperties(materialData, type, materialSettings);
443
+ this.maxMapCount = Math.max(this.maxMapCount, mapCount);
444
+
445
+ let material: ThreeJsMaterialTypes;
446
+ if (type === MATERIAL_TYPE.POINT) {
447
+ if (materialData instanceof MaterialMultiPointData) {
448
+ material = new MultiPointsMaterial(properties);
449
+ } else {
450
+ material = new THREE.PointsMaterial(properties);
451
+ }
452
+ } else if (type === MATERIAL_TYPE.LINE) {
453
+ material = new THREE.LineBasicMaterial(properties as THREE.LineBasicMaterialParameters);
454
+ } else {
455
+ if (materialData instanceof MaterialUnlitData) {
456
+ material = new THREE.MeshBasicMaterial(properties);
457
+ } else {
458
+ if (materialData instanceof MaterialShadowData) {
459
+ material = new THREE.ShadowMaterial({ opacity: properties.opacity, color: properties.color });
460
+ } else if (materialData instanceof MaterialSpecularGlossinessData) {
461
+ material = new SpecularGlossinessMaterial(properties);
462
+ } else if (materialData instanceof MaterialGemData) {
463
+ material = new GemMaterial(properties);
464
+ } else {
465
+ material = new THREE.MeshPhysicalMaterial(properties);
466
+ }
467
+ const before = material.onBeforeCompile;
468
+ material.onBeforeCompile = (shader: THREE.WebGLProgramParametersWithUniforms, renderer: THREE.WebGLRenderer) => {
469
+ before(shader, renderer);
470
+ shader.uniforms.lightSizeUV = { value: this._lightSizeUV };
471
+ shader.uniforms.blending = { value: this._blending };
472
+ material.userData.shader = shader;
473
+ };
474
+
475
+ if (material instanceof SpecularGlossinessMaterial || material instanceof THREE.MeshPhysicalMaterial) {
476
+ material.defines['ENVMAP_TYPE_' + this._envMapType.toUpperCase()] = '';
477
+
478
+ if (materialSettings && materialSettings.useVertexTangents) material.normalScale.y *= - 1;
479
+ if (materialSettings && materialSettings.useVertexTangents && material instanceof THREE.MeshPhysicalMaterial) material.clearcoatNormalScale.y *= - 1;
480
+ if (materialSettings && materialSettings.useFlatShading) material.flatShading = true;
481
+ }
482
+ }
483
+ }
484
+
485
+ if (materialSettings && materialSettings.useVertexColors) material.vertexColors = true;
486
+
487
+ if (materialData instanceof MaterialStandardData || materialData instanceof MaterialGemData || materialData instanceof MaterialSpecularGlossinessData || materialData instanceof MaterialUnlitData) {
488
+ if (materialData.envMap !== undefined) {
489
+ const envMapInput = (<MaterialDataMeshTypes>materialData).envMap;
490
+ if (envMapInput !== undefined) {
491
+ const envMapResult = this._renderingEngine.environmentMapLoader.loadEnvMap(envMapInput);
492
+ envMapResult.map.then(envMap => {
493
+ if (material instanceof THREE.MeshBasicMaterial && this._renderingEngine.environmentMapForUnlitMaterials === false) return;
494
+
495
+ (<ThreeJsMeshMaterialTypes>material).envMap = envMap;
496
+
497
+ const envMapType = (<ThreeJsMeshMaterialTypes>material).envMap instanceof THREE.CubeTexture ? ENVIRONMENT_MAP_TYPE.LDR : ENVIRONMENT_MAP_TYPE.HDR;
498
+ for (const d in material.defines) {
499
+ if (d.startsWith('ENVMAP_TYPE_'))
500
+ delete material.defines[d];
501
+ }
502
+ if (material.defines)
503
+ material.defines['ENVMAP_TYPE_' + envMapType.toUpperCase()] = '';
504
+
505
+ material.needsUpdate = true;
506
+ });
507
+ }
508
+ }
509
+ }
510
+
511
+ if (materialData)
512
+ materialData.convertedObject[this._renderingEngine.id] = material;
513
+
514
+ material.needsUpdate = true;
515
+
516
+ if (material.userData) {
517
+ material.userData.SDid = incomingData.id;
518
+ material.userData.SDversion = incomingData.version;
519
+ } else {
520
+ material.userData = {
521
+ SDid: incomingData.id,
522
+ SDversion: incomingData.version
523
+ };
524
+ }
525
+
526
+ return material;
527
+ }
528
+
529
+ public emptyMaterialCache() {
530
+ this._materialCache = {};
531
+ }
532
+
533
+ public getMaterialProperties(
534
+ materialData: IMaterialAbstractData | null,
535
+ type: MATERIAL_TYPE,
536
+ materialSettings?: MaterialSettings
537
+ ): {
538
+ properties: ThreeJsMaterialParameterTypes,
539
+ mapCount: number
540
+ } {
541
+ const generalProperties: ThreeJsMaterialParameterTypes = {};
542
+
543
+ let mapCount = 0;
544
+
545
+ // if no MaterialStandardData is provided, we return our default
546
+ if (!materialData) {
547
+ if (type === MATERIAL_TYPE.POINT) {
548
+ return this.getMaterialProperties(this._defaultPointMaterialData, type, materialSettings);
549
+ } else if (type === MATERIAL_TYPE.LINE) {
550
+ return this.getMaterialProperties(this._defaultLineMaterialData, type, materialSettings);
551
+ } else {
552
+ if (materialSettings !== undefined && materialSettings.useVertexColors) {
553
+ const currentDefaultMaterialColor = this._defaultMaterialData.color;
554
+ this._defaultMaterialData.color = '#d3d3d3';
555
+ const properties = this.getMaterialProperties(this._defaultMaterialData, type, materialSettings);
556
+ this._defaultMaterialData.color = currentDefaultMaterialColor;
557
+ return properties;
558
+ } else {
559
+ return this.getMaterialProperties(this._defaultMaterialData, type, materialSettings);
560
+ }
561
+ }
562
+ }
563
+
564
+ /**
565
+ * We know evaluate properties that can be applied to all materials
566
+ */
567
+
568
+ generalProperties.alphaTest = materialData.alphaCutoff;
569
+
570
+ if (materialData.opacity !== undefined) {
571
+ generalProperties.opacity = materialData.opacity;
572
+ generalProperties.transparent = generalProperties.opacity < 1;
573
+ }
574
+
575
+ if (materialData.alphaMode === MATERIAL_ALPHA.BLEND) {
576
+ generalProperties.transparent = true;
577
+ generalProperties.depthWrite = false;
578
+ } else if (!generalProperties.transparent) {
579
+ generalProperties.transparent = false;
580
+ }
581
+
582
+ if (materialData.depthTest !== undefined) {
583
+ generalProperties.depthTest = materialData.depthTest;
584
+ }
585
+
586
+ if (materialData.depthWrite !== undefined) {
587
+ generalProperties.depthWrite = materialData.depthWrite;
588
+ }
589
+
590
+ if (materialData.transparent !== undefined) {
591
+ generalProperties.transparent = materialData.transparent;
592
+ }
593
+
594
+ if (materialData.color !== undefined)
595
+ generalProperties.color = this._renderingEngine.createThreeJsColor(materialData.color);
596
+
597
+ if (materialData.color === undefined && materialData.map !== undefined && materialData.map.color !== undefined)
598
+ generalProperties.color = this._renderingEngine.createThreeJsColor(materialData.map.color);
599
+
600
+ if (materialData.color === undefined && materialData.map !== undefined && materialData.map.color === undefined && !(materialSettings !== undefined && materialSettings.useVertexColors))
601
+ generalProperties.color = this._renderingEngine.createThreeJsColor(this._renderingEngine.defaultMaterialColor);
602
+
603
+ if ((materialSettings !== undefined && materialSettings.useVertexColors) && (materialData.color === this._converter.toHexColor(this._renderingEngine.defaultMaterialColor) || materialData.color + 'ff' === this._converter.toHexColor(this._renderingEngine.defaultMaterialColor) || materialData.color === this._renderingEngine.defaultMaterialColor || materialData.color === this._renderingEngine.defaultMaterialColor + 'ff' || materialData.color === undefined))
604
+ generalProperties.color = this._renderingEngine.createThreeJsColor('#d3d3d3');
605
+
606
+ if (materialData.side !== undefined)
607
+ generalProperties.side = materialData.side === MATERIAL_SIDE.BACK ? THREE.BackSide : materialData.side === MATERIAL_SIDE.FRONT ? THREE.FrontSide : THREE.DoubleSide;
608
+
609
+ /**
610
+ *
611
+ * First exit, lines ans points
612
+ *
613
+ */
614
+
615
+ if (type === MATERIAL_TYPE.POINT) {
616
+ if (materialData instanceof MaterialPointData) {
617
+ const pointMaterialProperties: THREE.PointsMaterialParameters = generalProperties;
618
+
619
+ pointMaterialProperties.size = materialData.size !== undefined ? materialData.size : this._pointSize;
620
+ pointMaterialProperties.userData = {
621
+ customPointSizeEnabled: materialData.size !== undefined,
622
+ customPointSize: materialData.size
623
+ };
624
+ pointMaterialProperties.sizeAttenuation = materialData.sizeAttenuation !== undefined ? materialData.sizeAttenuation : true;
625
+
626
+ if (materialData.map !== undefined) {
627
+ pointMaterialProperties.map = this.createTexture(materialData.map);
628
+ mapCount++;
629
+ }
630
+
631
+ if (materialData.alphaMap !== undefined) {
632
+ pointMaterialProperties.alphaMap = this.createTexture(materialData.alphaMap);
633
+ pointMaterialProperties.transparent = true;
634
+ pointMaterialProperties.depthWrite = false;
635
+ mapCount++;
636
+ }
637
+
638
+ } else if (materialData instanceof MaterialMultiPointData) {
639
+ const multiPointMaterialProperties: MultiPointsMaterialParameters = generalProperties;
640
+
641
+ if (materialData.materialIndexDataMap) {
642
+ multiPointMaterialProperties.materialIndexDataTexture = this.createTexture(materialData.materialIndexDataMap) as THREE.DataTexture;
643
+ } else {
644
+ multiPointMaterialProperties.materialIndexDataTexture =
645
+ new THREE.DataTexture(
646
+ new Uint8Array(multiPointMaterialProperties.materialIndexDataTextureSize || 1024),
647
+ multiPointMaterialProperties.materialIndexDataTextureSize || 1024,
648
+ 1,
649
+ THREE.RedIntegerFormat,
650
+ THREE.UnsignedIntType
651
+ );
652
+ multiPointMaterialProperties.materialIndexDataTexture.internalFormat = 'R32UI';
653
+ }
654
+
655
+ multiPointMaterialProperties.size_0 = materialData.size_0 !== undefined ? materialData.size_0 : this._pointSize;
656
+ multiPointMaterialProperties.size_1 = materialData.size_1 !== undefined ? materialData.size_1 : this._pointSize;
657
+ multiPointMaterialProperties.size_2 = materialData.size_2 !== undefined ? materialData.size_2 : this._pointSize;
658
+ multiPointMaterialProperties.size_3 = materialData.size_3 !== undefined ? materialData.size_3 : this._pointSize;
659
+ multiPointMaterialProperties.size_4 = materialData.size_4 !== undefined ? materialData.size_4 : this._pointSize;
660
+ multiPointMaterialProperties.size_5 = materialData.size_5 !== undefined ? materialData.size_5 : this._pointSize;
661
+ multiPointMaterialProperties.size_6 = materialData.size_6 !== undefined ? materialData.size_6 : this._pointSize;
662
+ multiPointMaterialProperties.size_7 = materialData.size_7 !== undefined ? materialData.size_7 : this._pointSize;
663
+
664
+ multiPointMaterialProperties.userData = {
665
+ customPointSize_0Enabled: materialData.size_0 !== undefined,
666
+ customPointSize_1Enabled: materialData.size_1 !== undefined,
667
+ customPointSize_2Enabled: materialData.size_2 !== undefined,
668
+ customPointSize_3Enabled: materialData.size_3 !== undefined,
669
+ customPointSize_4Enabled: materialData.size_4 !== undefined,
670
+ customPointSize_5Enabled: materialData.size_5 !== undefined,
671
+ customPointSize_6Enabled: materialData.size_6 !== undefined,
672
+ customPointSize_7Enabled: materialData.size_7 !== undefined,
673
+ customPointSize_0: materialData.size_0,
674
+ customPointSize_1: materialData.size_1,
675
+ customPointSize_2: materialData.size_2,
676
+ customPointSize_3: materialData.size_3,
677
+ customPointSize_4: materialData.size_4,
678
+ customPointSize_5: materialData.size_5,
679
+ customPointSize_6: materialData.size_6,
680
+ customPointSize_7: materialData.size_7
681
+ };
682
+
683
+ multiPointMaterialProperties.sizeAttenuation_0 = materialData.sizeAttenuation_0 !== undefined ? materialData.sizeAttenuation_0 : false;
684
+ multiPointMaterialProperties.sizeAttenuation_1 = materialData.sizeAttenuation_1 !== undefined ? materialData.sizeAttenuation_1 : false;
685
+ multiPointMaterialProperties.sizeAttenuation_2 = materialData.sizeAttenuation_2 !== undefined ? materialData.sizeAttenuation_2 : false;
686
+ multiPointMaterialProperties.sizeAttenuation_3 = materialData.sizeAttenuation_3 !== undefined ? materialData.sizeAttenuation_3 : false;
687
+ multiPointMaterialProperties.sizeAttenuation_4 = materialData.sizeAttenuation_4 !== undefined ? materialData.sizeAttenuation_4 : false;
688
+ multiPointMaterialProperties.sizeAttenuation_5 = materialData.sizeAttenuation_5 !== undefined ? materialData.sizeAttenuation_5 : false;
689
+ multiPointMaterialProperties.sizeAttenuation_6 = materialData.sizeAttenuation_6 !== undefined ? materialData.sizeAttenuation_6 : false;
690
+ multiPointMaterialProperties.sizeAttenuation_7 = materialData.sizeAttenuation_7 !== undefined ? materialData.sizeAttenuation_7 : false;
691
+
692
+ if (materialData.map_0 !== undefined) {
693
+ multiPointMaterialProperties.map_0 = this.createTexture(materialData.map_0);
694
+ multiPointMaterialProperties.map = multiPointMaterialProperties.map_0;
695
+ mapCount++;
696
+ }
697
+
698
+ if (materialData.map_1 !== undefined) {
699
+ multiPointMaterialProperties.map_1 = this.createTexture(materialData.map_1);
700
+ multiPointMaterialProperties.map = multiPointMaterialProperties.map_0;
701
+ mapCount++;
702
+ }
703
+
704
+ if (materialData.map_2 !== undefined) {
705
+ multiPointMaterialProperties.map_2 = this.createTexture(materialData.map_2);
706
+ multiPointMaterialProperties.map = multiPointMaterialProperties.map_0;
707
+ mapCount++;
708
+ }
709
+
710
+ if (materialData.map_3 !== undefined) {
711
+ multiPointMaterialProperties.map_3 = this.createTexture(materialData.map_3);
712
+ multiPointMaterialProperties.map = multiPointMaterialProperties.map_0;
713
+ mapCount++;
714
+ }
715
+
716
+ if (materialData.map_4 !== undefined) {
717
+ multiPointMaterialProperties.map_4 = this.createTexture(materialData.map_4);
718
+ multiPointMaterialProperties.map = multiPointMaterialProperties.map_0;
719
+ mapCount++;
720
+ }
721
+
722
+ if (materialData.map_5 !== undefined) {
723
+ multiPointMaterialProperties.map_5 = this.createTexture(materialData.map_5);
724
+ multiPointMaterialProperties.map = multiPointMaterialProperties.map_0;
725
+ mapCount++;
726
+ }
727
+
728
+ if (materialData.map_6 !== undefined) {
729
+ multiPointMaterialProperties.map_6 = this.createTexture(materialData.map_6);
730
+ multiPointMaterialProperties.map = multiPointMaterialProperties.map_0;
731
+ mapCount++;
732
+ }
733
+
734
+ if (materialData.map_7 !== undefined) {
735
+ multiPointMaterialProperties.map_7 = this.createTexture(materialData.map_7);
736
+ multiPointMaterialProperties.map = multiPointMaterialProperties.map_0;
737
+ mapCount++;
738
+ }
739
+
740
+ if (materialData.alphaMap_0 !== undefined) {
741
+ multiPointMaterialProperties.alphaMap_0 = this.createTexture(materialData.alphaMap_0);
742
+ multiPointMaterialProperties.alphaMap = multiPointMaterialProperties.alphaMap_0;
743
+ multiPointMaterialProperties.transparent = true;
744
+ multiPointMaterialProperties.depthWrite = false;
745
+ mapCount++;
746
+ }
747
+
748
+ if (materialData.alphaMap_1 !== undefined) {
749
+ multiPointMaterialProperties.alphaMap_1 = this.createTexture(materialData.alphaMap_1);
750
+ multiPointMaterialProperties.alphaMap = multiPointMaterialProperties.alphaMap_0;
751
+ multiPointMaterialProperties.transparent = true;
752
+ multiPointMaterialProperties.depthWrite = false;
753
+ mapCount++;
754
+ }
755
+
756
+ if (materialData.alphaMap_2 !== undefined) {
757
+ multiPointMaterialProperties.alphaMap_2 = this.createTexture(materialData.alphaMap_2);
758
+ multiPointMaterialProperties.alphaMap = multiPointMaterialProperties.alphaMap_0;
759
+ multiPointMaterialProperties.transparent = true;
760
+ multiPointMaterialProperties.depthWrite = false;
761
+ mapCount++;
762
+ }
763
+
764
+ if (materialData.alphaMap_3 !== undefined) {
765
+ multiPointMaterialProperties.alphaMap_3 = this.createTexture(materialData.alphaMap_3);
766
+ multiPointMaterialProperties.alphaMap = multiPointMaterialProperties.alphaMap_0;
767
+ multiPointMaterialProperties.transparent = true;
768
+ multiPointMaterialProperties.depthWrite = false;
769
+ mapCount++;
770
+ }
771
+
772
+ if (materialData.alphaMap_4 !== undefined) {
773
+ multiPointMaterialProperties.alphaMap_4 = this.createTexture(materialData.alphaMap_4);
774
+ multiPointMaterialProperties.alphaMap = multiPointMaterialProperties.alphaMap_0;
775
+ multiPointMaterialProperties.transparent = true;
776
+ multiPointMaterialProperties.depthWrite = false;
777
+ mapCount++;
778
+ }
779
+
780
+ if (materialData.alphaMap_5 !== undefined) {
781
+ multiPointMaterialProperties.alphaMap_5 = this.createTexture(materialData.alphaMap_5);
782
+ multiPointMaterialProperties.alphaMap = multiPointMaterialProperties.alphaMap_0;
783
+ multiPointMaterialProperties.transparent = true;
784
+ multiPointMaterialProperties.depthWrite = false;
785
+ mapCount++;
786
+ }
787
+
788
+ if (materialData.alphaMap_6 !== undefined) {
789
+ multiPointMaterialProperties.alphaMap_6 = this.createTexture(materialData.alphaMap_6);
790
+ multiPointMaterialProperties.alphaMap = multiPointMaterialProperties.alphaMap_0;
791
+ multiPointMaterialProperties.transparent = true;
792
+ multiPointMaterialProperties.depthWrite = false;
793
+ mapCount++;
794
+ }
795
+
796
+ if (materialData.alphaMap_7 !== undefined) {
797
+ multiPointMaterialProperties.alphaMap_7 = this.createTexture(materialData.alphaMap_7);
798
+ multiPointMaterialProperties.alphaMap = multiPointMaterialProperties.alphaMap_0;
799
+ multiPointMaterialProperties.transparent = true;
800
+ multiPointMaterialProperties.depthWrite = false;
801
+ mapCount++;
802
+ }
803
+
804
+ if (materialData.color_0 !== undefined) {
805
+ multiPointMaterialProperties.color_0 = this._renderingEngine.createThreeJsColor(materialData.color_0);
806
+ }
807
+
808
+ if (materialData.color_1 !== undefined) {
809
+ multiPointMaterialProperties.color_1 = this._renderingEngine.createThreeJsColor(materialData.color_1);
810
+ }
811
+
812
+ if (materialData.color_2 !== undefined) {
813
+ multiPointMaterialProperties.color_2 = this._renderingEngine.createThreeJsColor(materialData.color_2);
814
+ }
815
+
816
+ if (materialData.color_3 !== undefined) {
817
+ multiPointMaterialProperties.color_3 = this._renderingEngine.createThreeJsColor(materialData.color_3);
818
+ }
819
+
820
+ if (materialData.color_4 !== undefined) {
821
+ multiPointMaterialProperties.color_4 = this._renderingEngine.createThreeJsColor(materialData.color_4);
822
+ }
823
+
824
+ if (materialData.color_5 !== undefined) {
825
+ multiPointMaterialProperties.color_5 = this._renderingEngine.createThreeJsColor(materialData.color_5);
826
+ }
827
+
828
+ if (materialData.color_6 !== undefined) {
829
+ multiPointMaterialProperties.color_6 = this._renderingEngine.createThreeJsColor(materialData.color_6);
830
+ }
831
+
832
+ if (materialData.color_7 !== undefined) {
833
+ multiPointMaterialProperties.color_7 = this._renderingEngine.createThreeJsColor(materialData.color_7);
834
+ }
835
+
836
+ } else {
837
+ const pointMaterialProperties: THREE.PointsMaterialParameters = generalProperties;
838
+ pointMaterialProperties.size = this._pointSize;
839
+ }
840
+ return { properties: generalProperties, mapCount };
841
+ } else if (type === MATERIAL_TYPE.LINE) {
842
+ return { properties: generalProperties, mapCount };
843
+ }
844
+
845
+ /**
846
+ *
847
+ * Second exit, the shadow material
848
+ *
849
+ */
850
+
851
+ if (materialData instanceof MaterialShadowData)
852
+ return { properties: generalProperties, mapCount };
853
+
854
+ /**
855
+ * We know evaluate properties that can be applied to basic mesh materials (and the ones extending from them)
856
+ */
857
+
858
+ const basicProperties: MeshUnlitMaterialParameters | THREE.MeshPhysicalMaterialParameters | SpecularGlossinessMaterialParameters = generalProperties;
859
+
860
+ if (materialData.alphaMap !== undefined) {
861
+ basicProperties.alphaMap = this.createTexture(materialData.alphaMap);
862
+ basicProperties.transparent = true;
863
+ basicProperties.depthWrite = false;
864
+ mapCount++;
865
+ }
866
+
867
+ if (materialData.aoMap !== undefined) {
868
+ basicProperties.aoMap = this.createTexture(materialData.aoMap);
869
+ mapCount++;
870
+ }
871
+
872
+ if (materialData.aoMapIntensity !== undefined) {
873
+ basicProperties.aoMapIntensity = materialData.aoMapIntensity;
874
+ }
875
+
876
+ if (materialData.map !== undefined) {
877
+ basicProperties.map = this.createTexture(materialData.map);
878
+ basicProperties.map.colorSpace = this._textureEncoding;
879
+ mapCount++;
880
+ }
881
+
882
+ /**
883
+ *
884
+ * Third exit, the unlit material
885
+ *
886
+ */
887
+
888
+ if (materialData instanceof MaterialUnlitData)
889
+ return { properties: basicProperties, mapCount };
890
+
891
+ /**
892
+ * We know evaluate properties that can be applied to MeshPhysicalMaterials, SpecularGlossinessMaterials and GemMaterialParameters
893
+ */
894
+
895
+ const standardProperties: THREE.MeshPhysicalMaterialParameters | SpecularGlossinessMaterialParameters | GemMaterialParameters = basicProperties;
896
+
897
+ if (materialData.shading !== undefined)
898
+ standardProperties.flatShading = materialData.shading !== 'smooth';
899
+
900
+ if (materialData.bumpMap !== undefined) {
901
+ standardProperties.bumpMap = this.createTexture(materialData.bumpMap);
902
+ mapCount++;
903
+ }
904
+
905
+ standardProperties.bumpScale = materialData.bumpScale;
906
+
907
+ if (materialData.emissiveness !== undefined)
908
+ standardProperties.emissive = this._renderingEngine.createThreeJsColor(materialData.emissiveness);
909
+
910
+ if (materialData.emissiveMap !== undefined) {
911
+ standardProperties.emissiveMap = this.createTexture(materialData.emissiveMap);
912
+ standardProperties.emissiveMap.colorSpace = this._textureEncoding;
913
+ mapCount++;
914
+ }
915
+
916
+ standardProperties.envMap = this._envMap;
917
+ standardProperties.envMapIntensity = this._envMapIntensity;
918
+ standardProperties.envMapRotation = this._environmentMapRotationEuler;
919
+
920
+ if (materialData.normalMap !== undefined) {
921
+ standardProperties.normalMap = this.createTexture(materialData.normalMap);
922
+ mapCount++;
923
+ }
924
+
925
+ if (materialData.normalScale !== undefined)
926
+ standardProperties.normalScale = new THREE.Vector2(materialData.normalScale, -materialData.normalScale);
927
+
928
+ /**
929
+ *
930
+ * Fourth exit, the specular-glossiness material
931
+ *
932
+ */
933
+ if (materialData instanceof MaterialSpecularGlossinessData) {
934
+ const specularGlossinessProperties: SpecularGlossinessMaterialParameters = standardProperties;
935
+
936
+ specularGlossinessProperties.specular = this._renderingEngine.createThreeJsColor(materialData.specular);
937
+ specularGlossinessProperties.glossiness = materialData.glossiness;
938
+
939
+ if (materialData.specularGlossinessMap !== undefined) {
940
+ specularGlossinessProperties.specularMap2 = this.createTexture(materialData.specularGlossinessMap);
941
+ specularGlossinessProperties.specularMap2.colorSpace = THREE.SRGBColorSpace;
942
+ specularGlossinessProperties.glossinessMap = specularGlossinessProperties.specularMap2;
943
+ mapCount++;
944
+ } else {
945
+ if (materialData.specularMap !== undefined) {
946
+ specularGlossinessProperties.specularMap2 = this.createTexture(materialData.specularMap);
947
+ specularGlossinessProperties.specularMap2.colorSpace = THREE.SRGBColorSpace;
948
+ mapCount++;
949
+ }
950
+ if (materialData.glossinessMap !== undefined) {
951
+ specularGlossinessProperties.glossinessMap = this.createTexture(materialData.glossinessMap);
952
+ mapCount++;
953
+ }
954
+ }
955
+
956
+ return { properties: specularGlossinessProperties, mapCount };
957
+ }
958
+
959
+ /**
960
+ *
961
+ * Fourth exit, the gem material
962
+ *
963
+ */
964
+ if (materialData instanceof MaterialGemData) {
965
+ const gemProperties: GemMaterialParameters = standardProperties;
966
+
967
+ gemProperties.refractionIndex = materialData.refractionIndex;
968
+
969
+ if (materialData.impurityMap !== undefined) {
970
+ gemProperties.impurityMap = this.createTexture(materialData.impurityMap);
971
+ mapCount++;
972
+ }
973
+
974
+ gemProperties.impurityScale = materialData.impurityScale;
975
+
976
+ if (materialData.colorTransferBegin !== undefined) {
977
+ gemProperties.colorTransferBegin = this._renderingEngine.createThreeJsColor(materialData.colorTransferBegin);
978
+ }
979
+
980
+ if (materialData.colorTransferEnd !== undefined) {
981
+ gemProperties.colorTransferEnd = this._renderingEngine.createThreeJsColor(materialData.colorTransferEnd);
982
+ }
983
+
984
+ gemProperties.center = new THREE.Vector3(materialData.center[0], materialData.center[1], materialData.center[2]);
985
+
986
+ gemProperties.tracingDepth = materialData.tracingDepth;
987
+
988
+ gemProperties.radius = materialData.radius;
989
+
990
+ gemProperties.sphericalNormalMap = <THREE.CubeTexture><unknown>materialData.sphericalNormalMap;
991
+
992
+ gemProperties.gamma = materialData.gamma;
993
+
994
+ gemProperties.contrast = materialData.contrast;
995
+
996
+ gemProperties.brightness = materialData.brightness;
997
+
998
+ gemProperties.dispersion = materialData.dispersion;
999
+
1000
+ gemProperties.tracingOpacity = materialData.tracingOpacity;
1001
+
1002
+ gemProperties.roughness = 0;
1003
+ gemProperties.metalness = 1;
1004
+
1005
+ gemProperties.transparent = true;
1006
+ gemProperties.opacity = 1.0;
1007
+
1008
+ gemProperties.side = THREE.FrontSide;
1009
+
1010
+ return { properties: gemProperties, mapCount };
1011
+ }
1012
+
1013
+ /**
1014
+ *
1015
+ * the final exit, the MeshPhysicalMaterial
1016
+ *
1017
+ */
1018
+ if (materialData instanceof MaterialStandardData) {
1019
+ const meshPhysicalProperties: THREE.MeshPhysicalMaterialParameters = standardProperties;
1020
+
1021
+ meshPhysicalProperties.clearcoat = materialData.clearcoat;
1022
+
1023
+ if (materialData.clearcoatMap !== undefined) {
1024
+ meshPhysicalProperties.clearcoatMap = this.createTexture(materialData.clearcoatMap);
1025
+ mapCount++;
1026
+ }
1027
+
1028
+ if (materialData.clearcoatNormalMap !== undefined) {
1029
+ meshPhysicalProperties.clearcoatNormalMap = this.createTexture(materialData.clearcoatNormalMap);
1030
+ mapCount++;
1031
+ }
1032
+
1033
+ meshPhysicalProperties.clearcoatRoughness = materialData.clearcoatRoughness;
1034
+
1035
+ if (materialData.clearcoatRoughnessMap !== undefined) {
1036
+ meshPhysicalProperties.clearcoatRoughnessMap = this.createTexture(materialData.clearcoatRoughnessMap);
1037
+ mapCount++;
1038
+ }
1039
+
1040
+ if (materialData.displacementMap !== undefined) {
1041
+ meshPhysicalProperties.displacementMap = this.createTexture(materialData.displacementMap);
1042
+ mapCount++;
1043
+ }
1044
+
1045
+ meshPhysicalProperties.displacementScale = materialData.displacementScale;
1046
+
1047
+ meshPhysicalProperties.displacementBias = materialData.displacementBias;
1048
+
1049
+ meshPhysicalProperties.ior = materialData.ior;
1050
+
1051
+ meshPhysicalProperties.transmission = materialData.transmission;
1052
+
1053
+ if (materialData.transmissionMap !== undefined) {
1054
+ meshPhysicalProperties.transmissionMap = this.createTexture(materialData.transmissionMap);
1055
+ mapCount++;
1056
+ }
1057
+
1058
+ (<THREE.MeshPhysicalMaterial>meshPhysicalProperties).thickness = materialData.thickness;
1059
+
1060
+ if (materialData.thicknessMap !== undefined) {
1061
+ (<THREE.MeshPhysicalMaterial>meshPhysicalProperties).thicknessMap = this.createTexture(materialData.thicknessMap);
1062
+ mapCount++;
1063
+ }
1064
+
1065
+ meshPhysicalProperties.attenuationDistance = materialData.attenuationDistance;
1066
+ meshPhysicalProperties.attenuationColor = this._renderingEngine.createThreeJsColor(materialData.attenuationColor);
1067
+
1068
+ meshPhysicalProperties.sheen = materialData.sheen;
1069
+ meshPhysicalProperties.sheenColor = this._renderingEngine.createThreeJsColor(materialData.sheenColor);
1070
+ meshPhysicalProperties.sheenRoughness = materialData.sheenRoughness;
1071
+
1072
+ if (materialData.sheenColorMap !== undefined) {
1073
+ (<THREE.MeshPhysicalMaterial>meshPhysicalProperties).sheenColorMap = this.createTexture(materialData.sheenColorMap);
1074
+ mapCount++;
1075
+ }
1076
+
1077
+ if (materialData.sheenRoughnessMap !== undefined) {
1078
+ (<THREE.MeshPhysicalMaterial>meshPhysicalProperties).sheenRoughnessMap = this.createTexture(materialData.sheenRoughnessMap);
1079
+ mapCount++;
1080
+ }
1081
+
1082
+ meshPhysicalProperties.specularIntensity = materialData.specularIntensity;
1083
+
1084
+ if (materialData.specularIntensityMap !== undefined) {
1085
+ meshPhysicalProperties.specularIntensityMap = this.createTexture(materialData.specularIntensityMap);
1086
+ mapCount++;
1087
+ }
1088
+
1089
+ meshPhysicalProperties.specularColor = this._renderingEngine.createThreeJsColor(materialData.specularColor);
1090
+
1091
+ if (materialData.specularColorMap !== undefined) {
1092
+ meshPhysicalProperties.specularColorMap = this.createTexture(materialData.specularColorMap);
1093
+ mapCount++;
1094
+ }
1095
+
1096
+ meshPhysicalProperties.metalness = materialData.metalness;
1097
+ meshPhysicalProperties.roughness = materialData.roughness;
1098
+
1099
+ if (materialData.metalnessRoughnessMap !== undefined) {
1100
+ meshPhysicalProperties.metalnessMap = this.createTexture(materialData.metalnessRoughnessMap);
1101
+ meshPhysicalProperties.roughnessMap = meshPhysicalProperties.metalnessMap;
1102
+ mapCount++;
1103
+ } else {
1104
+ if (materialData.metalnessMap !== undefined) {
1105
+ meshPhysicalProperties.metalnessMap = this.createTexture(materialData.metalnessMap);
1106
+ mapCount++;
1107
+ }
1108
+ if (materialData.roughnessMap !== undefined) {
1109
+ meshPhysicalProperties.roughnessMap = this.createTexture(materialData.roughnessMap);
1110
+ mapCount++;
1111
+ }
1112
+ }
1113
+ return { properties: meshPhysicalProperties, mapCount };
1114
+ }
1115
+
1116
+ // we should never get here
1117
+ throw new ShapeDiverViewerDataProcessingError('MaterialLoader.getMaterialProperties: No proper material properties were found.');
1118
+ }
1119
+
1120
+ public init(): void { }
1121
+
1122
+ /**
1123
+ * Create a material object with the provided material data.
1124
+ *
1125
+ * @param material the material data
1126
+ * @returns the material object
1127
+ */
1128
+ public load(
1129
+ incomingData: IMaterialAbstractData | GeometryData,
1130
+ materialSettings?: MaterialSettings
1131
+ ): THREE.Material {
1132
+ let materialData: IMaterialAbstractData | null = null;
1133
+ if (!(incomingData instanceof GeometryData))
1134
+ materialData = incomingData;
1135
+
1136
+ // evaluate which type of material properties we are constructing
1137
+ let type: MATERIAL_TYPE;
1138
+ if (materialSettings && materialSettings.mode === 0) {
1139
+ type = MATERIAL_TYPE.POINT;
1140
+ } else if (materialSettings && (materialSettings.mode === 1 || materialSettings.mode === 2 || materialSettings.mode === 3)) {
1141
+ type = MATERIAL_TYPE.LINE;
1142
+ } else {
1143
+ type = MATERIAL_TYPE.MESH;
1144
+ }
1145
+
1146
+ const material = this.createMaterial(type, incomingData, materialData, materialSettings);
1147
+
1148
+ const cacheKey = this.createDataKeyFromMaterial(incomingData, type, materialSettings);
1149
+ if (this._materialCache[cacheKey]) {
1150
+ this._materialCache[cacheKey].material.copy(material);
1151
+ return this._materialCache[cacheKey].material;
1152
+ }
1153
+
1154
+ this._materialCache[cacheKey] = {
1155
+ material,
1156
+ materialData,
1157
+ materialSettings
1158
+ };
1159
+
1160
+ return material;
1161
+ }
1162
+
1163
+ public removeFromMaterialCache(id: string) {
1164
+ for (const cacheKey in this._materialCache) {
1165
+ const decodedCacheKey = atobCustom(cacheKey);
1166
+ if (decodedCacheKey.startsWith(id)) {
1167
+ delete this._materialCache[cacheKey];
1168
+ }
1169
+ }
1170
+ }
1171
+
1172
+ public updateMaterials(): void {
1173
+ for (const cacheKey in this._materialCache)
1174
+ this._materialCache[cacheKey].material.needsUpdate = true;
1175
+ }
1176
+
1177
+ public updateSoftShadow(lightSizeUV: number, blending: number) {
1178
+ this._lightSizeUV = lightSizeUV;
1179
+ this._blending = blending;
1180
+ for (const cacheKey in this._materialCache) {
1181
+ if (this._materialCache[cacheKey].material.userData.shader) {
1182
+ this._materialCache[cacheKey].material.userData.shader.uniforms.lightSizeUV.value = lightSizeUV;
1183
+ this._materialCache[cacheKey].material.userData.shader.uniforms.blending.value = blending;
1184
+ }
1185
+ }
1186
+ }
1187
+
1188
+ // #endregion Public Methods (18)
1189
+
1190
+ // #region Private Methods (4)
1191
+
1192
+ private assignTextureEncoding() {
1193
+ for (const cacheKey in this._materialCache) {
1194
+ if (this._materialCache[cacheKey].material instanceof THREE.MeshPhysicalMaterial || this._materialCache[cacheKey].material instanceof THREE.MeshStandardMaterial) {
1195
+ const material: THREE.MeshPhysicalMaterial | THREE.MeshStandardMaterial = <THREE.MeshPhysicalMaterial | THREE.MeshStandardMaterial>this._materialCache[cacheKey].material;
1196
+ if (material.emissiveMap) {
1197
+ material.emissiveMap!.colorSpace = this._textureEncoding;
1198
+ material.emissiveMap!.needsUpdate = true;
1199
+ }
1200
+ if (material.map) {
1201
+ material.map!.colorSpace = this._textureEncoding;
1202
+ material.map!.needsUpdate = true;
1203
+ }
1204
+ material.needsUpdate = true;
1205
+ }
1206
+ }
1207
+ }
1208
+
1209
+ private createDataKeyFromMap(map: IMapData): string {
1210
+ return btoaCustom(`${(map.image as HTMLImageElement).src}_${map.center}_${map.color}_${map.flipY}_${map.magFilter}_${map.minFilter}_${map.offset}_${map.repeat}_${map.rotation}_${map.texCoord}_${map.wrapS}_${map.wrapT}`);
1211
+ }
1212
+
1213
+ private createDataKeyFromMaterial(data: ITreeNodeData | undefined, type: MATERIAL_TYPE, materialSettings?: MaterialSettings): string {
1214
+ return data ? btoaCustom(data.id + '_' + data.version + '_' + type + '_' + JSON.stringify(materialSettings)) : btoaCustom(type + '_' + JSON.stringify(materialSettings));
1215
+ }
1216
+
1217
+ private createTexture(map: IMapData): THREE.Texture {
1218
+ if(map.image instanceof ArrayBuffer) return new THREE.Texture();
1219
+
1220
+ const key = this.createDataKeyFromMap(map);
1221
+
1222
+ // texture in this structure are only stored until the next scene tree update call
1223
+ // therefore no cache management is needed, as these textures need to be created either way
1224
+ // the cache is cleared in updateSceneTree
1225
+ if (this._threeJsTextureCache[key]) {
1226
+ this._threeJsTextureCache[key].usage++;
1227
+ return this._threeJsTextureCache[key].texture;
1228
+ }
1229
+
1230
+ let texture: THREE.Texture;
1231
+ if (map.asData === true) {
1232
+ texture = new THREE.DataTexture(
1233
+ new Uint32Array(map.data!),
1234
+ map.data!.length,
1235
+ 1,
1236
+ THREE.RedIntegerFormat,
1237
+ THREE.UnsignedIntType
1238
+ );
1239
+ texture.internalFormat = 'R32UI';
1240
+ } else {
1241
+ texture = new THREE.Texture(map.image);
1242
+ texture.format = THREE.RGBAFormat;
1243
+ texture.minFilter = (() => {
1244
+ switch (map.minFilter) {
1245
+ case TEXTURE_FILTERING.NEAREST:
1246
+ return THREE.NearestFilter;
1247
+ case TEXTURE_FILTERING.NEAREST_MIPMAP_NEAREST:
1248
+ return THREE.NearestMipMapNearestFilter;
1249
+ case TEXTURE_FILTERING.LINEAR_MIPMAP_NEAREST:
1250
+ return THREE.LinearMipMapNearestFilter;
1251
+ case TEXTURE_FILTERING.NEAREST_MIPMAP_LINEAR:
1252
+ return THREE.NearestMipMapLinearFilter;
1253
+ case TEXTURE_FILTERING.LINEAR:
1254
+ return THREE.LinearFilter;
1255
+ case TEXTURE_FILTERING.LINEAR_MIPMAP_LINEAR:
1256
+ default:
1257
+ return THREE.LinearMipMapLinearFilter;
1258
+ }
1259
+ })();
1260
+ texture.magFilter = (() => {
1261
+ switch (map.magFilter) {
1262
+ case TEXTURE_FILTERING.NEAREST:
1263
+ return THREE.NearestFilter;
1264
+ case TEXTURE_FILTERING.LINEAR:
1265
+ default:
1266
+ return THREE.LinearFilter;
1267
+ }
1268
+ })();
1269
+ texture.wrapS = (() => {
1270
+ switch (map.wrapS) {
1271
+ case TEXTURE_WRAPPING.CLAMP_TO_EDGE:
1272
+ return THREE.ClampToEdgeWrapping;
1273
+ case TEXTURE_WRAPPING.MIRRORED_REPEAT:
1274
+ return THREE.MirroredRepeatWrapping;
1275
+ case TEXTURE_WRAPPING.REPEAT:
1276
+ default:
1277
+ return THREE.RepeatWrapping;
1278
+ }
1279
+ })();
1280
+ texture.wrapT = (() => {
1281
+ switch (map.wrapT) {
1282
+ case TEXTURE_WRAPPING.CLAMP_TO_EDGE:
1283
+ return THREE.ClampToEdgeWrapping;
1284
+ case TEXTURE_WRAPPING.MIRRORED_REPEAT:
1285
+ return THREE.MirroredRepeatWrapping;
1286
+ case TEXTURE_WRAPPING.REPEAT:
1287
+ default:
1288
+ return THREE.RepeatWrapping;
1289
+ }
1290
+ })();
1291
+
1292
+ texture.center = new THREE.Vector2(map.center[0], map.center[1]);
1293
+ texture.offset = new THREE.Vector2(map.offset[0], map.offset[1]);
1294
+ texture.repeat = new THREE.Vector2(map.repeat[0], map.repeat[1]);
1295
+ texture.rotation = map.rotation;
1296
+ if (map.texCoord !== undefined) texture.channel = map.texCoord;
1297
+
1298
+ texture.flipY = map.flipY;
1299
+ }
1300
+
1301
+ texture.needsUpdate = true;
1302
+
1303
+ texture.userData.cacheKey = key;
1304
+
1305
+ this._threeJsTextureCache[key] = {
1306
+ texture,
1307
+ usage: 1,
1308
+ initialized: false
1309
+ };
1310
+ return this._threeJsTextureCache[key].texture;
1311
+ }
1312
+
1313
+ // #endregion Private Methods (4)
1314
+ }
1315
+
1316
+ // #endregion Classes (1)
1317
+
1318
+ // #region Enums (1)
1319
+
1320
+ /* eslint-disable @typescript-eslint/no-empty-function */
1321
+ export enum MATERIAL_TYPE {
1322
+ POINT = 'point',
1323
+ LINE = 'line',
1324
+ MESH = 'mesh',
1325
+ }
1326
+
1327
+ // #endregion Enums (1)
1328
+
1329
+ // #region Variables (1)
1330
+
1331
+ export const adaptShaders = () => {
1332
+ let shader = THREE.ShaderChunk.shadowmap_pars_fragment;
1333
+ if (!shader.includes('PCSS implementation')) {
1334
+ shader = shader.replace('#ifdef USE_SHADOWMAP', '#ifdef USE_SHADOWMAP' + main);
1335
+ shader = shader.replace(shader.substr(shader.indexOf('#if defined( SHADOWMAP_TYPE_PCF )'), shader.indexOf('#elif defined( SHADOWMAP_TYPE_PCF_SOFT )') - shader.indexOf('#if defined( SHADOWMAP_TYPE_PCF )')), '#if defined( SHADOWMAP_TYPE_PCF )\n' + entry);
1336
+ }
1337
+ THREE.ShaderChunk.shadowmap_pars_fragment = shader;
1338
+
1339
+ // here we replace in the background cube fragment shader the y component of the reflection vector with the negative y component and inverse the rotation in the case of a LDR environment map
1340
+ // console.log(THREE.ShaderChunk.backgroundCube_frag.includes('vec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );'))
1341
+ THREE.ShaderChunk.backgroundCube_frag = THREE.ShaderChunk.backgroundCube_frag.replace(
1342
+ 'vec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );',
1343
+ 'vec4 texColor = textureCube( envMap, inverse(backgroundRotation) * vec3( flipEnvMap * vWorldDirection.x, -vWorldDirection.y, vWorldDirection.z ) );'
1344
+ );
1345
+ THREE.ShaderLib.backgroundCube.fragmentShader = THREE.ShaderChunk.backgroundCube_frag;
1346
+
1347
+ // here we replace in the envmap_physical_pars_fragment the z component of the reflection vector with the negative z component in the case of a LDR environment map
1348
+ // console.log(THREE.ShaderChunk.envmap_physical_pars_fragment, THREE.ShaderChunk.envmap_physical_pars_fragment.includes('vec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );'));
1349
+ THREE.ShaderChunk.envmap_physical_pars_fragment = THREE.ShaderChunk.envmap_physical_pars_fragment.replace(
1350
+ 'vec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );',
1351
+ `
1352
+ #ifdef ENVMAP_TYPE_LDR
1353
+ vec3 rotatedReflectVec = vec3(envMapRotation * worldNormal).xzy;
1354
+ vec4 envMapColor = textureCubeUV( envMap, vec3(rotatedReflectVec.xy, -rotatedReflectVec.z), 1.0 );
1355
+ #else
1356
+ vec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );
1357
+ #endif
1358
+ `
1359
+ );
1360
+
1361
+ // here we replace in the envmap_fragment the z component of the reflection vector with the negative z component in the case of a LDR environment map
1362
+ // console.log(THREE.ShaderChunk.envmap_physical_pars_fragment, THREE.ShaderChunk.envmap_physical_pars_fragment.includes('vec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );'));
1363
+ THREE.ShaderChunk.envmap_physical_pars_fragment = THREE.ShaderChunk.envmap_physical_pars_fragment.replace(
1364
+ 'vec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );',
1365
+ `
1366
+ #ifdef ENVMAP_TYPE_LDR
1367
+ vec3 rotatedReflectVec = vec3(envMapRotation * reflectVec).xzy;
1368
+ vec4 envMapColor = textureCubeUV( envMap, vec3(rotatedReflectVec.xy, -rotatedReflectVec.z), roughness );
1369
+ #else
1370
+ vec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );
1371
+ #endif
1372
+ `
1373
+ );
1374
+
1375
+ // here we replace in the envmap_fragment the z component of the reflection vector with the negative z component in the case of a LDR environment map
1376
+ // console.log(THREE.ShaderChunk.envmap_fragment, THREE.ShaderChunk.envmap_fragment.includes('vec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );'));
1377
+ THREE.ShaderChunk.envmap_fragment = THREE.ShaderChunk.envmap_fragment.replace(
1378
+ 'vec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );',
1379
+ `
1380
+ #ifdef ENVMAP_TYPE_LDR
1381
+ vec4 envColor = textureCube( envMap, envMapRotation * vec3(flipEnvMap * reflectVec.x, reflectVec.y, -reflectVec.z ) );
1382
+ #else
1383
+ vec4 envColor = textureCube( envMap, envMapRotation * vec3( -flipEnvMap * reflectVec.x, reflectVec.zy ) );
1384
+ #endif
1385
+ `
1386
+ );
1387
+
1388
+ // here we replace the z and y component of the sampleDir in the cube_uv_reflection_fragment
1389
+ // console.log(THREE.ShaderChunk.cube_uv_reflection_fragment.includes('vec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );'))
1390
+ THREE.ShaderChunk.cube_uv_reflection_fragment = THREE.ShaderChunk.cube_uv_reflection_fragment.replace(
1391
+ 'vec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );',
1392
+ 'vec3 color0 = bilinearCubeUV( envMap, sampleDir.xzy, mipInt );'
1393
+ );
1394
+
1395
+ // here we replace the z and y component of the sampleDir in the cube_uv_reflection_fragment
1396
+ // console.log(THREE.ShaderChunk.cube_uv_reflection_fragment)
1397
+ THREE.ShaderChunk.cube_uv_reflection_fragment = THREE.ShaderChunk.cube_uv_reflection_fragment.replace(
1398
+ 'vec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );',
1399
+ 'vec3 color1 = bilinearCubeUV( envMap, sampleDir.xzy, mipInt + 1.0 );'
1400
+ );
1401
+
1402
+ // here we create a new case in the lights_fragment_maps for the case of ENVMAP_TYPE_NONE
1403
+ if (!THREE.ShaderChunk.lights_fragment_maps.includes('vec3 reflectVec')) {
1404
+ const index = THREE.ShaderChunk.lights_fragment_maps.lastIndexOf('#endif');
1405
+ THREE.ShaderChunk.lights_fragment_maps = THREE.ShaderChunk.lights_fragment_maps.substring(0, index) +
1406
+ `#else
1407
+ #ifdef ENVMAP_TYPE_NONE
1408
+ vec3 reflectVec = reflect( -geometryViewDir, geometryNormal );
1409
+ reflectVec = inverseTransformDirection( reflectVec, viewMatrix );
1410
+ vec4 adjustedEnvReflectVector = vec4(reflectVec, 1.0);
1411
+ radiance += (vec3((adjustedEnvReflectVector.z + 1.0) / 2.0) + 0.5) / 1.5;
1412
+ #endif
1413
+ #endif
1414
+ ` + THREE.ShaderChunk.lights_fragment_maps.substring(index + '#endif'.length);
1415
+ }
1416
+ };
1417
+
1418
+ // #endregion Variables (1)