@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.
- package/LICENSE +73 -0
- package/README.md +3 -0
- package/dist/RenderingEngine.d.ts +296 -0
- package/dist/RenderingEngine.d.ts.map +1 -0
- package/dist/RenderingEngine.js +1079 -0
- package/dist/RenderingEngine.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/injectors/Tag3dGeometryCreationInjector.d.ts +11 -0
- package/dist/injectors/Tag3dGeometryCreationInjector.d.ts.map +1 -0
- package/dist/injectors/Tag3dGeometryCreationInjector.js +169 -0
- package/dist/injectors/Tag3dGeometryCreationInjector.js.map +1 -0
- package/dist/injectors/TextureUnifierInjector.d.ts +14 -0
- package/dist/injectors/TextureUnifierInjector.d.ts.map +1 -0
- package/dist/injectors/TextureUnifierInjector.js +227 -0
- package/dist/injectors/TextureUnifierInjector.js.map +1 -0
- package/dist/interfaces/ILoader.d.ts +4 -0
- package/dist/interfaces/ILoader.d.ts.map +1 -0
- package/dist/interfaces/ILoader.js +3 -0
- package/dist/interfaces/ILoader.js.map +1 -0
- package/dist/interfaces/IPostProcessingEffectDefinitions.d.ts +307 -0
- package/dist/interfaces/IPostProcessingEffectDefinitions.d.ts.map +1 -0
- package/dist/interfaces/IPostProcessingEffectDefinitions.js +31 -0
- package/dist/interfaces/IPostProcessingEffectDefinitions.js.map +1 -0
- package/dist/interfaces/IRenderingEngine.d.ts +43 -0
- package/dist/interfaces/IRenderingEngine.d.ts.map +1 -0
- package/dist/interfaces/IRenderingEngine.js +3 -0
- package/dist/interfaces/IRenderingEngine.js.map +1 -0
- package/dist/loaders/EnvironmentMapLoader.d.ts +98 -0
- package/dist/loaders/EnvironmentMapLoader.d.ts.map +1 -0
- package/dist/loaders/EnvironmentMapLoader.js +348 -0
- package/dist/loaders/EnvironmentMapLoader.js.map +1 -0
- package/dist/loaders/GeometryLoader.d.ts +38 -0
- package/dist/loaders/GeometryLoader.d.ts.map +1 -0
- package/dist/loaders/GeometryLoader.js +505 -0
- package/dist/loaders/GeometryLoader.js.map +1 -0
- package/dist/loaders/HTMLElementAnchorLoader.d.ts +17 -0
- package/dist/loaders/HTMLElementAnchorLoader.d.ts.map +1 -0
- package/dist/loaders/HTMLElementAnchorLoader.js +84 -0
- package/dist/loaders/HTMLElementAnchorLoader.js.map +1 -0
- package/dist/loaders/LightLoader.d.ts +19 -0
- package/dist/loaders/LightLoader.d.ts.map +1 -0
- package/dist/loaders/LightLoader.js +152 -0
- package/dist/loaders/LightLoader.js.map +1 -0
- package/dist/loaders/MaterialLoader.d.ts +99 -0
- package/dist/loaders/MaterialLoader.d.ts.map +1 -0
- package/dist/loaders/MaterialLoader.js +1175 -0
- package/dist/loaders/MaterialLoader.js.map +1 -0
- package/dist/managers/CameraManager.d.ts +20 -0
- package/dist/managers/CameraManager.d.ts.map +1 -0
- package/dist/managers/CameraManager.js +195 -0
- package/dist/managers/CameraManager.js.map +1 -0
- package/dist/managers/EnvironmentGeometryManager.d.ts +43 -0
- package/dist/managers/EnvironmentGeometryManager.d.ts.map +1 -0
- package/dist/managers/EnvironmentGeometryManager.js +210 -0
- package/dist/managers/EnvironmentGeometryManager.js.map +1 -0
- package/dist/managers/PostProcessingManager.d.ts +1014 -0
- package/dist/managers/PostProcessingManager.d.ts.map +1 -0
- package/dist/managers/PostProcessingManager.js +1013 -0
- package/dist/managers/PostProcessingManager.js.map +1 -0
- package/dist/managers/RenderingManager.d.ts +83 -0
- package/dist/managers/RenderingManager.d.ts.map +1 -0
- package/dist/managers/RenderingManager.js +567 -0
- package/dist/managers/RenderingManager.js.map +1 -0
- package/dist/managers/SceneTracingManager.d.ts +26 -0
- package/dist/managers/SceneTracingManager.d.ts.map +1 -0
- package/dist/managers/SceneTracingManager.js +122 -0
- package/dist/managers/SceneTracingManager.js.map +1 -0
- package/dist/managers/SceneTreeManager.d.ts +55 -0
- package/dist/managers/SceneTreeManager.d.ts.map +1 -0
- package/dist/managers/SceneTreeManager.js +501 -0
- package/dist/managers/SceneTreeManager.js.map +1 -0
- package/dist/managers/postprocessing/GodRaysManager.d.ts +13 -0
- package/dist/managers/postprocessing/GodRaysManager.d.ts.map +1 -0
- package/dist/managers/postprocessing/GodRaysManager.js +64 -0
- package/dist/managers/postprocessing/GodRaysManager.js.map +1 -0
- package/dist/managers/postprocessing/OutlineManager.d.ts +15 -0
- package/dist/managers/postprocessing/OutlineManager.d.ts.map +1 -0
- package/dist/managers/postprocessing/OutlineManager.js +67 -0
- package/dist/managers/postprocessing/OutlineManager.js.map +1 -0
- package/dist/managers/postprocessing/SSAARenderPass.d.ts +54 -0
- package/dist/managers/postprocessing/SSAARenderPass.d.ts.map +1 -0
- package/dist/managers/postprocessing/SSAARenderPass.js +234 -0
- package/dist/managers/postprocessing/SSAARenderPass.js.map +1 -0
- package/dist/managers/postprocessing/SelectiveBloomManager.d.ts +15 -0
- package/dist/managers/postprocessing/SelectiveBloomManager.d.ts.map +1 -0
- package/dist/managers/postprocessing/SelectiveBloomManager.js +67 -0
- package/dist/managers/postprocessing/SelectiveBloomManager.js.map +1 -0
- package/dist/managers/postprocessing/ao/ao/AOEffect.d.ts +47 -0
- package/dist/managers/postprocessing/ao/ao/AOEffect.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/ao/AOEffect.js +134 -0
- package/dist/managers/postprocessing/ao/ao/AOEffect.js.map +1 -0
- package/dist/managers/postprocessing/ao/ao/AOPass.d.ts +13 -0
- package/dist/managers/postprocessing/ao/ao/AOPass.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/ao/AOPass.js +78 -0
- package/dist/managers/postprocessing/ao/ao/AOPass.js.map +1 -0
- package/dist/managers/postprocessing/ao/ao/shader/ao_compose.d.ts +2 -0
- package/dist/managers/postprocessing/ao/ao/shader/ao_compose.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/ao/shader/ao_compose.js +23 -0
- package/dist/managers/postprocessing/ao/ao/shader/ao_compose.js.map +1 -0
- package/dist/managers/postprocessing/ao/hbao/HBAOEffect.d.ts +15 -0
- package/dist/managers/postprocessing/ao/hbao/HBAOEffect.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/hbao/HBAOEffect.js +25 -0
- package/dist/managers/postprocessing/ao/hbao/HBAOEffect.js.map +1 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao.d.ts +2 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao.js +102 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao.js.map +1 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.d.ts +2 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.js +99 -0
- package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.js.map +1 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.d.ts +37 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js +171 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js.map +1 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.d.ts +2 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.js +131 -0
- package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.js.map +1 -0
- package/dist/managers/postprocessing/ao/ssao/SSAOEffect.d.ts +15 -0
- package/dist/managers/postprocessing/ao/ssao/SSAOEffect.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js +76 -0
- package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js.map +1 -0
- package/dist/managers/postprocessing/ao/ssao/shader/ssao.d.ts +2 -0
- package/dist/managers/postprocessing/ao/ssao/shader/ssao.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/ssao/shader/ssao.js +134 -0
- package/dist/managers/postprocessing/ao/ssao/shader/ssao.js.map +1 -0
- package/dist/managers/postprocessing/ao/utils/shader/basic.d.ts +2 -0
- package/dist/managers/postprocessing/ao/utils/shader/basic.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/utils/shader/basic.js +12 -0
- package/dist/managers/postprocessing/ao/utils/shader/basic.js.map +1 -0
- package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.d.ts +2 -0
- package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.d.ts.map +1 -0
- package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.js +42 -0
- package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.js.map +1 -0
- package/dist/managers/postprocessing/utils/CopyMaterial.d.ts +38 -0
- package/dist/managers/postprocessing/utils/CopyMaterial.d.ts.map +1 -0
- package/dist/managers/postprocessing/utils/CopyMaterial.js +106 -0
- package/dist/managers/postprocessing/utils/CopyMaterial.js.map +1 -0
- package/dist/managers/postprocessing/utils/CopyShader.d.ts +14 -0
- package/dist/managers/postprocessing/utils/CopyShader.d.ts.map +1 -0
- package/dist/managers/postprocessing/utils/CopyShader.js +36 -0
- package/dist/managers/postprocessing/utils/CopyShader.js.map +1 -0
- package/dist/managers/postprocessing/utils/FullScreenQuad.d.ts +10 -0
- package/dist/managers/postprocessing/utils/FullScreenQuad.d.ts.map +1 -0
- package/dist/managers/postprocessing/utils/FullScreenQuad.js +29 -0
- package/dist/managers/postprocessing/utils/FullScreenQuad.js.map +1 -0
- package/dist/managers/postprocessing/utils/NormalPass.d.ts +88 -0
- package/dist/managers/postprocessing/utils/NormalPass.d.ts.map +1 -0
- package/dist/managers/postprocessing/utils/NormalPass.js +157 -0
- package/dist/managers/postprocessing/utils/NormalPass.js.map +1 -0
- package/dist/managers/postprocessing/utils/RenderPass.d.ts +115 -0
- package/dist/managers/postprocessing/utils/RenderPass.d.ts.map +1 -0
- package/dist/managers/postprocessing/utils/RenderPass.js +251 -0
- package/dist/managers/postprocessing/utils/RenderPass.js.map +1 -0
- package/dist/materials/GemMaterial.d.ts +38 -0
- package/dist/materials/GemMaterial.d.ts.map +1 -0
- package/dist/materials/GemMaterial.js +253 -0
- package/dist/materials/GemMaterial.js.map +1 -0
- package/dist/materials/MeshUnlitMaterialParameters.d.ts +4 -0
- package/dist/materials/MeshUnlitMaterialParameters.d.ts.map +1 -0
- package/dist/materials/MeshUnlitMaterialParameters.js +3 -0
- package/dist/materials/MeshUnlitMaterialParameters.js.map +1 -0
- package/dist/materials/MultiPointsMaterial.d.ts +94 -0
- package/dist/materials/MultiPointsMaterial.d.ts.map +1 -0
- package/dist/materials/MultiPointsMaterial.js +567 -0
- package/dist/materials/MultiPointsMaterial.js.map +1 -0
- package/dist/materials/SpecularGlossinessMaterial.d.ts +14 -0
- package/dist/materials/SpecularGlossinessMaterial.d.ts.map +1 -0
- package/dist/materials/SpecularGlossinessMaterial.js +162 -0
- package/dist/materials/SpecularGlossinessMaterial.js.map +1 -0
- package/dist/objects/SDBone.d.ts +13 -0
- package/dist/objects/SDBone.d.ts.map +1 -0
- package/dist/objects/SDBone.js +75 -0
- package/dist/objects/SDBone.js.map +1 -0
- package/dist/objects/SDColor.d.ts +17 -0
- package/dist/objects/SDColor.d.ts.map +1 -0
- package/dist/objects/SDColor.js +49 -0
- package/dist/objects/SDColor.js.map +1 -0
- package/dist/objects/SDData.d.ts +19 -0
- package/dist/objects/SDData.d.ts.map +1 -0
- package/dist/objects/SDData.js +48 -0
- package/dist/objects/SDData.js.map +1 -0
- package/dist/objects/SDObject.d.ts +14 -0
- package/dist/objects/SDObject.d.ts.map +1 -0
- package/dist/objects/SDObject.js +81 -0
- package/dist/objects/SDObject.js.map +1 -0
- package/dist/shaders/PCSS.d.ts +3 -0
- package/dist/shaders/PCSS.d.ts.map +1 -0
- package/dist/shaders/PCSS.js +127 -0
- package/dist/shaders/PCSS.js.map +1 -0
- package/dist/shaders/gem.d.ts +3 -0
- package/dist/shaders/gem.d.ts.map +1 -0
- package/dist/shaders/gem.js +578 -0
- package/dist/shaders/gem.js.map +1 -0
- package/dist/shaders/multi_points.d.ts +3 -0
- package/dist/shaders/multi_points.d.ts.map +1 -0
- package/dist/shaders/multi_points.js +294 -0
- package/dist/shaders/multi_points.js.map +1 -0
- package/dist/styling/viewport-css.d.ts +2 -0
- package/dist/styling/viewport-css.d.ts.map +1 -0
- package/dist/styling/viewport-css.js +117 -0
- package/dist/styling/viewport-css.js.map +1 -0
- package/dist/three/font.d.ts +2365 -0
- package/dist/three/font.d.ts.map +1 -0
- package/dist/three/font.js +6 -0
- package/dist/three/font.js.map +1 -0
- package/dist/three/geometries/TextGeometry.d.ts +22 -0
- package/dist/three/geometries/TextGeometry.d.ts.map +1 -0
- package/dist/three/geometries/TextGeometry.js +45 -0
- package/dist/three/geometries/TextGeometry.js.map +1 -0
- package/dist/three/loaders/FontLoader.d.ts +15 -0
- package/dist/three/loaders/FontLoader.d.ts.map +1 -0
- package/dist/three/loaders/FontLoader.js +118 -0
- package/dist/three/loaders/FontLoader.js.map +1 -0
- package/dist/three/loaders/RGBELoader.d.ts +24 -0
- package/dist/three/loaders/RGBELoader.d.ts.map +1 -0
- package/dist/three/loaders/RGBELoader.js +299 -0
- package/dist/three/loaders/RGBELoader.js.map +1 -0
- package/dist/types/IThreejsData.d.ts +7 -0
- package/dist/types/IThreejsData.d.ts.map +1 -0
- package/dist/types/IThreejsData.js +3 -0
- package/dist/types/IThreejsData.js.map +1 -0
- package/dist/types/ThreejsData.d.ts +11 -0
- package/dist/types/ThreejsData.d.ts.map +1 -0
- package/dist/types/ThreejsData.js +42 -0
- package/dist/types/ThreejsData.js.map +1 -0
- package/package.json +65 -0
- package/src/RenderingEngine.ts +1342 -0
- package/src/index.ts +23 -0
- package/src/injectors/Tag3dGeometryCreationInjector.ts +170 -0
- package/src/injectors/TextureUnifierInjector.ts +224 -0
- package/src/interfaces/ILoader.ts +3 -0
- package/src/interfaces/IPostProcessingEffectDefinitions.ts +402 -0
- package/src/interfaces/IRenderingEngine.ts +48 -0
- package/src/loaders/EnvironmentMapLoader.ts +355 -0
- package/src/loaders/GeometryLoader.ts +565 -0
- package/src/loaders/HTMLElementAnchorLoader.ts +107 -0
- package/src/loaders/LightLoader.ts +171 -0
- package/src/loaders/MaterialLoader.ts +1418 -0
- package/src/managers/CameraManager.ts +178 -0
- package/src/managers/EnvironmentGeometryManager.ts +224 -0
- package/src/managers/PostProcessingManager.ts +1169 -0
- package/src/managers/RenderingManager.ts +657 -0
- package/src/managers/SceneTracingManager.ts +120 -0
- package/src/managers/SceneTreeManager.ts +569 -0
- package/src/managers/postprocessing/GodRaysManager.ts +52 -0
- package/src/managers/postprocessing/OutlineManager.ts +58 -0
- package/src/managers/postprocessing/SSAARenderPass.ts +339 -0
- package/src/managers/postprocessing/SelectiveBloomManager.ts +58 -0
- package/src/managers/postprocessing/ao/ao/AOEffect.ts +180 -0
- package/src/managers/postprocessing/ao/ao/AOPass.ts +128 -0
- package/src/managers/postprocessing/ao/ao/shader/ao_compose.glsl +17 -0
- package/src/managers/postprocessing/ao/ao/shader/ao_compose.ts +19 -0
- package/src/managers/postprocessing/ao/hbao/HBAOEffect.ts +41 -0
- package/src/managers/postprocessing/ao/hbao/shader/hbao.glsl +96 -0
- package/src/managers/postprocessing/ao/hbao/shader/hbao.ts +98 -0
- package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.glsl +92 -0
- package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.ts +95 -0
- package/src/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.ts +245 -0
- package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.glsl +125 -0
- package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.ts +127 -0
- package/src/managers/postprocessing/ao/ssao/SSAOEffect.ts +106 -0
- package/src/managers/postprocessing/ao/ssao/shader/ssao.glsl +128 -0
- package/src/managers/postprocessing/ao/ssao/shader/ssao.ts +130 -0
- package/src/managers/postprocessing/ao/utils/shader/basic.glsl +6 -0
- package/src/managers/postprocessing/ao/utils/shader/basic.ts +8 -0
- package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.glsl +36 -0
- package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.ts +38 -0
- package/src/managers/postprocessing/utils/CopyMaterial.ts +130 -0
- package/src/managers/postprocessing/utils/CopyShader.ts +39 -0
- package/src/managers/postprocessing/utils/FullScreenQuad.ts +47 -0
- package/src/managers/postprocessing/utils/NormalPass.ts +222 -0
- package/src/managers/postprocessing/utils/RenderPass.ts +366 -0
- package/src/materials/GemMaterial.ts +268 -0
- package/src/materials/MeshUnlitMaterialParameters.ts +4 -0
- package/src/materials/MultiPointsMaterial.ts +646 -0
- package/src/materials/SpecularGlossinessMaterial.ts +182 -0
- package/src/objects/SDBone.ts +51 -0
- package/src/objects/SDColor.ts +54 -0
- package/src/objects/SDData.ts +44 -0
- package/src/objects/SDObject.ts +58 -0
- package/src/shaders/PCSS.ts +124 -0
- package/src/shaders/gem.ts +575 -0
- package/src/shaders/gem_frag.glsl +517 -0
- package/src/shaders/gem_vert.glsl +53 -0
- package/src/shaders/multi_points.ts +291 -0
- package/src/shaders/multi_points_frag.glsl +166 -0
- package/src/shaders/multi_points_vert.glsl +120 -0
- package/src/styling/viewport-css.ts +113 -0
- package/src/styling/viewport.css +111 -0
- package/src/three/font.ts +2 -0
- package/src/three/geometries/TextGeometry.ts +58 -0
- package/src/three/loaders/FontLoader.ts +205 -0
- package/src/three/loaders/RGBELoader.ts +496 -0
- package/src/types/IThreejsData.ts +16 -0
- package/src/types/ThreejsData.ts +43 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import {
|
|
3
|
+
AttributeData,
|
|
4
|
+
GeometryData,
|
|
5
|
+
IAttributeData,
|
|
6
|
+
IMaterialAbstractData,
|
|
7
|
+
IPrimitiveData,
|
|
8
|
+
MATERIAL_SIDE,
|
|
9
|
+
MaterialGemData,
|
|
10
|
+
PRIMITIVE_MODE
|
|
11
|
+
} from '@shapediver/viewer.shared.types';
|
|
12
|
+
import { GemMaterial } from '../materials/GemMaterial';
|
|
13
|
+
import { IBox } from '@shapediver/viewer.shared.math';
|
|
14
|
+
import { ILoader } from '../interfaces/ILoader';
|
|
15
|
+
import { Logger, ShapeDiverViewerDataProcessingError } from '@shapediver/viewer.shared.services';
|
|
16
|
+
import { RENDERER_TYPE } from '@shapediver/viewer.rendering-engine.rendering-engine';
|
|
17
|
+
import { RenderingEngine } from '../RenderingEngine';
|
|
18
|
+
import { SDData } from '../objects/SDData';
|
|
19
|
+
import { vec3 } from 'gl-matrix';
|
|
20
|
+
|
|
21
|
+
export class GeometryLoader implements ILoader {
|
|
22
|
+
// #region Properties (8)
|
|
23
|
+
|
|
24
|
+
private _gemCubeCamera?: THREE.CubeCamera;
|
|
25
|
+
private _gemCubeCameraRenderTarget?: THREE.WebGLCubeRenderTarget;
|
|
26
|
+
private _gemNormalMaterial?: THREE.ShaderMaterial;
|
|
27
|
+
private _gemScene?: THREE.Scene;
|
|
28
|
+
private _gemSphericalMapsCache: {
|
|
29
|
+
[key: string]: {
|
|
30
|
+
texture: THREE.CubeTexture,
|
|
31
|
+
renderTarget: THREE.WebGLCubeRenderTarget,
|
|
32
|
+
counter: number
|
|
33
|
+
}
|
|
34
|
+
} = {};
|
|
35
|
+
private _geometryCache: {
|
|
36
|
+
[key: string]: {
|
|
37
|
+
obj: SDData
|
|
38
|
+
}
|
|
39
|
+
} = {};
|
|
40
|
+
private _logger: Logger = Logger.instance;
|
|
41
|
+
private _primitiveCache: {
|
|
42
|
+
[key: string]: {
|
|
43
|
+
counter: number,
|
|
44
|
+
threeGeometry: THREE.BufferGeometry,
|
|
45
|
+
clones: THREE.BufferGeometry[]
|
|
46
|
+
}
|
|
47
|
+
} = {};
|
|
48
|
+
|
|
49
|
+
// #endregion Properties (8)
|
|
50
|
+
|
|
51
|
+
// #region Constructors (1)
|
|
52
|
+
|
|
53
|
+
constructor(private readonly _renderingEngine: RenderingEngine) { }
|
|
54
|
+
|
|
55
|
+
// #endregion Constructors (1)
|
|
56
|
+
|
|
57
|
+
// #region Public Methods (7)
|
|
58
|
+
|
|
59
|
+
public emptyGeometryCache() {
|
|
60
|
+
this._geometryCache = {};
|
|
61
|
+
this._primitiveCache = {};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public init(): void { }
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Create a geometry object with the provided geometry data.
|
|
68
|
+
*
|
|
69
|
+
* @param geometry the geometry data
|
|
70
|
+
* @returns the geometry object
|
|
71
|
+
*/
|
|
72
|
+
public load(geometry: GeometryData, parent: SDData, newChild: boolean, skeleton?: THREE.Skeleton): IBox {
|
|
73
|
+
const threeGeometry = (() => {
|
|
74
|
+
if (!this._primitiveCache[geometry.primitive.id + '_' + geometry.primitive.version]) {
|
|
75
|
+
return this.loadPrimitive(geometry.primitive);
|
|
76
|
+
} else {
|
|
77
|
+
this._primitiveCache[geometry.primitive.id + '_' + geometry.primitive.version].counter++;
|
|
78
|
+
const clone = this._primitiveCache[geometry.primitive.id + '_' + geometry.primitive.version].threeGeometry.clone();
|
|
79
|
+
this._primitiveCache[geometry.primitive.id + '_' + geometry.primitive.version].clones.push(clone);
|
|
80
|
+
return clone;
|
|
81
|
+
}
|
|
82
|
+
})();
|
|
83
|
+
|
|
84
|
+
let incomingMaterialData: IMaterialAbstractData | null;
|
|
85
|
+
if (geometry.effectMaterials.length > 0) {
|
|
86
|
+
incomingMaterialData = geometry.effectMaterials[geometry.effectMaterials.length - 1].material;
|
|
87
|
+
} else if (this._renderingEngine.type === RENDERER_TYPE.ATTRIBUTES) {
|
|
88
|
+
incomingMaterialData = geometry.attributeMaterial;
|
|
89
|
+
} else {
|
|
90
|
+
incomingMaterialData = geometry.material;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const materialSettings = {
|
|
94
|
+
mode: geometry.mode,
|
|
95
|
+
useVertexTangents: threeGeometry.attributes.tangent !== undefined,
|
|
96
|
+
useVertexColors: threeGeometry.attributes.color !== undefined && this._renderingEngine.type !== RENDERER_TYPE.ATTRIBUTES,
|
|
97
|
+
useFlatShading: threeGeometry.attributes.normal === undefined,
|
|
98
|
+
useMorphTargets: Object.keys(threeGeometry.morphAttributes).length > 0,
|
|
99
|
+
useMorphNormals: Object.keys(threeGeometry.morphAttributes).length > 0 && threeGeometry.morphAttributes.normal !== undefined
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
if (incomingMaterialData instanceof MaterialGemData) {
|
|
103
|
+
const gemMaterialData = <MaterialGemData>incomingMaterialData;
|
|
104
|
+
threeGeometry.computeBoundingSphere();
|
|
105
|
+
|
|
106
|
+
const sphericalNormalMap = this.createCubeNormalMap(geometry, threeGeometry);
|
|
107
|
+
|
|
108
|
+
const center = threeGeometry.boundingSphere!.center,
|
|
109
|
+
radius = threeGeometry.boundingSphere!.radius;
|
|
110
|
+
|
|
111
|
+
gemMaterialData.side = MATERIAL_SIDE.FRONT;
|
|
112
|
+
|
|
113
|
+
gemMaterialData.center = vec3.fromValues(center.x, center.y, center.z);
|
|
114
|
+
gemMaterialData.radius = radius;
|
|
115
|
+
(<unknown>gemMaterialData.sphericalNormalMap) = sphericalNormalMap;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
while (parent.children.length !== 0)
|
|
119
|
+
parent.remove(parent.children[0]);
|
|
120
|
+
|
|
121
|
+
const material = this._renderingEngine.materialLoader.load(incomingMaterialData || geometry, materialSettings);
|
|
122
|
+
let obj: SDData;
|
|
123
|
+
if (this._geometryCache[geometry.id + '_' + geometry.version] && !skeleton) {
|
|
124
|
+
obj = this._geometryCache[geometry.id + '_' + geometry.version].obj;
|
|
125
|
+
|
|
126
|
+
// case 1: in case the geometry data was cloned and this is a different object
|
|
127
|
+
// case 2: it is a new child
|
|
128
|
+
if (newChild === false && obj.parent !== parent || newChild === true) {
|
|
129
|
+
obj = obj.cloneObject() as SDData;
|
|
130
|
+
parent.add(obj);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
obj.traverse(o => {
|
|
134
|
+
if (
|
|
135
|
+
o instanceof THREE.Points ||
|
|
136
|
+
o instanceof THREE.LineSegments ||
|
|
137
|
+
o instanceof THREE.LineLoop ||
|
|
138
|
+
o instanceof THREE.Line ||
|
|
139
|
+
o instanceof THREE.Mesh)
|
|
140
|
+
o.material = material;
|
|
141
|
+
});
|
|
142
|
+
} else {
|
|
143
|
+
obj = new SDData(geometry.id, geometry.version);
|
|
144
|
+
this.createMesh(obj, geometry, threeGeometry, material, skeleton);
|
|
145
|
+
this._geometryCache[geometry.id + '_' + geometry.version] = { obj };
|
|
146
|
+
parent.add(obj);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
obj.children.forEach(m => m.castShadow = true);
|
|
150
|
+
if (material instanceof GemMaterial) {
|
|
151
|
+
obj.children.forEach(m => m.receiveShadow = false);
|
|
152
|
+
} else {
|
|
153
|
+
obj.children.forEach(m => m.receiveShadow = true);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return geometry.boundingBox.clone();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
public loadPrimitive(primitive: IPrimitiveData): THREE.BufferGeometry {
|
|
160
|
+
const geometry = new THREE.BufferGeometry();
|
|
161
|
+
if (primitive.indices)
|
|
162
|
+
geometry.setIndex(new THREE.BufferAttribute(primitive.indices!.array, primitive.indices!.itemSize));
|
|
163
|
+
|
|
164
|
+
for (const attributeId in primitive.attributes) {
|
|
165
|
+
const buffer = this.loadAttribute(primitive.attributes[attributeId], attributeId);
|
|
166
|
+
const attributeName = this.getAttributeName(attributeId);
|
|
167
|
+
|
|
168
|
+
if (attributeId === 'NORMAL')
|
|
169
|
+
if (this.checkNormals(primitive, attributeId, buffer, geometry))
|
|
170
|
+
continue;
|
|
171
|
+
|
|
172
|
+
geometry.setAttribute(attributeName, buffer);
|
|
173
|
+
|
|
174
|
+
const morphAttributeData = primitive.attributes[attributeId].morphAttributeData;
|
|
175
|
+
if (morphAttributeData.length > 0) {
|
|
176
|
+
geometry.morphTargetsRelative = true;
|
|
177
|
+
const buffers: (THREE.BufferAttribute | THREE.InterleavedBufferAttribute)[] = [];
|
|
178
|
+
for (let i = 0; i < morphAttributeData.length; i++)
|
|
179
|
+
buffers.push(this.loadAttribute(morphAttributeData[i], attributeId));
|
|
180
|
+
geometry.morphAttributes[attributeName] = buffers;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// we copy the uv coordinates into the second set of uv coordinates if there are none
|
|
184
|
+
// this allows for the usage of AO and light maps that share this coordinate set
|
|
185
|
+
const attributeIdUV2 = 'TEXCOORD_1', attributeNameUV2 = 'uv1';
|
|
186
|
+
if (attributeName === 'uv' && !primitive.attributes[attributeIdUV2]) {
|
|
187
|
+
geometry.setAttribute(attributeNameUV2, buffer);
|
|
188
|
+
|
|
189
|
+
const morphAttributeData = primitive.attributes[attributeId].morphAttributeData;
|
|
190
|
+
if (morphAttributeData.length > 0) {
|
|
191
|
+
geometry.morphTargetsRelative = true;
|
|
192
|
+
const buffers: (THREE.BufferAttribute | THREE.InterleavedBufferAttribute)[] = [];
|
|
193
|
+
for (let i = 0; i < morphAttributeData.length; i++)
|
|
194
|
+
buffers.push(this.loadAttribute(morphAttributeData[i], attributeId));
|
|
195
|
+
geometry.morphAttributes[attributeNameUV2] = buffers;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
primitive.convertedObject[this._renderingEngine.id] = geometry;
|
|
200
|
+
|
|
201
|
+
this._primitiveCache[primitive.id + '_' + primitive.version] = { threeGeometry: geometry, counter: 1, clones: [] };
|
|
202
|
+
return geometry;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
public removeFromGemSphericalMapsCache(id: string) {
|
|
206
|
+
if (this._gemSphericalMapsCache[id]) {
|
|
207
|
+
if (this._gemSphericalMapsCache[id].counter === 1) {
|
|
208
|
+
this._gemSphericalMapsCache[id].renderTarget.dispose();
|
|
209
|
+
this._gemSphericalMapsCache[id].texture.dispose();
|
|
210
|
+
delete this._gemSphericalMapsCache[id];
|
|
211
|
+
} else {
|
|
212
|
+
this._gemSphericalMapsCache[id].counter--;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
public removeFromGeometryCache(id: string) {
|
|
218
|
+
if (this._geometryCache[id])
|
|
219
|
+
delete this._geometryCache[id];
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
public removeFromPrimitiveCache(id: string) {
|
|
223
|
+
if (this._primitiveCache[id]) {
|
|
224
|
+
if (this._primitiveCache[id].counter === 1) {
|
|
225
|
+
this._primitiveCache[id].threeGeometry.dispose();
|
|
226
|
+
for (const key in this._primitiveCache[id].threeGeometry.attributes)
|
|
227
|
+
this._primitiveCache[id].threeGeometry.deleteAttribute(key);
|
|
228
|
+
this._primitiveCache[id].threeGeometry.setIndex(null);
|
|
229
|
+
|
|
230
|
+
this._primitiveCache[id].clones.forEach(c => {
|
|
231
|
+
c.dispose();
|
|
232
|
+
for (const key in c.attributes)
|
|
233
|
+
c.deleteAttribute(key);
|
|
234
|
+
c.setIndex(null);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
delete this._primitiveCache[id];
|
|
238
|
+
} else {
|
|
239
|
+
this._primitiveCache[id].counter--;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// #endregion Public Methods (7)
|
|
245
|
+
|
|
246
|
+
// #region Private Methods (6)
|
|
247
|
+
|
|
248
|
+
private checkNormals(primitive: IPrimitiveData, attributeId: string, buffer: THREE.InterleavedBufferAttribute | THREE.BufferAttribute, geometry: THREE.BufferGeometry): boolean {
|
|
249
|
+
let blnNormalsOk = false;
|
|
250
|
+
for (let index = 0; index < 10; ++index) {
|
|
251
|
+
if (Math.abs(buffer.array[index * 3]) > 0.001) {
|
|
252
|
+
blnNormalsOk = true;
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
if (
|
|
256
|
+
Math.abs(buffer.array[index * 3 + 1]) > 0.001
|
|
257
|
+
) {
|
|
258
|
+
blnNormalsOk = true;
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
if (
|
|
262
|
+
Math.abs(buffer.array[index * 3 + 2]) > 0.001
|
|
263
|
+
) {
|
|
264
|
+
blnNormalsOk = true;
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (!blnNormalsOk) {
|
|
269
|
+
geometry.computeVertexNormals();
|
|
270
|
+
const computedNormalAttribute = <THREE.BufferAttribute>geometry.getAttribute('normal');
|
|
271
|
+
|
|
272
|
+
// store the computed normals in the attribute data
|
|
273
|
+
primitive.attributes[attributeId] = new AttributeData(
|
|
274
|
+
new Float32Array(computedNormalAttribute.array),
|
|
275
|
+
computedNormalAttribute.itemSize,
|
|
276
|
+
0,
|
|
277
|
+
0,
|
|
278
|
+
3,
|
|
279
|
+
computedNormalAttribute.normalized,
|
|
280
|
+
computedNormalAttribute.array.length / 3);
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
private convertToTriangleMode(geometry: THREE.BufferGeometry, drawMode: PRIMITIVE_MODE) {
|
|
287
|
+
let index = geometry.getIndex();
|
|
288
|
+
// generate index if not present
|
|
289
|
+
if (index === null) {
|
|
290
|
+
const indices = [];
|
|
291
|
+
const position = geometry.getAttribute('position');
|
|
292
|
+
if (position !== undefined) {
|
|
293
|
+
for (let i = 0; i < position.count; i++)
|
|
294
|
+
indices.push(i);
|
|
295
|
+
geometry.setIndex(indices);
|
|
296
|
+
index = geometry.getIndex();
|
|
297
|
+
} else {
|
|
298
|
+
throw new ShapeDiverViewerDataProcessingError('GeometryLoader.convertToTriangleMode: Undefined position attribute. Processing not possible.');
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (index === null)
|
|
303
|
+
throw new ShapeDiverViewerDataProcessingError('GeometryLoader.convertToTriangleMode: Undefined index. Processing not possible.');
|
|
304
|
+
|
|
305
|
+
const numberOfTriangles = index.count - 2;
|
|
306
|
+
const newIndices = [];
|
|
307
|
+
if (drawMode === PRIMITIVE_MODE.TRIANGLE_FAN) {
|
|
308
|
+
for (let i = 1; i <= numberOfTriangles; i++) {
|
|
309
|
+
newIndices.push(index.getX(0));
|
|
310
|
+
newIndices.push(index.getX(i));
|
|
311
|
+
newIndices.push(index.getX(i + 1));
|
|
312
|
+
}
|
|
313
|
+
} else {
|
|
314
|
+
for (let i = 0; i < numberOfTriangles; i++) {
|
|
315
|
+
if (i % 2 === 0) {
|
|
316
|
+
newIndices.push(index.getX(i));
|
|
317
|
+
newIndices.push(index.getX(i + 1));
|
|
318
|
+
newIndices.push(index.getX(i + 2));
|
|
319
|
+
} else {
|
|
320
|
+
newIndices.push(index.getX(i + 2));
|
|
321
|
+
newIndices.push(index.getX(i + 1));
|
|
322
|
+
newIndices.push(index.getX(i));
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if ((newIndices.length / 3) !== numberOfTriangles)
|
|
328
|
+
throw new ShapeDiverViewerDataProcessingError('GeometryLoader.convertToTriangleMode: Unable to generate correct amount of triangle.');
|
|
329
|
+
|
|
330
|
+
geometry.setIndex(newIndices);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
private createCubeNormalMap(geometryData: GeometryData, geometry: THREE.BufferGeometry, resolution = 1024) {
|
|
334
|
+
if (this._gemSphericalMapsCache[geometryData.primitive.id + '_' + geometryData.primitive.version]) {
|
|
335
|
+
this._gemSphericalMapsCache[geometryData.primitive.id + '_' + geometryData.primitive.version].counter++;
|
|
336
|
+
return this._gemSphericalMapsCache[geometryData.primitive.id + '_' + geometryData.primitive.version].texture;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
if (!this._gemScene) {
|
|
340
|
+
this._gemScene = new THREE.Scene();
|
|
341
|
+
this._gemCubeCameraRenderTarget = new THREE.WebGLCubeRenderTarget(resolution, { format: THREE.RGBAFormat, magFilter: THREE.LinearFilter, minFilter: THREE.LinearFilter });
|
|
342
|
+
this._gemCubeCameraRenderTarget.texture.generateMipmaps = false;
|
|
343
|
+
this._gemCubeCameraRenderTarget.texture.minFilter = THREE.NearestFilter;
|
|
344
|
+
this._gemCubeCameraRenderTarget.texture.magFilter = THREE.NearestFilter;
|
|
345
|
+
this._gemCubeCameraRenderTarget.texture.format = THREE.RGBAFormat;
|
|
346
|
+
this._gemCubeCamera = new THREE.CubeCamera(0.001, 10000, this._gemCubeCameraRenderTarget);
|
|
347
|
+
this._gemScene.add(this._gemCubeCamera);
|
|
348
|
+
} else {
|
|
349
|
+
this._gemCubeCameraRenderTarget = new THREE.WebGLCubeRenderTarget(resolution, { format: THREE.RGBAFormat, magFilter: THREE.LinearFilter, minFilter: THREE.LinearFilter });
|
|
350
|
+
this._gemCubeCameraRenderTarget.texture.generateMipmaps = false;
|
|
351
|
+
this._gemCubeCameraRenderTarget.texture.minFilter = THREE.NearestFilter;
|
|
352
|
+
this._gemCubeCameraRenderTarget.texture.magFilter = THREE.NearestFilter;
|
|
353
|
+
this._gemCubeCameraRenderTarget.texture.format = THREE.RGBAFormat;
|
|
354
|
+
this._gemCubeCamera!.renderTarget = this._gemCubeCameraRenderTarget;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (!this._gemNormalMaterial) {
|
|
358
|
+
const _normalShader = {
|
|
359
|
+
defines: {},
|
|
360
|
+
uniforms: THREE.UniformsUtils.merge([
|
|
361
|
+
THREE.UniformsLib.common]),
|
|
362
|
+
vertexShader: `
|
|
363
|
+
varying vec3 vNormal;
|
|
364
|
+
|
|
365
|
+
void main() {
|
|
366
|
+
vNormal = normal;
|
|
367
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
368
|
+
}
|
|
369
|
+
`,
|
|
370
|
+
fragmentShader: `
|
|
371
|
+
varying highp vec3 vNormal;
|
|
372
|
+
|
|
373
|
+
float decodeFloat(float f) {
|
|
374
|
+
float r = mod(f, 1.0/255.0);
|
|
375
|
+
return /*r > 0.5/256.0 ? f + (1.0/256.0) - r : */f - r;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
vec3 decodeVec3(vec3 v) {
|
|
379
|
+
return vec3(decodeFloat(v.x), decodeFloat(v.y), decodeFloat(v.z));
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
float signEncoding(vec3 v) {
|
|
383
|
+
float code = 1.0;
|
|
384
|
+
if(v.x < 0.0 && v.y < 0.0 && v.z < 0.0) {
|
|
385
|
+
code = 0.0;
|
|
386
|
+
} else if (v.x < 0.0 && v.y < 0.0) {
|
|
387
|
+
code = 2.0/256.0;
|
|
388
|
+
} else if (v.x < 0.0 && v.z < 0.0) {
|
|
389
|
+
code = 4.0/256.0;
|
|
390
|
+
} else if (v.y < 0.0 && v.z < 0.0) {
|
|
391
|
+
code = 6.0/256.0;
|
|
392
|
+
} else if (v.x < 0.0) {
|
|
393
|
+
code = 8.0/256.0;
|
|
394
|
+
} else if (v.y < 0.0) {
|
|
395
|
+
code = 10.0/256.0;
|
|
396
|
+
} else if (v.z < 0.0) {
|
|
397
|
+
code = 12.0/256.0;
|
|
398
|
+
}
|
|
399
|
+
return code;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
void main() {
|
|
403
|
+
vec3 n = normalize(vNormal);
|
|
404
|
+
gl_FragColor = vec4(decodeVec3(abs(n)), signEncoding(n));
|
|
405
|
+
}
|
|
406
|
+
`
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
this._gemNormalMaterial = new THREE.ShaderMaterial({
|
|
410
|
+
uniforms: THREE.UniformsUtils.clone(_normalShader.uniforms),
|
|
411
|
+
defines: _normalShader.defines,
|
|
412
|
+
vertexShader: _normalShader.vertexShader,
|
|
413
|
+
fragmentShader: _normalShader.fragmentShader
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
this._gemNormalMaterial.blending = THREE.NoBlending;
|
|
417
|
+
this._gemNormalMaterial.side = THREE.DoubleSide;
|
|
418
|
+
this._gemScene.overrideMaterial = this._gemNormalMaterial;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
const mesh = new THREE.Mesh(geometry.clone(), this._gemNormalMaterial);
|
|
422
|
+
mesh.geometry.center();
|
|
423
|
+
this._gemScene.add(mesh);
|
|
424
|
+
|
|
425
|
+
this._gemCubeCamera!.update(this._renderingEngine.renderer, this._gemScene);
|
|
426
|
+
this._gemScene.remove(mesh);
|
|
427
|
+
mesh.geometry.dispose();
|
|
428
|
+
mesh.material.dispose();
|
|
429
|
+
|
|
430
|
+
this._gemCubeCamera!.renderTarget.texture.userData = {
|
|
431
|
+
SDid: geometryData.primitive.id,
|
|
432
|
+
SDversion: geometryData.primitive.version
|
|
433
|
+
};
|
|
434
|
+
|
|
435
|
+
this._gemSphericalMapsCache[geometryData.primitive.id + '_' + geometryData.primitive.version] = { texture: this._gemCubeCameraRenderTarget.texture, renderTarget: this._gemCubeCameraRenderTarget, counter: 1 };
|
|
436
|
+
return this._gemSphericalMapsCache[geometryData.primitive.id + '_' + geometryData.primitive.version].texture;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
private createMesh(obj: SDData, geometry: GeometryData, threeGeometry: THREE.BufferGeometry, material: THREE.Material, skeleton?: THREE.Skeleton) {
|
|
440
|
+
if (geometry.mode === PRIMITIVE_MODE.POINTS) {
|
|
441
|
+
const points = new THREE.Points(threeGeometry, material);
|
|
442
|
+
geometry.convertedObject[this._renderingEngine.id] = points;
|
|
443
|
+
obj.add(points);
|
|
444
|
+
} else if (geometry.mode === PRIMITIVE_MODE.LINES) {
|
|
445
|
+
const lineSegments = new THREE.LineSegments(threeGeometry, material);
|
|
446
|
+
geometry.convertedObject[this._renderingEngine.id] = lineSegments;
|
|
447
|
+
obj.add(lineSegments);
|
|
448
|
+
} else if (geometry.mode === PRIMITIVE_MODE.LINE_LOOP) {
|
|
449
|
+
const lineLoop = new THREE.LineLoop(threeGeometry, material);
|
|
450
|
+
geometry.convertedObject[this._renderingEngine.id] = lineLoop;
|
|
451
|
+
obj.add(lineLoop);
|
|
452
|
+
} else if (geometry.mode === PRIMITIVE_MODE.LINE_STRIP) {
|
|
453
|
+
const line = new THREE.Line(threeGeometry, material);
|
|
454
|
+
geometry.convertedObject[this._renderingEngine.id] = line;
|
|
455
|
+
obj.add(line);
|
|
456
|
+
} else if (geometry.mode === PRIMITIVE_MODE.TRIANGLES || geometry.mode === PRIMITIVE_MODE.TRIANGLE_STRIP || geometry.mode === PRIMITIVE_MODE.TRIANGLE_FAN) {
|
|
457
|
+
const bufferGeometry = threeGeometry;
|
|
458
|
+
if (geometry.mode === PRIMITIVE_MODE.TRIANGLE_STRIP || geometry.mode === PRIMITIVE_MODE.TRIANGLE_FAN)
|
|
459
|
+
this.convertToTriangleMode(bufferGeometry, geometry.mode);
|
|
460
|
+
|
|
461
|
+
if (skeleton) {
|
|
462
|
+
const skinnedMesh = new THREE.SkinnedMesh(bufferGeometry, material);
|
|
463
|
+
geometry.convertedObject[this._renderingEngine.id] = skinnedMesh;
|
|
464
|
+
skinnedMesh.bind(skeleton, skinnedMesh.matrixWorld);
|
|
465
|
+
|
|
466
|
+
if ((<THREE.BufferAttribute>bufferGeometry.attributes.skinWeight).normalized)
|
|
467
|
+
skinnedMesh.normalizeSkinWeights();
|
|
468
|
+
|
|
469
|
+
obj.add(skinnedMesh);
|
|
470
|
+
} else {
|
|
471
|
+
const mesh = new THREE.Mesh(bufferGeometry, material);
|
|
472
|
+
geometry.convertedObject[this._renderingEngine.id] = mesh;
|
|
473
|
+
obj.add(mesh);
|
|
474
|
+
}
|
|
475
|
+
} else {
|
|
476
|
+
throw new ShapeDiverViewerDataProcessingError(`GeometryLoader.load: Unrecognized primitive mode ${geometry.mode}.`);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
obj.traverse(m => {
|
|
480
|
+
if (m instanceof THREE.Mesh || m instanceof THREE.Points || m instanceof THREE.LineSegments || m instanceof THREE.LineLoop || m instanceof THREE.Line) {
|
|
481
|
+
(<THREE.Mesh>m).geometry.userData = {
|
|
482
|
+
SDid: geometry.id,
|
|
483
|
+
SDversion: geometry.version,
|
|
484
|
+
primitiveSDid: geometry.primitive.id,
|
|
485
|
+
primitiveSDversion: geometry.primitive.version
|
|
486
|
+
};
|
|
487
|
+
m.renderOrder = geometry.renderOrder;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
if (m instanceof THREE.Mesh && m.userData.transparencyPlaceholder !== true) {
|
|
491
|
+
(<THREE.Mesh>m).geometry.boundingBox = new THREE.Box3(new THREE.Vector3(geometry.boundingBox.min[0], geometry.boundingBox.min[1], geometry.boundingBox.min[2]), new THREE.Vector3(geometry.boundingBox.max[0], geometry.boundingBox.max[1], geometry.boundingBox.max[2]));
|
|
492
|
+
(<THREE.Mesh>m).geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(geometry.boundingBox.boundingSphere.center[0], geometry.boundingBox.boundingSphere.center[1], geometry.boundingBox.boundingSphere.center[2]), geometry.boundingBox.boundingSphere.radius);
|
|
493
|
+
(<THREE.Mesh>m).morphTargetInfluences = geometry.morphWeights;
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
private getAttributeName(attributeId: string): string {
|
|
499
|
+
switch (attributeId) {
|
|
500
|
+
case 'POSITION':
|
|
501
|
+
return 'position';
|
|
502
|
+
case 'NORMAL':
|
|
503
|
+
return 'normal';
|
|
504
|
+
case 'TEXCOORD_0':
|
|
505
|
+
case 'TEXCOORD0':
|
|
506
|
+
case 'TEXCOORD':
|
|
507
|
+
case 'UV':
|
|
508
|
+
return 'uv';
|
|
509
|
+
case 'TEXCOORD_1':
|
|
510
|
+
return 'uv1';
|
|
511
|
+
case 'TEXCOORD_2':
|
|
512
|
+
return 'uv2';
|
|
513
|
+
case 'TEXCOORD_3':
|
|
514
|
+
return 'uv3';
|
|
515
|
+
case 'COLOR_0':
|
|
516
|
+
case 'COLOR0':
|
|
517
|
+
case 'COLOR':
|
|
518
|
+
return 'color';
|
|
519
|
+
case 'WEIGHT':
|
|
520
|
+
case 'WEIGHTS_0':
|
|
521
|
+
return 'skinWeight';
|
|
522
|
+
case 'JOINT':
|
|
523
|
+
case 'JOINTS_0':
|
|
524
|
+
return 'skinIndex';
|
|
525
|
+
case 'TANGENT':
|
|
526
|
+
return 'tangent';
|
|
527
|
+
case 'POSITION_INDEX':
|
|
528
|
+
return 'positionIndex';
|
|
529
|
+
default:
|
|
530
|
+
this._logger.warn(`GeometryLoader.loadPrimitive: Unrecognized attribute id ${attributeId}.`);
|
|
531
|
+
}
|
|
532
|
+
return '';
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
private loadAttribute(bufferAttribute: IAttributeData, attributeId: string) {
|
|
536
|
+
let buffer: THREE.InterleavedBufferAttribute | THREE.BufferAttribute;
|
|
537
|
+
|
|
538
|
+
if (bufferAttribute.byteStride && bufferAttribute.byteStride !== bufferAttribute.itemBytes) {
|
|
539
|
+
// Integer parameters to IB/IBA are in array elements, not bytes.
|
|
540
|
+
const ib = new THREE.InterleavedBuffer(bufferAttribute.array, bufferAttribute.byteStride / bufferAttribute.elementBytes);
|
|
541
|
+
buffer = new THREE.InterleavedBufferAttribute(ib, bufferAttribute.itemSize, (bufferAttribute.byteOffset % bufferAttribute.byteStride) / bufferAttribute.elementBytes, bufferAttribute.normalized);
|
|
542
|
+
} else {
|
|
543
|
+
buffer = new THREE.BufferAttribute(bufferAttribute.array, bufferAttribute.itemSize, (attributeId === 'COLOR_0' || attributeId === 'COLOR0' || attributeId === 'COLOR') ? true : bufferAttribute.normalized);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
if (bufferAttribute.sparse) {
|
|
547
|
+
if (bufferAttribute.array !== null) {
|
|
548
|
+
// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.
|
|
549
|
+
buffer = new THREE.BufferAttribute(bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
for (let i = 0, il = bufferAttribute.sparseIndices!.length; i < il; i++) {
|
|
553
|
+
const index = bufferAttribute.sparseIndices![i];
|
|
554
|
+
buffer.setX(index, bufferAttribute.sparseValues![i * bufferAttribute.itemSize]);
|
|
555
|
+
if (bufferAttribute.itemSize >= 2) buffer.setY(index, bufferAttribute.sparseValues![i * bufferAttribute.itemSize + 1]);
|
|
556
|
+
if (bufferAttribute.itemSize >= 3) buffer.setZ(index, bufferAttribute.sparseValues![i * bufferAttribute.itemSize + 2]);
|
|
557
|
+
if (bufferAttribute.itemSize >= 4) buffer.setW(index, bufferAttribute.sparseValues![i * bufferAttribute.itemSize + 3]);
|
|
558
|
+
if (bufferAttribute.itemSize >= 5) throw new ShapeDiverViewerDataProcessingError('GeometryLoader.loadPrimitive: Unsupported itemSize in sparse BufferAttribute.');
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
return buffer;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// #endregion Private Methods (6)
|
|
565
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { BUSY_MODE_DISPLAY } from '@shapediver/viewer.rendering-engine.rendering-engine';
|
|
2
|
+
import { HTMLElementAnchorData } from '@shapediver/viewer.shared.types';
|
|
3
|
+
import { ILoader } from '../interfaces/ILoader';
|
|
4
|
+
import { ITreeNode } from '@shapediver/viewer.shared.node-tree';
|
|
5
|
+
import { RenderingEngine } from '../RenderingEngine';
|
|
6
|
+
import { vec2, vec3 } from 'gl-matrix';
|
|
7
|
+
|
|
8
|
+
export class HTMLElementAnchorLoader implements ILoader {
|
|
9
|
+
// #region Properties (2)
|
|
10
|
+
|
|
11
|
+
private readonly _htmlElements: {
|
|
12
|
+
[key: string]: {
|
|
13
|
+
anchor: HTMLElementAnchorData,
|
|
14
|
+
node: ITreeNode
|
|
15
|
+
}
|
|
16
|
+
} = {};
|
|
17
|
+
private readonly _parentDiv: HTMLDivElement;
|
|
18
|
+
|
|
19
|
+
// #endregion Properties (2)
|
|
20
|
+
|
|
21
|
+
// #region Constructors (1)
|
|
22
|
+
|
|
23
|
+
constructor(private readonly _renderingEngine: RenderingEngine) {
|
|
24
|
+
this._parentDiv = document.createElement('div');
|
|
25
|
+
this._parentDiv.classList.add('sdv-anchor-container');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// #endregion Constructors (1)
|
|
29
|
+
|
|
30
|
+
// #region Public Getters And Setters (1)
|
|
31
|
+
|
|
32
|
+
public get parentDiv(): HTMLDivElement {
|
|
33
|
+
return this._parentDiv;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// #endregion Public Getters And Setters (1)
|
|
37
|
+
|
|
38
|
+
// #region Public Methods (5)
|
|
39
|
+
|
|
40
|
+
public adjustPositions(scaleWidth: number, scaleHeight: number): void {
|
|
41
|
+
for (const anchorId in this._htmlElements) {
|
|
42
|
+
const anchor = this._htmlElements[anchorId].anchor;
|
|
43
|
+
const { page, container, client, hidden } = this._renderingEngine.sceneTracingManager.convert3Dto2D(vec3.clone(anchor.location));
|
|
44
|
+
|
|
45
|
+
const htmlElement = anchor.createViewerHtmlElement(this._renderingEngine.id);
|
|
46
|
+
if (!htmlElement) continue;
|
|
47
|
+
|
|
48
|
+
let node = this._htmlElements[anchorId].node;
|
|
49
|
+
|
|
50
|
+
let visible = node.visible;
|
|
51
|
+
while (node.parent) {
|
|
52
|
+
node = node.parent;
|
|
53
|
+
visible = node.visible && visible;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (this._renderingEngine.show === false)
|
|
57
|
+
visible = false;
|
|
58
|
+
|
|
59
|
+
anchor.update({ anchor, htmlElement, page, container, client, scale: vec2.fromValues(scaleWidth, scaleHeight), hidden, visible });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public init(): void {
|
|
64
|
+
this._renderingEngine.canvas.parentNode?.appendChild(this._parentDiv);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public load(node: ITreeNode, anchor: HTMLElementAnchorData, isVisibleInHierarchy: boolean): void {
|
|
68
|
+
const htmlElement = anchor.createViewerHtmlElement(this._renderingEngine.id);
|
|
69
|
+
if (!htmlElement) return;
|
|
70
|
+
|
|
71
|
+
// set the display property to "none" if the viewport is not shown or the node is not visible
|
|
72
|
+
if (this._renderingEngine.show === false || isVisibleInHierarchy === false) htmlElement.style.display = 'none';
|
|
73
|
+
|
|
74
|
+
// if the node is not visible return
|
|
75
|
+
if (isVisibleInHierarchy === false) return;
|
|
76
|
+
|
|
77
|
+
this._parentDiv.appendChild(htmlElement);
|
|
78
|
+
this._htmlElements[anchor.id + '_' + anchor.version] = {
|
|
79
|
+
node,
|
|
80
|
+
anchor
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public removeData(id: string, version: string) {
|
|
85
|
+
// since the data object might be there, but no data is loaded for this viewport
|
|
86
|
+
// this check is needed
|
|
87
|
+
if (!this._htmlElements[id + '_' + version]) return;
|
|
88
|
+
|
|
89
|
+
const anchor = this._htmlElements[id + '_' + version].anchor;
|
|
90
|
+
if (anchor && anchor.getViewerHtmlElement(this._renderingEngine.id)) {
|
|
91
|
+
this._parentDiv.removeChild(anchor.getViewerHtmlElement(this._renderingEngine.id)!);
|
|
92
|
+
delete this._htmlElements[id + '_' + version];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public toggleBusyMode(toggle: boolean) {
|
|
97
|
+
if (toggle && this._renderingEngine.busyModeDisplay === BUSY_MODE_DISPLAY.BLUR) {
|
|
98
|
+
if (navigator.userAgent.toLowerCase().indexOf('firefox') > -1 && navigator.userAgent.toLowerCase().indexOf('android') > -1)
|
|
99
|
+
return;
|
|
100
|
+
this._parentDiv.style.filter = 'blur(3px)';
|
|
101
|
+
} else {
|
|
102
|
+
this._parentDiv.style.filter = '';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// #endregion Public Methods (5)
|
|
107
|
+
}
|