angular-three-soba 1.12.4 → 1.14.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/abstractions/lib/billboard/billboard.d.ts +1 -1
- package/abstractions/lib/catmull-rom-line/catmull-rom-line.d.ts +1 -1
- package/abstractions/lib/cubic-bezier-line/cubic-bezier-line.d.ts +1 -1
- package/abstractions/lib/edges/edges.d.ts +2 -2
- package/abstractions/lib/gizmo-helper/gizmo-helper.d.ts +1 -1
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +1 -1
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +2 -2
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +1 -1
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +1 -1
- package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +2 -2
- package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +1 -1
- package/abstractions/lib/line/line-input.d.ts +1 -1
- package/abstractions/lib/line/line.d.ts +1 -1
- package/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.d.ts +1 -1
- package/abstractions/lib/text/text.d.ts +1 -1
- package/abstractions/lib/text-3d/text-3d.d.ts +1 -1
- package/cameras/lib/camera/camera-content.d.ts +1 -1
- package/cameras/lib/camera/camera.d.ts +1 -1
- package/cameras/lib/cube-camera/cube-camera.d.ts +1 -1
- package/cameras/lib/orthographic-camera/orthographic-camera.d.ts +1 -1
- package/controls/lib/orbit-controls/orbit-controls.d.ts +1 -1
- package/esm2022/abstractions/lib/billboard/billboard.mjs +74 -0
- package/esm2022/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +120 -0
- package/esm2022/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +99 -0
- package/esm2022/abstractions/lib/edges/edges.mjs +96 -0
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-helper.mjs +213 -0
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +92 -0
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +184 -0
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +46 -0
- package/{esm2020 → esm2022}/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +8 -7
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +195 -0
- package/{esm2020 → esm2022}/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +8 -7
- package/esm2022/abstractions/lib/line/line-input.mjs +76 -0
- package/esm2022/abstractions/lib/line/line.mjs +133 -0
- package/esm2022/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +128 -0
- package/esm2022/abstractions/lib/text/text.mjs +115 -0
- package/esm2022/abstractions/lib/text-3d/text-3d.mjs +145 -0
- package/esm2022/cameras/lib/camera/camera-content.mjs +21 -0
- package/esm2022/cameras/lib/camera/camera.mjs +75 -0
- package/esm2022/cameras/lib/cube-camera/cube-camera.mjs +131 -0
- package/esm2022/cameras/lib/orthographic-camera/orthographic-camera.mjs +93 -0
- package/{esm2020 → esm2022}/cameras/lib/perspective-camera/perspective-camera.mjs +8 -7
- package/esm2022/controls/lib/orbit-controls/orbit-controls.mjs +147 -0
- package/esm2022/loaders/index.mjs +6 -0
- package/esm2022/loaders/lib/cube-texture-loader/cube-texture-loader.mjs +10 -0
- package/esm2022/loaders/lib/loader/loader.mjs +134 -0
- package/esm2022/materials/lib/mesh-distort-material/mesh-distort-material.mjs +75 -0
- package/esm2022/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +328 -0
- package/esm2022/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +158 -0
- package/esm2022/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +238 -0
- package/esm2022/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +68 -0
- package/esm2022/misc/lib/bake-shadows/bake-shadows.mjs +26 -0
- package/esm2022/performance/lib/adaptive/adaptive-dpr.mjs +47 -0
- package/esm2022/performance/lib/adaptive/adaptive-events.mjs +37 -0
- package/esm2022/performance/lib/detailed/detailed.mjs +54 -0
- package/esm2022/performance/lib/stats/stats.mjs +80 -0
- package/esm2022/shaders/lib/blur-pass/blur-pass.mjs +61 -0
- package/esm2022/staging/lib/accumulative-shadows/accumulative-shadows.mjs +249 -0
- package/esm2022/staging/lib/accumulative-shadows/randomized-lights.mjs +201 -0
- package/{esm2020 → esm2022}/staging/lib/bounds/bounds.mjs +8 -7
- package/esm2022/staging/lib/camera-shake/camera-shake.mjs +122 -0
- package/esm2022/staging/lib/caustics/caustics.mjs +364 -0
- package/esm2022/staging/lib/center/center.mjs +143 -0
- package/esm2022/staging/lib/cloud/cloud.mjs +160 -0
- package/esm2022/staging/lib/contact-shadows/contact-shadows.mjs +228 -0
- package/esm2022/staging/lib/environment/environment-cube.mjs +41 -0
- package/esm2022/staging/lib/environment/environment-ground.mjs +67 -0
- package/esm2022/staging/lib/environment/environment-inputs.mjs +87 -0
- package/esm2022/staging/lib/environment/environment-map.mjs +39 -0
- package/esm2022/staging/lib/environment/environment-portal.mjs +111 -0
- package/{esm2020 → esm2022}/staging/lib/environment/environment.mjs +13 -11
- package/esm2022/staging/lib/float/float.mjs +77 -0
- package/esm2022/staging/lib/sky/sky.mjs +109 -0
- package/esm2022/staging/lib/sparkles/sparkles.mjs +210 -0
- package/esm2022/staging/lib/spot-light/shadow-mesh-input.mjs +51 -0
- package/esm2022/staging/lib/spot-light/spot-light-input.mjs +62 -0
- package/esm2022/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +74 -0
- package/esm2022/staging/lib/spot-light/spot-light-shadow-shader.mjs +126 -0
- package/{esm2020 → esm2022}/staging/lib/spot-light/spot-light-shadow.mjs +8 -7
- package/esm2022/staging/lib/spot-light/spot-light.mjs +117 -0
- package/esm2022/staging/lib/spot-light/volumetric-mesh.mjs +86 -0
- package/{esm2020 → esm2022}/staging/lib/stage/stage.mjs +13 -11
- package/esm2022/staging/lib/stars/stars.mjs +140 -0
- package/{fesm2020 → fesm2022}/angular-three-soba-abstractions.mjs +89 -89
- package/{fesm2015 → fesm2022}/angular-three-soba-abstractions.mjs.map +1 -1
- package/{fesm2015 → fesm2022}/angular-three-soba-cameras.mjs +21 -21
- package/{fesm2015 → fesm2022}/angular-three-soba-cameras.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/angular-three-soba-controls.mjs +5 -5
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/angular-three-soba-loaders.mjs +15 -8
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/angular-three-soba-materials.mjs +25 -25
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/angular-three-soba-misc.mjs +3 -3
- package/{fesm2020 → fesm2022}/angular-three-soba-misc.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/angular-three-soba-performance.mjs +14 -14
- package/{fesm2020 → fesm2022}/angular-three-soba-performance.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/angular-three-soba-shaders.mjs +2 -2
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/angular-three-soba-staging.mjs +139 -139
- package/{fesm2020 → fesm2022}/angular-three-soba-staging.mjs.map +1 -1
- package/loaders/index.d.ts +1 -0
- package/loaders/lib/cube-texture-loader/cube-texture-loader.d.ts +3 -0
- package/loaders/lib/loader/loader.d.ts +1 -1
- package/materials/lib/mesh-distort-material/mesh-distort-material.d.ts +8 -3
- package/materials/lib/mesh-reflector-material/mesh-reflector-material.d.ts +1 -1
- package/materials/lib/mesh-refraction-material/mesh-refraction-material.d.ts +1 -1
- package/materials/lib/mesh-transmission-material/mesh-transmission-material.d.ts +1 -1
- package/materials/lib/mesh-wobble-material/mesh-wobble-material.d.ts +1 -1
- package/package.json +43 -68
- package/performance/lib/adaptive/adaptive-dpr.d.ts +1 -1
- package/performance/lib/detailed/detailed.d.ts +1 -1
- package/performance/lib/stats/stats.d.ts +1 -1
- package/plugin/package.json +1 -1
- package/plugin/src/generators/init/compat.js +1 -1
- package/plugin/src/generators/init/compat.js.map +1 -1
- package/plugin/src/generators/init/init.d.ts +1 -1
- package/plugin/src/generators/init/init.js +1 -1
- package/plugin/src/generators/init/init.js.map +1 -1
- package/staging/lib/accumulative-shadows/accumulative-shadows.d.ts +2 -2
- package/staging/lib/accumulative-shadows/randomized-lights.d.ts +1 -1
- package/staging/lib/bounds/bounds.d.ts +1 -1
- package/staging/lib/camera-shake/camera-shake.d.ts +1 -1
- package/staging/lib/caustics/caustics.d.ts +2 -2
- package/staging/lib/center/center.d.ts +1 -1
- package/staging/lib/cloud/cloud.d.ts +1 -1
- package/staging/lib/contact-shadows/contact-shadows.d.ts +1 -1
- package/staging/lib/environment/environment-inputs.d.ts +1 -1
- package/staging/lib/float/float.d.ts +1 -1
- package/staging/lib/sky/sky.d.ts +1 -1
- package/staging/lib/sparkles/sparkles.d.ts +2 -2
- package/staging/lib/spot-light/shadow-mesh-input.d.ts +1 -1
- package/staging/lib/spot-light/spot-light-input.d.ts +1 -1
- package/staging/lib/spot-light/spot-light-shadow-no-shader.d.ts +1 -1
- package/staging/lib/spot-light/spot-light-shadow-shader.d.ts +1 -1
- package/staging/lib/spot-light/spot-light.d.ts +1 -1
- package/staging/lib/spot-light/volumetric-mesh.d.ts +1 -1
- package/staging/lib/stage/stage.d.ts +2 -2
- package/staging/lib/stars/stars.d.ts +2 -2
- package/esm2020/abstractions/lib/billboard/billboard.mjs +0 -73
- package/esm2020/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +0 -119
- package/esm2020/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +0 -98
- package/esm2020/abstractions/lib/edges/edges.mjs +0 -95
- package/esm2020/abstractions/lib/gizmo-helper/gizmo-helper.mjs +0 -211
- package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -91
- package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -182
- package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -45
- package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -193
- package/esm2020/abstractions/lib/line/line-input.mjs +0 -75
- package/esm2020/abstractions/lib/line/line.mjs +0 -132
- package/esm2020/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -127
- package/esm2020/abstractions/lib/text/text.mjs +0 -114
- package/esm2020/abstractions/lib/text-3d/text-3d.mjs +0 -144
- package/esm2020/cameras/lib/camera/camera-content.mjs +0 -20
- package/esm2020/cameras/lib/camera/camera.mjs +0 -74
- package/esm2020/cameras/lib/cube-camera/cube-camera.mjs +0 -130
- package/esm2020/cameras/lib/orthographic-camera/orthographic-camera.mjs +0 -92
- package/esm2020/controls/lib/orbit-controls/orbit-controls.mjs +0 -146
- package/esm2020/loaders/index.mjs +0 -5
- package/esm2020/loaders/lib/loader/loader.mjs +0 -133
- package/esm2020/materials/lib/mesh-distort-material/mesh-distort-material.mjs +0 -74
- package/esm2020/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -327
- package/esm2020/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -157
- package/esm2020/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -237
- package/esm2020/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -67
- package/esm2020/misc/lib/bake-shadows/bake-shadows.mjs +0 -25
- package/esm2020/performance/lib/adaptive/adaptive-dpr.mjs +0 -46
- package/esm2020/performance/lib/adaptive/adaptive-events.mjs +0 -36
- package/esm2020/performance/lib/detailed/detailed.mjs +0 -53
- package/esm2020/performance/lib/stats/stats.mjs +0 -79
- package/esm2020/shaders/lib/blur-pass/blur-pass.mjs +0 -61
- package/esm2020/staging/lib/accumulative-shadows/accumulative-shadows.mjs +0 -247
- package/esm2020/staging/lib/accumulative-shadows/randomized-lights.mjs +0 -199
- package/esm2020/staging/lib/camera-shake/camera-shake.mjs +0 -121
- package/esm2020/staging/lib/caustics/caustics.mjs +0 -363
- package/esm2020/staging/lib/center/center.mjs +0 -142
- package/esm2020/staging/lib/cloud/cloud.mjs +0 -159
- package/esm2020/staging/lib/contact-shadows/contact-shadows.mjs +0 -227
- package/esm2020/staging/lib/environment/environment-cube.mjs +0 -40
- package/esm2020/staging/lib/environment/environment-ground.mjs +0 -66
- package/esm2020/staging/lib/environment/environment-inputs.mjs +0 -86
- package/esm2020/staging/lib/environment/environment-map.mjs +0 -38
- package/esm2020/staging/lib/environment/environment-portal.mjs +0 -110
- package/esm2020/staging/lib/float/float.mjs +0 -76
- package/esm2020/staging/lib/sky/sky.mjs +0 -108
- package/esm2020/staging/lib/sparkles/sparkles.mjs +0 -209
- package/esm2020/staging/lib/spot-light/shadow-mesh-input.mjs +0 -50
- package/esm2020/staging/lib/spot-light/spot-light-input.mjs +0 -61
- package/esm2020/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +0 -73
- package/esm2020/staging/lib/spot-light/spot-light-shadow-shader.mjs +0 -125
- package/esm2020/staging/lib/spot-light/spot-light.mjs +0 -116
- package/esm2020/staging/lib/spot-light/volumetric-mesh.mjs +0 -85
- package/esm2020/staging/lib/stars/stars.mjs +0 -139
- package/fesm2015/angular-three-soba-abstractions.mjs +0 -2048
- package/fesm2015/angular-three-soba-controls.mjs +0 -153
- package/fesm2015/angular-three-soba-controls.mjs.map +0 -1
- package/fesm2015/angular-three-soba-loaders.mjs +0 -222
- package/fesm2015/angular-three-soba-loaders.mjs.map +0 -1
- package/fesm2015/angular-three-soba-materials.mjs +0 -851
- package/fesm2015/angular-three-soba-materials.mjs.map +0 -1
- package/fesm2015/angular-three-soba-misc.mjs +0 -148
- package/fesm2015/angular-three-soba-misc.mjs.map +0 -1
- package/fesm2015/angular-three-soba-performance.mjs +0 -210
- package/fesm2015/angular-three-soba-performance.mjs.map +0 -1
- package/fesm2015/angular-three-soba-shaders.mjs +0 -1239
- package/fesm2015/angular-three-soba-shaders.mjs.map +0 -1
- package/fesm2015/angular-three-soba-staging.mjs +0 -3772
- package/fesm2015/angular-three-soba-staging.mjs.map +0 -1
- package/fesm2020/angular-three-soba-abstractions.mjs.map +0 -1
- package/fesm2020/angular-three-soba-cameras.mjs +0 -347
- package/fesm2020/angular-three-soba-cameras.mjs.map +0 -1
- package/fesm2020/angular-three-soba-controls.mjs.map +0 -1
- package/fesm2020/angular-three-soba-loaders.mjs.map +0 -1
- package/fesm2020/angular-three-soba-materials.mjs.map +0 -1
- package/fesm2020/angular-three-soba-shaders.mjs.map +0 -1
- package/fesm2020/angular-three-soba.mjs +0 -6
- package/fesm2020/angular-three-soba.mjs.map +0 -1
- /package/{esm2020 → esm2022}/abstractions/angular-three-soba-abstractions.mjs +0 -0
- /package/{esm2020 → esm2022}/abstractions/index.mjs +0 -0
- /package/{esm2020 → esm2022}/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.mjs +0 -0
- /package/{esm2020 → esm2022}/angular-three-soba.mjs +0 -0
- /package/{esm2020 → esm2022}/cameras/angular-three-soba-cameras.mjs +0 -0
- /package/{esm2020 → esm2022}/cameras/index.mjs +0 -0
- /package/{esm2020 → esm2022}/controls/angular-three-soba-controls.mjs +0 -0
- /package/{esm2020 → esm2022}/controls/index.mjs +0 -0
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/loaders/angular-three-soba-loaders.mjs +0 -0
- /package/{esm2020 → esm2022}/loaders/lib/gltf-loader/gltf-loader.mjs +0 -0
- /package/{esm2020 → esm2022}/loaders/lib/progress/progress.mjs +0 -0
- /package/{esm2020 → esm2022}/loaders/lib/texture-loader/texture-loader.mjs +0 -0
- /package/{esm2020 → esm2022}/materials/angular-three-soba-materials.mjs +0 -0
- /package/{esm2020 → esm2022}/materials/index.mjs +0 -0
- /package/{esm2020 → esm2022}/misc/angular-three-soba-misc.mjs +0 -0
- /package/{esm2020 → esm2022}/misc/index.mjs +0 -0
- /package/{esm2020 → esm2022}/misc/lib/animations/animations.mjs +0 -0
- /package/{esm2020 → esm2022}/misc/lib/depth-buffer/depth-buffer.mjs +0 -0
- /package/{esm2020 → esm2022}/misc/lib/fbo/fbo.mjs +0 -0
- /package/{esm2020 → esm2022}/performance/angular-three-soba-performance.mjs +0 -0
- /package/{esm2020 → esm2022}/performance/index.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/angular-three-soba-shaders.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/index.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/caustics-material/caustics-material.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/caustics-projection-material/caustics-projection-material.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/convolution-material/convolution-material.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/discard-material/discard-material.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/mesh-distort-material/mesh-distort-material.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/shader-material/shader-material.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/soft-shadow-material/soft-shadow-material.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/spot-light-material/spot-light-material.mjs +0 -0
- /package/{esm2020 → esm2022}/shaders/lib/star-field-material/star-field-material.mjs +0 -0
- /package/{esm2020 → esm2022}/staging/angular-three-soba-staging.mjs +0 -0
- /package/{esm2020 → esm2022}/staging/index.mjs +0 -0
- /package/{esm2020 → esm2022}/staging/lib/accumulative-shadows/progressive-light-map.mjs +0 -0
- /package/{esm2020 → esm2022}/staging/lib/environment/assets.mjs +0 -0
- /package/{esm2020 → esm2022}/staging/lib/environment/utils.mjs +0 -0
- /package/{esm2020 → esm2022}/staging/lib/spot-light/common.mjs +0 -0
- /package/{fesm2015 → fesm2022}/angular-three-soba.mjs +0 -0
- /package/{fesm2015 → fesm2022}/angular-three-soba.mjs.map +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { BufferAttribute, BufferGeometry, LinearFilter, Mesh, PerspectiveCamera, Scene, Vector2, WebGLRenderTarget, } from 'three';
|
|
2
|
+
import { ConvolutionMaterial } from '../convolution-material/convolution-material';
|
|
3
|
+
export class BlurPass {
|
|
4
|
+
constructor({ gl, resolution, width = 500, height = 500, minDepthThreshold = 0, maxDepthThreshold = 1, depthScale = 0, depthToBlurRatioBias = 0.25, }) {
|
|
5
|
+
this.renderToScreen = false;
|
|
6
|
+
this.renderTargetA = new WebGLRenderTarget(resolution, resolution, {
|
|
7
|
+
minFilter: LinearFilter,
|
|
8
|
+
magFilter: LinearFilter,
|
|
9
|
+
stencilBuffer: false,
|
|
10
|
+
depthBuffer: false,
|
|
11
|
+
encoding: gl.outputEncoding,
|
|
12
|
+
});
|
|
13
|
+
this.renderTargetB = this.renderTargetA.clone();
|
|
14
|
+
this.convolutionMaterial = new ConvolutionMaterial();
|
|
15
|
+
this.convolutionMaterial.setTexelSize(1.0 / width, 1.0 / height);
|
|
16
|
+
this.convolutionMaterial.setResolution(new Vector2(width, height));
|
|
17
|
+
this.scene = new Scene();
|
|
18
|
+
this.camera = new PerspectiveCamera();
|
|
19
|
+
this.convolutionMaterial.uniforms['minDepthThreshold'].value = minDepthThreshold;
|
|
20
|
+
this.convolutionMaterial.uniforms['maxDepthThreshold'].value = maxDepthThreshold;
|
|
21
|
+
this.convolutionMaterial.uniforms['depthScale'].value = depthScale;
|
|
22
|
+
this.convolutionMaterial.uniforms['depthToBlurRatioBias'].value = depthToBlurRatioBias;
|
|
23
|
+
this.convolutionMaterial.defines['USE_DEPTH'] = depthScale > 0;
|
|
24
|
+
const vertices = new Float32Array([-1, -1, 0, 3, -1, 0, -1, 3, 0]);
|
|
25
|
+
const uvs = new Float32Array([0, 0, 2, 0, 0, 2]);
|
|
26
|
+
const geometry = new BufferGeometry();
|
|
27
|
+
geometry.setAttribute('position', new BufferAttribute(vertices, 3));
|
|
28
|
+
geometry.setAttribute('uv', new BufferAttribute(uvs, 2));
|
|
29
|
+
this.screen = new Mesh(geometry, this.convolutionMaterial);
|
|
30
|
+
this.screen.frustumCulled = false;
|
|
31
|
+
this.scene.add(this.screen);
|
|
32
|
+
}
|
|
33
|
+
render(renderer, inputBuffer, outputBuffer) {
|
|
34
|
+
const scene = this.scene;
|
|
35
|
+
const camera = this.camera;
|
|
36
|
+
const renderTargetA = this.renderTargetA;
|
|
37
|
+
const renderTargetB = this.renderTargetB;
|
|
38
|
+
const material = this.convolutionMaterial;
|
|
39
|
+
const uniforms = material.uniforms;
|
|
40
|
+
uniforms['depthBuffer'].value = inputBuffer.depthTexture;
|
|
41
|
+
const kernel = material.kernel;
|
|
42
|
+
let lastRT = inputBuffer;
|
|
43
|
+
let destRT;
|
|
44
|
+
let i, l;
|
|
45
|
+
// Apply the multi-pass blur.
|
|
46
|
+
for (i = 0, l = kernel.length - 1; i < l; ++i) {
|
|
47
|
+
// Alternate between targets.
|
|
48
|
+
destRT = (i & 1) === 0 ? renderTargetA : renderTargetB;
|
|
49
|
+
uniforms['kernel'].value = kernel[i];
|
|
50
|
+
uniforms['inputBuffer'].value = lastRT.texture;
|
|
51
|
+
renderer.setRenderTarget(destRT);
|
|
52
|
+
renderer.render(scene, camera);
|
|
53
|
+
lastRT = destRT;
|
|
54
|
+
}
|
|
55
|
+
uniforms['kernel'].value = kernel[i];
|
|
56
|
+
uniforms['inputBuffer'].value = lastRT.texture;
|
|
57
|
+
renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);
|
|
58
|
+
renderer.render(scene, camera);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmx1ci1wYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLXNvYmEvc2hhZGVycy9zcmMvbGliL2JsdXItcGFzcy9ibHVyLXBhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGVBQWUsRUFDZixjQUFjLEVBRWQsWUFBWSxFQUNaLElBQUksRUFDSixpQkFBaUIsRUFDakIsS0FBSyxFQUNMLE9BQU8sRUFFUCxpQkFBaUIsR0FDcEIsTUFBTSxPQUFPLENBQUM7QUFFZixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQWFuRixNQUFNLE9BQU8sUUFBUTtJQVNqQixZQUFZLEVBQ1IsRUFBRSxFQUNGLFVBQVUsRUFDVixLQUFLLEdBQUcsR0FBRyxFQUNYLE1BQU0sR0FBRyxHQUFHLEVBQ1osaUJBQWlCLEdBQUcsQ0FBQyxFQUNyQixpQkFBaUIsR0FBRyxDQUFDLEVBQ3JCLFVBQVUsR0FBRyxDQUFDLEVBQ2Qsb0JBQW9CLEdBQUcsSUFBSSxHQUNmO1FBWGhCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBWW5CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFO1lBQy9ELFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFFBQVEsRUFBRSxFQUFFLENBQUMsY0FBYztTQUM5QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxLQUFL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QUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQzNDLDZCQUE2QjtZQUM3QixNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztZQUN2RCxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDL0MsUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMvQixNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQ25CO1FBQ0QsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQy9DLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwRSxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEJ1ZmZlckF0dHJpYnV0ZSxcbiAgICBCdWZmZXJHZW9tZXRyeSxcbiAgICBDYW1lcmEsXG4gICAgTGluZWFyRmlsdGVyLFxuICAgIE1lc2gsXG4gICAgUGVyc3BlY3RpdmVDYW1lcmEsXG4gICAgU2NlbmUsXG4gICAgVmVjdG9yMixcbiAgICBXZWJHTFJlbmRlcmVyLFxuICAgIFdlYkdMUmVuZGVyVGFyZ2V0LFxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7IENvbnZvbHV0aW9uTWF0ZXJpYWwgfSBmcm9tICcuLi9jb252b2x1dGlvbi1tYXRlcmlhbC9jb252b2x1dGlvbi1tYXRlcmlhbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmx1clBhc3NQcm9wcyB7XG4gICAgZ2w6IFdlYkdMUmVuZGVyZXI7XG4gICAgcmVzb2x1dGlvbjogbnVtYmVyO1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICBtaW5EZXB0aFRocmVzaG9sZD86IG51bWJlcjtcbiAgICBtYXhEZXB0aFRocmVzaG9sZD86IG51bWJlcjtcbiAgICBkZXB0aFNjYWxlPzogbnVtYmVyO1xuICAgIGRlcHRoVG9CbHVyUmF0aW9CaWFzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgQmx1clBhc3Mge1xuICAgIHJlYWRvbmx5IHJlbmRlclRhcmdldEE6IFdlYkdMUmVuZGVyVGFyZ2V0O1xuICAgIHJlYWRvbmx5IHJlbmRlclRhcmdldEI6IFdlYkdMUmVuZGVyVGFyZ2V0O1xuICAgIHJlYWRvbmx5IGNvbnZvbHV0aW9uTWF0ZXJpYWw6IENvbnZvbHV0aW9uTWF0ZXJpYWw7XG4gICAgcmVhZG9ubHkgc2NlbmU6IFNjZW5lO1xuICAgIHJlYWRvbmx5IGNhbWVyYTogQ2FtZXJhO1xuICAgIHJlYWRvbmx5IHNjcmVlbjogTWVzaDtcbiAgICByZW5kZXJUb1NjcmVlbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBnbCxcbiAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgd2lkdGggPSA1MDAsXG4gICAgICAgIGhlaWdodCA9IDUwMCxcbiAgICAgICAgbWluRGVwdGhUaHJlc2hvbGQgPSAwLFxuICAgICAgICBtYXhEZXB0aFRocmVzaG9sZCA9IDEsXG4gICAgICAgIGRlcHRoU2NhbGUgPSAwLFxuICAgICAgICBkZXB0aFRvQmx1clJhdGlvQmlhcyA9IDAuMjUsXG4gICAgfTogQmx1clBhc3NQcm9wcykge1xuICAgICAgICB0aGlzLnJlbmRlclRhcmdldEEgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQocmVzb2x1dGlvbiwgcmVzb2x1dGlvbiwge1xuICAgICAgICAgICAgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICAgICAgICBtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgICAgICAgIHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxuICAgICAgICAgICAgZGVwdGhCdWZmZXI6IGZhbHNlLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IGdsLm91dHB1dEVuY29kaW5nLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZW5kZXJUYXJnZXRCID0gdGhpcy5yZW5kZXJUYXJnZXRBLmNsb25lKCk7XG4gICAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbCA9IG5ldyBDb252b2x1dGlvbk1hdGVyaWFsKCk7XG4gICAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbC5zZXRUZXhlbFNpemUoMS4wIC8gd2lkdGgsIDEuMCAvIGhlaWdodCk7XG4gICAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbC5zZXRSZXNvbHV0aW9uKG5ldyBWZWN0b3IyKHdpZHRoLCBoZWlnaHQpKTtcbiAgICAgICAgdGhpcy5zY2VuZSA9IG5ldyBTY2VuZSgpO1xuICAgICAgICB0aGlzLmNhbWVyYSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuICAgICAgICB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwudW5pZm9ybXNbJ21pbkRlcHRoVGhyZXNob2xkJ10udmFsdWUgPSBtaW5EZXB0aFRocmVzaG9sZDtcbiAgICAgICAgdGhpcy5jb252b2x1dGlvbk1hdGVyaWFsLnVuaWZvcm1zWydtYXhEZXB0aFRocmVzaG9sZCddLnZhbHVlID0gbWF4RGVwdGhUaHJlc2hvbGQ7XG4gICAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbC51bmlmb3Jtc1snZGVwdGhTY2FsZSddLnZhbHVlID0gZGVwdGhTY2FsZTtcbiAgICAgICAgdGhpcy5jb252b2x1dGlvbk1hdGVyaWFsLnVuaWZvcm1zWydkZXB0aFRvQmx1clJhdGlvQmlhcyddLnZhbHVlID0gZGVwdGhUb0JsdXJSYXRpb0JpYXM7XG4gICAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbC5kZWZpbmVzWydVU0VfREVQVEgnXSA9IGRlcHRoU2NhbGUgPiAwO1xuICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoWy0xLCAtMSwgMCwgMywgLTEsIDAsIC0xLCAzLCAwXSk7XG4gICAgICAgIGNvbnN0IHV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDIsIDAsIDAsIDJdKTtcbiAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcbiAgICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUodmVydGljZXMsIDMpKTtcbiAgICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCd1dicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUodXZzLCAyKSk7XG4gICAgICAgIHRoaXMuc2NyZWVuID0gbmV3IE1lc2goZ2VvbWV0cnksIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbCk7XG4gICAgICAgIHRoaXMuc2NyZWVuLmZydXN0dW1DdWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zY2VuZS5hZGQodGhpcy5zY3JlZW4pO1xuICAgIH1cblxuICAgIHJlbmRlcihyZW5kZXJlcjogV2ViR0xSZW5kZXJlciwgaW5wdXRCdWZmZXI6IGFueSwgb3V0cHV0QnVmZmVyOiBhbnkpIHtcbiAgICAgICAgY29uc3Qgc2NlbmUgPSB0aGlzLnNjZW5lO1xuICAgICAgICBjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcbiAgICAgICAgY29uc3QgcmVuZGVyVGFyZ2V0QSA9IHRoaXMucmVuZGVyVGFyZ2V0QTtcbiAgICAgICAgY29uc3QgcmVuZGVyVGFyZ2V0QiA9IHRoaXMucmVuZGVyVGFyZ2V0QjtcbiAgICAgICAgY29uc3QgbWF0ZXJpYWwgPSB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWw7XG4gICAgICAgIGNvbnN0IHVuaWZvcm1zID0gbWF0ZXJpYWwudW5pZm9ybXM7XG4gICAgICAgIHVuaWZvcm1zWydkZXB0aEJ1ZmZlciddLnZhbHVlID0gaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlO1xuICAgICAgICBjb25zdCBrZXJuZWwgPSBtYXRlcmlhbC5rZXJuZWw7XG4gICAgICAgIGxldCBsYXN0UlQgPSBpbnB1dEJ1ZmZlcjtcbiAgICAgICAgbGV0IGRlc3RSVDtcbiAgICAgICAgbGV0IGksIGw7XG4gICAgICAgIC8vIEFwcGx5IHRoZSBtdWx0aS1wYXNzIGJsdXIuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXJuZWwubGVuZ3RoIC0gMTsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gQWx0ZXJuYXRlIGJldHdlZW4gdGFyZ2V0cy5cbiAgICAgICAgICAgIGRlc3RSVCA9IChpICYgMSkgPT09IDAgPyByZW5kZXJUYXJnZXRBIDogcmVuZGVyVGFyZ2V0QjtcbiAgICAgICAgICAgIHVuaWZvcm1zWydrZXJuZWwnXS52YWx1ZSA9IGtlcm5lbFtpXTtcbiAgICAgICAgICAgIHVuaWZvcm1zWydpbnB1dEJ1ZmZlciddLnZhbHVlID0gbGFzdFJULnRleHR1cmU7XG4gICAgICAgICAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoZGVzdFJUKTtcbiAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcbiAgICAgICAgICAgIGxhc3RSVCA9IGRlc3RSVDtcbiAgICAgICAgfVxuICAgICAgICB1bmlmb3Jtc1sna2VybmVsJ10udmFsdWUgPSBrZXJuZWxbaV07XG4gICAgICAgIHVuaWZvcm1zWydpbnB1dEJ1ZmZlciddLnZhbHVlID0gbGFzdFJULnRleHR1cmU7XG4gICAgICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCh0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { Component, CUSTOM_ELEMENTS_SCHEMA, Directive, inject, InjectionToken, Input } from '@angular/core';
|
|
2
|
+
import { extend, getLocalState, injectNgtRef, NgtRxStore, NgtStore } from 'angular-three';
|
|
3
|
+
import { SoftShadowMaterial } from 'angular-three-soba/shaders';
|
|
4
|
+
import { combineLatest, Subject } from 'rxjs';
|
|
5
|
+
import { Group, Mesh, PlaneGeometry } from 'three';
|
|
6
|
+
import { ProgressiveLightMap } from './progressive-light-map';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
extend({ SoftShadowMaterial, Group, Mesh, PlaneGeometry });
|
|
9
|
+
export const NGTS_ACCUMULATIVE_SHADOWS_API = new InjectionToken('NgtsAccumulativeShadows API');
|
|
10
|
+
function accumulativeShadowsApiFactory(accumulativeShadows) {
|
|
11
|
+
const store = inject(NgtStore);
|
|
12
|
+
const api = {
|
|
13
|
+
lights: new Map(),
|
|
14
|
+
count: 0,
|
|
15
|
+
getMesh: () => accumulativeShadows.meshRef.nativeElement,
|
|
16
|
+
reset: () => {
|
|
17
|
+
accumulativeShadows.pLM.clear();
|
|
18
|
+
const material = api.getMesh().material;
|
|
19
|
+
material.opacity = 0;
|
|
20
|
+
material.alphaTest = 0;
|
|
21
|
+
api.count = 0;
|
|
22
|
+
},
|
|
23
|
+
update: (frames = 1) => {
|
|
24
|
+
// adapt the opacity blend ratio to the number of frames
|
|
25
|
+
const material = api.getMesh().material;
|
|
26
|
+
if (!api.temporal) {
|
|
27
|
+
material.opacity = accumulativeShadows.get('opacity');
|
|
28
|
+
material.alphaTest = accumulativeShadows.get('alphaTest');
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
material.opacity = Math.min(accumulativeShadows.get('opacity'), material.opacity + accumulativeShadows.get('opacity') / api.blend);
|
|
32
|
+
material.alphaTest = Math.min(accumulativeShadows.get('alphaTest'), material.alphaTest + accumulativeShadows.get('alphaTest') / api.blend);
|
|
33
|
+
}
|
|
34
|
+
// switch accumulative lights on
|
|
35
|
+
accumulativeShadows.accumulativeShadowsRef.nativeElement.visible = true;
|
|
36
|
+
// collect scene lights and meshes
|
|
37
|
+
accumulativeShadows.pLM.prepare();
|
|
38
|
+
// update the lightmap and the accumulative lights
|
|
39
|
+
for (let i = 0; i < frames; i++) {
|
|
40
|
+
api.lights.forEach((light) => light.update());
|
|
41
|
+
accumulativeShadows.pLM.update(store.get('camera'), api.blend);
|
|
42
|
+
}
|
|
43
|
+
// switch lights off
|
|
44
|
+
accumulativeShadows.accumulativeShadowsRef.nativeElement.visible = false;
|
|
45
|
+
// restore lights and meshes
|
|
46
|
+
accumulativeShadows.pLM.finish();
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperties(api, {
|
|
50
|
+
temporal: {
|
|
51
|
+
get: () => !!accumulativeShadows.get('temporal'),
|
|
52
|
+
},
|
|
53
|
+
frames: {
|
|
54
|
+
get: () => Math.max(2, accumulativeShadows.get('frames')),
|
|
55
|
+
},
|
|
56
|
+
blend: {
|
|
57
|
+
get: () => Math.max(2, accumulativeShadows.get('frames') === Infinity
|
|
58
|
+
? accumulativeShadows.get('blend')
|
|
59
|
+
: accumulativeShadows.get('frames')),
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
const subject = new Subject();
|
|
63
|
+
accumulativeShadows.hold(accumulativeShadows.meshRef.$, (mesh) => {
|
|
64
|
+
accumulativeShadows.pLM.configure(mesh);
|
|
65
|
+
accumulativeShadows.hold(combineLatest([accumulativeShadows.select(), getLocalState(store.get('scene')).objects]), () => {
|
|
66
|
+
// reset internals, buffers, ...
|
|
67
|
+
api.reset();
|
|
68
|
+
// update lightmap
|
|
69
|
+
if (!api.temporal && api.frames !== Infinity)
|
|
70
|
+
api.update(api.blend);
|
|
71
|
+
});
|
|
72
|
+
accumulativeShadows.effect(subject, () => store.get('internal').subscribe(() => {
|
|
73
|
+
const limit = accumulativeShadows.get('limit');
|
|
74
|
+
if ((api.temporal || api.frames === Infinity) && api.count < api.frames && api.count < limit) {
|
|
75
|
+
api.update();
|
|
76
|
+
api.count++;
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
subject.next();
|
|
80
|
+
});
|
|
81
|
+
return api;
|
|
82
|
+
}
|
|
83
|
+
class AccumulativeShadowsConsumer {
|
|
84
|
+
constructor() {
|
|
85
|
+
inject(NGTS_ACCUMULATIVE_SHADOWS_API);
|
|
86
|
+
}
|
|
87
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AccumulativeShadowsConsumer, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
88
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: AccumulativeShadowsConsumer, isStandalone: true, selector: "[ngtsAccumulativeShadowsConsumer]", ngImport: i0 }); }
|
|
89
|
+
}
|
|
90
|
+
export { AccumulativeShadowsConsumer };
|
|
91
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AccumulativeShadowsConsumer, decorators: [{
|
|
92
|
+
type: Directive,
|
|
93
|
+
args: [{ selector: '[ngtsAccumulativeShadowsConsumer]', standalone: true }]
|
|
94
|
+
}], ctorParameters: function () { return []; } });
|
|
95
|
+
class NgtsAccumulativeShadows extends NgtRxStore {
|
|
96
|
+
constructor() {
|
|
97
|
+
super(...arguments);
|
|
98
|
+
this.nullTraverse = () => null;
|
|
99
|
+
this.Math = Math;
|
|
100
|
+
this.store = inject(NgtStore);
|
|
101
|
+
this.pLM = new ProgressiveLightMap(this.store.get('gl'), this.store.get('scene'), this.get('resolution'));
|
|
102
|
+
this.accumulativeShadowsRef = injectNgtRef();
|
|
103
|
+
this.meshRef = injectNgtRef();
|
|
104
|
+
}
|
|
105
|
+
/** How many frames it can render, more yields cleaner results but takes more time, 40 */
|
|
106
|
+
set frames(frames) {
|
|
107
|
+
this.set({ frames });
|
|
108
|
+
}
|
|
109
|
+
/** If frames === Infinity blend controls the refresh ratio, 100 */
|
|
110
|
+
set blend(blend) {
|
|
111
|
+
this.set({ blend });
|
|
112
|
+
}
|
|
113
|
+
/** Can limit the amount of frames rendered if frames === Infinity, usually to get some performance back once a movable scene has settled, Infinity */
|
|
114
|
+
set limit(limit) {
|
|
115
|
+
this.set({ limit });
|
|
116
|
+
}
|
|
117
|
+
/** Scale of the plane, */
|
|
118
|
+
set scale(scale) {
|
|
119
|
+
this.set({ scale });
|
|
120
|
+
}
|
|
121
|
+
/** Temporal accumulates shadows over time which is more performant but has a visual regression over instant results, false */
|
|
122
|
+
set temporal(temporal) {
|
|
123
|
+
this.set({ temporal });
|
|
124
|
+
}
|
|
125
|
+
/** Opacity of the plane, 1 */
|
|
126
|
+
set opacity(opacity) {
|
|
127
|
+
this.set({ opacity });
|
|
128
|
+
}
|
|
129
|
+
/** Discards alpha pixels, 0.65 */
|
|
130
|
+
set alphaTest(alphaTest) {
|
|
131
|
+
this.set({ alphaTest });
|
|
132
|
+
}
|
|
133
|
+
/** Shadow color, black */
|
|
134
|
+
set color(color) {
|
|
135
|
+
this.set({ color });
|
|
136
|
+
}
|
|
137
|
+
/** Colorblend, how much colors turn to black, 0 is black, 2 */
|
|
138
|
+
set colorBlend(colorBlend) {
|
|
139
|
+
this.set({ colorBlend });
|
|
140
|
+
}
|
|
141
|
+
/** Buffer resolution, 1024 */
|
|
142
|
+
set resolution(resolution) {
|
|
143
|
+
this.set({ resolution });
|
|
144
|
+
}
|
|
145
|
+
/** Texture tonemapping */
|
|
146
|
+
set toneMapped(toneMapped) {
|
|
147
|
+
this.set({ toneMapped });
|
|
148
|
+
}
|
|
149
|
+
initialize() {
|
|
150
|
+
super.initialize();
|
|
151
|
+
this.set({
|
|
152
|
+
frames: 40,
|
|
153
|
+
limit: Infinity,
|
|
154
|
+
blend: 20,
|
|
155
|
+
scale: 10,
|
|
156
|
+
opacity: 1,
|
|
157
|
+
alphaTest: 0.75,
|
|
158
|
+
color: 'black',
|
|
159
|
+
colorBlend: 2,
|
|
160
|
+
resolution: 1024,
|
|
161
|
+
toneMapped: true,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsAccumulativeShadows, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
165
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtsAccumulativeShadows, isStandalone: true, selector: "ngts-accumulative-shadows", inputs: { frames: "frames", blend: "blend", limit: "limit", scale: "scale", temporal: "temporal", opacity: "opacity", alphaTest: "alphaTest", color: "color", colorBlend: "colorBlend", resolution: "resolution", toneMapped: "toneMapped" }, providers: [
|
|
166
|
+
{
|
|
167
|
+
provide: NGTS_ACCUMULATIVE_SHADOWS_API,
|
|
168
|
+
useFactory: accumulativeShadowsApiFactory,
|
|
169
|
+
deps: [NgtsAccumulativeShadows],
|
|
170
|
+
},
|
|
171
|
+
], usesInheritance: true, ngImport: i0, template: `
|
|
172
|
+
<ngt-group ngtCompound>
|
|
173
|
+
<ngt-group [ref]="accumulativeShadowsRef" [traverse]="nullTraverse">
|
|
174
|
+
<ng-content />
|
|
175
|
+
<ng-container ngtsAccumulativeShadowsConsumer />
|
|
176
|
+
</ngt-group>
|
|
177
|
+
<ngt-mesh [ref]="meshRef" [receiveShadow]="true" [scale]="get('scale')" [rotation]="[-Math.PI / 2, 0, 0]">
|
|
178
|
+
<ngt-plane-geometry />
|
|
179
|
+
<ngt-soft-shadow-material
|
|
180
|
+
[transparent]="true"
|
|
181
|
+
[depthWrite]="false"
|
|
182
|
+
[color]="get('color')"
|
|
183
|
+
[toneMapped]="get('toneMapped')"
|
|
184
|
+
[blend]="get('colorBlend')"
|
|
185
|
+
[map]="pLM.progressiveLightMap2.texture"
|
|
186
|
+
/>
|
|
187
|
+
</ngt-mesh>
|
|
188
|
+
</ngt-group>
|
|
189
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: AccumulativeShadowsConsumer, selector: "[ngtsAccumulativeShadowsConsumer]" }] }); }
|
|
190
|
+
}
|
|
191
|
+
export { NgtsAccumulativeShadows };
|
|
192
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsAccumulativeShadows, decorators: [{
|
|
193
|
+
type: Component,
|
|
194
|
+
args: [{
|
|
195
|
+
selector: 'ngts-accumulative-shadows',
|
|
196
|
+
standalone: true,
|
|
197
|
+
template: `
|
|
198
|
+
<ngt-group ngtCompound>
|
|
199
|
+
<ngt-group [ref]="accumulativeShadowsRef" [traverse]="nullTraverse">
|
|
200
|
+
<ng-content />
|
|
201
|
+
<ng-container ngtsAccumulativeShadowsConsumer />
|
|
202
|
+
</ngt-group>
|
|
203
|
+
<ngt-mesh [ref]="meshRef" [receiveShadow]="true" [scale]="get('scale')" [rotation]="[-Math.PI / 2, 0, 0]">
|
|
204
|
+
<ngt-plane-geometry />
|
|
205
|
+
<ngt-soft-shadow-material
|
|
206
|
+
[transparent]="true"
|
|
207
|
+
[depthWrite]="false"
|
|
208
|
+
[color]="get('color')"
|
|
209
|
+
[toneMapped]="get('toneMapped')"
|
|
210
|
+
[blend]="get('colorBlend')"
|
|
211
|
+
[map]="pLM.progressiveLightMap2.texture"
|
|
212
|
+
/>
|
|
213
|
+
</ngt-mesh>
|
|
214
|
+
</ngt-group>
|
|
215
|
+
`,
|
|
216
|
+
imports: [AccumulativeShadowsConsumer],
|
|
217
|
+
providers: [
|
|
218
|
+
{
|
|
219
|
+
provide: NGTS_ACCUMULATIVE_SHADOWS_API,
|
|
220
|
+
useFactory: accumulativeShadowsApiFactory,
|
|
221
|
+
deps: [NgtsAccumulativeShadows],
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
225
|
+
}]
|
|
226
|
+
}], propDecorators: { frames: [{
|
|
227
|
+
type: Input
|
|
228
|
+
}], blend: [{
|
|
229
|
+
type: Input
|
|
230
|
+
}], limit: [{
|
|
231
|
+
type: Input
|
|
232
|
+
}], scale: [{
|
|
233
|
+
type: Input
|
|
234
|
+
}], temporal: [{
|
|
235
|
+
type: Input
|
|
236
|
+
}], opacity: [{
|
|
237
|
+
type: Input
|
|
238
|
+
}], alphaTest: [{
|
|
239
|
+
type: Input
|
|
240
|
+
}], color: [{
|
|
241
|
+
type: Input
|
|
242
|
+
}], colorBlend: [{
|
|
243
|
+
type: Input
|
|
244
|
+
}], resolution: [{
|
|
245
|
+
type: Input
|
|
246
|
+
}], toneMapped: [{
|
|
247
|
+
type: Input
|
|
248
|
+
}] } });
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjdW11bGF0aXZlLXNoYWRvd3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zdGFnaW5nL3NyYy9saWIvYWNjdW11bGF0aXZlLXNoYWRvd3MvYWNjdW11bGF0aXZlLXNoYWRvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUE0QixNQUFNLDRCQUE0QixDQUFDO0FBQzFGLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNuRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFFOUQsTUFBTSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0FBZTNELE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLElBQUksY0FBYyxDQUMzRCw2QkFBNkIsQ0FDaEMsQ0FBQztBQUVGLFNBQVMsNkJBQTZCLENBQUMsbUJBQTRDO0lBQy9FLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUvQixNQUFNLEdBQUcsR0FBRztRQUNSLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUNqQixLQUFLLEVBQUUsQ0FBQztRQUNSLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDVixt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YWdCLE1BQU07c0JBQWxCLEtBQUs7Z0JBS08sS0FBSztzQkFBakIsS0FBSztnQkFLTyxLQUFLO3NCQUFqQixLQUFLO2dCQUtPLEtBQUs7c0JBQWpCLEtBQUs7Z0JBS08sUUFBUTtzQkFBcEIsS0FBSztnQkFLTyxPQUFPO3NCQUFuQixLQUFLO2dCQUtPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBS08sS0FBSztzQkFBakIsS0FBSztnQkFLTyxVQUFVO3NCQUF0QixLQUFLO2dCQUtPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBS08sVUFBVTtzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgRGlyZWN0aXZlLCBpbmplY3QsIEluamVjdGlvblRva2VuLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBnZXRMb2NhbFN0YXRlLCBpbmplY3ROZ3RSZWYsIE5ndFJ4U3RvcmUsIE5ndFN0b3JlIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBTb2Z0U2hhZG93TWF0ZXJpYWwsIFNvZnRTaGFkb3dNYXRlcmlhbElucHV0cyB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtc29iYS9zaGFkZXJzJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IEdyb3VwLCBNZXNoLCBQbGFuZUdlb21ldHJ5IH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgUHJvZ3Jlc3NpdmVMaWdodE1hcCB9IGZyb20gJy4vcHJvZ3Jlc3NpdmUtbGlnaHQtbWFwJztcblxuZXh0ZW5kKHsgU29mdFNoYWRvd01hdGVyaWFsLCBHcm91cCwgTWVzaCwgUGxhbmVHZW9tZXRyeSB9KTtcblxuZXhwb3J0IHR5cGUgTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NMaWdodEFwaSA9IHsgdXBkYXRlOiAoKSA9PiB2b2lkIH07XG5cbmV4cG9ydCB0eXBlIE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzQXBpID0ge1xuICAgIGxpZ2h0czogTWFwPHN0cmluZywgTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NMaWdodEFwaT47XG4gICAgdGVtcG9yYWw6IGJvb2xlYW47XG4gICAgZnJhbWVzOiBudW1iZXI7XG4gICAgYmxlbmQ6IG51bWJlcjtcbiAgICBjb3VudDogbnVtYmVyO1xuICAgIGdldE1lc2g6ICgpID0+IFRIUkVFLk1lc2g8VEhSRUUuUGxhbmVHZW9tZXRyeSwgU29mdFNoYWRvd01hdGVyaWFsSW5wdXRzICYgVEhSRUUuU2hhZGVyTWF0ZXJpYWw+O1xuICAgIHJlc2V0OiAoKSA9PiB2b2lkO1xuICAgIHVwZGF0ZTogKGZyYW1lcz86IG51bWJlcikgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBjb25zdCBOR1RTX0FDQ1VNVUxBVElWRV9TSEFET1dTX0FQSSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOZ3RzQWNjdW11bGF0aXZlU2hhZG93c0FwaT4oXG4gICAgJ05ndHNBY2N1bXVsYXRpdmVTaGFkb3dzIEFQSSdcbik7XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGl2ZVNoYWRvd3NBcGlGYWN0b3J5KGFjY3VtdWxhdGl2ZVNoYWRvd3M6IE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBpbmplY3QoTmd0U3RvcmUpO1xuXG4gICAgY29uc3QgYXBpID0ge1xuICAgICAgICBsaWdodHM6IG5ldyBNYXAoKSxcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIGdldE1lc2g6ICgpID0+XG4gICAgICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLm1lc2hSZWYubmF0aXZlRWxlbWVudCBhcyBUSFJFRS5NZXNoPFxuICAgICAgICAgICAgICAgIFRIUkVFLlBsYW5lR2VvbWV0cnksXG4gICAgICAgICAgICAgICAgU29mdFNoYWRvd01hdGVyaWFsSW5wdXRzICYgVEhSRUUuU2hhZGVyTWF0ZXJpYWxcbiAgICAgICAgICAgID4sXG4gICAgICAgIHJlc2V0OiAoKSA9PiB7XG4gICAgICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLnBMTS5jbGVhcigpO1xuICAgICAgICAgICAgY29uc3QgbWF0ZXJpYWwgPSBhcGkuZ2V0TWVzaCgpLm1hdGVyaWFsO1xuICAgICAgICAgICAgbWF0ZXJpYWwub3BhY2l0eSA9IDA7XG4gICAgICAgICAgICBtYXRlcmlhbC5hbHBoYVRlc3QgPSAwO1xuICAgICAgICAgICAgYXBpLmNvdW50ID0gMDtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlOiAoZnJhbWVzID0gMSkgPT4ge1xuICAgICAgICAgICAgLy8gYWRhcHQgdGhlIG9wYWNpdHkgYmxlbmQgcmF0aW8gdG8gdGhlIG51bWJlciBvZiBmcmFtZXNcbiAgICAgICAgICAgIGNvbnN0IG1hdGVyaWFsID0gYXBpLmdldE1lc2goKS5tYXRlcmlhbDtcbiAgICAgICAgICAgIGlmICghYXBpLnRlbXBvcmFsKSB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwub3BhY2l0eSA9IGFjY3VtdWxhdGl2ZVNoYWRvd3MuZ2V0KCdvcGFjaXR5Jyk7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuYWxwaGFUZXN0ID0gYWNjdW11bGF0aXZlU2hhZG93cy5nZXQoJ2FscGhhVGVzdCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5vcGFjaXR5ID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGl2ZVNoYWRvd3MuZ2V0KCdvcGFjaXR5JyksXG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLm9wYWNpdHkgKyBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnb3BhY2l0eScpIC8gYXBpLmJsZW5kXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5hbHBoYVRlc3QgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5nZXQoJ2FscGhhVGVzdCcpLFxuICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5hbHBoYVRlc3QgKyBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnYWxwaGFUZXN0JykgLyBhcGkuYmxlbmRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzd2l0Y2ggYWNjdW11bGF0aXZlIGxpZ2h0cyBvblxuICAgICAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5hY2N1bXVsYXRpdmVTaGFkb3dzUmVmLm5hdGl2ZUVsZW1lbnQudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBjb2xsZWN0IHNjZW5lIGxpZ2h0cyBhbmQgbWVzaGVzXG4gICAgICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLnBMTS5wcmVwYXJlKCk7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbGlnaHRtYXAgYW5kIHRoZSBhY2N1bXVsYXRpdmUgbGlnaHRzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyYW1lczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYXBpLmxpZ2h0cy5mb3JFYWNoKChsaWdodCkgPT4gbGlnaHQudXBkYXRlKCkpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGl2ZVNoYWRvd3MucExNLnVwZGF0ZShzdG9yZS5nZXQoJ2NhbWVyYScpLCBhcGkuYmxlbmQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzd2l0Y2ggbGlnaHRzIG9mZlxuICAgICAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5hY2N1bXVsYXRpdmVTaGFkb3dzUmVmLm5hdGl2ZUVsZW1lbnQudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gcmVzdG9yZSBsaWdodHMgYW5kIG1lc2hlc1xuICAgICAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5wTE0uZmluaXNoKCk7XG4gICAgICAgIH0sXG4gICAgfSBhcyBOZ3RzQWNjdW11bGF0aXZlU2hhZG93c0FwaTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGFwaSwge1xuICAgICAgICB0ZW1wb3JhbDoge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PiAhIWFjY3VtdWxhdGl2ZVNoYWRvd3MuZ2V0KCd0ZW1wb3JhbCcpLFxuICAgICAgICB9LFxuICAgICAgICBmcmFtZXM6IHtcbiAgICAgICAgICAgIGdldDogKCkgPT4gTWF0aC5tYXgoMiwgYWNjdW11bGF0aXZlU2hhZG93cy5nZXQoJ2ZyYW1lcycpKSxcbiAgICAgICAgfSxcbiAgICAgICAgYmxlbmQ6IHtcbiAgICAgICAgICAgIGdldDogKCkgPT5cbiAgICAgICAgICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5nZXQoJ2ZyYW1lcycpID09PSBJbmZpbml0eVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnYmxlbmQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnZnJhbWVzJylcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLmhvbGQoYWNjdW11bGF0aXZlU2hhZG93cy5tZXNoUmVmLiQsIChtZXNoKSA9PiB7XG4gICAgICAgIGFjY3VtdWxhdGl2ZVNoYWRvd3MucExNLmNvbmZpZ3VyZShtZXNoKTtcblxuICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLmhvbGQoXG4gICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFthY2N1bXVsYXRpdmVTaGFkb3dzLnNlbGVjdCgpLCBnZXRMb2NhbFN0YXRlKHN0b3JlLmdldCgnc2NlbmUnKSkub2JqZWN0c10pLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHJlc2V0IGludGVybmFscywgYnVmZmVycywgLi4uXG4gICAgICAgICAgICAgICAgYXBpLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGxpZ2h0bWFwXG4gICAgICAgICAgICAgICAgaWYgKCFhcGkudGVtcG9yYWwgJiYgYXBpLmZyYW1lcyAhPT0gSW5maW5pdHkpIGFwaS51cGRhdGUoYXBpLmJsZW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLmVmZmVjdChzdWJqZWN0LCAoKSA9PlxuICAgICAgICAgICAgc3RvcmUuZ2V0KCdpbnRlcm5hbCcpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGltaXQgPSBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnbGltaXQnKTtcbiAgICAgICAgICAgICAgICBpZiAoKGFwaS50ZW1wb3JhbCB8fCBhcGkuZnJhbWVzID09PSBJbmZpbml0eSkgJiYgYXBpLmNvdW50IDwgYXBpLmZyYW1lcyAmJiBhcGkuY291bnQgPCBsaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBhcGkudXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGFwaS5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHN1YmplY3QubmV4dCgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFwaTtcbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25ndHNBY2N1bXVsYXRpdmVTaGFkb3dzQ29uc3VtZXJdJywgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIEFjY3VtdWxhdGl2ZVNoYWRvd3NDb25zdW1lciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGluamVjdChOR1RTX0FDQ1VNVUxBVElWRV9TSEFET1dTX0FQSSk7XG4gICAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndHMtYWNjdW11bGF0aXZlLXNoYWRvd3MnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5ndC1ncm91cCBuZ3RDb21wb3VuZD5cbiAgICAgICAgICAgIDxuZ3QtZ3JvdXAgW3JlZl09XCJhY2N1bXVsYXRpdmVTaGFkb3dzUmVmXCIgW3RyYXZlcnNlXT1cIm51bGxUcmF2ZXJzZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IC8+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBuZ3RzQWNjdW11bGF0aXZlU2hhZG93c0NvbnN1bWVyIC8+XG4gICAgICAgICAgICA8L25ndC1ncm91cD5cbiAgICAgICAgICAgIDxuZ3QtbWVzaCBbcmVmXT1cIm1lc2hSZWZcIiBbcmVjZWl2ZVNoYWRvd109XCJ0cnVlXCIgW3NjYWxlXT1cImdldCgnc2NhbGUnKVwiIFtyb3RhdGlvbl09XCJbLU1hdGguUEkgLyAyLCAwLCAwXVwiPlxuICAgICAgICAgICAgICAgIDxuZ3QtcGxhbmUtZ2VvbWV0cnkgLz5cbiAgICAgICAgICAgICAgICA8bmd0LXNvZnQtc2hhZG93LW1hdGVyaWFsXG4gICAgICAgICAgICAgICAgICAgIFt0cmFuc3BhcmVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RlcHRoV3JpdGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiZ2V0KCdjb2xvcicpXCJcbiAgICAgICAgICAgICAgICAgICAgW3RvbmVNYXBwZWRdPVwiZ2V0KCd0b25lTWFwcGVkJylcIlxuICAgICAgICAgICAgICAgICAgICBbYmxlbmRdPVwiZ2V0KCdjb2xvckJsZW5kJylcIlxuICAgICAgICAgICAgICAgICAgICBbbWFwXT1cInBMTS5wcm9ncmVzc2l2ZUxpZ2h0TWFwMi50ZXh0dXJlXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9uZ3QtbWVzaD5cbiAgICAgICAgPC9uZ3QtZ3JvdXA+XG4gICAgYCxcbiAgICBpbXBvcnRzOiBbQWNjdW11bGF0aXZlU2hhZG93c0NvbnN1bWVyXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdUU19BQ0NVTVVMQVRJVkVfU0hBRE9XU19BUEksXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiBhY2N1bXVsYXRpdmVTaGFkb3dzQXBpRmFjdG9yeSxcbiAgICAgICAgICAgIGRlcHM6IFtOZ3RzQWNjdW11bGF0aXZlU2hhZG93c10sXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzIGV4dGVuZHMgTmd0UnhTdG9yZSB7XG4gICAgcmVhZG9ubHkgbnVsbFRyYXZlcnNlID0gKCkgPT4gbnVsbDtcbiAgICByZWFkb25seSBNYXRoID0gTWF0aDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBpbmplY3QoTmd0U3RvcmUpO1xuXG4gICAgcmVhZG9ubHkgcExNID0gbmV3IFByb2dyZXNzaXZlTGlnaHRNYXAodGhpcy5zdG9yZS5nZXQoJ2dsJyksIHRoaXMuc3RvcmUuZ2V0KCdzY2VuZScpLCB0aGlzLmdldCgncmVzb2x1dGlvbicpKTtcblxuICAgIHJlYWRvbmx5IGFjY3VtdWxhdGl2ZVNoYWRvd3NSZWYgPSBpbmplY3ROZ3RSZWY8VEhSRUUuR3JvdXA+KCk7XG4gICAgcmVhZG9ubHkgbWVzaFJlZiA9IGluamVjdE5ndFJlZjxUSFJFRS5NZXNoPigpO1xuXG4gICAgLyoqIEhvdyBtYW55IGZyYW1lcyBpdCBjYW4gcmVuZGVyLCBtb3JlIHlpZWxkcyBjbGVhbmVyIHJlc3VsdHMgYnV0IHRha2VzIG1vcmUgdGltZSwgNDAgKi9cbiAgICBASW5wdXQoKSBzZXQgZnJhbWVzKGZyYW1lczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZnJhbWVzIH0pO1xuICAgIH1cblxuICAgIC8qKiBJZiBmcmFtZXMgPT09IEluZmluaXR5IGJsZW5kIGNvbnRyb2xzIHRoZSByZWZyZXNoIHJhdGlvLCAxMDAgKi9cbiAgICBASW5wdXQoKSBzZXQgYmxlbmQoYmxlbmQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGJsZW5kIH0pO1xuICAgIH1cblxuICAgIC8qKiBDYW4gbGltaXQgdGhlIGFtb3VudCBvZiBmcmFtZXMgcmVuZGVyZWQgaWYgZnJhbWVzID09PSBJbmZpbml0eSwgdXN1YWxseSB0byBnZXQgc29tZSBwZXJmb3JtYW5jZSBiYWNrIG9uY2UgYSBtb3ZhYmxlIHNjZW5lIGhhcyBzZXR0bGVkLCBJbmZpbml0eSAqL1xuICAgIEBJbnB1dCgpIHNldCBsaW1pdChsaW1pdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbGltaXQgfSk7XG4gICAgfVxuXG4gICAgLyoqIFNjYWxlIG9mIHRoZSBwbGFuZSwgICovXG4gICAgQElucHV0KCkgc2V0IHNjYWxlKHNjYWxlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBzY2FsZSB9KTtcbiAgICB9XG5cbiAgICAvKiogVGVtcG9yYWwgYWNjdW11bGF0ZXMgc2hhZG93cyBvdmVyIHRpbWUgd2hpY2ggaXMgbW9yZSBwZXJmb3JtYW50IGJ1dCBoYXMgYSB2aXN1YWwgcmVncmVzc2lvbiBvdmVyIGluc3RhbnQgcmVzdWx0cywgZmFsc2UgICovXG4gICAgQElucHV0KCkgc2V0IHRlbXBvcmFsKHRlbXBvcmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgdGVtcG9yYWwgfSk7XG4gICAgfVxuXG4gICAgLyoqIE9wYWNpdHkgb2YgdGhlIHBsYW5lLCAxICovXG4gICAgQElucHV0KCkgc2V0IG9wYWNpdHkob3BhY2l0eTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgb3BhY2l0eSB9KTtcbiAgICB9XG5cbiAgICAvKiogRGlzY2FyZHMgYWxwaGEgcGl4ZWxzLCAwLjY1ICovXG4gICAgQElucHV0KCkgc2V0IGFscGhhVGVzdChhbHBoYVRlc3Q6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGFscGhhVGVzdCB9KTtcbiAgICB9XG5cbiAgICAvKiogU2hhZG93IGNvbG9yLCBibGFjayAqL1xuICAgIEBJbnB1dCgpIHNldCBjb2xvcihjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgY29sb3IgfSk7XG4gICAgfVxuXG4gICAgLyoqIENvbG9yYmxlbmQsIGhvdyBtdWNoIGNvbG9ycyB0dXJuIHRvIGJsYWNrLCAwIGlzIGJsYWNrLCAyICovXG4gICAgQElucHV0KCkgc2V0IGNvbG9yQmxlbmQoY29sb3JCbGVuZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgY29sb3JCbGVuZCB9KTtcbiAgICB9XG5cbiAgICAvKiogQnVmZmVyIHJlc29sdXRpb24sIDEwMjQgKi9cbiAgICBASW5wdXQoKSBzZXQgcmVzb2x1dGlvbihyZXNvbHV0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyByZXNvbHV0aW9uIH0pO1xuICAgIH1cblxuICAgIC8qKiBUZXh0dXJlIHRvbmVtYXBwaW5nICovXG4gICAgQElucHV0KCkgc2V0IHRvbmVNYXBwZWQodG9uZU1hcHBlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldCh7IHRvbmVNYXBwZWQgfSk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgICB0aGlzLnNldCh7XG4gICAgICAgICAgICBmcmFtZXM6IDQwLFxuICAgICAgICAgICAgbGltaXQ6IEluZmluaXR5LFxuICAgICAgICAgICAgYmxlbmQ6IDIwLFxuICAgICAgICAgICAgc2NhbGU6IDEwLFxuICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgIGFscGhhVGVzdDogMC43NSxcbiAgICAgICAgICAgIGNvbG9yOiAnYmxhY2snLFxuICAgICAgICAgICAgY29sb3JCbGVuZDogMixcbiAgICAgICAgICAgIHJlc29sdXRpb246IDEwMjQsXG4gICAgICAgICAgICB0b25lTWFwcGVkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { Component, CUSTOM_ELEMENTS_SCHEMA, Directive, inject, InjectionToken, Input } from '@angular/core';
|
|
2
|
+
import { extend, injectNgtRef, NgtArgs, NgtRepeat, NgtRxStore } from 'angular-three';
|
|
3
|
+
import { combineLatest } from 'rxjs';
|
|
4
|
+
import * as THREE from 'three';
|
|
5
|
+
import { DirectionalLight, Group, OrthographicCamera, Vector2 } from 'three';
|
|
6
|
+
import { NGTS_ACCUMULATIVE_SHADOWS_API } from './accumulative-shadows';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
extend({ Group, DirectionalLight, OrthographicCamera, Vector2 });
|
|
9
|
+
export const NGTS_RANDOMIZED_LIGHTS_API = new InjectionToken('NgtsRandomizedLights API');
|
|
10
|
+
function randomizedLightsApiFactory(randomizedLights) {
|
|
11
|
+
const accumulativeApi = inject(NGTS_ACCUMULATIVE_SHADOWS_API);
|
|
12
|
+
const update = () => {
|
|
13
|
+
let light;
|
|
14
|
+
if (randomizedLights.lightsRef.nativeElement) {
|
|
15
|
+
for (let l = 0; l < randomizedLights.lightsRef.nativeElement.children.length; l++) {
|
|
16
|
+
light = randomizedLights.lightsRef.nativeElement.children[l];
|
|
17
|
+
if (Math.random() > randomizedLights.get('ambient')) {
|
|
18
|
+
const position = randomizedLights.get('position');
|
|
19
|
+
const radius = randomizedLights.get('radius');
|
|
20
|
+
light.position.set(position[0] + THREE.MathUtils.randFloatSpread(radius), position[1] + THREE.MathUtils.randFloatSpread(radius), position[2] + THREE.MathUtils.randFloatSpread(radius));
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
const lambda = Math.acos(2 * Math.random() - 1) - Math.PI / 2.0;
|
|
24
|
+
const phi = 2 * Math.PI * Math.random();
|
|
25
|
+
const length = randomizedLights.get('length');
|
|
26
|
+
light.position.set(Math.cos(lambda) * Math.cos(phi) * length, Math.abs(Math.cos(lambda) * Math.sin(phi) * length), Math.sin(lambda) * length);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const api = { update };
|
|
32
|
+
randomizedLights.effect(combineLatest([
|
|
33
|
+
randomizedLights.lightsRef.$,
|
|
34
|
+
randomizedLights.select('position'),
|
|
35
|
+
randomizedLights.select('radius'),
|
|
36
|
+
randomizedLights.select('length'),
|
|
37
|
+
randomizedLights.select('ambient'),
|
|
38
|
+
]), ([group]) => {
|
|
39
|
+
if (accumulativeApi)
|
|
40
|
+
accumulativeApi.lights.set(group.uuid, api);
|
|
41
|
+
return () => accumulativeApi.lights.delete(group.uuid);
|
|
42
|
+
});
|
|
43
|
+
return api;
|
|
44
|
+
}
|
|
45
|
+
class RandomizedLightsConsumer {
|
|
46
|
+
constructor() {
|
|
47
|
+
inject(NGTS_RANDOMIZED_LIGHTS_API);
|
|
48
|
+
}
|
|
49
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: RandomizedLightsConsumer, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
50
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: RandomizedLightsConsumer, isStandalone: true, selector: "[ngtsRandomizedLightsConsumer]", ngImport: i0 }); }
|
|
51
|
+
}
|
|
52
|
+
export { RandomizedLightsConsumer };
|
|
53
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: RandomizedLightsConsumer, decorators: [{
|
|
54
|
+
type: Directive,
|
|
55
|
+
args: [{ selector: '[ngtsRandomizedLightsConsumer]', standalone: true }]
|
|
56
|
+
}], ctorParameters: function () { return []; } });
|
|
57
|
+
class NgtsRandomizedLights extends NgtRxStore {
|
|
58
|
+
constructor() {
|
|
59
|
+
super(...arguments);
|
|
60
|
+
this.lightsRef = injectNgtRef();
|
|
61
|
+
}
|
|
62
|
+
/** How many frames it will jiggle the lights, 1.
|
|
63
|
+
* Frames is context aware, if a provider like AccumulativeShadows exists, frames will be taken from there! */
|
|
64
|
+
set frames(frames) {
|
|
65
|
+
this.set({ frames });
|
|
66
|
+
}
|
|
67
|
+
/** Light position, [0, 0, 0] */
|
|
68
|
+
set position(position) {
|
|
69
|
+
this.set({ position });
|
|
70
|
+
}
|
|
71
|
+
/** Radius of the jiggle, higher values make softer light, 5 */
|
|
72
|
+
set radius(radius) {
|
|
73
|
+
this.set({ radius });
|
|
74
|
+
}
|
|
75
|
+
/** Amount of lights, 8 */
|
|
76
|
+
set amount(amount) {
|
|
77
|
+
this.set({ amount });
|
|
78
|
+
}
|
|
79
|
+
/** Light intensity, 1 */
|
|
80
|
+
set intensity(intensity) {
|
|
81
|
+
this.set({ intensity });
|
|
82
|
+
}
|
|
83
|
+
/** Ambient occlusion, lower values mean less AO, hight more, you can mix AO and directional light, 0.5 */
|
|
84
|
+
set ambient(ambient) {
|
|
85
|
+
this.set({ ambient });
|
|
86
|
+
}
|
|
87
|
+
/** If the lights cast shadows, this is true by default */
|
|
88
|
+
set castShadow(castShadow) {
|
|
89
|
+
this.set({ castShadow });
|
|
90
|
+
}
|
|
91
|
+
/** Default shadow bias, 0 */
|
|
92
|
+
set bias(bias) {
|
|
93
|
+
this.set({ bias });
|
|
94
|
+
}
|
|
95
|
+
/** Default map size, 512 */
|
|
96
|
+
set mapSize(mapSize) {
|
|
97
|
+
this.set({ mapSize });
|
|
98
|
+
}
|
|
99
|
+
/** Default size of the shadow camera, 10 */
|
|
100
|
+
set size(size) {
|
|
101
|
+
this.set({ size });
|
|
102
|
+
}
|
|
103
|
+
/** Default shadow camera near, 0.5 */
|
|
104
|
+
set near(near) {
|
|
105
|
+
this.set({ near });
|
|
106
|
+
}
|
|
107
|
+
/** Default shadow camera far, 500 */
|
|
108
|
+
set far(far) {
|
|
109
|
+
this.set({ far });
|
|
110
|
+
}
|
|
111
|
+
initialize() {
|
|
112
|
+
super.initialize();
|
|
113
|
+
this.set({
|
|
114
|
+
castShadow: true,
|
|
115
|
+
bias: 0.001,
|
|
116
|
+
mapSize: 512,
|
|
117
|
+
size: 5,
|
|
118
|
+
near: 0.5,
|
|
119
|
+
far: 500,
|
|
120
|
+
frames: 1,
|
|
121
|
+
position: [0, 0, 0],
|
|
122
|
+
radius: 1,
|
|
123
|
+
amount: 8,
|
|
124
|
+
intensity: 1,
|
|
125
|
+
ambient: 0.5,
|
|
126
|
+
});
|
|
127
|
+
this.connect('cameraArgs', this.select(['size', 'near', 'far'], ({ size, near, far }) => [-size, size, size, -size, near, far]));
|
|
128
|
+
this.connect('length', this.select(['position'], ({ position }) => new THREE.Vector3(...position).length()));
|
|
129
|
+
}
|
|
130
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsRandomizedLights, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
131
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtsRandomizedLights, isStandalone: true, selector: "ngts-randomized-lights", inputs: { lightsRef: "lightsRef", frames: "frames", position: "position", radius: "radius", amount: "amount", intensity: "intensity", ambient: "ambient", castShadow: "castShadow", bias: "bias", mapSize: "mapSize", size: "size", near: "near", far: "far" }, providers: [
|
|
132
|
+
{ provide: NGTS_RANDOMIZED_LIGHTS_API, useFactory: randomizedLightsApiFactory, deps: [NgtsRandomizedLights] },
|
|
133
|
+
], usesInheritance: true, ngImport: i0, template: `
|
|
134
|
+
<ngt-group ngtCompound [ref]="lightsRef">
|
|
135
|
+
<ngt-directional-light
|
|
136
|
+
*ngFor="let i; repeat: get('amount')"
|
|
137
|
+
[castShadow]="get('castShadow')"
|
|
138
|
+
[intensity]="get('intensity') / get('amount')"
|
|
139
|
+
>
|
|
140
|
+
<ngt-value [rawValue]="get('bias')" attach="shadow.bias" />
|
|
141
|
+
<ngt-vector2 *args="[get('mapSize'), get('mapSize')]" attach="shadow.mapSize" />
|
|
142
|
+
<ngt-orthographic-camera *args="get('cameraArgs')" attach="shadow.camera" />
|
|
143
|
+
</ngt-directional-light>
|
|
144
|
+
<ng-container ngtsRandomizedLightsConsumer />
|
|
145
|
+
</ngt-group>
|
|
146
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: RandomizedLightsConsumer, selector: "[ngtsRandomizedLightsConsumer]" }, { kind: "directive", type: NgtArgs, selector: "[args]", inputs: ["args"] }, { kind: "directive", type: NgtRepeat, selector: "[ngFor][ngForRepeat]", inputs: ["ngForRepeat"] }] }); }
|
|
147
|
+
}
|
|
148
|
+
export { NgtsRandomizedLights };
|
|
149
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsRandomizedLights, decorators: [{
|
|
150
|
+
type: Component,
|
|
151
|
+
args: [{
|
|
152
|
+
selector: 'ngts-randomized-lights',
|
|
153
|
+
standalone: true,
|
|
154
|
+
template: `
|
|
155
|
+
<ngt-group ngtCompound [ref]="lightsRef">
|
|
156
|
+
<ngt-directional-light
|
|
157
|
+
*ngFor="let i; repeat: get('amount')"
|
|
158
|
+
[castShadow]="get('castShadow')"
|
|
159
|
+
[intensity]="get('intensity') / get('amount')"
|
|
160
|
+
>
|
|
161
|
+
<ngt-value [rawValue]="get('bias')" attach="shadow.bias" />
|
|
162
|
+
<ngt-vector2 *args="[get('mapSize'), get('mapSize')]" attach="shadow.mapSize" />
|
|
163
|
+
<ngt-orthographic-camera *args="get('cameraArgs')" attach="shadow.camera" />
|
|
164
|
+
</ngt-directional-light>
|
|
165
|
+
<ng-container ngtsRandomizedLightsConsumer />
|
|
166
|
+
</ngt-group>
|
|
167
|
+
`,
|
|
168
|
+
imports: [RandomizedLightsConsumer, NgtArgs, NgtRepeat],
|
|
169
|
+
providers: [
|
|
170
|
+
{ provide: NGTS_RANDOMIZED_LIGHTS_API, useFactory: randomizedLightsApiFactory, deps: [NgtsRandomizedLights] },
|
|
171
|
+
],
|
|
172
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
173
|
+
}]
|
|
174
|
+
}], propDecorators: { lightsRef: [{
|
|
175
|
+
type: Input
|
|
176
|
+
}], frames: [{
|
|
177
|
+
type: Input
|
|
178
|
+
}], position: [{
|
|
179
|
+
type: Input
|
|
180
|
+
}], radius: [{
|
|
181
|
+
type: Input
|
|
182
|
+
}], amount: [{
|
|
183
|
+
type: Input
|
|
184
|
+
}], intensity: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}], ambient: [{
|
|
187
|
+
type: Input
|
|
188
|
+
}], castShadow: [{
|
|
189
|
+
type: Input
|
|
190
|
+
}], bias: [{
|
|
191
|
+
type: Input
|
|
192
|
+
}], mapSize: [{
|
|
193
|
+
type: Input
|
|
194
|
+
}], size: [{
|
|
195
|
+
type: Input
|
|
196
|
+
}], near: [{
|
|
197
|
+
type: Input
|
|
198
|
+
}], far: [{
|
|
199
|
+
type: Input
|
|
200
|
+
}] } });
|
|
201
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9taXplZC1saWdodHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zdGFnaW5nL3NyYy9saWIvYWNjdW11bGF0aXZlLXNoYWRvd3MvcmFuZG9taXplZC1saWdodHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyQyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM3RSxPQUFPLEVBQW1DLDZCQUE2QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRXhHLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBRWpFLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLElBQUksY0FBYyxDQUN4RCwwQkFBMEIsQ0FDN0IsQ0FBQztBQUVGLFNBQVMsMEJBQTBCLENBQUMsZ0JBQXNDO0lBQ3RFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBRTlELE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRTtRQUNoQixJQUFJLEtBQXlDLENBQUM7UUFDOUMsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFO1lBQzFDLEtBQUssSUFB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S0FBSztnQkFHTyxNQUFNO3NCQUFsQixLQUFLO2dCQUtPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBS08sTUFBTTtzQkFBbEIsS0FBSztnQkFLTyxNQUFNO3NCQUFsQixLQUFLO2dCQUtPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBS08sT0FBTztzQkFBbkIsS0FBSztnQkFLTyxVQUFVO3NCQUF0QixLQUFLO2dCQUtPLElBQUk7c0JBQWhCLEtBQUs7Z0JBS08sT0FBTztzQkFBbkIsS0FBSztnQkFLTyxJQUFJO3NCQUFoQixLQUFLO2dCQUtPLElBQUk7c0JBQWhCLEtBQUs7Z0JBS08sR0FBRztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBEaXJlY3RpdmUsIGluamVjdCwgSW5qZWN0aW9uVG9rZW4sIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIGluamVjdE5ndFJlZiwgTmd0QXJncywgTmd0UmVwZWF0LCBOZ3RSeFN0b3JlIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBEaXJlY3Rpb25hbExpZ2h0LCBHcm91cCwgT3J0aG9ncmFwaGljQ2FtZXJhLCBWZWN0b3IyIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NMaWdodEFwaSwgTkdUU19BQ0NVTVVMQVRJVkVfU0hBRE9XU19BUEkgfSBmcm9tICcuL2FjY3VtdWxhdGl2ZS1zaGFkb3dzJztcblxuZXh0ZW5kKHsgR3JvdXAsIERpcmVjdGlvbmFsTGlnaHQsIE9ydGhvZ3JhcGhpY0NhbWVyYSwgVmVjdG9yMiB9KTtcblxuZXhwb3J0IGNvbnN0IE5HVFNfUkFORE9NSVpFRF9MSUdIVFNfQVBJID0gbmV3IEluamVjdGlvblRva2VuPE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzTGlnaHRBcGk+KFxuICAgICdOZ3RzUmFuZG9taXplZExpZ2h0cyBBUEknXG4pO1xuXG5mdW5jdGlvbiByYW5kb21pemVkTGlnaHRzQXBpRmFjdG9yeShyYW5kb21pemVkTGlnaHRzOiBOZ3RzUmFuZG9taXplZExpZ2h0cykge1xuICAgIGNvbnN0IGFjY3VtdWxhdGl2ZUFwaSA9IGluamVjdChOR1RTX0FDQ1VNVUxBVElWRV9TSEFET1dTX0FQSSk7XG5cbiAgICBjb25zdCB1cGRhdGUgPSAoKSA9PiB7XG4gICAgICAgIGxldCBsaWdodDogVEhSRUUuRGlyZWN0aW9uYWxMaWdodCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJhbmRvbWl6ZWRMaWdodHMubGlnaHRzUmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgcmFuZG9taXplZExpZ2h0cy5saWdodHNSZWYubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGwrKykge1xuICAgICAgICAgICAgICAgIGxpZ2h0ID0gcmFuZG9taXplZExpZ2h0cy5saWdodHNSZWYubmF0aXZlRWxlbWVudC5jaGlsZHJlbltsXSBhcyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0O1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLnJhbmRvbSgpID4gcmFuZG9taXplZExpZ2h0cy5nZXQoJ2FtYmllbnQnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHJhbmRvbWl6ZWRMaWdodHMuZ2V0KCdwb3NpdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpdXMgPSByYW5kb21pemVkTGlnaHRzLmdldCgncmFkaXVzJyk7XG4gICAgICAgICAgICAgICAgICAgIGxpZ2h0LnBvc2l0aW9uLnNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uWzBdICsgVEhSRUUuTWF0aFV0aWxzLnJhbmRGbG9hdFNwcmVhZChyYWRpdXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25bMV0gKyBUSFJFRS5NYXRoVXRpbHMucmFuZEZsb2F0U3ByZWFkKHJhZGl1cyksXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblsyXSArIFRIUkVFLk1hdGhVdGlscy5yYW5kRmxvYXRTcHJlYWQocmFkaXVzKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhbWJkYSA9IE1hdGguYWNvcygyICogTWF0aC5yYW5kb20oKSAtIDEpIC0gTWF0aC5QSSAvIDIuMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGhpID0gMiAqIE1hdGguUEkgKiBNYXRoLnJhbmRvbSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSByYW5kb21pemVkTGlnaHRzLmdldCgnbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGxpZ2h0LnBvc2l0aW9uLnNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY29zKGxhbWJkYSkgKiBNYXRoLmNvcyhwaGkpICogbGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoTWF0aC5jb3MobGFtYmRhKSAqIE1hdGguc2luKHBoaSkgKiBsZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zaW4obGFtYmRhKSAqIGxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhcGkgPSB7IHVwZGF0ZSB9IGFzIE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzTGlnaHRBcGk7XG5cbiAgICByYW5kb21pemVkTGlnaHRzLmVmZmVjdChcbiAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLmxpZ2h0c1JlZi4kLFxuICAgICAgICAgICAgcmFuZG9taXplZExpZ2h0cy5zZWxlY3QoJ3Bvc2l0aW9uJyksXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLnNlbGVjdCgncmFkaXVzJyksXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLnNlbGVjdCgnbGVuZ3RoJyksXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLnNlbGVjdCgnYW1iaWVudCcpLFxuICAgICAgICBdKSxcbiAgICAgICAgKFtncm91cF0pID0+IHtcbiAgICAgICAgICAgIGlmIChhY2N1bXVsYXRpdmVBcGkpIGFjY3VtdWxhdGl2ZUFwaS5saWdodHMuc2V0KGdyb3VwLnV1aWQsIGFwaSk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4gYWNjdW11bGF0aXZlQXBpLmxpZ2h0cy5kZWxldGUoZ3JvdXAudXVpZCk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIGFwaTtcbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25ndHNSYW5kb21pemVkTGlnaHRzQ29uc3VtZXJdJywgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIFJhbmRvbWl6ZWRMaWdodHNDb25zdW1lciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGluamVjdChOR1RTX1JBTkRPTUlaRURfTElHSFRTX0FQSSk7XG4gICAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndHMtcmFuZG9taXplZC1saWdodHMnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5ndC1ncm91cCBuZ3RDb21wb3VuZCBbcmVmXT1cImxpZ2h0c1JlZlwiPlxuICAgICAgICAgICAgPG5ndC1kaXJlY3Rpb25hbC1saWdodFxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpOyByZXBlYXQ6IGdldCgnYW1vdW50JylcIlxuICAgICAgICAgICAgICAgIFtjYXN0U2hhZG93XT1cImdldCgnY2FzdFNoYWRvdycpXCJcbiAgICAgICAgICAgICAgICBbaW50ZW5zaXR5XT1cImdldCgnaW50ZW5zaXR5JykgLyBnZXQoJ2Ftb3VudCcpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmd0LXZhbHVlIFtyYXdWYWx1ZV09XCJnZXQoJ2JpYXMnKVwiIGF0dGFjaD1cInNoYWRvdy5iaWFzXCIgLz5cbiAgICAgICAgICAgICAgICA8bmd0LXZlY3RvcjIgKmFyZ3M9XCJbZ2V0KCdtYXBTaXplJyksIGdldCgnbWFwU2l6ZScpXVwiIGF0dGFjaD1cInNoYWRvdy5tYXBTaXplXCIgLz5cbiAgICAgICAgICAgICAgICA8bmd0LW9ydGhvZ3JhcGhpYy1jYW1lcmEgKmFyZ3M9XCJnZXQoJ2NhbWVyYUFyZ3MnKVwiIGF0dGFjaD1cInNoYWRvdy5jYW1lcmFcIiAvPlxuICAgICAgICAgICAgPC9uZ3QtZGlyZWN0aW9uYWwtbGlnaHQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG5ndHNSYW5kb21pemVkTGlnaHRzQ29uc3VtZXIgLz5cbiAgICAgICAgPC9uZ3QtZ3JvdXA+XG4gICAgYCxcbiAgICBpbXBvcnRzOiBbUmFuZG9taXplZExpZ2h0c0NvbnN1bWVyLCBOZ3RBcmdzLCBOZ3RSZXBlYXRdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IE5HVFNfUkFORE9NSVpFRF9MSUdIVFNfQVBJLCB1c2VGYWN0b3J5OiByYW5kb21pemVkTGlnaHRzQXBpRmFjdG9yeSwgZGVwczogW05ndHNSYW5kb21pemVkTGlnaHRzXSB9LFxuICAgIF0sXG4gICAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzUmFuZG9taXplZExpZ2h0cyBleHRlbmRzIE5ndFJ4U3RvcmUge1xuICAgIEBJbnB1dCgpIGxpZ2h0c1JlZiA9IGluamVjdE5ndFJlZjxUSFJFRS5Hcm91cD4oKTtcbiAgICAvKiogSG93IG1hbnkgZnJhbWVzIGl0IHdpbGwgamlnZ2xlIHRoZSBsaWdodHMsIDEuXG4gICAgICogIEZyYW1lcyBpcyBjb250ZXh0IGF3YXJlLCBpZiBhIHByb3ZpZGVyIGxpa2UgQWNjdW11bGF0aXZlU2hhZG93cyBleGlzdHMsIGZyYW1lcyB3aWxsIGJlIHRha2VuIGZyb20gdGhlcmUhICAqL1xuICAgIEBJbnB1dCgpIHNldCBmcmFtZXMoZnJhbWVzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBmcmFtZXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIExpZ2h0IHBvc2l0aW9uLCBbMCwgMCwgMF0gKi9cbiAgICBASW5wdXQoKSBzZXQgcG9zaXRpb24ocG9zaXRpb246IFt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyXSkge1xuICAgICAgICB0aGlzLnNldCh7IHBvc2l0aW9uIH0pO1xuICAgIH1cblxuICAgIC8qKiBSYWRpdXMgb2YgdGhlIGppZ2dsZSwgaGlnaGVyIHZhbHVlcyBtYWtlIHNvZnRlciBsaWdodCwgNSAqL1xuICAgIEBJbnB1dCgpIHNldCByYWRpdXMocmFkaXVzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyByYWRpdXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIEFtb3VudCBvZiBsaWdodHMsIDggKi9cbiAgICBASW5wdXQoKSBzZXQgYW1vdW50KGFtb3VudDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgYW1vdW50IH0pO1xuICAgIH1cblxuICAgIC8qKiBMaWdodCBpbnRlbnNpdHksIDEgKi9cbiAgICBASW5wdXQoKSBzZXQgaW50ZW5zaXR5KGludGVuc2l0eTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgaW50ZW5zaXR5IH0pO1xuICAgIH1cblxuICAgIC8qKiBBbWJpZW50IG9jY2x1c2lvbiwgbG93ZXIgdmFsdWVzIG1lYW4gbGVzcyBBTywgaGlnaHQgbW9yZSwgeW91IGNhbiBtaXggQU8gYW5kIGRpcmVjdGlvbmFsIGxpZ2h0LCAwLjUgKi9cbiAgICBASW5wdXQoKSBzZXQgYW1iaWVudChhbWJpZW50OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBhbWJpZW50IH0pO1xuICAgIH1cblxuICAgIC8qKiBJZiB0aGUgbGlnaHRzIGNhc3Qgc2hhZG93cywgdGhpcyBpcyB0cnVlIGJ5IGRlZmF1bHQgKi9cbiAgICBASW5wdXQoKSBzZXQgY2FzdFNoYWRvdyhjYXN0U2hhZG93OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgY2FzdFNoYWRvdyB9KTtcbiAgICB9XG5cbiAgICAvKiogRGVmYXVsdCBzaGFkb3cgYmlhcywgMCAqL1xuICAgIEBJbnB1dCgpIHNldCBiaWFzKGJpYXM6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGJpYXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIERlZmF1bHQgbWFwIHNpemUsIDUxMiAqL1xuICAgIEBJbnB1dCgpIHNldCBtYXBTaXplKG1hcFNpemU6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IG1hcFNpemUgfSk7XG4gICAgfVxuXG4gICAgLyoqIERlZmF1bHQgc2l6ZSBvZiB0aGUgc2hhZG93IGNhbWVyYSwgMTAgKi9cbiAgICBASW5wdXQoKSBzZXQgc2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBzaXplIH0pO1xuICAgIH1cblxuICAgIC8qKiBEZWZhdWx0IHNoYWRvdyBjYW1lcmEgbmVhciwgMC41ICovXG4gICAgQElucHV0KCkgc2V0IG5lYXIobmVhcjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbmVhciB9KTtcbiAgICB9XG5cbiAgICAvKiogRGVmYXVsdCBzaGFkb3cgY2FtZXJhIGZhciwgNTAwICovXG4gICAgQElucHV0KCkgc2V0IGZhcihmYXI6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGZhciB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgIGNhc3RTaGFkb3c6IHRydWUsXG4gICAgICAgICAgICBiaWFzOiAwLjAwMSxcbiAgICAgICAgICAgIG1hcFNpemU6IDUxMixcbiAgICAgICAgICAgIHNpemU6IDUsXG4gICAgICAgICAgICBuZWFyOiAwLjUsXG4gICAgICAgICAgICBmYXI6IDUwMCxcbiAgICAgICAgICAgIGZyYW1lczogMSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBbMCwgMCwgMF0sXG4gICAgICAgICAgICByYWRpdXM6IDEsXG4gICAgICAgICAgICBhbW91bnQ6IDgsXG4gICAgICAgICAgICBpbnRlbnNpdHk6IDEsXG4gICAgICAgICAgICBhbWJpZW50OiAwLjUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbm5lY3QoXG4gICAgICAgICAgICAnY2FtZXJhQXJncycsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdChbJ3NpemUnLCAnbmVhcicsICdmYXInXSwgKHsgc2l6ZSwgbmVhciwgZmFyIH0pID0+IFstc2l6ZSwgc2l6ZSwgc2l6ZSwgLXNpemUsIG5lYXIsIGZhcl0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29ubmVjdChcbiAgICAgICAgICAgICdsZW5ndGgnLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3QoWydwb3NpdGlvbiddLCAoeyBwb3NpdGlvbiB9KSA9PiBuZXcgVEhSRUUuVmVjdG9yMyguLi5wb3NpdGlvbikubGVuZ3RoKCkpXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19
|