angular-three-soba 1.14.0 → 2.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/abstractions/billboard/billboard.d.ts +28 -0
- package/abstractions/detailed/detailed.d.ts +26 -0
- package/abstractions/edges/edges.d.ts +34 -0
- package/abstractions/grid/grid.d.ts +50 -0
- package/abstractions/index.d.ts +6 -11
- package/abstractions/text/text.d.ts +82 -0
- package/abstractions/text-3d/text-3d.d.ts +81 -0
- package/cameras/{lib/camera → camera}/camera-content.d.ts +2 -2
- package/cameras/camera/camera.d.ts +26 -0
- package/cameras/cube-camera/cube-camera.d.ts +69 -0
- package/cameras/index.d.ts +4 -4
- package/cameras/orthographic-camera/orthographic-camera.d.ts +37 -0
- package/cameras/{lib/perspective-camera → perspective-camera}/perspective-camera.d.ts +10 -1
- package/controls/index.d.ts +1 -1
- package/controls/orbit-controls/orbit-controls.d.ts +54 -0
- package/esm2022/abstractions/angular-three-soba-abstractions.mjs +1 -1
- package/esm2022/abstractions/billboard/billboard.mjs +74 -0
- package/esm2022/abstractions/detailed/detailed.mjs +64 -0
- package/esm2022/abstractions/edges/edges.mjs +88 -0
- package/esm2022/abstractions/grid/grid.mjs +180 -0
- package/esm2022/abstractions/index.mjs +7 -12
- package/esm2022/abstractions/text/text.mjs +274 -0
- package/esm2022/abstractions/text-3d/text-3d.mjs +165 -0
- package/esm2022/angular-three-soba.mjs +1 -1
- package/esm2022/cameras/angular-three-soba-cameras.mjs +1 -1
- package/esm2022/cameras/camera/camera-content.mjs +20 -0
- package/esm2022/cameras/camera/camera.mjs +77 -0
- package/esm2022/cameras/cube-camera/cube-camera.mjs +161 -0
- package/esm2022/cameras/index.mjs +5 -5
- package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +102 -0
- package/esm2022/cameras/perspective-camera/perspective-camera.mjs +46 -0
- package/esm2022/controls/angular-three-soba-controls.mjs +1 -1
- package/esm2022/controls/index.mjs +2 -2
- package/esm2022/controls/orbit-controls/orbit-controls.mjs +181 -0
- package/esm2022/index.mjs +1 -1
- package/esm2022/loaders/angular-three-soba-loaders.mjs +1 -1
- package/esm2022/loaders/gltf-loader/gltf-loader.mjs +30 -0
- package/esm2022/loaders/index.mjs +5 -6
- package/esm2022/loaders/loader/loader.mjs +138 -0
- package/esm2022/loaders/progress/progress.mjs +45 -0
- package/esm2022/loaders/texture-loader/texture-loader.mjs +28 -0
- package/esm2022/materials/angular-three-soba-materials.mjs +1 -1
- package/esm2022/materials/index.mjs +7 -6
- package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +82 -0
- package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +367 -0
- package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +171 -0
- package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +278 -0
- package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +68 -0
- package/esm2022/materials/point-material/point-material.mjs +46 -0
- package/esm2022/misc/angular-three-soba-misc.mjs +1 -1
- package/esm2022/misc/animations/animations.mjs +59 -0
- package/esm2022/misc/bake-shadows/bake-shadows.mjs +24 -0
- package/esm2022/misc/caustics/caustics.mjs +387 -0
- package/esm2022/misc/decal/decal.mjs +187 -0
- package/esm2022/misc/depth-buffer/depth-buffer.mjs +44 -0
- package/esm2022/misc/example/example.mjs +160 -0
- package/esm2022/misc/fbo/fbo.mjs +47 -0
- package/esm2022/misc/html/html-wrapper.mjs +478 -0
- package/esm2022/misc/html/html.mjs +304 -0
- package/esm2022/misc/index.mjs +14 -5
- package/esm2022/misc/sampler/sampler.mjs +142 -0
- package/esm2022/misc/shadow/shadow.mjs +111 -0
- package/esm2022/misc/stats-gl/stats-gl.mjs +61 -0
- package/esm2022/misc/trail/trail.mjs +209 -0
- package/esm2022/misc/trail-texture/inject-trail-texture.mjs +17 -0
- package/esm2022/misc/trail-texture/trail-texture.mjs +106 -0
- package/esm2022/modifiers/angular-three-soba-modifiers.mjs +5 -0
- package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +64 -0
- package/esm2022/modifiers/index.mjs +2 -0
- package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +44 -0
- package/esm2022/performances/adaptive-events/adaptive-events.mjs +27 -0
- package/esm2022/performances/angular-three-soba-performances.mjs +5 -0
- package/esm2022/performances/index.mjs +6 -0
- package/esm2022/performances/points/points-input.mjs +64 -0
- package/esm2022/performances/points/points.mjs +329 -0
- package/esm2022/performances/points/position-point.mjs +54 -0
- package/esm2022/performances/segments/segment-object.mjs +9 -0
- package/esm2022/performances/segments/segments.mjs +182 -0
- package/esm2022/shaders/angular-three-soba-shaders.mjs +1 -1
- package/esm2022/shaders/blur-pass/blur-pass.mjs +61 -0
- package/esm2022/shaders/caustics/caustics-material.mjs +130 -0
- package/esm2022/shaders/caustics/caustics-projection-material.mjs +31 -0
- package/esm2022/shaders/convolution-material/convolution-material.mjs +94 -0
- package/esm2022/shaders/discard-material/discard-material.mjs +3 -0
- package/esm2022/shaders/grid-material/grid-material.mjs +77 -0
- package/esm2022/shaders/index.mjs +18 -15
- package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +56 -0
- package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +223 -0
- package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +170 -0
- package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +268 -0
- package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +37 -0
- package/esm2022/shaders/shader-material/shader-material.mjs +34 -0
- package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +25 -0
- package/esm2022/shaders/sparkles-material/sparkles-material.mjs +33 -0
- package/esm2022/shaders/spot-light-material/spot-light-material.mjs +86 -0
- package/esm2022/shaders/star-field-material/star-field-material.mjs +33 -0
- package/esm2022/shaders/wireframe-material/wireframe-material.mjs +247 -0
- package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +267 -0
- package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +108 -0
- package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +206 -0
- package/esm2022/staging/angular-three-soba-staging.mjs +1 -1
- package/esm2022/staging/backdrop/backdrop.mjs +77 -0
- package/esm2022/staging/bb-anchor/bb-anchor.mjs +70 -0
- package/esm2022/staging/bounds/bounds.mjs +308 -0
- package/esm2022/staging/camera-shake/camera-shake.mjs +123 -0
- package/esm2022/staging/center/center.mjs +163 -0
- package/esm2022/staging/cloud/cloud.mjs +158 -0
- package/esm2022/staging/contact-shadows/contact-shadows.mjs +246 -0
- package/esm2022/staging/environment/assets.mjs +13 -0
- package/esm2022/staging/environment/environment-cube.mjs +47 -0
- package/esm2022/staging/environment/environment-ground.mjs +41 -0
- package/esm2022/staging/environment/environment-input.mjs +119 -0
- package/esm2022/staging/environment/environment-map.mjs +53 -0
- package/esm2022/staging/environment/environment-portal.mjs +113 -0
- package/esm2022/staging/environment/environment.mjs +61 -0
- package/esm2022/staging/environment/utils.mjs +105 -0
- package/esm2022/staging/float/float.mjs +94 -0
- package/esm2022/staging/index.mjs +22 -18
- package/esm2022/staging/matcap-texture/matcap-texture.mjs +64 -0
- package/esm2022/staging/normal-texture/normal-texture.mjs +53 -0
- package/esm2022/staging/sky/sky.mjs +119 -0
- package/esm2022/staging/sparkles/sparkles.mjs +164 -0
- package/esm2022/staging/spot-light/shadow-mesh-input.mjs +63 -0
- package/esm2022/staging/spot-light/shadow-mesh.mjs +266 -0
- package/esm2022/staging/spot-light/spot-light-input.mjs +84 -0
- package/esm2022/staging/spot-light/spot-light.mjs +81 -0
- package/esm2022/staging/spot-light/volumetric-mesh.mjs +98 -0
- package/esm2022/staging/stage/stage.mjs +388 -0
- package/esm2022/staging/stars/stars.mjs +147 -0
- package/esm2022/staging/wireframe/wireframe-input.mjs +191 -0
- package/esm2022/staging/wireframe/wireframe.mjs +224 -0
- package/esm2022/utils/angular-three-soba-utils.mjs +5 -0
- package/esm2022/utils/content/content.mjs +15 -0
- package/esm2022/utils/index.mjs +2 -0
- package/fesm2022/angular-three-soba-abstractions.mjs +668 -1882
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +279 -232
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +104 -69
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +177 -164
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +630 -482
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +2248 -122
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-modifiers.mjs +71 -0
- package/fesm2022/angular-three-soba-modifiers.mjs.map +1 -0
- package/fesm2022/angular-three-soba-performances.mjs +697 -0
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -0
- package/fesm2022/angular-three-soba-shaders.mjs +554 -209
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +3231 -2852
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-utils.mjs +22 -0
- package/fesm2022/angular-three-soba-utils.mjs.map +1 -0
- package/fesm2022/angular-three-soba.mjs.map +1 -1
- package/loaders/gltf-loader/gltf-loader.d.ts +10 -0
- package/loaders/index.d.ts +4 -5
- package/loaders/loader/loader.d.ts +33 -0
- package/loaders/progress/progress.d.ts +9 -0
- package/loaders/texture-loader/texture-loader.d.ts +7 -0
- package/materials/index.d.ts +6 -5
- package/materials/mesh-distort-material/mesh-distort-material.d.ts +40 -0
- package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +99 -0
- package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +62 -0
- package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +107 -0
- package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +29 -0
- package/materials/point-material/point-material.d.ts +24 -0
- package/metadata.json +1 -0
- package/misc/animations/animations.d.ts +15 -0
- package/misc/{lib/bake-shadows → bake-shadows}/bake-shadows.d.ts +2 -5
- package/misc/caustics/caustics.d.ts +87 -0
- package/misc/decal/decal.d.ts +49 -0
- package/misc/depth-buffer/depth-buffer.d.ts +9 -0
- package/misc/example/example.d.ts +81 -0
- package/misc/{lib/fbo → fbo}/fbo.d.ts +4 -2
- package/misc/html/html-wrapper.d.ts +559 -0
- package/misc/html/html.d.ts +214 -0
- package/misc/index.d.ts +13 -4
- package/misc/sampler/sampler.d.ts +67 -0
- package/misc/shadow/shadow.d.ts +37 -0
- package/misc/stats-gl/stats-gl.d.ts +24 -0
- package/misc/trail/trail.d.ts +57 -0
- package/misc/trail-texture/inject-trail-texture.d.ts +9 -0
- package/misc/trail-texture/trail-texture.d.ts +50 -0
- package/modifiers/README.md +3 -0
- package/modifiers/curve-modifier/curve-modifier.d.ts +23 -0
- package/modifiers/index.d.ts +1 -0
- package/package.json +38 -27
- package/performances/README.md +3 -0
- package/performances/adaptive-dpr/adaptive-dpr.d.ts +14 -0
- package/{performance/lib/adaptive → performances/adaptive-events}/adaptive-events.d.ts +5 -6
- package/performances/index.d.ts +5 -0
- package/performances/points/points-input.d.ts +32 -0
- package/performances/points/points.d.ts +92 -0
- package/performances/points/position-point.d.ts +11 -0
- package/performances/segments/segment-object.d.ts +7 -0
- package/performances/segments/segments.d.ts +124 -0
- package/shaders/{lib/blur-pass → blur-pass}/blur-pass.d.ts +2 -2
- package/shaders/grid-material/grid-material.d.ts +37 -0
- package/shaders/index.d.ts +17 -14
- package/shaders/{lib/mesh-distort-material → mesh-distort-material}/mesh-distort-material.d.ts +147 -2
- package/shaders/{lib/mesh-transmission-material → mesh-transmission-material}/mesh-transmission-material.d.ts +1 -1
- package/shaders/{lib/mesh-wobble-material → mesh-wobble-material}/mesh-wobble-material.d.ts +1 -0
- package/shaders/{lib/shader-material → shader-material}/shader-material.d.ts +2 -2
- package/shaders/soft-shadow-material/soft-shadow-material.d.ts +19 -0
- package/shaders/sparkles-material/sparkles-material.d.ts +17 -0
- package/shaders/spot-light-material/spot-light-material.d.ts +13 -0
- package/shaders/star-field-material/star-field-material.d.ts +13 -0
- package/shaders/wireframe-material/wireframe-material.d.ts +58 -0
- package/staging/accumulative-shadows/accumulative-shadows.d.ts +146 -0
- package/staging/{lib/accumulative-shadows → accumulative-shadows}/progressive-light-map.d.ts +2 -2
- package/staging/accumulative-shadows/randomized-lights.d.ts +90 -0
- package/staging/backdrop/backdrop.d.ts +30 -0
- package/staging/bb-anchor/bb-anchor.d.ts +27 -0
- package/staging/bounds/bounds.d.ts +134 -0
- package/staging/camera-shake/camera-shake.d.ts +43 -0
- package/staging/center/center.d.ts +70 -0
- package/staging/cloud/cloud.d.ts +51 -0
- package/staging/contact-shadows/contact-shadows.d.ts +70 -0
- package/staging/{lib/environment → environment}/assets.d.ts +9 -9
- package/staging/environment/environment-cube.d.ts +15 -0
- package/staging/environment/environment-ground.d.ts +13 -0
- package/staging/environment/environment-input.d.ts +68 -0
- package/staging/environment/environment-map.d.ts +16 -0
- package/staging/environment/environment-portal.d.ts +18 -0
- package/staging/{lib/environment → environment}/environment.d.ts +2 -6
- package/staging/environment/utils.d.ts +7 -0
- package/staging/float/float.d.ts +31 -0
- package/staging/index.d.ts +21 -17
- package/staging/matcap-texture/matcap-texture.d.ts +13 -0
- package/staging/normal-texture/normal-texture.d.ts +16 -0
- package/staging/sky/sky.d.ts +48 -0
- package/staging/sparkles/sparkles.d.ts +63 -0
- package/staging/spot-light/shadow-mesh-input.d.ts +29 -0
- package/staging/spot-light/shadow-mesh.d.ts +37 -0
- package/staging/spot-light/spot-light-input.d.ts +38 -0
- package/staging/spot-light/spot-light.d.ts +39 -0
- package/staging/spot-light/volumetric-mesh.d.ts +24 -0
- package/staging/stage/stage.d.ts +130 -0
- package/staging/stars/stars.d.ts +45 -0
- package/staging/wireframe/wireframe-input.d.ts +65 -0
- package/staging/wireframe/wireframe.d.ts +28 -0
- package/utils/README.md +3 -0
- package/utils/content/content.d.ts +8 -0
- package/utils/index.d.ts +1 -0
- package/web-types.json +1 -0
- package/abstractions/lib/billboard/billboard.d.ts +0 -14
- package/abstractions/lib/catmull-rom-line/catmull-rom-line.d.ts +0 -15
- package/abstractions/lib/cubic-bezier-line/cubic-bezier-line.d.ts +0 -15
- package/abstractions/lib/edges/edges.d.ts +0 -18
- package/abstractions/lib/gizmo-helper/gizmo-helper.d.ts +0 -41
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.d.ts +0 -12
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +0 -16
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +0 -24
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +0 -14
- package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +0 -15
- package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +0 -28
- package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +0 -21
- package/abstractions/lib/line/line-input.d.ts +0 -19
- package/abstractions/lib/line/line.d.ts +0 -21
- package/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.d.ts +0 -19
- package/abstractions/lib/text/text.d.ts +0 -21
- package/abstractions/lib/text-3d/text-3d.d.ts +0 -39
- package/assets/default-spot-light-shadow.glsl +0 -10
- package/cameras/lib/camera/camera.d.ts +0 -19
- package/cameras/lib/cube-camera/cube-camera.d.ts +0 -27
- package/cameras/lib/orthographic-camera/orthographic-camera.d.ts +0 -17
- package/controls/lib/orbit-controls/orbit-controls.d.ts +0 -27
- package/esm2022/abstractions/lib/billboard/billboard.mjs +0 -74
- package/esm2022/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +0 -120
- package/esm2022/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +0 -99
- package/esm2022/abstractions/lib/edges/edges.mjs +0 -96
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-helper.mjs +0 -213
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.mjs +0 -31
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -92
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -184
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -46
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +0 -134
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -195
- package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +0 -267
- package/esm2022/abstractions/lib/line/line-input.mjs +0 -76
- package/esm2022/abstractions/lib/line/line.mjs +0 -133
- package/esm2022/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -128
- package/esm2022/abstractions/lib/text/text.mjs +0 -115
- package/esm2022/abstractions/lib/text-3d/text-3d.mjs +0 -145
- package/esm2022/cameras/lib/camera/camera-content.mjs +0 -21
- package/esm2022/cameras/lib/camera/camera.mjs +0 -75
- package/esm2022/cameras/lib/cube-camera/cube-camera.mjs +0 -131
- package/esm2022/cameras/lib/orthographic-camera/orthographic-camera.mjs +0 -93
- package/esm2022/cameras/lib/perspective-camera/perspective-camera.mjs +0 -47
- package/esm2022/controls/lib/orbit-controls/orbit-controls.mjs +0 -147
- package/esm2022/loaders/lib/cube-texture-loader/cube-texture-loader.mjs +0 -10
- package/esm2022/loaders/lib/gltf-loader/gltf-loader.mjs +0 -32
- package/esm2022/loaders/lib/loader/loader.mjs +0 -134
- package/esm2022/loaders/lib/progress/progress.mjs +0 -39
- package/esm2022/loaders/lib/texture-loader/texture-loader.mjs +0 -19
- package/esm2022/materials/lib/mesh-distort-material/mesh-distort-material.mjs +0 -75
- package/esm2022/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -328
- package/esm2022/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -158
- package/esm2022/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -238
- package/esm2022/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -68
- package/esm2022/misc/lib/animations/animations.mjs +0 -52
- package/esm2022/misc/lib/bake-shadows/bake-shadows.mjs +0 -26
- package/esm2022/misc/lib/depth-buffer/depth-buffer.mjs +0 -39
- package/esm2022/misc/lib/fbo/fbo.mjs +0 -39
- package/esm2022/performance/angular-three-soba-performance.mjs +0 -5
- package/esm2022/performance/index.mjs +0 -5
- package/esm2022/performance/lib/adaptive/adaptive-dpr.mjs +0 -47
- package/esm2022/performance/lib/adaptive/adaptive-events.mjs +0 -37
- package/esm2022/performance/lib/detailed/detailed.mjs +0 -54
- package/esm2022/performance/lib/stats/stats.mjs +0 -80
- package/esm2022/shaders/lib/blur-pass/blur-pass.mjs +0 -61
- package/esm2022/shaders/lib/caustics-material/caustics-material.mjs +0 -128
- package/esm2022/shaders/lib/caustics-projection-material/caustics-projection-material.mjs +0 -33
- package/esm2022/shaders/lib/convolution-material/convolution-material.mjs +0 -94
- package/esm2022/shaders/lib/discard-material/discard-material.mjs +0 -3
- package/esm2022/shaders/lib/mesh-distort-material/mesh-distort-material.mjs +0 -55
- package/esm2022/shaders/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -223
- package/esm2022/shaders/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -169
- package/esm2022/shaders/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -268
- package/esm2022/shaders/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -37
- package/esm2022/shaders/lib/shader-material/shader-material.mjs +0 -34
- package/esm2022/shaders/lib/soft-shadow-material/soft-shadow-material.mjs +0 -33
- package/esm2022/shaders/lib/spot-light-material/spot-light-material.mjs +0 -86
- package/esm2022/shaders/lib/star-field-material/star-field-material.mjs +0 -32
- package/esm2022/staging/lib/accumulative-shadows/accumulative-shadows.mjs +0 -249
- package/esm2022/staging/lib/accumulative-shadows/progressive-light-map.mjs +0 -108
- package/esm2022/staging/lib/accumulative-shadows/randomized-lights.mjs +0 -201
- package/esm2022/staging/lib/bounds/bounds.mjs +0 -284
- package/esm2022/staging/lib/camera-shake/camera-shake.mjs +0 -122
- package/esm2022/staging/lib/caustics/caustics.mjs +0 -364
- package/esm2022/staging/lib/center/center.mjs +0 -143
- package/esm2022/staging/lib/cloud/cloud.mjs +0 -160
- package/esm2022/staging/lib/contact-shadows/contact-shadows.mjs +0 -228
- package/esm2022/staging/lib/environment/assets.mjs +0 -13
- package/esm2022/staging/lib/environment/environment-cube.mjs +0 -41
- package/esm2022/staging/lib/environment/environment-ground.mjs +0 -67
- package/esm2022/staging/lib/environment/environment-inputs.mjs +0 -87
- package/esm2022/staging/lib/environment/environment-map.mjs +0 -39
- package/esm2022/staging/lib/environment/environment-portal.mjs +0 -111
- package/esm2022/staging/lib/environment/environment.mjs +0 -165
- package/esm2022/staging/lib/environment/utils.mjs +0 -70
- package/esm2022/staging/lib/float/float.mjs +0 -77
- package/esm2022/staging/lib/sky/sky.mjs +0 -109
- package/esm2022/staging/lib/sparkles/sparkles.mjs +0 -210
- package/esm2022/staging/lib/spot-light/common.mjs +0 -42
- package/esm2022/staging/lib/spot-light/shadow-mesh-input.mjs +0 -51
- package/esm2022/staging/lib/spot-light/spot-light-input.mjs +0 -62
- package/esm2022/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +0 -74
- package/esm2022/staging/lib/spot-light/spot-light-shadow-shader.mjs +0 -126
- package/esm2022/staging/lib/spot-light/spot-light-shadow.mjs +0 -63
- package/esm2022/staging/lib/spot-light/spot-light.mjs +0 -117
- package/esm2022/staging/lib/spot-light/volumetric-mesh.mjs +0 -86
- package/esm2022/staging/lib/stage/stage.mjs +0 -368
- package/esm2022/staging/lib/stars/stars.mjs +0 -140
- package/fesm2022/angular-three-soba-performance.mjs +0 -210
- package/fesm2022/angular-three-soba-performance.mjs.map +0 -1
- package/loaders/lib/cube-texture-loader/cube-texture-loader.d.ts +0 -3
- package/loaders/lib/gltf-loader/gltf-loader.d.ts +0 -8
- package/loaders/lib/loader/loader.d.ts +0 -26
- package/loaders/lib/progress/progress.d.ts +0 -16
- package/loaders/lib/texture-loader/texture-loader.d.ts +0 -5
- package/materials/lib/mesh-distort-material/mesh-distort-material.d.ts +0 -24
- package/materials/lib/mesh-reflector-material/mesh-reflector-material.d.ts +0 -41
- package/materials/lib/mesh-refraction-material/mesh-refraction-material.d.ts +0 -28
- package/materials/lib/mesh-transmission-material/mesh-transmission-material.d.ts +0 -46
- package/materials/lib/mesh-wobble-material/mesh-wobble-material.d.ts +0 -14
- package/misc/lib/animations/animations.d.ts +0 -13
- package/misc/lib/depth-buffer/depth-buffer.d.ts +0 -7
- package/performance/README.md +0 -3
- package/performance/index.d.ts +0 -4
- package/performance/lib/adaptive/adaptive-dpr.d.ts +0 -11
- package/performance/lib/detailed/detailed.d.ts +0 -13
- package/performance/lib/stats/stats.d.ts +0 -15
- package/plugin/README.md +0 -11
- package/plugin/generators.json +0 -19
- package/plugin/package.json +0 -9
- package/plugin/src/generators/init/compat.d.ts +0 -2
- package/plugin/src/generators/init/compat.js +0 -6
- package/plugin/src/generators/init/compat.js.map +0 -1
- package/plugin/src/generators/init/init.d.ts +0 -4
- package/plugin/src/generators/init/init.js +0 -22
- package/plugin/src/generators/init/init.js.map +0 -1
- package/plugin/src/generators/init/schema.json +0 -6
- package/plugin/src/index.d.ts +0 -1
- package/plugin/src/index.js +0 -6
- package/plugin/src/index.js.map +0 -1
- package/shaders/lib/soft-shadow-material/soft-shadow-material.d.ts +0 -10
- package/shaders/lib/spot-light-material/spot-light-material.d.ts +0 -4
- package/shaders/lib/star-field-material/star-field-material.d.ts +0 -3
- package/staging/lib/accumulative-shadows/accumulative-shadows.d.ts +0 -58
- package/staging/lib/accumulative-shadows/randomized-lights.d.ts +0 -42
- package/staging/lib/bounds/bounds.d.ts +0 -48
- package/staging/lib/camera-shake/camera-shake.d.ts +0 -28
- package/staging/lib/caustics/caustics.d.ts +0 -47
- package/staging/lib/center/center.d.ts +0 -40
- package/staging/lib/cloud/cloud.d.ts +0 -23
- package/staging/lib/contact-shadows/contact-shadows.d.ts +0 -29
- package/staging/lib/environment/environment-cube.d.ts +0 -11
- package/staging/lib/environment/environment-ground.d.ts +0 -9
- package/staging/lib/environment/environment-inputs.d.ts +0 -28
- package/staging/lib/environment/environment-map.d.ts +0 -10
- package/staging/lib/environment/environment-portal.d.ts +0 -15
- package/staging/lib/environment/utils.d.ts +0 -8
- package/staging/lib/float/float.d.ts +0 -16
- package/staging/lib/sky/sky.d.ts +0 -20
- package/staging/lib/sparkles/sparkles.d.ts +0 -29
- package/staging/lib/spot-light/common.d.ts +0 -3
- package/staging/lib/spot-light/shadow-mesh-input.d.ts +0 -14
- package/staging/lib/spot-light/spot-light-input.d.ts +0 -16
- package/staging/lib/spot-light/spot-light-shadow-no-shader.d.ts +0 -14
- package/staging/lib/spot-light/spot-light-shadow-shader.d.ts +0 -25
- package/staging/lib/spot-light/spot-light-shadow.d.ts +0 -6
- package/staging/lib/spot-light/spot-light.d.ts +0 -17
- package/staging/lib/spot-light/volumetric-mesh.d.ts +0 -15
- package/staging/lib/stage/stage.d.ts +0 -87
- package/staging/lib/stars/stars.d.ts +0 -20
- /package/shaders/{lib/caustics-material → caustics}/caustics-material.d.ts +0 -0
- /package/shaders/{lib/caustics-projection-material → caustics}/caustics-projection-material.d.ts +0 -0
- /package/shaders/{lib/convolution-material → convolution-material}/convolution-material.d.ts +0 -0
- /package/shaders/{lib/discard-material → discard-material}/discard-material.d.ts +0 -0
- /package/shaders/{lib/mesh-reflector-material → mesh-reflector-material}/mesh-reflector-material.d.ts +0 -0
- /package/shaders/{lib/mesh-refraction-material → mesh-refraction-material}/mesh-refraction-material.d.ts +0 -0
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { Directive, inject, Input } from '@angular/core';
|
|
2
|
-
import { injectBeforeRender, NgtRxStore, NgtStore } from 'angular-three';
|
|
3
|
-
import { combineLatest } from 'rxjs';
|
|
4
|
-
import { SimplexNoise } from 'three-stdlib';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
class NgtsCameraShake extends NgtRxStore {
|
|
7
|
-
set intensity(intensity) {
|
|
8
|
-
this.set({ intensity });
|
|
9
|
-
}
|
|
10
|
-
set decay(decay) {
|
|
11
|
-
this.set({ decay });
|
|
12
|
-
}
|
|
13
|
-
set decayRate(decayRate) {
|
|
14
|
-
this.set({ decayRate });
|
|
15
|
-
}
|
|
16
|
-
set maxYaw(maxYaw) {
|
|
17
|
-
this.set({ maxYaw });
|
|
18
|
-
}
|
|
19
|
-
set maxPitch(maxPitch) {
|
|
20
|
-
this.set({ maxPitch });
|
|
21
|
-
}
|
|
22
|
-
set maxRoll(maxRoll) {
|
|
23
|
-
this.set({ maxRoll });
|
|
24
|
-
}
|
|
25
|
-
set yawFrequency(yawFrequency) {
|
|
26
|
-
this.set({ yawFrequency });
|
|
27
|
-
}
|
|
28
|
-
set pitchFrequency(pitchFrequency) {
|
|
29
|
-
this.set({ pitchFrequency });
|
|
30
|
-
}
|
|
31
|
-
set rollFrequency(rollFrequency) {
|
|
32
|
-
this.set({ rollFrequency });
|
|
33
|
-
}
|
|
34
|
-
initialize() {
|
|
35
|
-
super.initialize();
|
|
36
|
-
this.set({
|
|
37
|
-
intensity: 1,
|
|
38
|
-
decayRate: 0.65,
|
|
39
|
-
maxYaw: 0.1,
|
|
40
|
-
maxPitch: 0.1,
|
|
41
|
-
maxRoll: 0.1,
|
|
42
|
-
yawFrequency: 0.1,
|
|
43
|
-
pitchFrequency: 0.1,
|
|
44
|
-
rollFrequency: 0.1,
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
constructor() {
|
|
48
|
-
super();
|
|
49
|
-
this.store = inject(NgtStore);
|
|
50
|
-
this.initialRotation = this.store.get('camera').rotation.clone();
|
|
51
|
-
this.yawNoise = new SimplexNoise();
|
|
52
|
-
this.pitchNoise = new SimplexNoise();
|
|
53
|
-
this.rollNoise = new SimplexNoise();
|
|
54
|
-
injectBeforeRender(({ clock, delta, camera }) => {
|
|
55
|
-
const { intensity, maxYaw, maxPitch, maxRoll, yawFrequency, pitchFrequency, rollFrequency, decay, decayRate, } = this.get();
|
|
56
|
-
const shake = Math.pow(intensity, 2);
|
|
57
|
-
const yaw = maxYaw * shake * this.yawNoise.noise(clock.elapsedTime * yawFrequency, 1);
|
|
58
|
-
const pitch = maxPitch * shake * this.pitchNoise.noise(clock.elapsedTime * pitchFrequency, 1);
|
|
59
|
-
const roll = maxRoll * shake * this.rollNoise.noise(clock.elapsedTime * rollFrequency, 1);
|
|
60
|
-
camera.rotation.set(this.initialRotation.x + pitch, this.initialRotation.y + yaw, this.initialRotation.z + roll);
|
|
61
|
-
if (decay && intensity > 0) {
|
|
62
|
-
this.set({ intensity: intensity - decayRate * delta });
|
|
63
|
-
this.constraintIntensity();
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
ngOnInit() {
|
|
68
|
-
this.setChangeEvent();
|
|
69
|
-
}
|
|
70
|
-
setChangeEvent() {
|
|
71
|
-
this.effect(combineLatest([this.store.select('camera'), this.store.select('controls')]), ([camera, controls]) => {
|
|
72
|
-
if (controls) {
|
|
73
|
-
const callback = () => void (this.initialRotation = camera.rotation.clone());
|
|
74
|
-
controls.addEventListener('change', callback);
|
|
75
|
-
callback();
|
|
76
|
-
return () => void controls.removeEventListener('change', callback);
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
getIntensity() {
|
|
81
|
-
return this.get('intensity');
|
|
82
|
-
}
|
|
83
|
-
setIntensity(intensity) {
|
|
84
|
-
this.set({ intensity });
|
|
85
|
-
this.constraintIntensity();
|
|
86
|
-
}
|
|
87
|
-
constraintIntensity() {
|
|
88
|
-
const intensity = this.get('intensity');
|
|
89
|
-
if (intensity < 0 || intensity > 1) {
|
|
90
|
-
this.set({ intensity: intensity < 0 ? 0 : 1 });
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsCameraShake, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
94
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: NgtsCameraShake, isStandalone: true, selector: "ngts-camera-shake", inputs: { intensity: "intensity", decay: "decay", decayRate: "decayRate", maxYaw: "maxYaw", maxPitch: "maxPitch", maxRoll: "maxRoll", yawFrequency: "yawFrequency", pitchFrequency: "pitchFrequency", rollFrequency: "rollFrequency" }, usesInheritance: true, ngImport: i0 }); }
|
|
95
|
-
}
|
|
96
|
-
export { NgtsCameraShake };
|
|
97
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsCameraShake, decorators: [{
|
|
98
|
-
type: Directive,
|
|
99
|
-
args: [{
|
|
100
|
-
selector: 'ngts-camera-shake',
|
|
101
|
-
standalone: true,
|
|
102
|
-
}]
|
|
103
|
-
}], ctorParameters: function () { return []; }, propDecorators: { intensity: [{
|
|
104
|
-
type: Input
|
|
105
|
-
}], decay: [{
|
|
106
|
-
type: Input
|
|
107
|
-
}], decayRate: [{
|
|
108
|
-
type: Input
|
|
109
|
-
}], maxYaw: [{
|
|
110
|
-
type: Input
|
|
111
|
-
}], maxPitch: [{
|
|
112
|
-
type: Input
|
|
113
|
-
}], maxRoll: [{
|
|
114
|
-
type: Input
|
|
115
|
-
}], yawFrequency: [{
|
|
116
|
-
type: Input
|
|
117
|
-
}], pitchFrequency: [{
|
|
118
|
-
type: Input
|
|
119
|
-
}], rollFrequency: [{
|
|
120
|
-
type: Input
|
|
121
|
-
}] } });
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtZXJhLXNoYWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLXNvYmEvc3RhZ2luZy9zcmMvbGliL2NhbWVyYS1zaGFrZS9jYW1lcmEtc2hha2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFFNUMsTUFJYSxlQUFnQixTQUFRLFVBQVU7SUFTM0MsSUFBYSxTQUFTLENBQUMsU0FBaUI7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQWEsS0FBSyxDQUFDLEtBQWM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQWEsU0FBUyxDQUFDLFNBQWlCO1FBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFhLE1BQU0sQ0FBQyxNQUFjO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFhLFFBQVEsQ0FBQyxRQUFnQjtRQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBYSxPQUFPLENBQUMsT0FBZTtRQUNoQyxJQUFJLENBQUMsR0FBRyxD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R0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNsRDtJQUNMLENBQUM7OEdBNUhRLGVBQWU7a0dBQWYsZUFBZTs7U0FBZixlQUFlOzJGQUFmLGVBQWU7a0JBSjNCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsVUFBVSxFQUFFLElBQUk7aUJBQ25COzBFQVVnQixTQUFTO3NCQUFyQixLQUFLO2dCQUlPLEtBQUs7c0JBQWpCLEtBQUs7Z0JBSU8sU0FBUztzQkFBckIsS0FBSztnQkFJTyxNQUFNO3NCQUFsQixLQUFLO2dCQUlPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBSU8sT0FBTztzQkFBbkIsS0FBSztnQkFJTyxZQUFZO3NCQUF4QixLQUFLO2dCQUlPLGNBQWM7c0JBQTFCLEtBQUs7Z0JBSU8sYUFBYTtzQkFBekIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgaW5qZWN0LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmplY3RCZWZvcmVSZW5kZXIsIE5ndFJ4U3RvcmUsIE5ndFN0b3JlIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTaW1wbGV4Tm9pc2UgfSBmcm9tICd0aHJlZS1zdGRsaWInO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ25ndHMtY2FtZXJhLXNoYWtlJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzQ2FtZXJhU2hha2UgZXh0ZW5kcyBOZ3RSeFN0b3JlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gaW5qZWN0KE5ndFN0b3JlKTtcblxuICAgIHByaXZhdGUgaW5pdGlhbFJvdGF0aW9uID0gdGhpcy5zdG9yZS5nZXQoJ2NhbWVyYScpLnJvdGF0aW9uLmNsb25lKCk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHlhd05vaXNlID0gbmV3IFNpbXBsZXhOb2lzZSgpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGl0Y2hOb2lzZSA9IG5ldyBTaW1wbGV4Tm9pc2UoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvbGxOb2lzZSA9IG5ldyBTaW1wbGV4Tm9pc2UoKTtcblxuICAgIEBJbnB1dCgpIHNldCBpbnRlbnNpdHkoaW50ZW5zaXR5OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBpbnRlbnNpdHkgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IGRlY2F5KGRlY2F5OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZGVjYXkgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IGRlY2F5UmF0ZShkZWNheVJhdGU6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGRlY2F5UmF0ZSB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgbWF4WWF3KG1heFlhdzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbWF4WWF3IH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBtYXhQaXRjaChtYXhQaXRjaDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbWF4UGl0Y2ggfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IG1heFJvbGwobWF4Um9sbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbWF4Um9sbCB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgeWF3RnJlcXVlbmN5KHlhd0ZyZXF1ZW5jeTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgeWF3RnJlcXVlbmN5IH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBwaXRjaEZyZXF1ZW5jeShwaXRjaEZyZXF1ZW5jeTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgcGl0Y2hGcmVxdWVuY3kgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IHJvbGxGcmVxdWVuY3kocm9sbEZyZXF1ZW5jeTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgcm9sbEZyZXF1ZW5jeSB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgIGludGVuc2l0eTogMSxcbiAgICAgICAgICAgIGRlY2F5UmF0ZTogMC42NSxcbiAgICAgICAgICAgIG1heFlhdzogMC4xLFxuICAgICAgICAgICAgbWF4UGl0Y2g6IDAuMSxcbiAgICAgICAgICAgIG1heFJvbGw6IDAuMSxcbiAgICAgICAgICAgIHlhd0ZyZXF1ZW5jeTogMC4xLFxuICAgICAgICAgICAgcGl0Y2hGcmVxdWVuY3k6IDAuMSxcbiAgICAgICAgICAgIHJvbGxGcmVxdWVuY3k6IDAuMSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGluamVjdEJlZm9yZVJlbmRlcigoeyBjbG9jaywgZGVsdGEsIGNhbWVyYSB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgaW50ZW5zaXR5LFxuICAgICAgICAgICAgICAgIG1heFlhdyxcbiAgICAgICAgICAgICAgICBtYXhQaXRjaCxcbiAgICAgICAgICAgICAgICBtYXhSb2xsLFxuICAgICAgICAgICAgICAgIHlhd0ZyZXF1ZW5jeSxcbiAgICAgICAgICAgICAgICBwaXRjaEZyZXF1ZW5jeSxcbiAgICAgICAgICAgICAgICByb2xsRnJlcXVlbmN5LFxuICAgICAgICAgICAgICAgIGRlY2F5LFxuICAgICAgICAgICAgICAgIGRlY2F5UmF0ZSxcbiAgICAgICAgICAgIH0gPSB0aGlzLmdldCgpO1xuXG4gICAgICAgICAgICBjb25zdCBzaGFrZSA9IE1hdGgucG93KGludGVuc2l0eSwgMik7XG4gICAgICAgICAgICBjb25zdCB5YXcgPSBtYXhZYXcgKiBzaGFrZSAqIHRoaXMueWF3Tm9pc2Uubm9pc2UoY2xvY2suZWxhcHNlZFRpbWUgKiB5YXdGcmVxdWVuY3ksIDEpO1xuICAgICAgICAgICAgY29uc3QgcGl0Y2ggPSBtYXhQaXRjaCAqIHNoYWtlICogdGhpcy5waXRjaE5vaXNlLm5vaXNlKGNsb2NrLmVsYXBzZWRUaW1lICogcGl0Y2hGcmVxdWVuY3ksIDEpO1xuICAgICAgICAgICAgY29uc3Qgcm9sbCA9IG1heFJvbGwgKiBzaGFrZSAqIHRoaXMucm9sbE5vaXNlLm5vaXNlKGNsb2NrLmVsYXBzZWRUaW1lICogcm9sbEZyZXF1ZW5jeSwgMSk7XG5cbiAgICAgICAgICAgIGNhbWVyYS5yb3RhdGlvbi5zZXQoXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsUm90YXRpb24ueCArIHBpdGNoLFxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFJvdGF0aW9uLnkgKyB5YXcsXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsUm90YXRpb24ueiArIHJvbGxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChkZWNheSAmJiBpbnRlbnNpdHkgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoeyBpbnRlbnNpdHk6IGludGVuc2l0eSAtIGRlY2F5UmF0ZSAqIGRlbHRhIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uc3RyYWludEludGVuc2l0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDaGFuZ2VFdmVudCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Q2hhbmdlRXZlbnQoKSB7XG4gICAgICAgIHRoaXMuZWZmZWN0KFxuICAgICAgICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5zdG9yZS5zZWxlY3QoJ2NhbWVyYScpLCB0aGlzLnN0b3JlLnNlbGVjdCgnY29udHJvbHMnKV0pLFxuICAgICAgICAgICAgKFtjYW1lcmEsIGNvbnRyb2xzXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9scykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+IHZvaWQgKHRoaXMuaW5pdGlhbFJvdGF0aW9uID0gY2FtZXJhLnJvdGF0aW9uLmNsb25lKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250cm9scy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB2b2lkIGNvbnRyb2xzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0SW50ZW5zaXR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2ludGVuc2l0eScpO1xuICAgIH1cblxuICAgIHNldEludGVuc2l0eShpbnRlbnNpdHk6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGludGVuc2l0eSB9KTtcbiAgICAgICAgdGhpcy5jb25zdHJhaW50SW50ZW5zaXR5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25zdHJhaW50SW50ZW5zaXR5KCkge1xuICAgICAgICBjb25zdCBpbnRlbnNpdHkgPSB0aGlzLmdldCgnaW50ZW5zaXR5Jyk7XG4gICAgICAgIGlmIChpbnRlbnNpdHkgPCAwIHx8IGludGVuc2l0eSA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KHsgaW50ZW5zaXR5OiBpbnRlbnNpdHkgPCAwID8gMCA6IDEgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
import { NgIf } from '@angular/common';
|
|
2
|
-
import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, Input } from '@angular/core';
|
|
3
|
-
import { extend, injectNgtRef, NgtRxStore, NgtStore } from 'angular-three';
|
|
4
|
-
import { NgtsEdges } from 'angular-three-soba/abstractions';
|
|
5
|
-
import { injectNgtsFBO } from 'angular-three-soba/misc';
|
|
6
|
-
import { CausticsMaterial, CausticsProjectionMaterial } from 'angular-three-soba/shaders';
|
|
7
|
-
import { combineLatest, map } from 'rxjs';
|
|
8
|
-
import * as THREE from 'three';
|
|
9
|
-
import { Group, LineBasicMaterial, Mesh, OrthographicCamera, PlaneGeometry, Scene } from 'three';
|
|
10
|
-
import { FullScreenQuad } from 'three-stdlib';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
extend({ Group, Scene, Mesh, PlaneGeometry, OrthographicCamera, CausticsProjectionMaterial, LineBasicMaterial });
|
|
13
|
-
const NORMALPROPS = {
|
|
14
|
-
depth: true,
|
|
15
|
-
minFilter: THREE.LinearFilter,
|
|
16
|
-
magFilter: THREE.LinearFilter,
|
|
17
|
-
encoding: THREE.LinearEncoding,
|
|
18
|
-
type: THREE.UnsignedByteType,
|
|
19
|
-
};
|
|
20
|
-
const CAUSTICPROPS = {
|
|
21
|
-
minFilter: THREE.LinearMipmapLinearFilter,
|
|
22
|
-
magFilter: THREE.LinearFilter,
|
|
23
|
-
encoding: THREE.LinearEncoding,
|
|
24
|
-
format: THREE.RGBAFormat,
|
|
25
|
-
type: THREE.FloatType,
|
|
26
|
-
generateMipmaps: true,
|
|
27
|
-
};
|
|
28
|
-
function createNormalMaterial(side = THREE.FrontSide) {
|
|
29
|
-
const viewMatrix = { value: new THREE.Matrix4() };
|
|
30
|
-
return Object.assign(new THREE.MeshNormalMaterial({ side }), {
|
|
31
|
-
viewMatrix,
|
|
32
|
-
onBeforeCompile: (shader) => {
|
|
33
|
-
shader.uniforms.viewMatrix = viewMatrix;
|
|
34
|
-
shader.fragmentShader =
|
|
35
|
-
`vec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {
|
|
36
|
-
return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );
|
|
37
|
-
}\n` +
|
|
38
|
-
shader.fragmentShader.replace('#include <normal_fragment_maps>', `#include <normal_fragment_maps>
|
|
39
|
-
normal = inverseTransformDirection( normal, viewMatrix );\n`);
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
class NgtsCaustics extends NgtRxStore {
|
|
44
|
-
constructor() {
|
|
45
|
-
super(...arguments);
|
|
46
|
-
this.CustomBlending = THREE.CustomBlending;
|
|
47
|
-
this.OneFactor = THREE.OneFactor;
|
|
48
|
-
this.SrcAlphaFactor = THREE.SrcAlphaFactor;
|
|
49
|
-
this.Math = Math;
|
|
50
|
-
this.planeRef = injectNgtRef();
|
|
51
|
-
this.sceneRef = injectNgtRef();
|
|
52
|
-
this.cameraRef = injectNgtRef();
|
|
53
|
-
this.causticsRef = injectNgtRef();
|
|
54
|
-
this.normalTargetFbo = injectNgtsFBO(() => this.select('resolution').pipe(map((resolution) => ({ width: resolution, height: resolution, settings: NORMALPROPS }))));
|
|
55
|
-
this.normalTargetBFbo = injectNgtsFBO(() => this.select('resolution').pipe(map((resolution) => ({ width: resolution, height: resolution, settings: NORMALPROPS }))));
|
|
56
|
-
this.causticsTargetFbo = injectNgtsFBO(() => this.select('resolution').pipe(map((resolution) => ({ width: resolution, height: resolution, settings: CAUSTICPROPS }))));
|
|
57
|
-
this.causticsTargetBFbo = injectNgtsFBO(() => this.select('resolution').pipe(map((resolution) => ({ width: resolution, height: resolution, settings: CAUSTICPROPS }))));
|
|
58
|
-
this.store = inject(NgtStore);
|
|
59
|
-
}
|
|
60
|
-
/** How many frames it will render, set it to Infinity for runtime, default: 1 */
|
|
61
|
-
set frames(frames) {
|
|
62
|
-
this.set({ frames });
|
|
63
|
-
}
|
|
64
|
-
/** Enables visual cues to help you stage your scene, default: false */
|
|
65
|
-
set debug(debug) {
|
|
66
|
-
this.set({ debug });
|
|
67
|
-
}
|
|
68
|
-
/** Will display caustics only and skip the models, default: false */
|
|
69
|
-
set causticsOnly(causticsOnly) {
|
|
70
|
-
this.set({ causticsOnly });
|
|
71
|
-
}
|
|
72
|
-
/** Will include back faces and enable the backsideIOR prop, default: false */
|
|
73
|
-
set backside(backside) {
|
|
74
|
-
this.set({ backside });
|
|
75
|
-
}
|
|
76
|
-
/** The IOR refraction index, default: 1.1 */
|
|
77
|
-
set ior(ior) {
|
|
78
|
-
this.set({ ior });
|
|
79
|
-
}
|
|
80
|
-
/** The IOR refraction index for back faces (only available when backside is enabled), default: 1.1 */
|
|
81
|
-
set backsideIOR(backsideIOR) {
|
|
82
|
-
this.set({ backsideIOR });
|
|
83
|
-
}
|
|
84
|
-
/** The texel size, default: 0.3125 */
|
|
85
|
-
set worldRadius(worldRadius) {
|
|
86
|
-
this.set({ worldRadius });
|
|
87
|
-
}
|
|
88
|
-
/** Intensity of the prjected caustics, default: 0.05 */
|
|
89
|
-
set intensity(intensity) {
|
|
90
|
-
this.set({ intensity });
|
|
91
|
-
}
|
|
92
|
-
/** Caustics color, default: white */
|
|
93
|
-
set color(color) {
|
|
94
|
-
this.set({ color });
|
|
95
|
-
}
|
|
96
|
-
/** Buffer resolution, default: 2048 */
|
|
97
|
-
set resolution(resolution) {
|
|
98
|
-
this.set({ resolution });
|
|
99
|
-
}
|
|
100
|
-
/** Camera position, it will point towards the contents bounds center, default: [5, 5, 5] */
|
|
101
|
-
set lightSource(lightSource) {
|
|
102
|
-
this.set({ lightSource });
|
|
103
|
-
}
|
|
104
|
-
initialize() {
|
|
105
|
-
this.set({
|
|
106
|
-
frames: 1,
|
|
107
|
-
ior: 1.1,
|
|
108
|
-
color: 'white',
|
|
109
|
-
causticsOnly: false,
|
|
110
|
-
backside: false,
|
|
111
|
-
backsideIOR: 1.1,
|
|
112
|
-
worldRadius: 0.3125,
|
|
113
|
-
intensity: 0.05,
|
|
114
|
-
resolution: 2024,
|
|
115
|
-
lightSource: [5, 5, 5],
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
ngOnInit() {
|
|
119
|
-
this.updateWorldMatrix();
|
|
120
|
-
this.setBeforeRender();
|
|
121
|
-
}
|
|
122
|
-
updateWorldMatrix() {
|
|
123
|
-
this.hold(combineLatest([this.sceneRef.children$(), this.causticsRef.$, this.causticsRef.children$(), this.select()]), () => {
|
|
124
|
-
if (this.causticsRef.nativeElement) {
|
|
125
|
-
this.causticsRef.nativeElement.updateWorldMatrix(false, true);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
setBeforeRender() {
|
|
130
|
-
const causticsMaterial = new CausticsMaterial();
|
|
131
|
-
const causticsQuad = new FullScreenQuad(causticsMaterial);
|
|
132
|
-
const normalMaterial = createNormalMaterial();
|
|
133
|
-
const normalMaterialB = createNormalMaterial(THREE.BackSide);
|
|
134
|
-
this.effect(combineLatest([
|
|
135
|
-
this.sceneRef.$,
|
|
136
|
-
this.sceneRef.children$(),
|
|
137
|
-
this.causticsRef.$,
|
|
138
|
-
this.cameraRef.$,
|
|
139
|
-
this.normalTargetFbo.$,
|
|
140
|
-
this.normalTargetBFbo.$,
|
|
141
|
-
this.causticsTargetFbo.$,
|
|
142
|
-
this.causticsTargetBFbo.$,
|
|
143
|
-
this.planeRef.$,
|
|
144
|
-
this.planeRef.children$('both'),
|
|
145
|
-
]), ([scene, children, caustics, camera, normalTarget, normalTargetB, causticsTarget, causticsTargetB, plane,]) => {
|
|
146
|
-
caustics.updateWorldMatrix(false, true);
|
|
147
|
-
if (children.length > 1) {
|
|
148
|
-
const v = new THREE.Vector3();
|
|
149
|
-
const lpF = new THREE.Frustum();
|
|
150
|
-
const lpM = new THREE.Matrix4();
|
|
151
|
-
const lpP = new THREE.Plane();
|
|
152
|
-
const lightDir = new THREE.Vector3();
|
|
153
|
-
const lightDirInv = new THREE.Vector3();
|
|
154
|
-
const bounds = new THREE.Box3();
|
|
155
|
-
const focusPos = new THREE.Vector3();
|
|
156
|
-
let count = 0;
|
|
157
|
-
return this.store.get('internal').subscribe(({ gl }) => {
|
|
158
|
-
const { frames, lightSource, resolution, worldRadius, intensity, backside, backsideIOR, ior, causticsOnly, debug, } = this.get();
|
|
159
|
-
if (frames === Infinity || count++ < frames) {
|
|
160
|
-
if (Array.isArray(lightSource))
|
|
161
|
-
lightDir.fromArray(lightSource).normalize();
|
|
162
|
-
else
|
|
163
|
-
lightDir.copy(caustics.worldToLocal(lightSource.nativeElement.getWorldPosition(v)).normalize());
|
|
164
|
-
lightDirInv.copy(lightDir).multiplyScalar(-1);
|
|
165
|
-
let boundsVertices = [];
|
|
166
|
-
scene.parent?.matrixWorld.identity();
|
|
167
|
-
bounds.setFromObject(scene, true);
|
|
168
|
-
boundsVertices.push(new THREE.Vector3(bounds.min.x, bounds.min.y, bounds.min.z));
|
|
169
|
-
boundsVertices.push(new THREE.Vector3(bounds.min.x, bounds.min.y, bounds.max.z));
|
|
170
|
-
boundsVertices.push(new THREE.Vector3(bounds.min.x, bounds.max.y, bounds.min.z));
|
|
171
|
-
boundsVertices.push(new THREE.Vector3(bounds.min.x, bounds.max.y, bounds.max.z));
|
|
172
|
-
boundsVertices.push(new THREE.Vector3(bounds.max.x, bounds.min.y, bounds.min.z));
|
|
173
|
-
boundsVertices.push(new THREE.Vector3(bounds.max.x, bounds.min.y, bounds.max.z));
|
|
174
|
-
boundsVertices.push(new THREE.Vector3(bounds.max.x, bounds.max.y, bounds.min.z));
|
|
175
|
-
boundsVertices.push(new THREE.Vector3(bounds.max.x, bounds.max.y, bounds.max.z));
|
|
176
|
-
const worldVerts = boundsVertices.map((v) => v.clone());
|
|
177
|
-
bounds.getCenter(focusPos);
|
|
178
|
-
boundsVertices = boundsVertices.map((v) => v.clone().sub(focusPos));
|
|
179
|
-
const lightPlane = lpP.set(lightDirInv, 0);
|
|
180
|
-
const projectedVerts = boundsVertices.map((v) => lightPlane.projectPoint(v, new THREE.Vector3()));
|
|
181
|
-
const centralVert = projectedVerts
|
|
182
|
-
.reduce((a, b) => a.add(b), v.set(0, 0, 0))
|
|
183
|
-
.divideScalar(projectedVerts.length);
|
|
184
|
-
const radius = projectedVerts
|
|
185
|
-
.map((v) => v.distanceTo(centralVert))
|
|
186
|
-
.reduce((a, b) => Math.max(a, b));
|
|
187
|
-
const dirLength = boundsVertices
|
|
188
|
-
.map((x) => x.dot(lightDir))
|
|
189
|
-
.reduce((a, b) => Math.max(a, b));
|
|
190
|
-
// Shadows
|
|
191
|
-
camera.position.copy(lightDir.clone().multiplyScalar(dirLength).add(focusPos));
|
|
192
|
-
camera.lookAt(scene.localToWorld(focusPos.clone()));
|
|
193
|
-
const dirMatrix = lpM.lookAt(camera.position, focusPos, v.set(0, 1, 0));
|
|
194
|
-
camera.left = -radius;
|
|
195
|
-
camera.right = radius;
|
|
196
|
-
camera.top = radius;
|
|
197
|
-
camera.bottom = -radius;
|
|
198
|
-
const yOffset = v.set(0, radius, 0).applyMatrix4(dirMatrix);
|
|
199
|
-
const yTime = (camera.position.y + yOffset.y) / lightDir.y;
|
|
200
|
-
camera.near = 0.1;
|
|
201
|
-
camera.far = yTime;
|
|
202
|
-
camera.updateProjectionMatrix();
|
|
203
|
-
camera.updateMatrixWorld();
|
|
204
|
-
// Now find size of ground plane
|
|
205
|
-
const groundProjectedCoords = worldVerts.map((v) => v.add(lightDir.clone().multiplyScalar(-v.y / lightDir.y)));
|
|
206
|
-
const centerPos = groundProjectedCoords
|
|
207
|
-
.reduce((a, b) => a.add(b), v.set(0, 0, 0))
|
|
208
|
-
.divideScalar(groundProjectedCoords.length);
|
|
209
|
-
const maxSize = 2 *
|
|
210
|
-
groundProjectedCoords
|
|
211
|
-
.map((v) => Math.hypot(v.x - centerPos.x, v.z - centerPos.z))
|
|
212
|
-
.reduce((a, b) => Math.max(a, b));
|
|
213
|
-
plane.scale.setScalar(maxSize);
|
|
214
|
-
plane.position.copy(centerPos);
|
|
215
|
-
// if (debug) helper.current?.update();
|
|
216
|
-
// Inject uniforms
|
|
217
|
-
normalMaterialB.viewMatrix.value = normalMaterial.viewMatrix.value =
|
|
218
|
-
camera.matrixWorldInverse;
|
|
219
|
-
const dirLightNearPlane = lpF.setFromProjectionMatrix(lpM.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse)).planes[4];
|
|
220
|
-
causticsMaterial.cameraMatrixWorld = camera.matrixWorld;
|
|
221
|
-
causticsMaterial.cameraProjectionMatrixInv = camera.projectionMatrixInverse;
|
|
222
|
-
causticsMaterial.lightDir = lightDirInv;
|
|
223
|
-
causticsMaterial.lightPlaneNormal = dirLightNearPlane.normal;
|
|
224
|
-
causticsMaterial.lightPlaneConstant = dirLightNearPlane.constant;
|
|
225
|
-
causticsMaterial.near = camera.near;
|
|
226
|
-
causticsMaterial.far = camera.far;
|
|
227
|
-
causticsMaterial.resolution = resolution;
|
|
228
|
-
causticsMaterial.size = radius;
|
|
229
|
-
causticsMaterial.intensity = intensity;
|
|
230
|
-
causticsMaterial.worldRadius = worldRadius;
|
|
231
|
-
// Switch the scene on
|
|
232
|
-
scene.visible = true;
|
|
233
|
-
// Render front face normals
|
|
234
|
-
gl.setRenderTarget(normalTarget);
|
|
235
|
-
gl.clear();
|
|
236
|
-
scene.overrideMaterial = normalMaterial;
|
|
237
|
-
gl.render(scene, camera);
|
|
238
|
-
// Render back face normals, if enabled
|
|
239
|
-
gl.setRenderTarget(normalTargetB);
|
|
240
|
-
gl.clear();
|
|
241
|
-
if (backside) {
|
|
242
|
-
scene.overrideMaterial = normalMaterialB;
|
|
243
|
-
gl.render(scene, camera);
|
|
244
|
-
}
|
|
245
|
-
// Remove the override material
|
|
246
|
-
scene.overrideMaterial = null;
|
|
247
|
-
// Render front face caustics
|
|
248
|
-
causticsMaterial.ior = ior;
|
|
249
|
-
plane.material.lightProjMatrix =
|
|
250
|
-
camera.projectionMatrix;
|
|
251
|
-
plane.material.lightViewMatrix =
|
|
252
|
-
camera.matrixWorldInverse;
|
|
253
|
-
causticsMaterial.normalTexture = normalTarget.texture;
|
|
254
|
-
causticsMaterial.depthTexture = normalTarget.depthTexture;
|
|
255
|
-
gl.setRenderTarget(causticsTarget);
|
|
256
|
-
gl.clear();
|
|
257
|
-
causticsQuad.render(gl);
|
|
258
|
-
// Render back face caustics, if enabled
|
|
259
|
-
causticsMaterial.ior = backsideIOR;
|
|
260
|
-
causticsMaterial.normalTexture = normalTargetB.texture;
|
|
261
|
-
causticsMaterial.depthTexture = normalTargetB.depthTexture;
|
|
262
|
-
gl.setRenderTarget(causticsTargetB);
|
|
263
|
-
gl.clear();
|
|
264
|
-
if (backside)
|
|
265
|
-
causticsQuad.render(gl);
|
|
266
|
-
// Reset render target
|
|
267
|
-
gl.setRenderTarget(null);
|
|
268
|
-
// Switch the scene off if caustics is all that's wanted
|
|
269
|
-
if (causticsOnly)
|
|
270
|
-
scene.visible = false;
|
|
271
|
-
}
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsCaustics, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
277
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtsCaustics, isStandalone: true, selector: "ngts-caustics", inputs: { causticsRef: "causticsRef", frames: "frames", debug: "debug", causticsOnly: "causticsOnly", backside: "backside", ior: "ior", backsideIOR: "backsideIOR", worldRadius: "worldRadius", intensity: "intensity", color: "color", resolution: "resolution", lightSource: "lightSource" }, usesInheritance: true, ngImport: i0, template: `
|
|
278
|
-
<ngt-group [ref]="causticsRef" ngtCompound>
|
|
279
|
-
<ngt-scene [ref]="sceneRef">
|
|
280
|
-
<ngt-orthographic-camera [ref]="cameraRef" [up]="[0, 1, 0]" />
|
|
281
|
-
<ng-content />
|
|
282
|
-
</ngt-scene>
|
|
283
|
-
<ngt-mesh [renderOrder]="2" [ref]="planeRef" [rotation]="[-Math.PI / 2, 0, 0]">
|
|
284
|
-
<ngt-plane-geometry />
|
|
285
|
-
<ngt-caustics-projection-material
|
|
286
|
-
*ngIf="causticsTargetFbo.nativeElement && causticsTargetBFbo.nativeElement"
|
|
287
|
-
[transparent]="true"
|
|
288
|
-
[color]="get('color')"
|
|
289
|
-
[causticsTexture]="causticsTargetFbo.nativeElement.texture"
|
|
290
|
-
[causticsTextureB]="causticsTargetBFbo.nativeElement.texture"
|
|
291
|
-
[blending]="CustomBlending"
|
|
292
|
-
[blendSrc]="OneFactor"
|
|
293
|
-
[blendDst]="SrcAlphaFactor"
|
|
294
|
-
[depthWrite]="false"
|
|
295
|
-
/>
|
|
296
|
-
|
|
297
|
-
<ngts-edges *ngIf="get('debug')" [withChildren]="true">
|
|
298
|
-
<ngt-line-basic-material color="#ffff00" [toneMapped]="false" />
|
|
299
|
-
</ngts-edges>
|
|
300
|
-
</ngt-mesh>
|
|
301
|
-
</ngt-group>
|
|
302
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NgtsEdges, selector: "ngts-edges", inputs: ["edgesRef", "threshold", "color", "geometry", "userData", "withChildren"] }] }); }
|
|
303
|
-
}
|
|
304
|
-
export { NgtsCaustics };
|
|
305
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsCaustics, decorators: [{
|
|
306
|
-
type: Component,
|
|
307
|
-
args: [{
|
|
308
|
-
selector: 'ngts-caustics',
|
|
309
|
-
standalone: true,
|
|
310
|
-
template: `
|
|
311
|
-
<ngt-group [ref]="causticsRef" ngtCompound>
|
|
312
|
-
<ngt-scene [ref]="sceneRef">
|
|
313
|
-
<ngt-orthographic-camera [ref]="cameraRef" [up]="[0, 1, 0]" />
|
|
314
|
-
<ng-content />
|
|
315
|
-
</ngt-scene>
|
|
316
|
-
<ngt-mesh [renderOrder]="2" [ref]="planeRef" [rotation]="[-Math.PI / 2, 0, 0]">
|
|
317
|
-
<ngt-plane-geometry />
|
|
318
|
-
<ngt-caustics-projection-material
|
|
319
|
-
*ngIf="causticsTargetFbo.nativeElement && causticsTargetBFbo.nativeElement"
|
|
320
|
-
[transparent]="true"
|
|
321
|
-
[color]="get('color')"
|
|
322
|
-
[causticsTexture]="causticsTargetFbo.nativeElement.texture"
|
|
323
|
-
[causticsTextureB]="causticsTargetBFbo.nativeElement.texture"
|
|
324
|
-
[blending]="CustomBlending"
|
|
325
|
-
[blendSrc]="OneFactor"
|
|
326
|
-
[blendDst]="SrcAlphaFactor"
|
|
327
|
-
[depthWrite]="false"
|
|
328
|
-
/>
|
|
329
|
-
|
|
330
|
-
<ngts-edges *ngIf="get('debug')" [withChildren]="true">
|
|
331
|
-
<ngt-line-basic-material color="#ffff00" [toneMapped]="false" />
|
|
332
|
-
</ngts-edges>
|
|
333
|
-
</ngt-mesh>
|
|
334
|
-
</ngt-group>
|
|
335
|
-
`,
|
|
336
|
-
imports: [NgIf, NgtsEdges],
|
|
337
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
338
|
-
}]
|
|
339
|
-
}], propDecorators: { causticsRef: [{
|
|
340
|
-
type: Input
|
|
341
|
-
}], frames: [{
|
|
342
|
-
type: Input
|
|
343
|
-
}], debug: [{
|
|
344
|
-
type: Input
|
|
345
|
-
}], causticsOnly: [{
|
|
346
|
-
type: Input
|
|
347
|
-
}], backside: [{
|
|
348
|
-
type: Input
|
|
349
|
-
}], ior: [{
|
|
350
|
-
type: Input
|
|
351
|
-
}], backsideIOR: [{
|
|
352
|
-
type: Input
|
|
353
|
-
}], worldRadius: [{
|
|
354
|
-
type: Input
|
|
355
|
-
}], intensity: [{
|
|
356
|
-
type: Input
|
|
357
|
-
}], color: [{
|
|
358
|
-
type: Input
|
|
359
|
-
}], resolution: [{
|
|
360
|
-
type: Input
|
|
361
|
-
}], lightSource: [{
|
|
362
|
-
type: Input
|
|
363
|
-
}] } });
|
|
364
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F1c3RpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zdGFnaW5nL3NyYy9saWIvY2F1c3RpY3MvY2F1c3RpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNyRyxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNqRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUU5QyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0FBRWpILE1BQU0sV0FBVyxHQUFHO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0lBQ1gsU0FBUyxFQUFFLEtBQUssQ0FBQyxZQUFZ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QUFDLENBQUM7d0JBRXpCLHdEQUF3RDt3QkFDeEQsSUFBSSxZQUFZOzRCQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO3FCQUMzQztnQkFDTCxDQUFDLENBQUMsQ0FBQzthQUNOO1FBQ0wsQ0FBQyxDQUNKLENBQUM7SUFDTixDQUFDOzhHQTdUUSxZQUFZO2tHQUFaLFlBQVksZ1lBN0JYOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBeUJULDREQUNTLElBQUksNkZBQUUsU0FBUzs7U0FHaEIsWUFBWTsyRkFBWixZQUFZO2tCQWhDeEIsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsZUFBZTtvQkFDekIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXlCVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDO29CQUMxQixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztpQkFDcEM7OEJBV1ksV0FBVztzQkFBbkIsS0FBSztnQkFHTyxNQUFNO3NCQUFsQixLQUFLO2dCQUlPLEtBQUs7c0JBQWpCLEtBQUs7Z0JBSU8sWUFBWTtzQkFBeEIsS0FBSztnQkFJTyxRQUFRO3NCQUFwQixLQUFLO2dCQUlPLEdBQUc7c0JBQWYsS0FBSztnQkFJTyxXQUFXO3NCQUF2QixLQUFLO2dCQUlPLFdBQVc7c0JBQXZCLEtBQUs7Z0JBSU8sU0FBUztzQkFBckIsS0FBSztnQkFJTyxLQUFLO3NCQUFqQixLQUFLO2dCQUlPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBSU8sV0FBVztzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBFbGVtZW50UmVmLCBpbmplY3QsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGV4dGVuZCwgaW5qZWN0Tmd0UmVmLCBOZ3RSeFN0b3JlLCBOZ3RTdG9yZSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgTmd0c0VkZ2VzIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL2Fic3RyYWN0aW9ucyc7XG5pbXBvcnQgeyBpbmplY3ROZ3RzRkJPIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL21pc2MnO1xuaW1wb3J0IHsgQ2F1c3RpY3NNYXRlcmlhbCwgQ2F1c3RpY3NQcm9qZWN0aW9uTWF0ZXJpYWwgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvc2hhZGVycyc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IEdyb3VwLCBMaW5lQmFzaWNNYXRlcmlhbCwgTWVzaCwgT3J0aG9ncmFwaGljQ2FtZXJhLCBQbGFuZUdlb21ldHJ5LCBTY2VuZSB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IEZ1bGxTY3JlZW5RdWFkIH0gZnJvbSAndGhyZWUtc3RkbGliJztcblxuZXh0ZW5kKHsgR3JvdXAsIFNjZW5lLCBNZXNoLCBQbGFuZUdlb21ldHJ5LCBPcnRob2dyYXBoaWNDYW1lcmEsIENhdXN0aWNzUHJvamVjdGlvbk1hdGVyaWFsLCBMaW5lQmFzaWNNYXRlcmlhbCB9KTtcblxuY29uc3QgTk9STUFMUFJPUFMgPSB7XG4gICAgZGVwdGg6IHRydWUsXG4gICAgbWluRmlsdGVyOiBUSFJFRS5MaW5lYXJGaWx0ZXIsXG4gICAgbWFnRmlsdGVyOiBUSFJFRS5MaW5lYXJGaWx0ZXIsXG4gICAgZW5jb2Rpbmc6IFRIUkVFLkxpbmVhckVuY29kaW5nLFxuICAgIHR5cGU6IFRIUkVFLlVuc2lnbmVkQnl0ZVR5cGUsXG59O1xuXG5jb25zdCBDQVVTVElDUFJPUFMgPSB7XG4gICAgbWluRmlsdGVyOiBUSFJFRS5MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIsXG4gICAgbWFnRmlsdGVyOiBUSFJFRS5MaW5lYXJGaWx0ZXIsXG4gICAgZW5jb2Rpbmc6IFRIUkVFLkxpbmVhckVuY29kaW5nLFxuICAgIGZvcm1hdDogVEhSRUUuUkdCQUZvcm1hdCxcbiAgICB0eXBlOiBUSFJFRS5GbG9hdFR5cGUsXG4gICAgZ2VuZXJhdGVNaXBtYXBzOiB0cnVlLFxufTtcblxudHlwZSBDYXVzdGljc01hdGVyaWFsVHlwZSA9IFRIUkVFLlNoYWRlck1hdGVyaWFsICYge1xuICAgIGNhbWVyYU1hdHJpeFdvcmxkPzogVEhSRUUuTWF0cml4NDtcbiAgICBjYW1lcmFQcm9qZWN0aW9uTWF0cml4SW52PzogVEhSRUUuTWF0cml4NDtcbiAgICBsaWdodFBsYW5lTm9ybWFsPzogVEhSRUUuVmVjdG9yMztcbiAgICBsaWdodFBsYW5lQ29uc3RhbnQ/OiBudW1iZXI7XG4gICAgbm9ybWFsVGV4dHVyZT86IFRIUkVFLlRleHR1cmUgfCBudWxsO1xuICAgIGRlcHRoVGV4dHVyZT86IFRIUkVFLlRleHR1cmUgfCBudWxsO1xuICAgIGxpZ2h0RGlyPzogVEhSRUUuVmVjdG9yMztcbiAgICBuZWFyPzogbnVtYmVyO1xuICAgIGZhcj86IG51bWJlcjtcbiAgICBtb2RlbE1hdHJpeD86IFRIUkVFLk1hdHJpeDQ7XG4gICAgd29ybGRSYWRpdXM/OiBudW1iZXI7XG4gICAgaW9yPzogbnVtYmVyO1xuICAgIGJvdW5jZXM/OiBudW1iZXI7XG4gICAgcmVzb2x1dGlvbj86IG51bWJlcjtcbiAgICBzaXplPzogbnVtYmVyO1xuICAgIGludGVuc2l0eT86IG51bWJlcjtcbn07XG5cbnR5cGUgQ2F1c3RpY3NQcm9qZWN0aW9uTWF0ZXJpYWxUeXBlID0gVEhSRUUuTWVzaE5vcm1hbE1hdGVyaWFsICYge1xuICAgIHZpZXdNYXRyaXg6IHsgdmFsdWU/OiBUSFJFRS5NYXRyaXg0IH07XG4gICAgY29sb3I/OiBUSFJFRS5Db2xvcjtcbiAgICBjYXVzdGljc1RleHR1cmU/OiBUSFJFRS5UZXh0dXJlO1xuICAgIGNhdXN0aWNzVGV4dHVyZUI/OiBUSFJFRS5UZXh0dXJlO1xuICAgIGxpZ2h0UHJvak1hdHJpeD86IFRIUkVFLk1hdHJpeDQ7XG4gICAgbGlnaHRWaWV3TWF0cml4PzogVEhSRUUuTWF0cml4NDtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vcm1hbE1hdGVyaWFsKHNpZGU6IFRIUkVFLlNpZGUgPSBUSFJFRS5Gcm9udFNpZGUpIHtcbiAgICBjb25zdCB2aWV3TWF0cml4ID0geyB2YWx1ZTogbmV3IFRIUkVFLk1hdHJpeDQoKSB9O1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBUSFJFRS5NZXNoTm9ybWFsTWF0ZXJpYWwoeyBzaWRlIH0pLCB7XG4gICAgICAgIHZpZXdNYXRyaXgsXG4gICAgICAgIG9uQmVmb3JlQ29tcGlsZTogKHNoYWRlcjogYW55KSA9PiB7XG4gICAgICAgICAgICBzaGFkZXIudW5pZm9ybXMudmlld01hdHJpeCA9IHZpZXdNYXRyaXg7XG4gICAgICAgICAgICBzaGFkZXIuZnJhZ21lbnRTaGFkZXIgPVxuICAgICAgICAgICAgICAgIGB2ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcbiAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7XG4gICAgICAgICB9XFxuYCArXG4gICAgICAgICAgICAgICAgc2hhZGVyLmZyYWdtZW50U2hhZGVyLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICcjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+JyxcbiAgICAgICAgICAgICAgICAgICAgYCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cbiAgICAgICAgICAgbm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd0cy1jYXVzdGljcycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmd0LWdyb3VwIFtyZWZdPVwiY2F1c3RpY3NSZWZcIiBuZ3RDb21wb3VuZD5cbiAgICAgICAgICAgIDxuZ3Qtc2NlbmUgW3JlZl09XCJzY2VuZVJlZlwiPlxuICAgICAgICAgICAgICAgIDxuZ3Qtb3J0aG9ncmFwaGljLWNhbWVyYSBbcmVmXT1cImNhbWVyYVJlZlwiIFt1cF09XCJbMCwgMSwgMF1cIiAvPlxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IC8+XG4gICAgICAgICAgICA8L25ndC1zY2VuZT5cbiAgICAgICAgICAgIDxuZ3QtbWVzaCBbcmVuZGVyT3JkZXJdPVwiMlwiIFtyZWZdPVwicGxhbmVSZWZcIiBbcm90YXRpb25dPVwiWy1NYXRoLlBJIC8gMiwgMCwgMF1cIj5cbiAgICAgICAgICAgICAgICA8bmd0LXBsYW5lLWdlb21ldHJ5IC8+XG4gICAgICAgICAgICAgICAgPG5ndC1jYXVzdGljcy1wcm9qZWN0aW9uLW1hdGVyaWFsXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2F1c3RpY3NUYXJnZXRGYm8ubmF0aXZlRWxlbWVudCAmJiBjYXVzdGljc1RhcmdldEJGYm8ubmF0aXZlRWxlbWVudFwiXG4gICAgICAgICAgICAgICAgICAgIFt0cmFuc3BhcmVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImdldCgnY29sb3InKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjYXVzdGljc1RleHR1cmVdPVwiY2F1c3RpY3NUYXJnZXRGYm8ubmF0aXZlRWxlbWVudC50ZXh0dXJlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NhdXN0aWNzVGV4dHVyZUJdPVwiY2F1c3RpY3NUYXJnZXRCRmJvLm5hdGl2ZUVsZW1lbnQudGV4dHVyZVwiXG4gICAgICAgICAgICAgICAgICAgIFtibGVuZGluZ109XCJDdXN0b21CbGVuZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgIFtibGVuZFNyY109XCJPbmVGYWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICBbYmxlbmREc3RdPVwiU3JjQWxwaGFGYWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICBbZGVwdGhXcml0ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICAgIDxuZ3RzLWVkZ2VzICpuZ0lmPVwiZ2V0KCdkZWJ1ZycpXCIgW3dpdGhDaGlsZHJlbl09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZ3QtbGluZS1iYXNpYy1tYXRlcmlhbCBjb2xvcj1cIiNmZmZmMDBcIiBbdG9uZU1hcHBlZF09XCJmYWxzZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9uZ3RzLWVkZ2VzPlxuICAgICAgICAgICAgPC9uZ3QtbWVzaD5cbiAgICAgICAgPC9uZ3QtZ3JvdXA+XG4gICAgYCxcbiAgICBpbXBvcnRzOiBbTmdJZiwgTmd0c0VkZ2VzXSxcbiAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNDYXVzdGljcyBleHRlbmRzIE5ndFJ4U3RvcmUgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHJlYWRvbmx5IEN1c3RvbUJsZW5kaW5nID0gVEhSRUUuQ3VzdG9tQmxlbmRpbmc7XG4gICAgcmVhZG9ubHkgT25lRmFjdG9yID0gVEhSRUUuT25lRmFjdG9yO1xuICAgIHJlYWRvbmx5IFNyY0FscGhhRmFjdG9yID0gVEhSRUUuU3JjQWxwaGFGYWN0b3I7XG4gICAgcmVhZG9ubHkgTWF0aCA9IE1hdGg7XG5cbiAgICByZWFkb25seSBwbGFuZVJlZiA9IGluamVjdE5ndFJlZjxUSFJFRS5NZXNoPigpO1xuICAgIHJlYWRvbmx5IHNjZW5lUmVmID0gaW5qZWN0Tmd0UmVmPFRIUkVFLlNjZW5lPigpO1xuICAgIHJlYWRvbmx5IGNhbWVyYVJlZiA9IGluamVjdE5ndFJlZjxUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmE+KCk7XG5cbiAgICBASW5wdXQoKSBjYXVzdGljc1JlZiA9IGluamVjdE5ndFJlZjxUSFJFRS5Hcm91cD4oKTtcblxuICAgIC8qKiBIb3cgbWFueSBmcmFtZXMgaXQgd2lsbCByZW5kZXIsIHNldCBpdCB0byBJbmZpbml0eSBmb3IgcnVudGltZSwgZGVmYXVsdDogMSAqL1xuICAgIEBJbnB1dCgpIHNldCBmcmFtZXMoZnJhbWVzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBmcmFtZXMgfSk7XG4gICAgfVxuICAgIC8qKiBFbmFibGVzIHZpc3VhbCBjdWVzIHRvIGhlbHAgeW91IHN0YWdlIHlvdXIgc2NlbmUsIGRlZmF1bHQ6IGZhbHNlICovXG4gICAgQElucHV0KCkgc2V0IGRlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZGVidWcgfSk7XG4gICAgfVxuICAgIC8qKiBXaWxsIGRpc3BsYXkgY2F1c3RpY3Mgb25seSBhbmQgc2tpcCB0aGUgbW9kZWxzLCBkZWZhdWx0OiBmYWxzZSAqL1xuICAgIEBJbnB1dCgpIHNldCBjYXVzdGljc09ubHkoY2F1c3RpY3NPbmx5OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgY2F1c3RpY3NPbmx5IH0pO1xuICAgIH1cbiAgICAvKiogV2lsbCBpbmNsdWRlIGJhY2sgZmFjZXMgYW5kIGVuYWJsZSB0aGUgYmFja3NpZGVJT1IgcHJvcCwgZGVmYXVsdDogZmFsc2UgKi9cbiAgICBASW5wdXQoKSBzZXQgYmFja3NpZGUoYmFja3NpZGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBiYWNrc2lkZSB9KTtcbiAgICB9XG4gICAgLyoqIFRoZSBJT1IgcmVmcmFjdGlvbiBpbmRleCwgZGVmYXVsdDogMS4xICovXG4gICAgQElucHV0KCkgc2V0IGlvcihpb3I6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGlvciB9KTtcbiAgICB9XG4gICAgLyoqIFRoZSBJT1IgcmVmcmFjdGlvbiBpbmRleCBmb3IgYmFjayBmYWNlcyAob25seSBhdmFpbGFibGUgd2hlbiBiYWNrc2lkZSBpcyBlbmFibGVkKSwgZGVmYXVsdDogMS4xICovXG4gICAgQElucHV0KCkgc2V0IGJhY2tzaWRlSU9SKGJhY2tzaWRlSU9SOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBiYWNrc2lkZUlPUiB9KTtcbiAgICB9XG4gICAgLyoqIFRoZSB0ZXhlbCBzaXplLCBkZWZhdWx0OiAwLjMxMjUgKi9cbiAgICBASW5wdXQoKSBzZXQgd29ybGRSYWRpdXMod29ybGRSYWRpdXM6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IHdvcmxkUmFkaXVzIH0pO1xuICAgIH1cbiAgICAvKiogSW50ZW5zaXR5IG9mIHRoZSBwcmplY3RlZCBjYXVzdGljcywgZGVmYXVsdDogMC4wNSAqL1xuICAgIEBJbnB1dCgpIHNldCBpbnRlbnNpdHkoaW50ZW5zaXR5OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBpbnRlbnNpdHkgfSk7XG4gICAgfVxuICAgIC8qKiBDYXVzdGljcyBjb2xvciwgZGVmYXVsdDogd2hpdGUgKi9cbiAgICBASW5wdXQoKSBzZXQgY29sb3IoY29sb3I6IFRIUkVFLkNvbG9yUmVwcmVzZW50YXRpb24pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBjb2xvciB9KTtcbiAgICB9XG4gICAgLyoqIEJ1ZmZlciByZXNvbHV0aW9uLCBkZWZhdWx0OiAyMDQ4ICovXG4gICAgQElucHV0KCkgc2V0IHJlc29sdXRpb24ocmVzb2x1dGlvbjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgcmVzb2x1dGlvbiB9KTtcbiAgICB9XG4gICAgLyoqIENhbWVyYSBwb3NpdGlvbiwgaXQgd2lsbCBwb2ludCB0b3dhcmRzIHRoZSBjb250ZW50cyBib3VuZHMgY2VudGVyLCBkZWZhdWx0OiBbNSwgNSwgNV0gKi9cbiAgICBASW5wdXQoKSBzZXQgbGlnaHRTb3VyY2UobGlnaHRTb3VyY2U6IFt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyXSB8IEVsZW1lbnRSZWY8VEhSRUUuT2JqZWN0M0Q+KSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbGlnaHRTb3VyY2UgfSk7XG4gICAgfVxuXG4gICAgcmVhZG9ubHkgbm9ybWFsVGFyZ2V0RmJvID0gaW5qZWN0Tmd0c0ZCTygoKSA9PlxuICAgICAgICB0aGlzLnNlbGVjdCgncmVzb2x1dGlvbicpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHJlc29sdXRpb24pID0+ICh7IHdpZHRoOiByZXNvbHV0aW9uLCBoZWlnaHQ6IHJlc29sdXRpb24sIHNldHRpbmdzOiBOT1JNQUxQUk9QUyB9KSlcbiAgICAgICAgKVxuICAgICk7XG5cbiAgICByZWFkb25seSBub3JtYWxUYXJnZXRCRmJvID0gaW5qZWN0Tmd0c0ZCTygoKSA9PlxuICAgICAgICB0aGlzLnNlbGVjdCgncmVzb2x1dGlvbicpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHJlc29sdXRpb24pID0+ICh7IHdpZHRoOiByZXNvbHV0aW9uLCBoZWlnaHQ6IHJlc29sdXRpb24sIHNldHRpbmdzOiBOT1JNQUxQUk9QUyB9KSlcbiAgICAgICAgKVxuICAgICk7XG5cbiAgICByZWFkb25seSBjYXVzdGljc1RhcmdldEZibyA9IGluamVjdE5ndHNGQk8oKCkgPT5cbiAgICAgICAgdGhpcy5zZWxlY3QoJ3Jlc29sdXRpb24nKS5waXBlKFxuICAgICAgICAgICAgbWFwKChyZXNvbHV0aW9uKSA9PiAoeyB3aWR0aDogcmVzb2x1dGlvbiwgaGVpZ2h0OiByZXNvbHV0aW9uLCBzZXR0aW5nczogQ0FVU1RJQ1BST1BTIH0pKVxuICAgICAgICApXG4gICAgKTtcblxuICAgIHJlYWRvbmx5IGNhdXN0aWNzVGFyZ2V0QkZibyA9IGluamVjdE5ndHNGQk8oKCkgPT5cbiAgICAgICAgdGhpcy5zZWxlY3QoJ3Jlc29sdXRpb24nKS5waXBlKFxuICAgICAgICAgICAgbWFwKChyZXNvbHV0aW9uKSA9PiAoeyB3aWR0aDogcmVzb2x1dGlvbiwgaGVpZ2h0OiByZXNvbHV0aW9uLCBzZXR0aW5nczogQ0FVU1RJQ1BST1BTIH0pKVxuICAgICAgICApXG4gICAgKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBpbmplY3QoTmd0U3RvcmUpO1xuXG4gICAgb3ZlcnJpZGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXQoe1xuICAgICAgICAgICAgZnJhbWVzOiAxLFxuICAgICAgICAgICAgaW9yOiAxLjEsXG4gICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgIGNhdXN0aWNzT25seTogZmFsc2UsXG4gICAgICAgICAgICBiYWNrc2lkZTogZmFsc2UsXG4gICAgICAgICAgICBiYWNrc2lkZUlPUjogMS4xLFxuICAgICAgICAgICAgd29ybGRSYWRpdXM6IDAuMzEyNSxcbiAgICAgICAgICAgIGludGVuc2l0eTogMC4wNSxcbiAgICAgICAgICAgIHJlc29sdXRpb246IDIwMjQsXG4gICAgICAgICAgICBsaWdodFNvdXJjZTogWzUsIDUsIDVdLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVXb3JsZE1hdHJpeCgpO1xuICAgICAgICB0aGlzLnNldEJlZm9yZVJlbmRlcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlV29ybGRNYXRyaXgoKSB7XG4gICAgICAgIHRoaXMuaG9sZChcbiAgICAgICAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuc2NlbmVSZWYuY2hpbGRyZW4kKCksIHRoaXMuY2F1c3RpY3NSZWYuJCwgdGhpcy5jYXVzdGljc1JlZi5jaGlsZHJlbiQoKSwgdGhpcy5zZWxlY3QoKV0pLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhdXN0aWNzUmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXVzdGljc1JlZi5uYXRpdmVFbGVtZW50LnVwZGF0ZVdvcmxkTWF0cml4KGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRCZWZvcmVSZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IGNhdXN0aWNzTWF0ZXJpYWwgPSBuZXcgQ2F1c3RpY3NNYXRlcmlhbCgpIGFzIENhdXN0aWNzTWF0ZXJpYWxUeXBlO1xuICAgICAgICBjb25zdCBjYXVzdGljc1F1YWQgPSBuZXcgRnVsbFNjcmVlblF1YWQoY2F1c3RpY3NNYXRlcmlhbCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsTWF0ZXJpYWwgPSBjcmVhdGVOb3JtYWxNYXRlcmlhbCgpO1xuICAgICAgICBjb25zdCBub3JtYWxNYXRlcmlhbEIgPSBjcmVhdGVOb3JtYWxNYXRlcmlhbChUSFJFRS5CYWNrU2lkZSk7XG5cbiAgICAgICAgdGhpcy5lZmZlY3QoXG4gICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lUmVmLiQsXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZVJlZi5jaGlsZHJlbiQoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmNhdXN0aWNzUmVmLiQsXG4gICAgICAgICAgICAgICAgdGhpcy5jYW1lcmFSZWYuJCxcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbFRhcmdldEZiby4kLFxuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsVGFyZ2V0QkZiby4kLFxuICAgICAgICAgICAgICAgIHRoaXMuY2F1c3RpY3NUYXJnZXRGYm8uJCxcbiAgICAgICAgICAgICAgICB0aGlzLmNhdXN0aWNzVGFyZ2V0QkZiby4kLFxuICAgICAgICAgICAgICAgIHRoaXMucGxhbmVSZWYuJCxcbiAgICAgICAgICAgICAgICB0aGlzLnBsYW5lUmVmLmNoaWxkcmVuJCgnYm90aCcpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAoW1xuICAgICAgICAgICAgICAgIHNjZW5lLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIGNhdXN0aWNzLFxuICAgICAgICAgICAgICAgIGNhbWVyYSxcbiAgICAgICAgICAgICAgICBub3JtYWxUYXJnZXQsXG4gICAgICAgICAgICAgICAgbm9ybWFsVGFyZ2V0QixcbiAgICAgICAgICAgICAgICBjYXVzdGljc1RhcmdldCxcbiAgICAgICAgICAgICAgICBjYXVzdGljc1RhcmdldEIsXG4gICAgICAgICAgICAgICAgcGxhbmUsXG4gICAgICAgICAgICBdKSA9PiB7XG4gICAgICAgICAgICAgICAgY2F1c3RpY3MudXBkYXRlV29ybGRNYXRyaXgoZmFsc2UsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxwRiA9IG5ldyBUSFJFRS5GcnVzdHVtKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxwTSA9IG5ldyBUSFJFRS5NYXRyaXg0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxwUCA9IG5ldyBUSFJFRS5QbGFuZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpZ2h0RGlyID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlnaHREaXJJbnYgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib3VuZHMgPSBuZXcgVEhSRUUuQm94MygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c1BvcyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0KCdpbnRlcm5hbCcpLnN1YnNjcmliZSgoeyBnbCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0U291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRSYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW5zaXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzaWRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzaWRlSU9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzdGljc09ubHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9ID0gdGhpcy5nZXQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lcyA9PT0gSW5maW5pdHkgfHwgY291bnQrKyA8IGZyYW1lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpZ2h0U291cmNlKSkgbGlnaHREaXIuZnJvbUFycmF5KGxpZ2h0U291cmNlKS5ub3JtYWxpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0RGlyLmNvcHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzdGljcy53b3JsZFRvTG9jYWwobGlnaHRTb3VyY2UubmF0aXZlRWxlbWVudC5nZXRXb3JsZFBvc2l0aW9uKHYpKS5ub3JtYWxpemUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlnaHREaXJJbnYuY29weShsaWdodERpcikubXVsdGlwbHlTY2FsYXIoLTEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJvdW5kc1ZlcnRpY2VzOiBUSFJFRS5WZWN0b3IzW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuZS5wYXJlbnQ/Lm1hdHJpeFdvcmxkLmlkZW50aXR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnNldEZyb21PYmplY3Qoc2NlbmUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzLnB1c2gobmV3IFRIUkVFLlZlY3RvcjMoYm91bmRzLm1pbi54LCBib3VuZHMubWluLnksIGJvdW5kcy5taW4ueikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzLnB1c2gobmV3IFRIUkVFLlZlY3RvcjMoYm91bmRzLm1pbi54LCBib3VuZHMubWluLnksIGJvdW5kcy5tYXgueikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzLnB1c2gobmV3IFRIUkVFLlZlY3RvcjMoYm91bmRzLm1pbi54LCBib3VuZHMubWF4LnksIGJvdW5kcy5taW4ueikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzLnB1c2gobmV3IFRIUkVFLlZlY3RvcjMoYm91bmRzLm1pbi54LCBib3VuZHMubWF4LnksIGJvdW5kcy5tYXgueikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzLnB1c2gobmV3IFRIUkVFLlZlY3RvcjMoYm91bmRzLm1heC54LCBib3VuZHMubWluLnksIGJvdW5kcy5taW4ueikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzLnB1c2gobmV3IFRIUkVFLlZlY3RvcjMoYm91bmRzLm1heC54LCBib3VuZHMubWluLnksIGJvdW5kcy5tYXgueikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzLnB1c2gobmV3IFRIUkVFLlZlY3RvcjMoYm91bmRzLm1heC54LCBib3VuZHMubWF4LnksIGJvdW5kcy5taW4ueikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzLnB1c2gobmV3IFRIUkVFLlZlY3RvcjMoYm91bmRzLm1heC54LCBib3VuZHMubWF4LnksIGJvdW5kcy5tYXgueikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ybGRWZXJ0cyA9IGJvdW5kc1ZlcnRpY2VzLm1hcCgodikgPT4gdi5jbG9uZSgpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5nZXRDZW50ZXIoZm9jdXNQb3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzID0gYm91bmRzVmVydGljZXMubWFwKCh2KSA9PiB2LmNsb25lKCkuc3ViKGZvY3VzUG9zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlnaHRQbGFuZSA9IGxwUC5zZXQobGlnaHREaXJJbnYsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2plY3RlZFZlcnRzID0gYm91bmRzVmVydGljZXMubWFwKCh2KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWdodFBsYW5lLnByb2plY3RQb2ludCh2LCBuZXcgVEhSRUUuVmVjdG9yMygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjZW50cmFsVmVydCA9IHByb2plY3RlZFZlcnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEuYWRkKGIpLCB2LnNldCgwLCAwLCAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpdmlkZVNjYWxhcihwcm9qZWN0ZWRWZXJ0cy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IHByb2plY3RlZFZlcnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHYpID0+IHYuZGlzdGFuY2VUbyhjZW50cmFsVmVydCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJMZW5ndGggPSBib3VuZHNWZXJ0aWNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKCh4KSA9PiB4LmRvdChsaWdodERpcikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYWRvd3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEucG9zaXRpb24uY29weShsaWdodERpci5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKGRpckxlbmd0aCkuYWRkKGZvY3VzUG9zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhLmxvb2tBdChzY2VuZS5sb2NhbFRvV29ybGQoZm9jdXNQb3MuY2xvbmUoKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpck1hdHJpeCA9IGxwTS5sb29rQXQoY2FtZXJhLnBvc2l0aW9uLCBmb2N1c1Bvcywgdi5zZXQoMCwgMSwgMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYS5sZWZ0ID0gLXJhZGl1cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEucmlnaHQgPSByYWRpdXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhLnRvcCA9IHJhZGl1cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEuYm90dG9tID0gLXJhZGl1cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5T2Zmc2V0ID0gdi5zZXQoMCwgcmFkaXVzLCAwKS5hcHBseU1hdHJpeDQoZGlyTWF0cml4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5VGltZSA9IChjYW1lcmEucG9zaXRpb24ueSArIHlPZmZzZXQueSkgLyBsaWdodERpci55O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYS5uZWFyID0gMC4xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYS5mYXIgPSB5VGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IGZpbmQgc2l6ZSBvZiBncm91bmQgcGxhbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91bmRQcm9qZWN0ZWRDb29yZHMgPSB3b3JsZFZlcnRzLm1hcCgodikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5hZGQobGlnaHREaXIuY2xvbmUoKS5tdWx0aXBseVNjYWxhcigtdi55IC8gbGlnaHREaXIueSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjZW50ZXJQb3MgPSBncm91bmRQcm9qZWN0ZWRDb29yZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gYS5hZGQoYiksIHYuc2V0KDAsIDAsIDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGl2aWRlU2NhbGFyKGdyb3VuZFByb2plY3RlZENvb3Jkcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdW5kUHJvamVjdGVkQ29vcmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKCh2KSA9PiBNYXRoLmh5cG90KHYueCAtIGNlbnRlclBvcy54LCB2LnogLSBjZW50ZXJQb3MueikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUuc2NhbGUuc2V0U2NhbGFyKG1heFNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lLnBvc2l0aW9uLmNvcHkoY2VudGVyUG9zKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChkZWJ1ZykgaGVscGVyLmN1cnJlbnQ/LnVwZGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5qZWN0IHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsTWF0ZXJpYWxCLnZpZXdNYXRyaXgudmFsdWUgPSBub3JtYWxNYXRlcmlhbC52aWV3TWF0cml4LnZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpckxpZ2h0TmVhclBsYW5lID0gbHBGLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscE0ubXVsdGlwbHlNYXRyaWNlcyhjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnBsYW5lc1s0XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXN0aWNzTWF0ZXJpYWwuY2FtZXJhTWF0cml4V29ybGQgPSBjYW1lcmEubWF0cml4V29ybGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c3RpY3NNYXRlcmlhbC5jYW1lcmFQcm9qZWN0aW9uTWF0cml4SW52ID0gY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXN0aWNzTWF0ZXJpYWwubGlnaHREaXIgPSBsaWdodERpckludjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXN0aWNzTWF0ZXJpYWwubGlnaHRQbGFuZU5vcm1hbCA9IGRpckxpZ2h0TmVhclBsYW5lLm5vcm1hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzdGljc01hdGVyaWFsLmxpZ2h0UGxhbmVDb25zdGFudCA9IGRpckxpZ2h0TmVhclBsYW5lLmNvbnN0YW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c3RpY3NNYXRlcmlhbC5uZWFyID0gY2FtZXJhLm5lYXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c3RpY3NNYXRlcmlhbC5mYXIgPSBjYW1lcmEuZmFyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXN0aWNzTWF0ZXJpYWwucmVzb2x1dGlvbiA9IHJlc29sdXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c3RpY3NNYXRlcmlhbC5zaXplID0gcmFkaXVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXN0aWNzTWF0ZXJpYWwuaW50ZW5zaXR5ID0gaW50ZW5zaXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXN0aWNzTWF0ZXJpYWwud29ybGRSYWRpdXMgPSB3b3JsZFJhZGl1cztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN3aXRjaCB0aGUgc2NlbmUgb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuZS52aXNpYmxlID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbmRlciBmcm9udCBmYWNlIG5vcm1hbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbC5zZXRSZW5kZXJUYXJnZXQobm9ybWFsVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbC5jbGVhcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBub3JtYWxNYXRlcmlhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbC5yZW5kZXIoc2NlbmUsIGNhbWVyYSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW5kZXIgYmFjayBmYWNlIG5vcm1hbHMsIGlmIGVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbC5zZXRSZW5kZXJUYXJnZXQobm9ybWFsVGFyZ2V0Qik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja3NpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IG5vcm1hbE1hdGVyaWFsQjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wucmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb3ZlcnJpZGUgbWF0ZXJpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbmRlciBmcm9udCBmYWNlIGNhdXN0aWNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c3RpY3NNYXRlcmlhbC5pb3IgPSBpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBsYW5lLm1hdGVyaWFsIGFzIENhdXN0aWNzUHJvamVjdGlvbk1hdGVyaWFsVHlwZSkubGlnaHRQcm9qTWF0cml4ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhLnByb2plY3Rpb25NYXRyaXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBsYW5lLm1hdGVyaWFsIGFzIENhdXN0aWNzUHJvamVjdGlvbk1hdGVyaWFsVHlwZSkubGlnaHRWaWV3TWF0cml4ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzdGljc01hdGVyaWFsLm5vcm1hbFRleHR1cmUgPSBub3JtYWxUYXJnZXQudGV4dHVyZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzdGljc01hdGVyaWFsLmRlcHRoVGV4dHVyZSA9IG5vcm1hbFRhcmdldC5kZXB0aFRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wuc2V0UmVuZGVyVGFyZ2V0KGNhdXN0aWNzVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbC5jbGVhcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXN0aWNzUXVhZC5yZW5kZXIoZ2wpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVuZGVyIGJhY2sgZmFjZSBjYXVzdGljcywgaWYgZW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXN0aWNzTWF0ZXJpYWwuaW9yID0gYmFja3NpZGVJT1I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c3RpY3NNYXRlcmlhbC5ub3JtYWxUZXh0dXJlID0gbm9ybWFsVGFyZ2V0Qi50ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXN0aWNzTWF0ZXJpYWwuZGVwdGhUZXh0dXJlID0gbm9ybWFsVGFyZ2V0Qi5kZXB0aFRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wuc2V0UmVuZGVyVGFyZ2V0KGNhdXN0aWNzVGFyZ2V0Qik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja3NpZGUpIGNhdXN0aWNzUXVhZC5yZW5kZXIoZ2wpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgcmVuZGVyIHRhcmdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsLnNldFJlbmRlclRhcmdldChudWxsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN3aXRjaCB0aGUgc2NlbmUgb2ZmIGlmIGNhdXN0aWNzIGlzIGFsbCB0aGF0J3Mgd2FudGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhdXN0aWNzT25seSkgc2NlbmUudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxufVxuIl19
|