@shapediver/viewer.rendering-engine.rendering-engine-threejs 3.16.8 → 3.16.10

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 (185) 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
  182. package/dist/managers/InstanceGroupManager.d.ts +0 -58
  183. package/dist/managers/InstanceGroupManager.d.ts.map +0 -1
  184. package/dist/managers/InstanceGroupManager.js +0 -372
  185. package/dist/managers/InstanceGroupManager.js.map +0 -1
@@ -1,670 +1,680 @@
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.RenderingManager = void 0;
27
- const viewer_rendering_engine_animation_engine_1 = require("@shapediver/viewer.rendering-engine.animation-engine");
28
- const viewer_rendering_engine_animation_frame_engine_1 = require("@shapediver/viewer.rendering-engine.animation-frame-engine");
29
- const viewer_rendering_engine_camera_engine_1 = require("@shapediver/viewer.rendering-engine.camera-engine");
30
- const viewer_shared_node_tree_1 = require("@shapediver/viewer.shared.node-tree");
31
- const viewer_shared_services_1 = require("@shapediver/viewer.shared.services");
32
- const viewer_shared_types_1 = require("@shapediver/viewer.shared.types");
33
- const Stats = __importStar(require("stats.js"));
34
- const THREE = __importStar(require("three"));
35
- const SceenTreeManagerUtils_1 = require("./sceneTree/SceenTreeManagerUtils");
36
- class RenderingManager {
37
- // #endregion Properties (30)
38
- // #region Constructors (1)
39
- constructor(_renderingEngine) {
40
- this._renderingEngine = _renderingEngine;
41
- // #region Properties (30)
42
- this._animationEngine = viewer_rendering_engine_animation_engine_1.AnimationEngine.instance;
43
- this._animationFrameEngine = viewer_rendering_engine_animation_frame_engine_1.AnimationFrameEngine.instance;
44
- this._converter = viewer_shared_services_1.Converter.instance;
45
- this._eventEngine = viewer_shared_services_1.EventEngine.instance;
46
- this._logger = viewer_shared_services_1.Logger.instance;
47
- this._systemInfo = viewer_shared_services_1.SystemInfo.instance;
48
- this._tree = viewer_shared_node_tree_1.Tree.instance;
49
- this._activeRendering = true;
50
- this._cameraChanged = false;
51
- this._continuousRendering = false;
52
- this._continuousShadowMapUpdate = false;
53
- this._height = 0;
54
- this._hidden = true;
55
- this._hiddenCamera = new THREE.PerspectiveCamera();
56
- this._hiddenRenderTarget = new THREE.WebGLRenderTarget();
57
- this._hideLogo = false;
58
- this._lastSize = {
59
- adjustedWidth: 0,
60
- adjustedHeight: 0,
61
- width: 0,
62
- height: 0,
63
- };
64
- this._lightSizeUVEnd = 0.15;
65
- this._lightSizeUVStart = 0.025;
66
- this._maxTextureUnits = 0;
67
- this._minimalRendering = false;
68
- this._noWebGL = false;
69
- this._runningAnimation = false;
70
- this._sizeChanged = false;
71
- this._softShadowRenderingActive = false;
72
- this._softShadowRenderingDurationActive = 0;
73
- this._softShadowRenderingTimeout = null;
74
- this._usingSwiftShader = false;
75
- this._width = 0;
76
- this._updateShadowMapInNextRender = false;
77
- }
78
- // #endregion Constructors (1)
79
- // #region Public Getters And Setters (6)
80
- get continuousRendering() {
81
- return this._continuousRendering;
82
- }
83
- set continuousRendering(value) {
84
- this._continuousRendering = value;
85
- }
86
- get continuousShadowMapUpdate() {
87
- return this._continuousShadowMapUpdate;
88
- }
89
- set continuousShadowMapUpdate(value) {
90
- this._continuousShadowMapUpdate = value;
91
- }
92
- get minimalRendering() {
93
- return this._minimalRendering;
94
- }
95
- get usingSwiftShader() {
96
- return this._usingSwiftShader;
97
- }
98
- // #endregion Public Getters And Setters (6)
99
- // #region Public Methods (10)
100
- addLogo(canvas, branding) {
101
- var _a, _b;
102
- const logoDivElement = document.createElement("div");
103
- logoDivElement.style.backgroundColor = branding.backgroundColor;
104
- logoDivElement.classList.add("sdv-logo-container");
105
- (_a = canvas.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(logoDivElement, (_b = canvas.parentElement) === null || _b === void 0 ? void 0 : _b.firstChild);
106
- if (branding.logo) {
107
- const img = new Image();
108
- img.classList.add("sdv-logo");
109
- img.src = branding.logo;
110
- logoDivElement.appendChild(img);
111
- }
112
- return logoDivElement;
113
- }
114
- addSpinner(canvas, branding) {
115
- var _a, _b;
116
- const spinnerDivElement = document.createElement("div");
117
- spinnerDivElement.classList.add("sdv-spinner-container");
118
- spinnerDivElement.style.visibility = "hidden";
119
- (_a = canvas.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(spinnerDivElement, (_b = canvas.parentElement) === null || _b === void 0 ? void 0 : _b.firstChild);
120
- if (branding.busyModeSpinner) {
121
- const img = new Image();
122
- img.src = branding.busyModeSpinner;
123
- img.classList.add("sdv-spinner");
124
- img.classList.add("sdv-spinner-" +
125
- branding.spinnerPositioning.replace("_", "-").toLowerCase());
126
- spinnerDivElement.appendChild(img);
127
- }
128
- return spinnerDivElement;
129
- }
130
- createRenderer(canvas) {
131
- const renderingProperties = {
132
- alpha: true,
133
- depth: true,
134
- antialias: true,
135
- preserveDrawingBuffer: true,
136
- stencil: true,
137
- premultipliedAlpha: true,
138
- canvas,
139
- };
140
- const renderer = new THREE.WebGLRenderer(renderingProperties);
141
- renderer.setPixelRatio(window.devicePixelRatio);
142
- const context = renderer.getContext();
143
- if (renderer.extensions.has("WEBGL_debug_renderer_info")) {
144
- const debugInfo = renderer.extensions.get("WEBGL_debug_renderer_info");
145
- // const vendor = context.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
146
- const rendererInfo = context.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
147
- if (rendererInfo === "Google SwiftShader") {
148
- this._usingSwiftShader = true;
149
- this._logger.warn("RenderingLogic.createWebGLContext: The current device is using Google SwiftShader, a CPU-based renderer. To achieve better rendering results, please enable GPU-rendering in your settings.");
150
- }
151
- }
152
- if (!renderer.extensions.has("EXT_shader_texture_lod"))
153
- this._minimalRendering = true;
154
- renderer.outputColorSpace = THREE.SRGBColorSpace;
155
- renderer.toneMapping = THREE.NoToneMapping;
156
- renderer.shadowMap.enabled = true;
157
- renderer.shadowMap.needsUpdate = true;
158
- renderer.shadowMap.type = THREE.PCFSoftShadowMap;
159
- renderer.shadowMap.autoUpdate = false;
160
- renderer.localClippingEnabled = true;
161
- // Performance: Disable object sorting to save CPU cycles per frame
162
- // Objects are sorted by material/program by default which is usually sufficient
163
- renderer.sortObjects = false;
164
- renderer.setSize(canvas.width, canvas.height);
165
- renderer.setClearColor(new THREE.Color("#ffffff"), 1);
166
- this._maxTextureUnits = renderer
167
- .getContext()
168
- .getParameter(renderer.getContext().MAX_TEXTURE_IMAGE_UNITS);
169
- return renderer;
170
- }
171
- evaluateTextureUnitCount(value) {
172
- if (value > this._maxTextureUnits) {
173
- this._logger.warn("RenderingManager.evaluateTextureUnitCount: Maximum number of texture units exceeded. Disabling shadows.");
174
- this._renderingEngine.lightLoader.forceDisabledShadows = true;
175
- this._renderingEngine.update("RenderingManager.evaluateTextureUnitCount");
176
- }
177
- else {
178
- this._renderingEngine.lightLoader.forceDisabledShadows = false;
179
- }
180
- }
181
- getScreenshot(type = "image/png", encoderOptions = 1) {
182
- return this._renderingEngine.renderer.domElement.toDataURL(type, encoderOptions);
183
- }
184
- init() {
185
- try {
186
- this._renderingEngine.materialLoader.updateSoftShadow(this._lightSizeUVEnd, 1.0);
187
- this._renderingEngine.renderer.shadowMap.type = THREE.PCFShadowMap;
188
- this._renderingEngine.renderer.shadowMap.needsUpdate = true;
189
- this._renderingEngine.materialLoader.updateMaterials();
190
- this._eventEngine.addListener(viewer_shared_services_1.EVENTTYPE.CAMERA.CAMERA_START, (e) => {
191
- const viewerEvent = e;
192
- if (viewerEvent.viewportId === this._renderingEngine.id)
193
- this.startRendering();
194
- });
195
- this._eventEngine.addListener(viewer_shared_services_1.EVENTTYPE.CAMERA.CAMERA_END, (e) => {
196
- const viewerEvent = e;
197
- if (viewerEvent.viewportId === this._renderingEngine.id)
198
- this.stopRendering();
199
- });
200
- window.onresize = () => {
201
- this.render();
202
- };
203
- this._renderingEngine.canvas.onresize = () => {
204
- this.render();
205
- };
206
- this._renderingEngine.canvas.parentElement.onresize = () => {
207
- this.render();
208
- };
209
- const stats1 = new Stats.default();
210
- stats1.showPanel(0); // Panel 0 = fps
211
- stats1.dom.style.cssText =
212
- "position:absolute;top:0px;left:0px;display:none;";
213
- this._renderingEngine.canvas.parentElement.appendChild(stats1.dom);
214
- const stats2 = new Stats.default();
215
- stats2.showPanel(1); // Panel 1 = ms
216
- stats2.dom.style.cssText =
217
- "position:absolute;top:0px;left:80px;display:none;";
218
- this._renderingEngine.canvas.parentElement.appendChild(stats2.dom);
219
- const stats3 = new Stats.default();
220
- stats3.showPanel(2); // Panel 2 = ms
221
- stats3.dom.style.cssText =
222
- "position:absolute;top:0px;left:160px;display:none;";
223
- this._renderingEngine.canvas.parentElement.appendChild(stats3.dom);
224
- this._stats = {
225
- stats: [stats1, stats2, stats3],
226
- begin: () => {
227
- stats1.begin();
228
- stats2.begin();
229
- stats3.begin();
230
- },
231
- end: () => {
232
- stats1.end();
233
- stats2.end();
234
- stats3.end();
235
- },
236
- };
237
- }
238
- catch (e) {
239
- this._noWebGL = true;
240
- throw e;
241
- }
242
- }
243
- render() {
244
- this.startAndStopRendering();
245
- }
246
- resize(width, height) {
247
- (this._width = width), (this._height = height);
248
- this._renderingEngine.materialLoader.assignPointSize(this._renderingEngine.pointSize);
249
- }
250
- /**
251
- * Must only be called once by the RenderingEngine!
252
- */
253
- start() {
254
- this._animationFrameEngine.addAnimationFrameCallback(this.animate.bind(this));
255
- this.startAndStopRendering();
256
- }
257
- updateShadowMap() {
258
- this._updateShadowMapInNextRender = true;
259
- }
260
- // #endregion Public Methods (10)
261
- // #region Private Methods (14)
262
- activateBeautyRenderShaders() {
263
- this._renderingEngine.renderer.shadowMap.type = THREE.PCFShadowMap;
264
- this._renderingEngine.renderer.shadowMap.needsUpdate = true;
265
- this._renderingEngine.materialLoader.updateMaterials();
266
- }
267
- animate(time, deltaTime, runningAnimation) {
268
- var _a;
269
- // animation loop - part 1: initial discarding
270
- if (this._renderingEngine.closed || this._noWebGL)
271
- return;
272
- this._renderingEngine.evaluateFlagState();
273
- // update if needed
274
- if (this._renderingEngine.show === true &&
275
- this._tree.root.version !==
276
- this._renderingEngine.sceneTreeManager.lastRootVersion &&
277
- this._renderingEngine.sceneTreeManager.suspendSceneUpdates === false) {
278
- this._renderingEngine.sceneTreeManager.updateSceneTree(this._tree.root);
279
- this.updateShadowMap();
280
- this._animationEngine.updateAnimationData();
281
- this.render();
282
- this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE_VIEWPORT.VIEWPORT_UPDATED, {
283
- viewportId: this._renderingEngine.id,
284
- });
285
- }
286
- if (this._renderingEngine.preRenderingCallback)
287
- this._renderingEngine.preRenderingCallback(this._renderingEngine.renderer);
288
- if (runningAnimation !== this._runningAnimation)
289
- this.render();
290
- this._runningAnimation = runningAnimation;
291
- if (this._runningAnimation)
292
- this._renderingEngine.sceneTreeManager.updateNode(undefined, undefined, { transformationOnly: true });
293
- if (this._runningAnimation)
294
- (0, SceenTreeManagerUtils_1.updateMorphWeights)(this._tree.root, this._renderingEngine.sceneTreeManager.mainNode);
295
- // get the current size
296
- const { width, height, adjustedWidth, adjustedHeight } = this.calculateSize();
297
- const aspect = width / height;
298
- this._sizeChanged =
299
- this._lastSize.adjustedHeight !== adjustedHeight ||
300
- this._lastSize.adjustedWidth !== adjustedWidth ||
301
- this._lastSize.height !== height ||
302
- this._lastSize.width !== width;
303
- this._lastSize = { width, height, adjustedWidth, adjustedHeight };
304
- // animation loop - part 3: update the camera, if there are new movements, they will start / continue the rendering
305
- this._cameraChanged = this._renderingEngine.cameraEngine.camera
306
- ? this._renderingEngine.cameraManager.updateCamera(deltaTime, aspect)
307
- : false;
308
- // animation loop - part 4: evaluating state
309
- const states = this.evaluateRenderingState();
310
- // toggle the blurring
311
- this.toggleBusyMode(states.busyMode);
312
- // animation loop - part 5: the scene is not even shown
313
- if (states.showScene === false) {
314
- // toggle on logo
315
- this.toggleLogo(true);
316
- if (this._hidden === false)
317
- this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.VIEWPORT.VIEWPORT_HIDDEN, { viewportId: this._renderingEngine.id });
318
- this._hidden = true;
319
- return;
320
- }
321
- else {
322
- // we delay for one render call as some of the postprocessing effects have artefacts in the first call
323
- if (this._hideLogo === true && this._hidden === true) {
324
- this.toggleLogo(false);
325
- this._hideLogo = false;
326
- if (this._hidden === true)
327
- this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.VIEWPORT.VIEWPORT_VISIBLE, { viewportId: this._renderingEngine.id });
328
- this._hidden = false;
329
- }
330
- else {
331
- this._hideLogo = true;
332
- if (this._hidden === true)
333
- this._renderingEngine.postProcessingManager.changeEffectPass();
334
- }
335
- }
336
- // animation loop - part 6: the scene is shown, but there is no active rendering happening
337
- if (states.rendering === false || this._renderingEngine.pause === true)
338
- return;
339
- // animation loop - part 7: there is actual rendering happening
340
- // do the things that have to be done for standard and beauty rendering in the same way
341
- this._stats.begin();
342
- this.showStatistics();
343
- // animation loop - part 8: calculate the current size
344
- const currentSize = new THREE.Vector2();
345
- this._renderingEngine.renderer.getSize(currentSize);
346
- // Performance: Direct property comparison instead of Vector2.equals()
347
- if (currentSize.width !== adjustedWidth ||
348
- currentSize.height !== adjustedHeight) {
349
- this._renderingEngine.renderer.setSize(adjustedWidth, adjustedHeight);
350
- this._renderingEngine.postProcessingManager.resize(adjustedWidth, adjustedHeight);
351
- this._renderingEngine.renderer.domElement.style.width =
352
- width + "px";
353
- this._renderingEngine.renderer.domElement.style.height =
354
- height + "px";
355
- this._renderingEngine.materialLoader.assignPointSize(this._renderingEngine.pointSize);
356
- }
357
- // animation loop - part 9: adjust the camera (the rendering state would be false if we didn't have a camera)
358
- const { camera, matrix } = this._renderingEngine.cameraManager.adjustCamera(aspect);
359
- // if a matrix is provided after a camera adjustment
360
- // that means that the turntable controls or the object controls are activated
361
- if (matrix) {
362
- for (let i = 0; i < this._tree.root.children.length; i++) {
363
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
364
- if (!this._tree.root.children[i].sessionNode ||
365
- this._tree.root.children[i].excludeViewports.includes(this._renderingEngine.id))
366
- continue;
367
- const transform = this._tree.root.children[i].transformations.find((t) => t.id === "objectRotation");
368
- if (transform) {
369
- transform.matrix = matrix;
370
- }
371
- else {
372
- this._tree.root.children[i].addTransformation({
373
- id: "objectRotation",
374
- matrix,
375
- });
376
- }
377
- }
378
- states.updateShadowMap = true;
379
- this._renderingEngine.sceneTreeManager.updateNode(undefined, undefined, { transformationOnly: true });
380
- }
381
- // animation loop - part 10: adjust the anchor elements
382
- this._renderingEngine.htmlElementAnchorLoader.adjustPositions(adjustedWidth / width, adjustedHeight / height);
383
- // animation loop - part 11: adjust some scene settings
384
- // enable / disable the shadow map
385
- const enabled = this._renderingEngine.renderer.shadowMap.enabled;
386
- this._renderingEngine.renderer.shadowMap.enabled =
387
- this._renderingEngine.usingSwiftShader ||
388
- this._renderingEngine.type === viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES
389
- ? false
390
- : this._renderingEngine.shadows;
391
- if (enabled !== this._renderingEngine.renderer.shadowMap.enabled)
392
- this._renderingEngine.materialLoader.updateMaterials();
393
- let threeJsLightObject, oldLightVisibility = true;
394
- // enable / disable lights
395
- if (this._renderingEngine.lights === false) {
396
- const ls = this._renderingEngine.lightEngine.lightScene;
397
- if (ls) {
398
- threeJsLightObject = ls.node.convertedObject[this._renderingEngine.id];
399
- if (threeJsLightObject) {
400
- oldLightVisibility = threeJsLightObject.visible;
401
- threeJsLightObject.visible = false;
402
- }
403
- }
404
- }
405
- // update shadowMap if need
406
- if (states.updateShadowMap) {
407
- if (this._renderingEngine.renderer.shadowMap.enabled)
408
- this._renderingEngine.renderer.shadowMap.needsUpdate = true;
409
- (_a = this._renderingEngine.environmentGeometryManager.contactShadow) === null || _a === void 0 ? void 0 : _a.render();
410
- }
411
- // enable / disable the background
412
- this._renderingEngine.sceneTreeManager.scene.background = this
413
- ._renderingEngine.environmentMapAsBackground
414
- ? this._renderingEngine.environmentMapLoader.environmentMap
415
- : null;
416
- // set the background color / alpha
417
- this._renderingEngine.renderer.setClearColor(new THREE.Color(this._converter.toThreeJsColorInput(this._renderingEngine.clearColor)), this._renderingEngine.clearAlpha);
418
- // check if we should render with post-processing
419
- const renderPostProcessing = (this._renderingEngine.postProcessingManager.effects.length > 0 ||
420
- this._renderingEngine.postProcessingManager
421
- .manualPostProcessing) &&
422
- !(this._renderingEngine.postProcessingManager
423
- .enablePostProcessingOnMobile === false &&
424
- this._systemInfo.isMobile === true);
425
- // animation loop - part 12: actual rendering separation
426
- if (states.softShadowRendering === true) {
427
- this.setShaderProperties();
428
- if (renderPostProcessing) {
429
- this._renderingEngine.postProcessingManager.render(deltaTime, camera);
430
- }
431
- else {
432
- this._renderingEngine.renderer.render(this._renderingEngine.sceneTreeManager
433
- .scene, camera);
434
- }
435
- // if the duration was long enough, disable the beauty rendering
436
- if (this._softShadowRenderingDurationActive >=
437
- this._renderingEngine.beautyRenderBlendingDuration) {
438
- this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.RENDERING.BEAUTY_RENDERING_FINISHED, { viewportId: this._renderingEngine.id });
439
- this.deactivateBeautyRenderShaders();
440
- this._activeRendering = false;
441
- }
442
- else {
443
- this._softShadowRenderingDurationActive += deltaTime;
444
- }
445
- }
446
- else {
447
- if (renderPostProcessing) {
448
- this._renderingEngine.postProcessingManager.render(deltaTime, camera);
449
- }
450
- else {
451
- this._renderingEngine.renderer.render(this._renderingEngine.sceneTreeManager
452
- .scene, camera);
453
- }
454
- // if the beauty rendering was active, disable it
455
- if (this._softShadowRenderingActive) {
456
- this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.RENDERING.BEAUTY_RENDERING_FINISHED, { viewportId: this._renderingEngine.id });
457
- this.deactivateBeautyRenderShaders();
458
- this._activeRendering = false;
459
- }
460
- }
461
- // reset the visibility of the threeJs light object
462
- if (threeJsLightObject)
463
- threeJsLightObject.visible = oldLightVisibility;
464
- if (this._renderingEngine.postRenderingCallback)
465
- this._renderingEngine.postRenderingCallback(this._renderingEngine.renderer, this._renderingEngine.scene, this._renderingEngine.camera);
466
- this._stats.end();
467
- }
468
- calculateSize() {
469
- if (this._renderingEngine.renderer.pixelRatio !==
470
- window.devicePixelRatio) {
471
- this._renderingEngine.renderer.setPixelRatio(window.devicePixelRatio);
472
- }
473
- let width = this._width, height = this._height;
474
- if (this._renderingEngine.automaticResizing) {
475
- width = this._renderingEngine.canvas.parentNode
476
- .clientWidth;
477
- height = this._renderingEngine.canvas.parentNode
478
- .clientHeight;
479
- }
480
- const aspect = width / height;
481
- let adjustedWidth = width, adjustedHeight = height;
482
- if (width > this._renderingEngine.maximumRenderingSize.width ||
483
- height > this._renderingEngine.maximumRenderingSize.height) {
484
- if ((width - this._renderingEngine.maximumRenderingSize.width) /
485
- aspect >
486
- height - this._renderingEngine.maximumRenderingSize.height) {
487
- adjustedWidth =
488
- this._renderingEngine.maximumRenderingSize.width;
489
- adjustedHeight =
490
- this._renderingEngine.maximumRenderingSize.width / aspect;
491
- }
492
- else {
493
- adjustedWidth =
494
- this._renderingEngine.maximumRenderingSize.height * aspect;
495
- adjustedHeight =
496
- this._renderingEngine.maximumRenderingSize.height;
497
- }
498
- }
499
- return {
500
- width,
501
- adjustedWidth,
502
- height,
503
- adjustedHeight,
504
- };
505
- }
506
- deactivateBeautyRenderShaders() {
507
- this._softShadowRenderingTimeout = null;
508
- this._softShadowRenderingActive = false;
509
- this._softShadowRenderingDurationActive = 0;
510
- this._renderingEngine.renderer.shadowMap.type = THREE.PCFSoftShadowMap;
511
- this._renderingEngine.renderer.shadowMap.needsUpdate = true;
512
- this._renderingEngine.materialLoader.updateSoftShadow(this._lightSizeUVStart, 0.1);
513
- this._renderingEngine.materialLoader.updateMaterials();
514
- }
515
- evaluateRenderingState() {
516
- // If there is a camera to show the scene and the setting for it is set to true, we show the scene
517
- let showScene = false;
518
- if (this._renderingEngine.cameraEngine.camera &&
519
- this._renderingEngine.show === true)
520
- showScene = true;
521
- // If we should render at all
522
- let rendering = false;
523
- if (this._activeRendering === true ||
524
- this._cameraChanged === true ||
525
- this._sizeChanged === true ||
526
- this._runningAnimation === true ||
527
- this._continuousRendering === true)
528
- rendering = true;
529
- let updateShadowMap = false;
530
- if (this._runningAnimation === true ||
531
- this._continuousShadowMapUpdate === true ||
532
- this._updateShadowMapInNextRender === true) {
533
- this._updateShadowMapInNextRender = false;
534
- updateShadowMap = true;
535
- }
536
- // special case, autorotation
537
- if (this._renderingEngine.cameraEngine.camera) {
538
- const camera = this._renderingEngine.cameraEngine.camera;
539
- if (camera.type === viewer_rendering_engine_camera_engine_1.CAMERA_TYPE.PERSPECTIVE) {
540
- const controls = (camera.controls);
541
- if (controls.enableAutoRotation === true &&
542
- controls.autoRotationSpeed !== 0)
543
- return {
544
- showScene,
545
- rendering: true,
546
- updateShadowMap,
547
- busyMode: this._renderingEngine.busy,
548
- softShadowRendering: false,
549
- };
550
- }
551
- }
552
- else {
553
- rendering = false;
554
- }
555
- // If the scene should be blurred
556
- let busyMode = false;
557
- if (this._renderingEngine.busy)
558
- busyMode = true;
559
- // If we should render in beauty mode
560
- let softShadowRendering = false;
561
- if (this._softShadowRenderingActive === true &&
562
- busyMode === false &&
563
- this._continuousRendering === false &&
564
- (this._renderingEngine.shadows || !this._systemInfo.isIOS) &&
565
- this._renderingEngine.usingSwiftShader === false &&
566
- this._runningAnimation === false &&
567
- this._renderingEngine.type !== viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES)
568
- softShadowRendering = true;
569
- return {
570
- showScene,
571
- rendering,
572
- updateShadowMap,
573
- busyMode,
574
- softShadowRendering,
575
- };
576
- }
577
- setShaderProperties() {
578
- if (this._renderingEngine.softShadows === false) {
579
- this._renderingEngine.materialLoader.updateSoftShadow(this._lightSizeUVStart, 0);
580
- return 0;
581
- }
582
- const deltaTime = Math.min(this._softShadowRenderingDurationActive, this._renderingEngine.beautyRenderBlendingDuration);
583
- const percentage = deltaTime / this._renderingEngine.beautyRenderBlendingDuration;
584
- if (percentage < 0.25) {
585
- const percentageMapped = percentage / 0.25;
586
- this._renderingEngine.materialLoader.updateSoftShadow(this._lightSizeUVStart, percentageMapped);
587
- }
588
- else {
589
- const percentageMapped = (percentage - 0.25) / (1 - 0.25);
590
- // this._lightSizeUVStart -> this._lightSizeUVEnd
591
- this._renderingEngine.materialLoader.updateSoftShadow(this._lightSizeUVStart +
592
- (this._lightSizeUVEnd - this._lightSizeUVStart) *
593
- percentageMapped, 1.0);
594
- }
595
- return percentage;
596
- }
597
- showStatistics() {
598
- if (this._renderingEngine.showStatistics) {
599
- for (let i = 0; i < this._stats.stats.length; i++)
600
- this._stats.stats[i].dom.style.display = "";
601
- }
602
- else {
603
- for (let i = 0; i < this._stats.stats.length; i++)
604
- this._stats.stats[i].dom.style.display = "none";
605
- }
606
- }
607
- startAndStopRendering() {
608
- this._activeRendering = true;
609
- this.stopBeautyRenderCountdown();
610
- this.startBeautyRenderCountdown();
611
- }
612
- startBeautyRenderCountdown() {
613
- this._softShadowRenderingTimeout = setTimeout(() => {
614
- this._softShadowRenderingActive = true;
615
- this._softShadowRenderingDurationActive = 0;
616
- this.activateBeautyRenderShaders();
617
- }, this._renderingEngine.beautyRenderDelay);
618
- }
619
- startRendering() {
620
- this._activeRendering = true;
621
- this.stopBeautyRenderCountdown();
622
- }
623
- stopBeautyRenderCountdown() {
624
- if (this._softShadowRenderingTimeout)
625
- clearTimeout(this._softShadowRenderingTimeout);
626
- this.deactivateBeautyRenderShaders();
627
- }
628
- stopRendering() {
629
- this.startBeautyRenderCountdown();
630
- }
631
- toggleBusyMode(toggle) {
632
- if (this._renderingEngine.branding.busyModeDisplay ===
633
- viewer_shared_types_1.BUSY_MODE_DISPLAY.BLUR) {
634
- this._renderingEngine.htmlElementAnchorLoader.toggleBusyMode(toggle);
635
- if (toggle) {
636
- if (navigator.userAgent.toLowerCase().indexOf("firefox") > -1 &&
637
- navigator.userAgent.toLowerCase().indexOf("android") > -1)
638
- return;
639
- this._renderingEngine.renderer.domElement.style.filter =
640
- "blur(3px)";
641
- }
642
- else {
643
- this._renderingEngine.renderer.domElement.style.filter = "";
644
- }
645
- }
646
- else if (this._renderingEngine.branding.busyModeDisplay ===
647
- viewer_shared_types_1.BUSY_MODE_DISPLAY.SPINNER) {
648
- if (toggle) {
649
- this._renderingEngine.spinnerDivElement.style.visibility =
650
- "visible";
651
- }
652
- else {
653
- this._renderingEngine.spinnerDivElement.style.visibility =
654
- "hidden";
655
- }
656
- }
657
- }
658
- toggleLogo(toggle) {
659
- if (this._renderingEngine.logoDivElement)
660
- this._renderingEngine.logoDivElement.style.display = toggle
661
- ? "inherit"
662
- : "none";
663
- if (this._renderingEngine.canvas)
664
- this._renderingEngine.canvas.style.display = !toggle
665
- ? "inherit"
666
- : "none";
667
- }
668
- }
669
- exports.RenderingManager = RenderingManager;
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.RenderingManager = void 0;
37
+ const viewer_rendering_engine_animation_engine_1 = require("@shapediver/viewer.rendering-engine.animation-engine");
38
+ const viewer_rendering_engine_animation_frame_engine_1 = require("@shapediver/viewer.rendering-engine.animation-frame-engine");
39
+ const viewer_rendering_engine_camera_engine_1 = require("@shapediver/viewer.rendering-engine.camera-engine");
40
+ const viewer_shared_node_tree_1 = require("@shapediver/viewer.shared.node-tree");
41
+ const viewer_shared_services_1 = require("@shapediver/viewer.shared.services");
42
+ const viewer_shared_types_1 = require("@shapediver/viewer.shared.types");
43
+ const Stats = __importStar(require("stats.js"));
44
+ const THREE = __importStar(require("three"));
45
+ const SceenTreeManagerUtils_1 = require("./sceneTree/SceenTreeManagerUtils");
46
+ class RenderingManager {
47
+ // #endregion Properties (30)
48
+ // #region Constructors (1)
49
+ constructor(_renderingEngine) {
50
+ this._renderingEngine = _renderingEngine;
51
+ // #region Properties (30)
52
+ this._animationEngine = viewer_rendering_engine_animation_engine_1.AnimationEngine.instance;
53
+ this._animationFrameEngine = viewer_rendering_engine_animation_frame_engine_1.AnimationFrameEngine.instance;
54
+ this._converter = viewer_shared_services_1.Converter.instance;
55
+ this._eventEngine = viewer_shared_services_1.EventEngine.instance;
56
+ this._logger = viewer_shared_services_1.Logger.instance;
57
+ this._systemInfo = viewer_shared_services_1.SystemInfo.instance;
58
+ this._tree = viewer_shared_node_tree_1.Tree.instance;
59
+ this._activeRendering = true;
60
+ this._cameraChanged = false;
61
+ this._continuousRendering = false;
62
+ this._continuousShadowMapUpdate = false;
63
+ this._height = 0;
64
+ this._hidden = true;
65
+ this._hiddenCamera = new THREE.PerspectiveCamera();
66
+ this._hiddenRenderTarget = new THREE.WebGLRenderTarget();
67
+ this._hideLogo = false;
68
+ this._lastSize = {
69
+ adjustedWidth: 0,
70
+ adjustedHeight: 0,
71
+ width: 0,
72
+ height: 0,
73
+ };
74
+ this._lightSizeUVEnd = 0.15;
75
+ this._lightSizeUVStart = 0.025;
76
+ this._maxTextureUnits = 0;
77
+ this._minimalRendering = false;
78
+ this._noWebGL = false;
79
+ this._runningAnimation = false;
80
+ this._sizeChanged = false;
81
+ this._softShadowRenderingActive = false;
82
+ this._softShadowRenderingDurationActive = 0;
83
+ this._softShadowRenderingTimeout = null;
84
+ this._usingSwiftShader = false;
85
+ this._width = 0;
86
+ this._updateShadowMapInNextRender = false;
87
+ }
88
+ // #endregion Constructors (1)
89
+ // #region Public Getters And Setters (6)
90
+ get continuousRendering() {
91
+ return this._continuousRendering;
92
+ }
93
+ set continuousRendering(value) {
94
+ this._continuousRendering = value;
95
+ }
96
+ get continuousShadowMapUpdate() {
97
+ return this._continuousShadowMapUpdate;
98
+ }
99
+ set continuousShadowMapUpdate(value) {
100
+ this._continuousShadowMapUpdate = value;
101
+ }
102
+ get minimalRendering() {
103
+ return this._minimalRendering;
104
+ }
105
+ get usingSwiftShader() {
106
+ return this._usingSwiftShader;
107
+ }
108
+ // #endregion Public Getters And Setters (6)
109
+ // #region Public Methods (10)
110
+ addLogo(canvas, branding) {
111
+ var _a, _b;
112
+ const logoDivElement = document.createElement("div");
113
+ logoDivElement.style.backgroundColor = branding.backgroundColor;
114
+ logoDivElement.classList.add("sdv-logo-container");
115
+ (_a = canvas.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(logoDivElement, (_b = canvas.parentElement) === null || _b === void 0 ? void 0 : _b.firstChild);
116
+ if (branding.logo) {
117
+ const img = new Image();
118
+ img.classList.add("sdv-logo");
119
+ img.src = branding.logo;
120
+ logoDivElement.appendChild(img);
121
+ }
122
+ return logoDivElement;
123
+ }
124
+ addSpinner(canvas, branding) {
125
+ var _a, _b;
126
+ const spinnerDivElement = document.createElement("div");
127
+ spinnerDivElement.classList.add("sdv-spinner-container");
128
+ spinnerDivElement.style.visibility = "hidden";
129
+ (_a = canvas.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(spinnerDivElement, (_b = canvas.parentElement) === null || _b === void 0 ? void 0 : _b.firstChild);
130
+ if (branding.busyModeSpinner) {
131
+ const img = new Image();
132
+ img.src = branding.busyModeSpinner;
133
+ img.classList.add("sdv-spinner");
134
+ img.classList.add("sdv-spinner-" +
135
+ branding.spinnerPositioning.replace("_", "-").toLowerCase());
136
+ spinnerDivElement.appendChild(img);
137
+ }
138
+ return spinnerDivElement;
139
+ }
140
+ createRenderer(canvas) {
141
+ const renderingProperties = {
142
+ alpha: true,
143
+ depth: true,
144
+ antialias: true,
145
+ preserveDrawingBuffer: true,
146
+ stencil: true,
147
+ premultipliedAlpha: true,
148
+ canvas,
149
+ };
150
+ const renderer = new THREE.WebGLRenderer(renderingProperties);
151
+ renderer.setPixelRatio(window.devicePixelRatio);
152
+ const context = renderer.getContext();
153
+ if (renderer.extensions.has("WEBGL_debug_renderer_info")) {
154
+ const debugInfo = renderer.extensions.get("WEBGL_debug_renderer_info");
155
+ // const vendor = context.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
156
+ const rendererInfo = context.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
157
+ if (rendererInfo === "Google SwiftShader") {
158
+ this._usingSwiftShader = true;
159
+ this._logger.warn("RenderingLogic.createWebGLContext: The current device is using Google SwiftShader, a CPU-based renderer. To achieve better rendering results, please enable GPU-rendering in your settings.");
160
+ }
161
+ }
162
+ if (!renderer.extensions.has("EXT_shader_texture_lod"))
163
+ this._minimalRendering = true;
164
+ renderer.outputColorSpace = THREE.SRGBColorSpace;
165
+ renderer.toneMapping = THREE.NoToneMapping;
166
+ renderer.shadowMap.enabled = true;
167
+ renderer.shadowMap.needsUpdate = true;
168
+ renderer.shadowMap.type = THREE.PCFSoftShadowMap;
169
+ renderer.shadowMap.autoUpdate = false;
170
+ renderer.localClippingEnabled = true;
171
+ // Performance: Disable object sorting to save CPU cycles per frame
172
+ // Objects are sorted by material/program by default which is usually sufficient
173
+ renderer.sortObjects = false;
174
+ renderer.setSize(canvas.width, canvas.height);
175
+ renderer.setClearColor(new THREE.Color("#ffffff"), 1);
176
+ this._maxTextureUnits = renderer
177
+ .getContext()
178
+ .getParameter(renderer.getContext().MAX_TEXTURE_IMAGE_UNITS);
179
+ return renderer;
180
+ }
181
+ evaluateTextureUnitCount(value) {
182
+ if (value > this._maxTextureUnits) {
183
+ this._logger.warn("RenderingManager.evaluateTextureUnitCount: Maximum number of texture units exceeded. Disabling shadows.");
184
+ this._renderingEngine.lightLoader.forceDisabledShadows = true;
185
+ this._renderingEngine.update("RenderingManager.evaluateTextureUnitCount");
186
+ }
187
+ else {
188
+ this._renderingEngine.lightLoader.forceDisabledShadows = false;
189
+ }
190
+ }
191
+ getScreenshot(type = "image/png", encoderOptions = 1) {
192
+ return this._renderingEngine.renderer.domElement.toDataURL(type, encoderOptions);
193
+ }
194
+ init() {
195
+ try {
196
+ this._renderingEngine.materialLoader.updateSoftShadow(this._lightSizeUVEnd, 1.0);
197
+ this._renderingEngine.renderer.shadowMap.type = THREE.PCFShadowMap;
198
+ this._renderingEngine.renderer.shadowMap.needsUpdate = true;
199
+ this._renderingEngine.materialLoader.updateMaterials();
200
+ this._eventEngine.addListener(viewer_shared_services_1.EVENTTYPE.CAMERA.CAMERA_START, (e) => {
201
+ const viewerEvent = e;
202
+ if (viewerEvent.viewportId === this._renderingEngine.id)
203
+ this.startRendering();
204
+ });
205
+ this._eventEngine.addListener(viewer_shared_services_1.EVENTTYPE.CAMERA.CAMERA_END, (e) => {
206
+ const viewerEvent = e;
207
+ if (viewerEvent.viewportId === this._renderingEngine.id)
208
+ this.stopRendering();
209
+ });
210
+ window.onresize = () => {
211
+ this.render();
212
+ };
213
+ this._renderingEngine.canvas.onresize = () => {
214
+ this.render();
215
+ };
216
+ this._renderingEngine.canvas.parentElement.onresize = () => {
217
+ this.render();
218
+ };
219
+ const stats1 = new Stats.default();
220
+ stats1.showPanel(0); // Panel 0 = fps
221
+ stats1.dom.style.cssText =
222
+ "position:absolute;top:0px;left:0px;display:none;";
223
+ this._renderingEngine.canvas.parentElement.appendChild(stats1.dom);
224
+ const stats2 = new Stats.default();
225
+ stats2.showPanel(1); // Panel 1 = ms
226
+ stats2.dom.style.cssText =
227
+ "position:absolute;top:0px;left:80px;display:none;";
228
+ this._renderingEngine.canvas.parentElement.appendChild(stats2.dom);
229
+ const stats3 = new Stats.default();
230
+ stats3.showPanel(2); // Panel 2 = ms
231
+ stats3.dom.style.cssText =
232
+ "position:absolute;top:0px;left:160px;display:none;";
233
+ this._renderingEngine.canvas.parentElement.appendChild(stats3.dom);
234
+ this._stats = {
235
+ stats: [stats1, stats2, stats3],
236
+ begin: () => {
237
+ stats1.begin();
238
+ stats2.begin();
239
+ stats3.begin();
240
+ },
241
+ end: () => {
242
+ stats1.end();
243
+ stats2.end();
244
+ stats3.end();
245
+ },
246
+ };
247
+ }
248
+ catch (e) {
249
+ this._noWebGL = true;
250
+ throw e;
251
+ }
252
+ }
253
+ render() {
254
+ this.startAndStopRendering();
255
+ }
256
+ resize(width, height) {
257
+ (this._width = width), (this._height = height);
258
+ this._renderingEngine.materialLoader.assignPointSize(this._renderingEngine.pointSize);
259
+ }
260
+ /**
261
+ * Must only be called once by the RenderingEngine!
262
+ */
263
+ start() {
264
+ this._animationFrameEngine.addAnimationFrameCallback(this.animate.bind(this));
265
+ this.startAndStopRendering();
266
+ }
267
+ updateShadowMap() {
268
+ this._updateShadowMapInNextRender = true;
269
+ }
270
+ // #endregion Public Methods (10)
271
+ // #region Private Methods (14)
272
+ activateBeautyRenderShaders() {
273
+ this._renderingEngine.renderer.shadowMap.type = THREE.PCFShadowMap;
274
+ this._renderingEngine.renderer.shadowMap.needsUpdate = true;
275
+ this._renderingEngine.materialLoader.updateMaterials();
276
+ }
277
+ animate(time, deltaTime, runningAnimation) {
278
+ var _a;
279
+ // animation loop - part 1: initial discarding
280
+ if (this._renderingEngine.closed || this._noWebGL)
281
+ return;
282
+ this._renderingEngine.evaluateFlagState();
283
+ // update if needed
284
+ if (this._renderingEngine.show === true &&
285
+ this._tree.root.version !==
286
+ this._renderingEngine.sceneTreeManager.lastRootVersion &&
287
+ this._renderingEngine.sceneTreeManager.suspendSceneUpdates === false) {
288
+ this._renderingEngine.sceneTreeManager.updateSceneTree(this._tree.root);
289
+ this.updateShadowMap();
290
+ this._animationEngine.updateAnimationData();
291
+ this.render();
292
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE_VIEWPORT.VIEWPORT_UPDATED, {
293
+ viewportId: this._renderingEngine.id,
294
+ });
295
+ }
296
+ if (this._renderingEngine.preRenderingCallback)
297
+ this._renderingEngine.preRenderingCallback(this._renderingEngine.renderer);
298
+ if (runningAnimation !== this._runningAnimation)
299
+ this.render();
300
+ this._runningAnimation = runningAnimation;
301
+ if (this._runningAnimation)
302
+ this._renderingEngine.sceneTreeManager.updateNode(undefined, undefined, { transformationOnly: true });
303
+ if (this._runningAnimation)
304
+ (0, SceenTreeManagerUtils_1.updateMorphWeights)(this._tree.root, this._renderingEngine.sceneTreeManager.mainNode);
305
+ // get the current size
306
+ const { width, height, adjustedWidth, adjustedHeight } = this.calculateSize();
307
+ const aspect = width / height;
308
+ this._sizeChanged =
309
+ this._lastSize.adjustedHeight !== adjustedHeight ||
310
+ this._lastSize.adjustedWidth !== adjustedWidth ||
311
+ this._lastSize.height !== height ||
312
+ this._lastSize.width !== width;
313
+ this._lastSize = { width, height, adjustedWidth, adjustedHeight };
314
+ // animation loop - part 3: update the camera, if there are new movements, they will start / continue the rendering
315
+ this._cameraChanged = this._renderingEngine.cameraEngine.camera
316
+ ? this._renderingEngine.cameraManager.updateCamera(deltaTime, aspect)
317
+ : false;
318
+ // animation loop - part 4: evaluating state
319
+ const states = this.evaluateRenderingState();
320
+ // toggle the blurring
321
+ this.toggleBusyMode(states.busyMode);
322
+ // animation loop - part 5: the scene is not even shown
323
+ if (states.showScene === false) {
324
+ // toggle on logo
325
+ this.toggleLogo(true);
326
+ if (this._hidden === false)
327
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.VIEWPORT.VIEWPORT_HIDDEN, { viewportId: this._renderingEngine.id });
328
+ this._hidden = true;
329
+ return;
330
+ }
331
+ else {
332
+ // we delay for one render call as some of the postprocessing effects have artefacts in the first call
333
+ if (this._hideLogo === true && this._hidden === true) {
334
+ this.toggleLogo(false);
335
+ this._hideLogo = false;
336
+ if (this._hidden === true)
337
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.VIEWPORT.VIEWPORT_VISIBLE, { viewportId: this._renderingEngine.id });
338
+ this._hidden = false;
339
+ }
340
+ else {
341
+ this._hideLogo = true;
342
+ if (this._hidden === true)
343
+ this._renderingEngine.postProcessingManager.changeEffectPass();
344
+ }
345
+ }
346
+ // animation loop - part 6: the scene is shown, but there is no active rendering happening
347
+ if (states.rendering === false || this._renderingEngine.pause === true)
348
+ return;
349
+ // animation loop - part 7: there is actual rendering happening
350
+ // do the things that have to be done for standard and beauty rendering in the same way
351
+ this._stats.begin();
352
+ this.showStatistics();
353
+ // animation loop - part 8: calculate the current size
354
+ const currentSize = new THREE.Vector2();
355
+ this._renderingEngine.renderer.getSize(currentSize);
356
+ // Performance: Direct property comparison instead of Vector2.equals()
357
+ if (currentSize.width !== adjustedWidth ||
358
+ currentSize.height !== adjustedHeight) {
359
+ this._renderingEngine.renderer.setSize(adjustedWidth, adjustedHeight);
360
+ this._renderingEngine.postProcessingManager.resize(adjustedWidth, adjustedHeight);
361
+ this._renderingEngine.renderer.domElement.style.width =
362
+ width + "px";
363
+ this._renderingEngine.renderer.domElement.style.height =
364
+ height + "px";
365
+ this._renderingEngine.materialLoader.assignPointSize(this._renderingEngine.pointSize);
366
+ }
367
+ // animation loop - part 9: adjust the camera (the rendering state would be false if we didn't have a camera)
368
+ const { camera, matrix } = this._renderingEngine.cameraManager.adjustCamera(aspect);
369
+ // if a matrix is provided after a camera adjustment
370
+ // that means that the turntable controls or the object controls are activated
371
+ if (matrix) {
372
+ for (let i = 0; i < this._tree.root.children.length; i++) {
373
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
374
+ if (!this._tree.root.children[i].sessionNode ||
375
+ this._tree.root.children[i].excludeViewports.includes(this._renderingEngine.id))
376
+ continue;
377
+ const transform = this._tree.root.children[i].transformations.find((t) => t.id === "objectRotation");
378
+ if (transform) {
379
+ transform.matrix = matrix;
380
+ }
381
+ else {
382
+ this._tree.root.children[i].addTransformation({
383
+ id: "objectRotation",
384
+ matrix,
385
+ });
386
+ }
387
+ }
388
+ states.updateShadowMap = true;
389
+ this._renderingEngine.sceneTreeManager.updateNode(undefined, undefined, { transformationOnly: true });
390
+ }
391
+ // animation loop - part 10: adjust the anchor elements
392
+ this._renderingEngine.htmlElementAnchorLoader.adjustPositions(adjustedWidth / width, adjustedHeight / height);
393
+ // animation loop - part 11: adjust some scene settings
394
+ // enable / disable the shadow map
395
+ const enabled = this._renderingEngine.renderer.shadowMap.enabled;
396
+ this._renderingEngine.renderer.shadowMap.enabled =
397
+ this._renderingEngine.usingSwiftShader ||
398
+ this._renderingEngine.type === viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES
399
+ ? false
400
+ : this._renderingEngine.shadows;
401
+ if (enabled !== this._renderingEngine.renderer.shadowMap.enabled)
402
+ this._renderingEngine.materialLoader.updateMaterials();
403
+ let threeJsLightObject, oldLightVisibility = true;
404
+ // enable / disable lights
405
+ if (this._renderingEngine.lights === false) {
406
+ const ls = this._renderingEngine.lightEngine.lightScene;
407
+ if (ls) {
408
+ threeJsLightObject = ls.node.convertedObject[this._renderingEngine.id];
409
+ if (threeJsLightObject) {
410
+ oldLightVisibility = threeJsLightObject.visible;
411
+ threeJsLightObject.visible = false;
412
+ }
413
+ }
414
+ }
415
+ // update shadowMap if need
416
+ if (states.updateShadowMap) {
417
+ if (this._renderingEngine.renderer.shadowMap.enabled)
418
+ this._renderingEngine.renderer.shadowMap.needsUpdate = true;
419
+ (_a = this._renderingEngine.environmentGeometryManager.contactShadow) === null || _a === void 0 ? void 0 : _a.render();
420
+ }
421
+ // enable / disable the background
422
+ this._renderingEngine.sceneTreeManager.scene.background = this
423
+ ._renderingEngine.environmentMapAsBackground
424
+ ? this._renderingEngine.environmentMapLoader.environmentMap
425
+ : null;
426
+ // set the background color / alpha
427
+ this._renderingEngine.renderer.setClearColor(new THREE.Color(this._converter.toThreeJsColorInput(this._renderingEngine.clearColor)), this._renderingEngine.clearAlpha);
428
+ // check if we should render with post-processing
429
+ const renderPostProcessing = (this._renderingEngine.postProcessingManager.effects.length > 0 ||
430
+ this._renderingEngine.postProcessingManager
431
+ .manualPostProcessing) &&
432
+ !(this._renderingEngine.postProcessingManager
433
+ .enablePostProcessingOnMobile === false &&
434
+ this._systemInfo.isMobile === true);
435
+ // animation loop - part 12: actual rendering separation
436
+ if (states.softShadowRendering === true) {
437
+ this.setShaderProperties();
438
+ if (renderPostProcessing) {
439
+ this._renderingEngine.postProcessingManager.render(deltaTime, camera);
440
+ }
441
+ else {
442
+ this._renderingEngine.renderer.render(this._renderingEngine.sceneTreeManager
443
+ .scene, camera);
444
+ }
445
+ // if the duration was long enough, disable the beauty rendering
446
+ if (this._softShadowRenderingDurationActive >=
447
+ this._renderingEngine.beautyRenderBlendingDuration) {
448
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.RENDERING.BEAUTY_RENDERING_FINISHED, { viewportId: this._renderingEngine.id });
449
+ this.deactivateBeautyRenderShaders();
450
+ this._activeRendering = false;
451
+ }
452
+ else {
453
+ this._softShadowRenderingDurationActive += deltaTime;
454
+ }
455
+ }
456
+ else {
457
+ if (renderPostProcessing) {
458
+ this._renderingEngine.postProcessingManager.render(deltaTime, camera);
459
+ }
460
+ else {
461
+ this._renderingEngine.renderer.render(this._renderingEngine.sceneTreeManager
462
+ .scene, camera);
463
+ }
464
+ // if the beauty rendering was active, disable it
465
+ if (this._softShadowRenderingActive) {
466
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.RENDERING.BEAUTY_RENDERING_FINISHED, { viewportId: this._renderingEngine.id });
467
+ this.deactivateBeautyRenderShaders();
468
+ this._activeRendering = false;
469
+ }
470
+ }
471
+ // reset the visibility of the threeJs light object
472
+ if (threeJsLightObject)
473
+ threeJsLightObject.visible = oldLightVisibility;
474
+ if (this._renderingEngine.postRenderingCallback)
475
+ this._renderingEngine.postRenderingCallback(this._renderingEngine.renderer, this._renderingEngine.scene, this._renderingEngine.camera);
476
+ this._stats.end();
477
+ }
478
+ calculateSize() {
479
+ if (this._renderingEngine.renderer.pixelRatio !==
480
+ window.devicePixelRatio) {
481
+ this._renderingEngine.renderer.setPixelRatio(window.devicePixelRatio);
482
+ }
483
+ let width = this._width, height = this._height;
484
+ if (this._renderingEngine.automaticResizing) {
485
+ width = this._renderingEngine.canvas.parentNode
486
+ .clientWidth;
487
+ height = this._renderingEngine.canvas.parentNode
488
+ .clientHeight;
489
+ }
490
+ const aspect = width / height;
491
+ let adjustedWidth = width, adjustedHeight = height;
492
+ if (width > this._renderingEngine.maximumRenderingSize.width ||
493
+ height > this._renderingEngine.maximumRenderingSize.height) {
494
+ if ((width - this._renderingEngine.maximumRenderingSize.width) /
495
+ aspect >
496
+ height - this._renderingEngine.maximumRenderingSize.height) {
497
+ adjustedWidth =
498
+ this._renderingEngine.maximumRenderingSize.width;
499
+ adjustedHeight =
500
+ this._renderingEngine.maximumRenderingSize.width / aspect;
501
+ }
502
+ else {
503
+ adjustedWidth =
504
+ this._renderingEngine.maximumRenderingSize.height * aspect;
505
+ adjustedHeight =
506
+ this._renderingEngine.maximumRenderingSize.height;
507
+ }
508
+ }
509
+ return {
510
+ width,
511
+ adjustedWidth,
512
+ height,
513
+ adjustedHeight,
514
+ };
515
+ }
516
+ deactivateBeautyRenderShaders() {
517
+ this._softShadowRenderingTimeout = null;
518
+ this._softShadowRenderingActive = false;
519
+ this._softShadowRenderingDurationActive = 0;
520
+ this._renderingEngine.renderer.shadowMap.type = THREE.PCFSoftShadowMap;
521
+ this._renderingEngine.renderer.shadowMap.needsUpdate = true;
522
+ this._renderingEngine.materialLoader.updateSoftShadow(this._lightSizeUVStart, 0.1);
523
+ this._renderingEngine.materialLoader.updateMaterials();
524
+ }
525
+ evaluateRenderingState() {
526
+ // If there is a camera to show the scene and the setting for it is set to true, we show the scene
527
+ let showScene = false;
528
+ if (this._renderingEngine.cameraEngine.camera &&
529
+ this._renderingEngine.show === true)
530
+ showScene = true;
531
+ // If we should render at all
532
+ let rendering = false;
533
+ if (this._activeRendering === true ||
534
+ this._cameraChanged === true ||
535
+ this._sizeChanged === true ||
536
+ this._runningAnimation === true ||
537
+ this._continuousRendering === true)
538
+ rendering = true;
539
+ let updateShadowMap = false;
540
+ if (this._runningAnimation === true ||
541
+ this._continuousShadowMapUpdate === true ||
542
+ this._updateShadowMapInNextRender === true) {
543
+ this._updateShadowMapInNextRender = false;
544
+ updateShadowMap = true;
545
+ }
546
+ // special case, autorotation
547
+ if (this._renderingEngine.cameraEngine.camera) {
548
+ const camera = this._renderingEngine.cameraEngine.camera;
549
+ if (camera.type === viewer_rendering_engine_camera_engine_1.CAMERA_TYPE.PERSPECTIVE) {
550
+ const controls = (camera.controls);
551
+ if (controls.enableAutoRotation === true &&
552
+ controls.autoRotationSpeed !== 0)
553
+ return {
554
+ showScene,
555
+ rendering: true,
556
+ updateShadowMap,
557
+ busyMode: this._renderingEngine.busy,
558
+ softShadowRendering: false,
559
+ };
560
+ }
561
+ }
562
+ else {
563
+ rendering = false;
564
+ }
565
+ // If the scene should be blurred
566
+ let busyMode = false;
567
+ if (this._renderingEngine.busy)
568
+ busyMode = true;
569
+ // If we should render in beauty mode
570
+ let softShadowRendering = false;
571
+ if (this._softShadowRenderingActive === true &&
572
+ busyMode === false &&
573
+ this._continuousRendering === false &&
574
+ (this._renderingEngine.shadows || !this._systemInfo.isIOS) &&
575
+ this._renderingEngine.usingSwiftShader === false &&
576
+ this._runningAnimation === false &&
577
+ this._renderingEngine.type !== viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES)
578
+ softShadowRendering = true;
579
+ return {
580
+ showScene,
581
+ rendering,
582
+ updateShadowMap,
583
+ busyMode,
584
+ softShadowRendering,
585
+ };
586
+ }
587
+ setShaderProperties() {
588
+ if (this._renderingEngine.softShadows === false) {
589
+ this._renderingEngine.materialLoader.updateSoftShadow(this._lightSizeUVStart, 0);
590
+ return 0;
591
+ }
592
+ const deltaTime = Math.min(this._softShadowRenderingDurationActive, this._renderingEngine.beautyRenderBlendingDuration);
593
+ const percentage = deltaTime / this._renderingEngine.beautyRenderBlendingDuration;
594
+ if (percentage < 0.25) {
595
+ const percentageMapped = percentage / 0.25;
596
+ this._renderingEngine.materialLoader.updateSoftShadow(this._lightSizeUVStart, percentageMapped);
597
+ }
598
+ else {
599
+ const percentageMapped = (percentage - 0.25) / (1 - 0.25);
600
+ // this._lightSizeUVStart -> this._lightSizeUVEnd
601
+ this._renderingEngine.materialLoader.updateSoftShadow(this._lightSizeUVStart +
602
+ (this._lightSizeUVEnd - this._lightSizeUVStart) *
603
+ percentageMapped, 1.0);
604
+ }
605
+ return percentage;
606
+ }
607
+ showStatistics() {
608
+ if (this._renderingEngine.showStatistics) {
609
+ for (let i = 0; i < this._stats.stats.length; i++)
610
+ this._stats.stats[i].dom.style.display = "";
611
+ }
612
+ else {
613
+ for (let i = 0; i < this._stats.stats.length; i++)
614
+ this._stats.stats[i].dom.style.display = "none";
615
+ }
616
+ }
617
+ startAndStopRendering() {
618
+ this._activeRendering = true;
619
+ this.stopBeautyRenderCountdown();
620
+ this.startBeautyRenderCountdown();
621
+ }
622
+ startBeautyRenderCountdown() {
623
+ this._softShadowRenderingTimeout = setTimeout(() => {
624
+ this._softShadowRenderingActive = true;
625
+ this._softShadowRenderingDurationActive = 0;
626
+ this.activateBeautyRenderShaders();
627
+ }, this._renderingEngine.beautyRenderDelay);
628
+ }
629
+ startRendering() {
630
+ this._activeRendering = true;
631
+ this.stopBeautyRenderCountdown();
632
+ }
633
+ stopBeautyRenderCountdown() {
634
+ if (this._softShadowRenderingTimeout)
635
+ clearTimeout(this._softShadowRenderingTimeout);
636
+ this.deactivateBeautyRenderShaders();
637
+ }
638
+ stopRendering() {
639
+ this.startBeautyRenderCountdown();
640
+ }
641
+ toggleBusyMode(toggle) {
642
+ if (this._renderingEngine.branding.busyModeDisplay ===
643
+ viewer_shared_types_1.BUSY_MODE_DISPLAY.BLUR) {
644
+ this._renderingEngine.htmlElementAnchorLoader.toggleBusyMode(toggle);
645
+ if (toggle) {
646
+ if (navigator.userAgent.toLowerCase().indexOf("firefox") > -1 &&
647
+ navigator.userAgent.toLowerCase().indexOf("android") > -1)
648
+ return;
649
+ this._renderingEngine.renderer.domElement.style.filter =
650
+ "blur(3px)";
651
+ }
652
+ else {
653
+ this._renderingEngine.renderer.domElement.style.filter = "";
654
+ }
655
+ }
656
+ else if (this._renderingEngine.branding.busyModeDisplay ===
657
+ viewer_shared_types_1.BUSY_MODE_DISPLAY.SPINNER) {
658
+ if (toggle) {
659
+ this._renderingEngine.spinnerDivElement.style.visibility =
660
+ "visible";
661
+ }
662
+ else {
663
+ this._renderingEngine.spinnerDivElement.style.visibility =
664
+ "hidden";
665
+ }
666
+ }
667
+ }
668
+ toggleLogo(toggle) {
669
+ if (this._renderingEngine.logoDivElement)
670
+ this._renderingEngine.logoDivElement.style.display = toggle
671
+ ? "inherit"
672
+ : "none";
673
+ if (this._renderingEngine.canvas)
674
+ this._renderingEngine.canvas.style.display = !toggle
675
+ ? "inherit"
676
+ : "none";
677
+ }
678
+ }
679
+ exports.RenderingManager = RenderingManager;
670
680
  //# sourceMappingURL=RenderingManager.js.map