angular-three-soba 2.0.0-beta.26 → 2.0.0-beta.261
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 +62 -4
- package/abstractions/README.md +278 -2
- package/abstractions/index.d.ts +11 -6
- package/abstractions/lib/catmull-rom-line.d.ts +648 -0
- package/abstractions/lib/cubic-bezier-line.d.ts +19 -0
- package/abstractions/lib/edges.d.ts +850 -0
- package/abstractions/lib/gradient-texture.d.ts +24 -0
- package/abstractions/lib/grid.d.ts +339 -0
- package/abstractions/lib/helper.d.ts +25 -0
- package/abstractions/lib/line.d.ts +41 -0
- package/abstractions/lib/prism-geometry.d.ts +30 -0
- package/abstractions/lib/quadratic-bezier-line.d.ts +21 -0
- package/abstractions/lib/text-3d.d.ts +338 -0
- package/abstractions/lib/text.d.ts +55 -0
- package/cameras/README.md +91 -2
- package/cameras/index.d.ts +4 -4
- package/cameras/lib/camera-content.d.ts +10 -0
- package/cameras/lib/cube-camera.d.ts +38 -0
- package/cameras/lib/orthographic-camera.d.ts +40 -0
- package/cameras/lib/perspective-camera.d.ts +36 -0
- package/controls/README.md +95 -2
- package/controls/index.d.ts +2 -1
- package/controls/lib/camera-controls.d.ts +31 -0
- package/controls/lib/orbit-controls.d.ts +38 -0
- package/esm2022/abstractions/index.mjs +12 -7
- package/esm2022/abstractions/lib/catmull-rom-line.mjs +76 -0
- package/esm2022/abstractions/lib/cubic-bezier-line.mjs +51 -0
- package/esm2022/abstractions/lib/edges.mjs +70 -0
- package/esm2022/abstractions/lib/gradient-texture.mjs +91 -0
- package/esm2022/abstractions/lib/grid.mjs +103 -0
- package/esm2022/abstractions/lib/helper.mjs +80 -0
- package/esm2022/abstractions/lib/line.mjs +123 -0
- package/esm2022/abstractions/lib/prism-geometry.mjs +55 -0
- package/esm2022/abstractions/lib/quadratic-bezier-line.mjs +73 -0
- package/esm2022/abstractions/lib/text-3d.mjs +98 -0
- package/esm2022/abstractions/lib/text.mjs +92 -0
- package/esm2022/cameras/index.mjs +5 -5
- package/esm2022/cameras/lib/camera-content.mjs +14 -0
- package/esm2022/cameras/lib/cube-camera.mjs +111 -0
- package/esm2022/cameras/lib/orthographic-camera.mjs +131 -0
- package/esm2022/cameras/lib/perspective-camera.mjs +104 -0
- package/esm2022/controls/index.mjs +3 -2
- package/esm2022/controls/lib/camera-controls.mjs +127 -0
- package/esm2022/controls/lib/orbit-controls.mjs +126 -0
- package/esm2022/loaders/index.mjs +6 -5
- package/esm2022/loaders/lib/font-loader.mjs +49 -0
- package/esm2022/loaders/lib/gltf-loader.mjs +33 -0
- package/esm2022/loaders/lib/loader.mjs +109 -0
- package/esm2022/loaders/lib/progress.mjs +51 -0
- package/esm2022/loaders/lib/texture-loader.mjs +32 -0
- package/esm2022/materials/index.mjs +7 -7
- package/esm2022/materials/lib/custom-shader-material.mjs +71 -0
- package/esm2022/materials/lib/mesh-distort-material.mjs +42 -0
- package/esm2022/materials/lib/mesh-reflector-material.mjs +278 -0
- package/esm2022/materials/lib/mesh-refraction-material.mjs +144 -0
- package/esm2022/materials/lib/mesh-transmission-material.mjs +188 -0
- package/esm2022/materials/lib/mesh-wobble-material.mjs +42 -0
- package/esm2022/misc/index.mjs +10 -14
- package/esm2022/misc/lib/animations.mjs +74 -0
- package/esm2022/misc/lib/bake-shadows.mjs +26 -0
- package/esm2022/misc/lib/computed-attribute.mjs +56 -0
- package/esm2022/misc/lib/constants.mjs +5 -0
- package/esm2022/misc/lib/decal.mjs +135 -0
- package/esm2022/misc/lib/deprecated.mjs +15 -0
- package/esm2022/misc/lib/depth-buffer.mjs +39 -0
- package/esm2022/misc/lib/fbo.mjs +89 -0
- package/esm2022/misc/lib/sampler.mjs +121 -0
- package/esm2022/shaders/index.mjs +3 -18
- package/esm2022/shaders/lib/grid-material.mjs +81 -0
- package/esm2022/shaders/lib/mesh-refraction-material.mjs +163 -0
- package/esm2022/staging/index.mjs +19 -22
- package/esm2022/staging/lib/accumulative-shadows.mjs +182 -0
- package/esm2022/staging/lib/backdrop.mjs +73 -0
- package/esm2022/staging/lib/bb-anchor.mjs +58 -0
- package/esm2022/staging/lib/bounds.mjs +286 -0
- package/esm2022/staging/lib/camera-shake.mjs +69 -0
- package/esm2022/staging/lib/caustics.mjs +188 -0
- package/esm2022/staging/lib/center.mjs +113 -0
- package/esm2022/staging/lib/contact-shadows.mjs +201 -0
- package/esm2022/staging/lib/environment.mjs +465 -0
- package/esm2022/staging/lib/float.mjs +60 -0
- package/esm2022/staging/lib/lightformer.mjs +107 -0
- package/esm2022/staging/lib/matcap-texture.mjs +81 -0
- package/esm2022/staging/lib/normal-texture.mjs +85 -0
- package/esm2022/staging/lib/randomized-lights.mjs +104 -0
- package/esm2022/staging/lib/render-texture.mjs +213 -0
- package/esm2022/staging/lib/sky.mjs +86 -0
- package/esm2022/staging/lib/spot-light.mjs +450 -0
- package/esm2022/staging/lib/stage.mjs +236 -0
- package/esm2022/vanilla-exports/angular-three-soba-vanilla-exports.mjs +5 -0
- package/esm2022/vanilla-exports/index.mjs +3 -0
- package/fesm2022/angular-three-soba-abstractions.mjs +739 -718
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +260 -307
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +174 -110
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +151 -129
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +511 -764
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +405 -2149
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-shaders.mjs +33 -1373
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +2329 -3538
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-vanilla-exports.mjs +6 -0
- package/fesm2022/angular-three-soba-vanilla-exports.mjs.map +1 -0
- package/loaders/README.md +130 -2
- package/loaders/index.d.ts +5 -4
- package/loaders/lib/font-loader.d.ts +27 -0
- package/loaders/lib/gltf-loader.d.ts +21 -0
- package/loaders/lib/loader.d.ts +29 -0
- package/loaders/lib/progress.d.ts +9 -0
- package/loaders/lib/texture-loader.d.ts +13 -0
- package/materials/README.md +160 -2
- package/materials/index.d.ts +6 -6
- package/materials/lib/custom-shader-material.d.ts +19 -0
- package/materials/lib/mesh-distort-material.d.ts +18 -0
- package/materials/lib/mesh-reflector-material.d.ts +50 -0
- package/materials/lib/mesh-refraction-material.d.ts +42 -0
- package/materials/lib/mesh-transmission-material.d.ts +77 -0
- package/materials/lib/mesh-wobble-material.d.ts +15 -0
- package/metadata.json +1 -1
- package/misc/README.md +217 -2
- package/misc/index.d.ts +9 -13
- package/misc/lib/animations.d.ts +14 -0
- package/misc/lib/computed-attribute.d.ts +69 -0
- package/misc/lib/constants.d.ts +1 -0
- package/misc/lib/decal.d.ts +27 -0
- package/misc/lib/deprecated.d.ts +14 -0
- package/misc/lib/depth-buffer.d.ts +8 -0
- package/misc/lib/fbo.d.ts +47 -0
- package/misc/lib/sampler.d.ts +73 -0
- package/package.json +60 -38
- package/shaders/index.d.ts +2 -17
- package/shaders/lib/grid-material.d.ts +69 -0
- package/shaders/lib/mesh-refraction-material.d.ts +11 -0
- package/staging/README.md +472 -2
- package/staging/index.d.ts +18 -21
- package/staging/lib/accumulative-shadows.d.ts +75 -0
- package/staging/lib/backdrop.d.ts +22 -0
- package/staging/lib/bb-anchor.d.ts +17 -0
- package/staging/lib/bounds.d.ts +47 -0
- package/staging/lib/camera-shake.d.ts +29 -0
- package/staging/lib/caustics.d.ts +53 -0
- package/staging/lib/center.d.ts +422 -0
- package/staging/lib/contact-shadows.d.ts +45 -0
- package/staging/lib/environment.d.ts +159 -0
- package/staging/lib/float.d.ts +19 -0
- package/staging/lib/lightformer.d.ts +334 -0
- package/staging/lib/matcap-texture.d.ts +32 -0
- package/staging/lib/normal-texture.d.ts +37 -0
- package/staging/lib/randomized-lights.d.ts +54 -0
- package/staging/lib/render-texture.d.ts +64 -0
- package/staging/lib/sky.d.ts +32 -0
- package/staging/lib/spot-light.d.ts +120 -0
- package/staging/lib/stage.d.ts +376 -0
- package/vanilla-exports/README.md +3 -0
- package/vanilla-exports/index.d.ts +27 -0
- package/web-types.json +1 -1
- package/abstractions/billboard/billboard.d.ts +0 -28
- package/abstractions/detailed/detailed.d.ts +0 -26
- package/abstractions/edges/edges.d.ts +0 -34
- package/abstractions/grid/grid.d.ts +0 -50
- package/abstractions/text/text.d.ts +0 -82
- package/abstractions/text-3d/text-3d.d.ts +0 -84
- package/assets/distort.vert.glsl +0 -1
- package/cameras/camera/camera-content.d.ts +0 -13
- package/cameras/camera/camera.d.ts +0 -26
- package/cameras/cube-camera/cube-camera.d.ts +0 -69
- package/cameras/orthographic-camera/orthographic-camera.d.ts +0 -37
- package/cameras/perspective-camera/perspective-camera.d.ts +0 -18
- package/controls/orbit-controls/orbit-controls.d.ts +0 -54
- package/esm2022/abstractions/billboard/billboard.mjs +0 -74
- package/esm2022/abstractions/detailed/detailed.mjs +0 -64
- package/esm2022/abstractions/edges/edges.mjs +0 -88
- package/esm2022/abstractions/grid/grid.mjs +0 -180
- package/esm2022/abstractions/text/text.mjs +0 -274
- package/esm2022/abstractions/text-3d/text-3d.mjs +0 -172
- package/esm2022/cameras/camera/camera-content.mjs +0 -21
- package/esm2022/cameras/camera/camera.mjs +0 -77
- package/esm2022/cameras/cube-camera/cube-camera.mjs +0 -161
- package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +0 -102
- package/esm2022/cameras/perspective-camera/perspective-camera.mjs +0 -46
- package/esm2022/controls/orbit-controls/orbit-controls.mjs +0 -185
- package/esm2022/gizmos/angular-three-soba-gizmos.mjs +0 -5
- package/esm2022/gizmos/gizmo-helper/gizmo-helper.mjs +0 -197
- package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/constants.mjs +0 -31
- package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -93
- package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -150
- package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-input.mjs +0 -66
- package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +0 -71
- package/esm2022/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -195
- package/esm2022/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +0 -272
- package/esm2022/gizmos/index.mjs +0 -4
- package/esm2022/loaders/gltf-loader/gltf-loader.mjs +0 -30
- package/esm2022/loaders/loader/loader.mjs +0 -138
- package/esm2022/loaders/progress/progress.mjs +0 -52
- package/esm2022/loaders/texture-loader/texture-loader.mjs +0 -28
- package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +0 -82
- package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +0 -367
- package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +0 -171
- package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +0 -278
- package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +0 -68
- package/esm2022/materials/point-material/point-material.mjs +0 -50
- package/esm2022/misc/animations/animations.mjs +0 -59
- package/esm2022/misc/bake-shadows/bake-shadows.mjs +0 -24
- package/esm2022/misc/caustics/caustics.mjs +0 -387
- package/esm2022/misc/decal/decal.mjs +0 -187
- package/esm2022/misc/depth-buffer/depth-buffer.mjs +0 -44
- package/esm2022/misc/example/example.mjs +0 -160
- package/esm2022/misc/fbo/fbo.mjs +0 -47
- package/esm2022/misc/html/html-wrapper.mjs +0 -478
- package/esm2022/misc/html/html.mjs +0 -304
- package/esm2022/misc/sampler/sampler.mjs +0 -142
- package/esm2022/misc/shadow/shadow.mjs +0 -111
- package/esm2022/misc/stats-gl/stats-gl.mjs +0 -61
- package/esm2022/misc/trail/trail.mjs +0 -209
- package/esm2022/misc/trail-texture/inject-trail-texture.mjs +0 -17
- package/esm2022/misc/trail-texture/trail-texture.mjs +0 -106
- package/esm2022/modifiers/angular-three-soba-modifiers.mjs +0 -5
- package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +0 -64
- package/esm2022/modifiers/index.mjs +0 -2
- package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +0 -44
- package/esm2022/performances/adaptive-events/adaptive-events.mjs +0 -27
- package/esm2022/performances/angular-three-soba-performances.mjs +0 -5
- package/esm2022/performances/index.mjs +0 -8
- package/esm2022/performances/instances/instances.mjs +0 -220
- package/esm2022/performances/instances/position-mesh.mjs +0 -52
- package/esm2022/performances/points/points-input.mjs +0 -64
- package/esm2022/performances/points/points.mjs +0 -326
- package/esm2022/performances/points/position-point.mjs +0 -54
- package/esm2022/performances/segments/segment-object.mjs +0 -9
- package/esm2022/performances/segments/segments.mjs +0 -182
- package/esm2022/shaders/blur-pass/blur-pass.mjs +0 -61
- package/esm2022/shaders/caustics/caustics-material.mjs +0 -130
- package/esm2022/shaders/caustics/caustics-projection-material.mjs +0 -31
- package/esm2022/shaders/convolution-material/convolution-material.mjs +0 -94
- package/esm2022/shaders/discard-material/discard-material.mjs +0 -3
- package/esm2022/shaders/grid-material/grid-material.mjs +0 -77
- package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +0 -56
- package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +0 -223
- package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +0 -170
- package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +0 -268
- package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +0 -37
- package/esm2022/shaders/shader-material/shader-material.mjs +0 -34
- package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +0 -25
- package/esm2022/shaders/sparkles-material/sparkles-material.mjs +0 -33
- package/esm2022/shaders/spot-light-material/spot-light-material.mjs +0 -86
- package/esm2022/shaders/star-field-material/star-field-material.mjs +0 -33
- package/esm2022/shaders/wireframe-material/wireframe-material.mjs +0 -247
- package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +0 -267
- package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +0 -108
- package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +0 -206
- package/esm2022/staging/backdrop/backdrop.mjs +0 -77
- package/esm2022/staging/bb-anchor/bb-anchor.mjs +0 -69
- package/esm2022/staging/bounds/bounds.mjs +0 -308
- package/esm2022/staging/camera-shake/camera-shake.mjs +0 -123
- package/esm2022/staging/center/center.mjs +0 -165
- package/esm2022/staging/cloud/cloud.mjs +0 -158
- package/esm2022/staging/contact-shadows/contact-shadows.mjs +0 -246
- package/esm2022/staging/environment/assets.mjs +0 -13
- package/esm2022/staging/environment/environment-cube.mjs +0 -47
- package/esm2022/staging/environment/environment-ground.mjs +0 -41
- package/esm2022/staging/environment/environment-input.mjs +0 -119
- package/esm2022/staging/environment/environment-map.mjs +0 -53
- package/esm2022/staging/environment/environment-portal.mjs +0 -113
- package/esm2022/staging/environment/environment.mjs +0 -61
- package/esm2022/staging/environment/utils.mjs +0 -106
- package/esm2022/staging/float/float.mjs +0 -94
- package/esm2022/staging/matcap-texture/matcap-texture.mjs +0 -64
- package/esm2022/staging/normal-texture/normal-texture.mjs +0 -53
- package/esm2022/staging/sky/sky.mjs +0 -119
- package/esm2022/staging/sparkles/sparkles.mjs +0 -164
- package/esm2022/staging/spot-light/shadow-mesh-input.mjs +0 -63
- package/esm2022/staging/spot-light/shadow-mesh.mjs +0 -266
- package/esm2022/staging/spot-light/spot-light-input.mjs +0 -84
- package/esm2022/staging/spot-light/spot-light.mjs +0 -81
- package/esm2022/staging/spot-light/volumetric-mesh.mjs +0 -98
- package/esm2022/staging/stage/stage.mjs +0 -389
- package/esm2022/staging/stars/stars.mjs +0 -147
- package/esm2022/staging/wireframe/wireframe-input.mjs +0 -191
- package/esm2022/staging/wireframe/wireframe.mjs +0 -228
- package/esm2022/utils/angular-three-soba-utils.mjs +0 -5
- package/esm2022/utils/content/content.mjs +0 -15
- package/esm2022/utils/index.mjs +0 -2
- package/fesm2022/angular-three-soba-gizmos.mjs +0 -1043
- package/fesm2022/angular-three-soba-gizmos.mjs.map +0 -1
- package/fesm2022/angular-three-soba-modifiers.mjs +0 -71
- package/fesm2022/angular-three-soba-modifiers.mjs.map +0 -1
- package/fesm2022/angular-three-soba-performances.mjs +0 -956
- package/fesm2022/angular-three-soba-performances.mjs.map +0 -1
- package/fesm2022/angular-three-soba-utils.mjs +0 -22
- package/fesm2022/angular-three-soba-utils.mjs.map +0 -1
- package/gizmos/README.md +0 -3
- package/gizmos/gizmo-helper/gizmo-helper.d.ts +0 -69
- package/gizmos/gizmo-helper/gizmo-viewcube/constants.d.ts +0 -12
- package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +0 -22
- package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +0 -29
- package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-input.d.ts +0 -33
- package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +0 -10
- package/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +0 -40
- package/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +0 -30
- package/gizmos/index.d.ts +0 -3
- package/loaders/gltf-loader/gltf-loader.d.ts +0 -10
- package/loaders/loader/loader.d.ts +0 -33
- package/loaders/progress/progress.d.ts +0 -9
- package/loaders/texture-loader/texture-loader.d.ts +0 -7
- package/materials/mesh-distort-material/mesh-distort-material.d.ts +0 -40
- package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +0 -99
- package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +0 -62
- package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +0 -107
- package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +0 -29
- package/materials/point-material/point-material.d.ts +0 -24
- package/misc/animations/animations.d.ts +0 -15
- package/misc/caustics/caustics.d.ts +0 -87
- package/misc/decal/decal.d.ts +0 -49
- package/misc/depth-buffer/depth-buffer.d.ts +0 -9
- package/misc/example/example.d.ts +0 -81
- package/misc/fbo/fbo.d.ts +0 -17
- package/misc/html/html-wrapper.d.ts +0 -559
- package/misc/html/html.d.ts +0 -214
- package/misc/sampler/sampler.d.ts +0 -67
- package/misc/shadow/shadow.d.ts +0 -37
- package/misc/stats-gl/stats-gl.d.ts +0 -24
- package/misc/trail/trail.d.ts +0 -57
- package/misc/trail-texture/inject-trail-texture.d.ts +0 -9
- package/misc/trail-texture/trail-texture.d.ts +0 -50
- package/modifiers/README.md +0 -3
- package/modifiers/curve-modifier/curve-modifier.d.ts +0 -23
- package/modifiers/index.d.ts +0 -1
- package/performances/README.md +0 -3
- package/performances/adaptive-dpr/adaptive-dpr.d.ts +0 -14
- package/performances/adaptive-events/adaptive-events.d.ts +0 -9
- package/performances/index.d.ts +0 -7
- package/performances/instances/instances.d.ts +0 -79
- package/performances/instances/position-mesh.d.ts +0 -10
- package/performances/points/points-input.d.ts +0 -32
- package/performances/points/points.d.ts +0 -92
- package/performances/points/position-point.d.ts +0 -11
- package/performances/segments/segment-object.d.ts +0 -7
- package/performances/segments/segments.d.ts +0 -124
- package/shaders/blur-pass/blur-pass.d.ts +0 -23
- package/shaders/caustics/caustics-material.d.ts +0 -4
- package/shaders/caustics/caustics-projection-material.d.ts +0 -4
- package/shaders/convolution-material/convolution-material.d.ts +0 -7
- package/shaders/discard-material/discard-material.d.ts +0 -3
- package/shaders/grid-material/grid-material.d.ts +0 -37
- package/shaders/mesh-distort-material/mesh-distort-material.d.ts +0 -295
- package/shaders/mesh-reflector-material/mesh-reflector-material.d.ts +0 -50
- package/shaders/mesh-refraction-material/mesh-refraction-material.d.ts +0 -4
- package/shaders/mesh-transmission-material/mesh-transmission-material.d.ts +0 -25
- package/shaders/mesh-wobble-material/mesh-wobble-material.d.ts +0 -16
- package/shaders/shader-material/shader-material.d.ts +0 -6
- package/shaders/soft-shadow-material/soft-shadow-material.d.ts +0 -19
- package/shaders/sparkles-material/sparkles-material.d.ts +0 -17
- package/shaders/spot-light-material/spot-light-material.d.ts +0 -13
- package/shaders/star-field-material/star-field-material.d.ts +0 -13
- package/shaders/wireframe-material/wireframe-material.d.ts +0 -58
- package/staging/accumulative-shadows/accumulative-shadows.d.ts +0 -146
- package/staging/accumulative-shadows/progressive-light-map.d.ts +0 -34
- package/staging/accumulative-shadows/randomized-lights.d.ts +0 -90
- package/staging/backdrop/backdrop.d.ts +0 -30
- package/staging/bb-anchor/bb-anchor.d.ts +0 -27
- package/staging/bounds/bounds.d.ts +0 -134
- package/staging/camera-shake/camera-shake.d.ts +0 -43
- package/staging/center/center.d.ts +0 -70
- package/staging/cloud/cloud.d.ts +0 -51
- package/staging/contact-shadows/contact-shadows.d.ts +0 -70
- package/staging/environment/assets.d.ts +0 -13
- package/staging/environment/environment-cube.d.ts +0 -15
- package/staging/environment/environment-ground.d.ts +0 -13
- package/staging/environment/environment-input.d.ts +0 -68
- package/staging/environment/environment-map.d.ts +0 -16
- package/staging/environment/environment-portal.d.ts +0 -18
- package/staging/environment/environment.d.ts +0 -8
- package/staging/environment/utils.d.ts +0 -7
- package/staging/float/float.d.ts +0 -31
- package/staging/matcap-texture/matcap-texture.d.ts +0 -13
- package/staging/normal-texture/normal-texture.d.ts +0 -16
- package/staging/sky/sky.d.ts +0 -48
- package/staging/sparkles/sparkles.d.ts +0 -63
- package/staging/spot-light/shadow-mesh-input.d.ts +0 -29
- package/staging/spot-light/shadow-mesh.d.ts +0 -37
- package/staging/spot-light/spot-light-input.d.ts +0 -38
- package/staging/spot-light/spot-light.d.ts +0 -39
- package/staging/spot-light/volumetric-mesh.d.ts +0 -24
- package/staging/stage/stage.d.ts +0 -130
- package/staging/stars/stars.d.ts +0 -45
- package/staging/wireframe/wireframe-input.d.ts +0 -65
- package/staging/wireframe/wireframe.d.ts +0 -28
- package/utils/README.md +0 -3
- package/utils/content/content.d.ts +0 -8
- package/utils/index.d.ts +0 -1
- /package/misc/{bake-shadows → lib}/bake-shadows.d.ts +0 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { effect } from '@angular/core';
|
|
2
|
+
import { injectLoader, injectStore } from 'angular-three';
|
|
3
|
+
import { assertInjector } from 'ngxtension/assert-injector';
|
|
4
|
+
import { Texture, TextureLoader } from 'three';
|
|
5
|
+
function _injectTexture(input, { onLoad, injector } = {}) {
|
|
6
|
+
return assertInjector(_injectTexture, injector, () => {
|
|
7
|
+
const store = injectStore();
|
|
8
|
+
const result = injectLoader(() => TextureLoader, input);
|
|
9
|
+
effect(() => {
|
|
10
|
+
const textures = result();
|
|
11
|
+
if (!textures)
|
|
12
|
+
return;
|
|
13
|
+
const gl = store.get('gl');
|
|
14
|
+
if ('initTexture' in gl) {
|
|
15
|
+
const array = Array.isArray(textures)
|
|
16
|
+
? textures
|
|
17
|
+
: textures instanceof Texture
|
|
18
|
+
? [textures]
|
|
19
|
+
: Object.values(textures);
|
|
20
|
+
if (onLoad)
|
|
21
|
+
onLoad(array);
|
|
22
|
+
array.forEach(gl.initTexture.bind(gl));
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return result;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
_injectTexture.preload = (input) => {
|
|
29
|
+
injectLoader.preload(() => TextureLoader, input);
|
|
30
|
+
};
|
|
31
|
+
export const injectTexture = _injectTexture;
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dHVyZS1sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvbG9hZGVycy9zcmMvbGliL3RleHR1cmUtbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFL0MsU0FBUyxjQUFjLENBQ3RCLEtBQW1CLEVBQ25CLEVBQUUsTUFBTSxFQUFFLFFBQVEsS0FBcUUsRUFBRTtJQUV6RixPQUFPLGNBQWMsQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUNwRCxNQUFNLEtBQUssR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUM1QixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhELE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDWCxNQUFNLFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsUUFBUTtnQkFBRSxPQUFPO1lBQ3RCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsSUFBSSxhQUFhLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO29CQUNwQyxDQUFDLENBQUMsUUFBUTtvQkFDVixDQUFDLENBQUMsUUFBUSxZQUFZLE9BQU87d0JBQzVCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQzt3QkFDWixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxNQUFNO29CQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsY0FBYyxDQUFDLE9BQU8sR0FBRyxDQUE0RCxLQUFtQixFQUFFLEVBQUU7SUFDM0csWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEQsQ0FBQyxDQUFDO0FBR0YsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFzQixjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlZmZlY3QsIEluamVjdG9yLCBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGluamVjdExvYWRlciwgaW5qZWN0U3RvcmUsIE5ndExvYWRlclJlc3VsdHMgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGFzc2VydEluamVjdG9yIH0gZnJvbSAnbmd4dGVuc2lvbi9hc3NlcnQtaW5qZWN0b3InO1xuaW1wb3J0IHsgVGV4dHVyZSwgVGV4dHVyZUxvYWRlciB9IGZyb20gJ3RocmVlJztcblxuZnVuY3Rpb24gX2luamVjdFRleHR1cmU8VElucHV0IGV4dGVuZHMgc3RyaW5nW10gfCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pihcblx0aW5wdXQ6ICgpID0+IFRJbnB1dCxcblx0eyBvbkxvYWQsIGluamVjdG9yIH06IHsgb25Mb2FkPzogKHRleHR1cmU6IFRleHR1cmVbXSkgPT4gdm9pZDsgaW5qZWN0b3I/OiBJbmplY3RvciB9ID0ge30sXG4pOiBTaWduYWw8Tmd0TG9hZGVyUmVzdWx0czxUSW5wdXQsIFRleHR1cmU+IHwgbnVsbD4ge1xuXHRyZXR1cm4gYXNzZXJ0SW5qZWN0b3IoX2luamVjdFRleHR1cmUsIGluamVjdG9yLCAoKSA9PiB7XG5cdFx0Y29uc3Qgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHRcdGNvbnN0IHJlc3VsdCA9IGluamVjdExvYWRlcigoKSA9PiBUZXh0dXJlTG9hZGVyLCBpbnB1dCk7XG5cblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgdGV4dHVyZXMgPSByZXN1bHQoKTtcblx0XHRcdGlmICghdGV4dHVyZXMpIHJldHVybjtcblx0XHRcdGNvbnN0IGdsID0gc3RvcmUuZ2V0KCdnbCcpO1xuXHRcdFx0aWYgKCdpbml0VGV4dHVyZScgaW4gZ2wpIHtcblx0XHRcdFx0Y29uc3QgYXJyYXkgPSBBcnJheS5pc0FycmF5KHRleHR1cmVzKVxuXHRcdFx0XHRcdD8gdGV4dHVyZXNcblx0XHRcdFx0XHQ6IHRleHR1cmVzIGluc3RhbmNlb2YgVGV4dHVyZVxuXHRcdFx0XHRcdFx0PyBbdGV4dHVyZXNdXG5cdFx0XHRcdFx0XHQ6IE9iamVjdC52YWx1ZXModGV4dHVyZXMpO1xuXHRcdFx0XHRpZiAob25Mb2FkKSBvbkxvYWQoYXJyYXkpO1xuXHRcdFx0XHRhcnJheS5mb3JFYWNoKGdsLmluaXRUZXh0dXJlLmJpbmQoZ2wpKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0pO1xufVxuXG5faW5qZWN0VGV4dHVyZS5wcmVsb2FkID0gPFRJbnB1dCBleHRlbmRzIHN0cmluZ1tdIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oaW5wdXQ6ICgpID0+IFRJbnB1dCkgPT4ge1xuXHRpbmplY3RMb2FkZXIucHJlbG9hZCgoKSA9PiBUZXh0dXJlTG9hZGVyLCBpbnB1dCk7XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RzVGV4dHVyZUxvYWRlciA9IHR5cGVvZiBfaW5qZWN0VGV4dHVyZTtcbmV4cG9ydCBjb25zdCBpbmplY3RUZXh0dXJlOiBOZ3RzVGV4dHVyZUxvYWRlciA9IF9pbmplY3RUZXh0dXJlO1xuIl19
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export * from './lib/custom-shader-material';
|
|
2
|
+
export * from './lib/mesh-distort-material';
|
|
3
|
+
export * from './lib/mesh-reflector-material';
|
|
4
|
+
export * from './lib/mesh-refraction-material';
|
|
5
|
+
export * from './lib/mesh-transmission-material';
|
|
6
|
+
export * from './lib/mesh-wobble-material';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvbWF0ZXJpYWxzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyw0QkFBNEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2N1c3RvbS1zaGFkZXItbWF0ZXJpYWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbWVzaC1kaXN0b3J0LW1hdGVyaWFsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21lc2gtcmVmbGVjdG9yLW1hdGVyaWFsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21lc2gtcmVmcmFjdGlvbi1tYXRlcmlhbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tZXNoLXRyYW5zbWlzc2lvbi1tYXRlcmlhbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tZXNoLXdvYmJsZS1tYXRlcmlhbCc7XG4iXX0=
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { afterNextRender, ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, input, } from '@angular/core';
|
|
2
|
+
import { is, NgtArgs, omit, pick } from 'angular-three';
|
|
3
|
+
import { injectAutoEffect } from 'ngxtension/auto-effect';
|
|
4
|
+
import CustomShaderMaterial from 'three-custom-shader-material/vanilla';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class NgtsCustomShaderMaterial {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.baseMaterial = input.required();
|
|
9
|
+
this.attach = input('material');
|
|
10
|
+
this.options = input({});
|
|
11
|
+
this.parameters = omit(this.options, ['fragmentShader', 'vertexShader', 'uniforms', 'cacheKey']);
|
|
12
|
+
this.base = computed(() => {
|
|
13
|
+
const baseMaterial = this.baseMaterial();
|
|
14
|
+
return is.ref(baseMaterial) ? baseMaterial.nativeElement : baseMaterial;
|
|
15
|
+
});
|
|
16
|
+
this.fragmentShader = pick(this.options, 'fragmentShader');
|
|
17
|
+
this.vertexShader = pick(this.options, 'vertexShader');
|
|
18
|
+
this.uniforms = pick(this.options, 'uniforms');
|
|
19
|
+
this.cacheKey = pick(this.options, 'cacheKey');
|
|
20
|
+
this.material = computed(() => {
|
|
21
|
+
const [base, fragmentShader, vertexShader, uniforms, cacheKey] = [
|
|
22
|
+
this.base(),
|
|
23
|
+
this.fragmentShader(),
|
|
24
|
+
this.vertexShader(),
|
|
25
|
+
this.uniforms(),
|
|
26
|
+
this.cacheKey(),
|
|
27
|
+
];
|
|
28
|
+
// NOTE: this is specific to angular-three
|
|
29
|
+
if (is.instance(base)) {
|
|
30
|
+
delete base['__ngt__'];
|
|
31
|
+
delete base['__ngt_renderer__'];
|
|
32
|
+
}
|
|
33
|
+
return new CustomShaderMaterial({
|
|
34
|
+
baseMaterial: base,
|
|
35
|
+
fragmentShader,
|
|
36
|
+
vertexShader,
|
|
37
|
+
uniforms,
|
|
38
|
+
cacheKey,
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
const autoEffect = injectAutoEffect();
|
|
42
|
+
afterNextRender(() => {
|
|
43
|
+
autoEffect(() => {
|
|
44
|
+
const material = this.material();
|
|
45
|
+
return () => material.dispose();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsCustomShaderMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
50
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.0", type: NgtsCustomShaderMaterial, isStandalone: true, selector: "ngts-custom-shader-material", inputs: { baseMaterial: { classPropertyName: "baseMaterial", publicName: "baseMaterial", isSignal: true, isRequired: true, transformFunction: null }, attach: { classPropertyName: "attach", publicName: "attach", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
51
|
+
<ngt-primitive *args="[material()]" [attach]="attach()" [parameters]="parameters()">
|
|
52
|
+
<ng-content />
|
|
53
|
+
</ngt-primitive>
|
|
54
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
55
|
+
}
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsCustomShaderMaterial, decorators: [{
|
|
57
|
+
type: Component,
|
|
58
|
+
args: [{
|
|
59
|
+
selector: 'ngts-custom-shader-material',
|
|
60
|
+
standalone: true,
|
|
61
|
+
template: `
|
|
62
|
+
<ngt-primitive *args="[material()]" [attach]="attach()" [parameters]="parameters()">
|
|
63
|
+
<ng-content />
|
|
64
|
+
</ngt-primitive>
|
|
65
|
+
`,
|
|
66
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
67
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
68
|
+
imports: [NgtArgs],
|
|
69
|
+
}]
|
|
70
|
+
}], ctorParameters: () => [] });
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXNoYWRlci1tYXRlcmlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc29iYS9tYXRlcmlhbHMvc3JjL2xpYi9jdXN0b20tc2hhZGVyLW1hdGVyaWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBRXRCLEtBQUssR0FDTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsRUFBRSxFQUFnQixPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxPQUFPLG9CQUFvQixNQUFNLHNDQUFzQyxDQUFDOztBQWN4RSxNQUFNLE9BQU8sd0JBQXdCO0lBd0NwQztRQXZDQSxpQkFBWSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQXFELENBQUM7UUFDbkYsV0FBTSxHQUFHLEtBQUssQ0FBb0IsVUFBVSxDQUFDLENBQUM7UUFDOUMsWUFBTyxHQUFHLEtBQUssQ0FBQyxFQUFpRixDQUFDLENBQUM7UUFDbkcsZUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBRTVGLFNBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3BCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztRQUVLLG1CQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUN0RCxpQkFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2xELGFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxQyxhQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFbEQsYUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsTUFBTSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRztnQkFDaEUsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDWCxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNyQixJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNuQixJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNmLElBQUksQ0FBQyxRQUFRLEVBQUU7YUFDZixDQUFDO1lBRUYsMENBQTBDO1lBQzFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2QixPQUFRLElBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3pDLE9BQVEsSUFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFFRCxPQUFPLElBQUksb0JBQW9CLENBQUM7Z0JBQy9CLFlBQVksRUFBRSxJQUFJO2dCQUNsQixjQUFjO2dCQUNkLFlBQVk7Z0JBQ1osUUFBUTtnQkFDUixRQUFRO2FBQ1IsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFHRixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOzhHQWhEVyx3QkFBd0I7a0dBQXhCLHdCQUF3Qix3ZUFUMUI7Ozs7RUFJVCw0REFHUyxPQUFPOzsyRkFFTCx3QkFBd0I7a0JBWnBDLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLDZCQUE2QjtvQkFDdkMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7OztFQUlUO29CQUNELE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDO2lCQUNsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdEVsZW1lbnRSZWYsXG5cdGlucHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzLCBOZ3RBbnlSZWNvcmQsIE5ndEFyZ3MsIG9taXQsIHBpY2sgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IEN1c3RvbVNoYWRlck1hdGVyaWFsIGZyb20gJ3RocmVlLWN1c3RvbS1zaGFkZXItbWF0ZXJpYWwvdmFuaWxsYSc7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtY3VzdG9tLXNoYWRlci1tYXRlcmlhbCcsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1wcmltaXRpdmUgKmFyZ3M9XCJbbWF0ZXJpYWwoKV1cIiBbYXR0YWNoXT1cImF0dGFjaCgpXCIgW3BhcmFtZXRlcnNdPVwicGFyYW1ldGVycygpXCI+XG5cdFx0XHQ8bmctY29udGVudCAvPlxuXHRcdDwvbmd0LXByaW1pdGl2ZT5cblx0YCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05ndEFyZ3NdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzQ3VzdG9tU2hhZGVyTWF0ZXJpYWwge1xuXHRiYXNlTWF0ZXJpYWwgPSBpbnB1dC5yZXF1aXJlZDxNYXRlcmlhbCB8IHR5cGVvZiBNYXRlcmlhbCB8IEVsZW1lbnRSZWY8TWF0ZXJpYWw+PigpO1xuXHRhdHRhY2ggPSBpbnB1dDxzdHJpbmcgfCBzdHJpbmdbXT4oJ21hdGVyaWFsJyk7XG5cdG9wdGlvbnMgPSBpbnB1dCh7fSBhcyBPbWl0PENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgQ3VzdG9tU2hhZGVyTWF0ZXJpYWw+WzBdLCAnYmFzZU1hdGVyaWFsJz4pO1xuXHRwYXJhbWV0ZXJzID0gb21pdCh0aGlzLm9wdGlvbnMsIFsnZnJhZ21lbnRTaGFkZXInLCAndmVydGV4U2hhZGVyJywgJ3VuaWZvcm1zJywgJ2NhY2hlS2V5J10pO1xuXG5cdGJhc2UgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgYmFzZU1hdGVyaWFsID0gdGhpcy5iYXNlTWF0ZXJpYWwoKTtcblx0XHRyZXR1cm4gaXMucmVmKGJhc2VNYXRlcmlhbCkgPyBiYXNlTWF0ZXJpYWwubmF0aXZlRWxlbWVudCA6IGJhc2VNYXRlcmlhbDtcblx0fSk7XG5cblx0cHJpdmF0ZSBmcmFnbWVudFNoYWRlciA9IHBpY2sodGhpcy5vcHRpb25zLCAnZnJhZ21lbnRTaGFkZXInKTtcblx0cHJpdmF0ZSB2ZXJ0ZXhTaGFkZXIgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3ZlcnRleFNoYWRlcicpO1xuXHRwcml2YXRlIHVuaWZvcm1zID0gcGljayh0aGlzLm9wdGlvbnMsICd1bmlmb3JtcycpO1xuXHRwcml2YXRlIGNhY2hlS2V5ID0gcGljayh0aGlzLm9wdGlvbnMsICdjYWNoZUtleScpO1xuXG5cdG1hdGVyaWFsID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IFtiYXNlLCBmcmFnbWVudFNoYWRlciwgdmVydGV4U2hhZGVyLCB1bmlmb3JtcywgY2FjaGVLZXldID0gW1xuXHRcdFx0dGhpcy5iYXNlKCksXG5cdFx0XHR0aGlzLmZyYWdtZW50U2hhZGVyKCksXG5cdFx0XHR0aGlzLnZlcnRleFNoYWRlcigpLFxuXHRcdFx0dGhpcy51bmlmb3JtcygpLFxuXHRcdFx0dGhpcy5jYWNoZUtleSgpLFxuXHRcdF07XG5cblx0XHQvLyBOT1RFOiB0aGlzIGlzIHNwZWNpZmljIHRvIGFuZ3VsYXItdGhyZWVcblx0XHRpZiAoaXMuaW5zdGFuY2UoYmFzZSkpIHtcblx0XHRcdGRlbGV0ZSAoYmFzZSBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9fJ107XG5cdFx0XHRkZWxldGUgKGJhc2UgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfcmVuZGVyZXJfXyddO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgQ3VzdG9tU2hhZGVyTWF0ZXJpYWwoe1xuXHRcdFx0YmFzZU1hdGVyaWFsOiBiYXNlLFxuXHRcdFx0ZnJhZ21lbnRTaGFkZXIsXG5cdFx0XHR2ZXJ0ZXhTaGFkZXIsXG5cdFx0XHR1bmlmb3Jtcyxcblx0XHRcdGNhY2hlS2V5LFxuXHRcdH0pO1xuXHR9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRjb25zdCBhdXRvRWZmZWN0ID0gaW5qZWN0QXV0b0VmZmVjdCgpO1xuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRhdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsKCk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiBtYXRlcmlhbC5kaXNwb3NlKCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuIl19
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, input } from '@angular/core';
|
|
2
|
+
import { MeshDistortMaterial } from '@pmndrs/vanilla';
|
|
3
|
+
import { injectBeforeRender, NgtArgs, omit, pick } from 'angular-three';
|
|
4
|
+
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
const defaultOptions = {
|
|
7
|
+
speed: 1,
|
|
8
|
+
};
|
|
9
|
+
export class NgtsMeshDistortMaterial {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.attach = input('material');
|
|
12
|
+
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
13
|
+
this.parameters = omit(this.options, ['speed']);
|
|
14
|
+
this.material = new MeshDistortMaterial();
|
|
15
|
+
this.speed = pick(this.options, 'speed');
|
|
16
|
+
injectBeforeRender(({ clock }) => {
|
|
17
|
+
this.material.time = clock.getElapsedTime() * this.speed();
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsMeshDistortMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
21
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.0", type: NgtsMeshDistortMaterial, isStandalone: true, selector: "ngts-mesh-distort-material", inputs: { attach: { classPropertyName: "attach", publicName: "attach", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
22
|
+
<ngt-primitive *args="[material]" [attach]="attach()" [parameters]="parameters()">
|
|
23
|
+
<ng-content />
|
|
24
|
+
</ngt-primitive>
|
|
25
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
26
|
+
}
|
|
27
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsMeshDistortMaterial, decorators: [{
|
|
28
|
+
type: Component,
|
|
29
|
+
args: [{
|
|
30
|
+
selector: 'ngts-mesh-distort-material',
|
|
31
|
+
standalone: true,
|
|
32
|
+
template: `
|
|
33
|
+
<ngt-primitive *args="[material]" [attach]="attach()" [parameters]="parameters()">
|
|
34
|
+
<ng-content />
|
|
35
|
+
</ngt-primitive>
|
|
36
|
+
`,
|
|
37
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
38
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
39
|
+
imports: [NgtArgs],
|
|
40
|
+
}]
|
|
41
|
+
}], ctorParameters: () => [] });
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1kaXN0b3J0LW1hdGVyaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL21hdGVyaWFscy9zcmMvbGliL21lc2gtZGlzdG9ydC1tYXRlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUEyQixJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFTdkQsTUFBTSxjQUFjLEdBQW1DO0lBQ3RELEtBQUssRUFBRSxDQUFDO0NBQ1IsQ0FBQztBQWNGLE1BQU0sT0FBTyx1QkFBdUI7SUFTbkM7UUFSQSxXQUFNLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNCLFlBQU8sR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUUsZUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUUzQyxhQUFRLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBRTdCLFVBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUczQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0FiVyx1QkFBdUI7a0dBQXZCLHVCQUF1QiwyVkFUekI7Ozs7RUFJVCw0REFHUyxPQUFPOzsyRkFFTCx1QkFBdUI7a0JBWm5DLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLDRCQUE0QjtvQkFDdEMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7OztFQUlUO29CQUNELE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDO2lCQUNsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZXNoRGlzdG9ydE1hdGVyaWFsIH0gZnJvbSAnQHBtbmRycy92YW5pbGxhJztcbmltcG9ydCB7IGluamVjdEJlZm9yZVJlbmRlciwgTmd0QXJncywgTmd0TWVzaFBoeXNpY2FsTWF0ZXJpYWwsIG9taXQsIHBpY2sgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IE1lc2hEaXN0b3J0TWF0ZXJpYWxQYXJhbWV0ZXJzIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL3ZhbmlsbGEtZXhwb3J0cyc7XG5pbXBvcnQgeyBtZXJnZUlucHV0cyB9IGZyb20gJ25neHRlbnNpb24vaW5qZWN0LWlucHV0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c01lc2hEaXN0b3J0TWF0ZXJpYWxPcHRpb25zXG5cdGV4dGVuZHMgUGFydGlhbDxNZXNoRGlzdG9ydE1hdGVyaWFsUGFyYW1ldGVycz4sXG5cdFx0UGFydGlhbDxOZ3RNZXNoUGh5c2ljYWxNYXRlcmlhbD4ge1xuXHRzcGVlZDogbnVtYmVyO1xuXHRmYWN0b3I/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBOZ3RzTWVzaERpc3RvcnRNYXRlcmlhbE9wdGlvbnMgPSB7XG5cdHNwZWVkOiAxLFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1tZXNoLWRpc3RvcnQtbWF0ZXJpYWwnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3QtcHJpbWl0aXZlICphcmdzPVwiW21hdGVyaWFsXVwiIFthdHRhY2hdPVwiYXR0YWNoKClcIiBbcGFyYW1ldGVyc109XCJwYXJhbWV0ZXJzKClcIj5cblx0XHRcdDxuZy1jb250ZW50IC8+XG5cdFx0PC9uZ3QtcHJpbWl0aXZlPlxuXHRgLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuXHRpbXBvcnRzOiBbTmd0QXJnc10sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNNZXNoRGlzdG9ydE1hdGVyaWFsIHtcblx0YXR0YWNoID0gaW5wdXQoJ21hdGVyaWFsJyk7XG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblx0cGFyYW1ldGVycyA9IG9taXQodGhpcy5vcHRpb25zLCBbJ3NwZWVkJ10pO1xuXG5cdG1hdGVyaWFsID0gbmV3IE1lc2hEaXN0b3J0TWF0ZXJpYWwoKTtcblxuXHRwcml2YXRlIHNwZWVkID0gcGljayh0aGlzLm9wdGlvbnMsICdzcGVlZCcpO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoeyBjbG9jayB9KSA9PiB7XG5cdFx0XHR0aGlzLm1hdGVyaWFsLnRpbWUgPSBjbG9jay5nZXRFbGFwc2VkVGltZSgpICogdGhpcy5zcGVlZCgpO1xuXHRcdH0pO1xuXHR9XG59XG4iXX0=
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { afterNextRender, ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, inject, input, untracked, viewChild, } from '@angular/core';
|
|
2
|
+
import { applyProps, getLocalState, injectBeforeRender, injectStore, NgtArgs, omit, pick, } from 'angular-three';
|
|
3
|
+
import { BlurPass, MeshReflectorMaterial } from 'angular-three-soba/vanilla-exports';
|
|
4
|
+
import { injectAutoEffect } from 'ngxtension/auto-effect';
|
|
5
|
+
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
6
|
+
import { DepthFormat, DepthTexture, HalfFloatType, LinearFilter, Matrix4, PerspectiveCamera, Plane, UnsignedShortType, Vector3, Vector4, WebGLRenderTarget, } from 'three';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
const defaultOptions = {
|
|
9
|
+
mixBlur: 0,
|
|
10
|
+
mixStrength: 1,
|
|
11
|
+
resolution: 256,
|
|
12
|
+
blur: [0, 0],
|
|
13
|
+
minDepthThreshold: 0.9,
|
|
14
|
+
maxDepthThreshold: 1,
|
|
15
|
+
depthScale: 0,
|
|
16
|
+
depthToBlurRatioBias: 0.25,
|
|
17
|
+
mirror: 0,
|
|
18
|
+
distortion: 1,
|
|
19
|
+
mixContrast: 1,
|
|
20
|
+
reflectorOffset: 0,
|
|
21
|
+
};
|
|
22
|
+
export class NgtsMeshReflectorMaterial {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.attach = input('material');
|
|
25
|
+
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
26
|
+
this.parameters = omit(this.options, [
|
|
27
|
+
'distortionMap',
|
|
28
|
+
'resolution',
|
|
29
|
+
'mixBlur',
|
|
30
|
+
'mixStrength',
|
|
31
|
+
'blur',
|
|
32
|
+
'minDepthThreshold',
|
|
33
|
+
'maxDepthThreshold',
|
|
34
|
+
'depthScale',
|
|
35
|
+
'depthToBlurRatioBias',
|
|
36
|
+
'mirror',
|
|
37
|
+
'distortion',
|
|
38
|
+
'mixContrast',
|
|
39
|
+
'reflectorOffset',
|
|
40
|
+
]);
|
|
41
|
+
this.store = injectStore();
|
|
42
|
+
this.gl = this.store.select('gl');
|
|
43
|
+
this.materialRef = viewChild('material');
|
|
44
|
+
this.reflectOptions = pick(this.options, [
|
|
45
|
+
'distortionMap',
|
|
46
|
+
'resolution',
|
|
47
|
+
'mixBlur',
|
|
48
|
+
'mixStrength',
|
|
49
|
+
'blur',
|
|
50
|
+
'minDepthThreshold',
|
|
51
|
+
'maxDepthThreshold',
|
|
52
|
+
'depthScale',
|
|
53
|
+
'depthToBlurRatioBias',
|
|
54
|
+
'mirror',
|
|
55
|
+
'distortion',
|
|
56
|
+
'mixContrast',
|
|
57
|
+
'reflectorOffset',
|
|
58
|
+
]);
|
|
59
|
+
this.blur = pick(this.reflectOptions, 'blur');
|
|
60
|
+
this.normalizedBlur = computed(() => {
|
|
61
|
+
const blur = this.blur();
|
|
62
|
+
return Array.isArray(blur) ? blur : [blur, blur];
|
|
63
|
+
});
|
|
64
|
+
this.hasBlur = computed(() => this.normalizedBlur()[0] + this.normalizedBlur()[1] > 0);
|
|
65
|
+
this.reflectorPlane = new Plane();
|
|
66
|
+
this.normal = new Vector3();
|
|
67
|
+
this.reflectorWorldPosition = new Vector3();
|
|
68
|
+
this.cameraWorldPosition = new Vector3();
|
|
69
|
+
this.rotationMatrix = new Matrix4();
|
|
70
|
+
this.lookAtPosition = new Vector3(0, 0, -1);
|
|
71
|
+
this.clipPlane = new Vector4();
|
|
72
|
+
this.view = new Vector3();
|
|
73
|
+
this.target = new Vector3();
|
|
74
|
+
this.q = new Vector4();
|
|
75
|
+
this.textureMatrix = new Matrix4();
|
|
76
|
+
this.virtualCamera = new PerspectiveCamera();
|
|
77
|
+
this.reflectState = computed(() => {
|
|
78
|
+
const [gl, { resolution, minDepthThreshold, maxDepthThreshold, depthScale, depthToBlurRatioBias, mirror, mixBlur, mixStrength, distortion, distortionMap, mixContrast, }, blur, hasBlur,] = [this.gl(), this.reflectOptions(), this.normalizedBlur(), this.hasBlur()];
|
|
79
|
+
const renderTargetParameters = {
|
|
80
|
+
minFilter: LinearFilter,
|
|
81
|
+
magFilter: LinearFilter,
|
|
82
|
+
type: HalfFloatType,
|
|
83
|
+
};
|
|
84
|
+
const fbo1 = new WebGLRenderTarget(resolution, resolution, renderTargetParameters);
|
|
85
|
+
fbo1.depthBuffer = true;
|
|
86
|
+
fbo1.depthTexture = new DepthTexture(resolution, resolution);
|
|
87
|
+
fbo1.depthTexture.format = DepthFormat;
|
|
88
|
+
fbo1.depthTexture.type = UnsignedShortType;
|
|
89
|
+
const fbo2 = new WebGLRenderTarget(resolution, resolution, renderTargetParameters);
|
|
90
|
+
const blurPass = new BlurPass({
|
|
91
|
+
gl,
|
|
92
|
+
resolution,
|
|
93
|
+
width: blur[0],
|
|
94
|
+
height: blur[1],
|
|
95
|
+
minDepthThreshold,
|
|
96
|
+
maxDepthThreshold,
|
|
97
|
+
depthScale,
|
|
98
|
+
depthToBlurRatioBias,
|
|
99
|
+
});
|
|
100
|
+
const defines = {};
|
|
101
|
+
if (hasBlur) {
|
|
102
|
+
defines['USE_BLUR'] = '';
|
|
103
|
+
}
|
|
104
|
+
if (depthScale > 0) {
|
|
105
|
+
defines['USE_DEPTH'] = '';
|
|
106
|
+
}
|
|
107
|
+
if (distortionMap) {
|
|
108
|
+
defines['USE_DISTORTION'] = '';
|
|
109
|
+
}
|
|
110
|
+
const reflectorParameters = {
|
|
111
|
+
mirror,
|
|
112
|
+
textureMatrix: this.textureMatrix,
|
|
113
|
+
mixBlur,
|
|
114
|
+
tDiffuse: fbo1.texture,
|
|
115
|
+
tDepth: fbo1.depthTexture,
|
|
116
|
+
tDiffuseBlur: fbo2.texture,
|
|
117
|
+
hasBlur,
|
|
118
|
+
mixStrength,
|
|
119
|
+
minDepthThreshold,
|
|
120
|
+
maxDepthThreshold,
|
|
121
|
+
depthScale,
|
|
122
|
+
depthToBlurRatioBias,
|
|
123
|
+
distortion,
|
|
124
|
+
distortionMap,
|
|
125
|
+
mixContrast,
|
|
126
|
+
defines,
|
|
127
|
+
};
|
|
128
|
+
return { fbo1, fbo2, blurPass, reflectorParameters };
|
|
129
|
+
});
|
|
130
|
+
this.definesKey = computed(() => {
|
|
131
|
+
const defines = this.reflectState().reflectorParameters.defines;
|
|
132
|
+
return Object.entries(defines).reduce((acc, [key, value]) => (value != null ? `${acc} ${key}` : acc), '');
|
|
133
|
+
});
|
|
134
|
+
this.material = computed(() => {
|
|
135
|
+
const prevMaterial = untracked(this.materialRef)?.nativeElement;
|
|
136
|
+
if (prevMaterial) {
|
|
137
|
+
prevMaterial.dispose();
|
|
138
|
+
delete prevMaterial['__ngt__'];
|
|
139
|
+
delete prevMaterial['__ngt_renderer__'];
|
|
140
|
+
}
|
|
141
|
+
// tracking defines key so that the material is recreated when the defines change
|
|
142
|
+
this.definesKey();
|
|
143
|
+
return new MeshReflectorMaterial();
|
|
144
|
+
});
|
|
145
|
+
const autoEffect = injectAutoEffect();
|
|
146
|
+
afterNextRender(() => {
|
|
147
|
+
autoEffect(() => {
|
|
148
|
+
const material = this.materialRef()?.nativeElement;
|
|
149
|
+
if (!material)
|
|
150
|
+
return;
|
|
151
|
+
const { reflectorParameters } = this.reflectState();
|
|
152
|
+
applyProps(material, { ...reflectorParameters, ...this.parameters() });
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
inject(DestroyRef).onDestroy(() => {
|
|
156
|
+
const material = this.materialRef()?.nativeElement;
|
|
157
|
+
if (material) {
|
|
158
|
+
material.dispose();
|
|
159
|
+
delete material['__ngt__'];
|
|
160
|
+
delete material['__ngt_renderer__'];
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
injectBeforeRender(({ gl, scene }) => {
|
|
164
|
+
const material = this.materialRef()?.nativeElement;
|
|
165
|
+
if (!material)
|
|
166
|
+
return;
|
|
167
|
+
const localState = getLocalState(material);
|
|
168
|
+
if (!localState)
|
|
169
|
+
return;
|
|
170
|
+
const parent = Reflect.get(material, 'parent') ?? untracked(localState.parent);
|
|
171
|
+
if (!parent)
|
|
172
|
+
return;
|
|
173
|
+
const { fbo1, fbo2, blurPass } = this.reflectState();
|
|
174
|
+
const hasBlur = this.hasBlur();
|
|
175
|
+
parent.visible = false;
|
|
176
|
+
const currentXrEnabled = gl.xr.enabled;
|
|
177
|
+
const currentShadowAutoUpdate = gl.shadowMap.autoUpdate;
|
|
178
|
+
this.beforeRender();
|
|
179
|
+
gl.xr.enabled = false;
|
|
180
|
+
gl.shadowMap.autoUpdate = false;
|
|
181
|
+
gl.setRenderTarget(fbo1);
|
|
182
|
+
gl.state.buffers.depth.setMask(true);
|
|
183
|
+
if (!gl.autoClear)
|
|
184
|
+
gl.clear();
|
|
185
|
+
gl.render(scene, this.virtualCamera);
|
|
186
|
+
if (hasBlur)
|
|
187
|
+
blurPass.render(gl, fbo1, fbo2);
|
|
188
|
+
gl.xr.enabled = currentXrEnabled;
|
|
189
|
+
gl.shadowMap.autoUpdate = currentShadowAutoUpdate;
|
|
190
|
+
parent.visible = true;
|
|
191
|
+
gl.setRenderTarget(null);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
beforeRender() {
|
|
195
|
+
const material = this.materialRef()?.nativeElement;
|
|
196
|
+
if (!material)
|
|
197
|
+
return;
|
|
198
|
+
const localState = getLocalState(material);
|
|
199
|
+
if (!localState)
|
|
200
|
+
return;
|
|
201
|
+
const parent = Reflect.get(material, 'parent') ?? untracked(localState.parent);
|
|
202
|
+
if (!parent)
|
|
203
|
+
return;
|
|
204
|
+
const { camera } = this.store.snapshot;
|
|
205
|
+
const { reflectorOffset } = untracked(this.reflectOptions);
|
|
206
|
+
this.reflectorWorldPosition.setFromMatrixPosition(parent.matrixWorld);
|
|
207
|
+
this.cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld);
|
|
208
|
+
this.rotationMatrix.extractRotation(parent.matrixWorld);
|
|
209
|
+
this.normal.set(0, 0, 1);
|
|
210
|
+
this.normal.applyMatrix4(this.rotationMatrix);
|
|
211
|
+
this.reflectorWorldPosition.addScaledVector(this.normal, reflectorOffset);
|
|
212
|
+
this.view.subVectors(this.reflectorWorldPosition, this.cameraWorldPosition);
|
|
213
|
+
// Avoid rendering when reflector is facing away
|
|
214
|
+
if (this.view.dot(this.normal) > 0)
|
|
215
|
+
return;
|
|
216
|
+
this.view.reflect(this.normal).negate();
|
|
217
|
+
this.view.add(this.reflectorWorldPosition);
|
|
218
|
+
this.rotationMatrix.extractRotation(camera.matrixWorld);
|
|
219
|
+
this.lookAtPosition.set(0, 0, -1);
|
|
220
|
+
this.lookAtPosition.applyMatrix4(this.rotationMatrix);
|
|
221
|
+
this.lookAtPosition.add(this.cameraWorldPosition);
|
|
222
|
+
this.target.subVectors(this.reflectorWorldPosition, this.lookAtPosition);
|
|
223
|
+
this.target.reflect(this.normal).negate();
|
|
224
|
+
this.target.add(this.reflectorWorldPosition);
|
|
225
|
+
this.virtualCamera.position.copy(this.view);
|
|
226
|
+
this.virtualCamera.up.set(0, 1, 0);
|
|
227
|
+
this.virtualCamera.up.applyMatrix4(this.rotationMatrix);
|
|
228
|
+
this.virtualCamera.up.reflect(this.normal);
|
|
229
|
+
this.virtualCamera.lookAt(this.target);
|
|
230
|
+
this.virtualCamera.far = camera.far; // Used in WebGLBackground
|
|
231
|
+
this.virtualCamera.updateMatrixWorld();
|
|
232
|
+
this.virtualCamera.projectionMatrix.copy(camera.projectionMatrix);
|
|
233
|
+
// Update the texture matrix
|
|
234
|
+
this.textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0);
|
|
235
|
+
this.textureMatrix.multiply(this.virtualCamera.projectionMatrix);
|
|
236
|
+
this.textureMatrix.multiply(this.virtualCamera.matrixWorldInverse);
|
|
237
|
+
this.textureMatrix.multiply(parent.matrixWorld);
|
|
238
|
+
// Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html
|
|
239
|
+
// Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
|
|
240
|
+
this.reflectorPlane.setFromNormalAndCoplanarPoint(this.normal, this.reflectorWorldPosition);
|
|
241
|
+
this.reflectorPlane.applyMatrix4(this.virtualCamera.matrixWorldInverse);
|
|
242
|
+
this.clipPlane.set(this.reflectorPlane.normal.x, this.reflectorPlane.normal.y, this.reflectorPlane.normal.z, this.reflectorPlane.constant);
|
|
243
|
+
const projectionMatrix = this.virtualCamera.projectionMatrix;
|
|
244
|
+
this.q.x = (Math.sign(this.clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0];
|
|
245
|
+
this.q.y = (Math.sign(this.clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5];
|
|
246
|
+
this.q.z = -1.0;
|
|
247
|
+
this.q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14];
|
|
248
|
+
// Calculate the scaled plane vector
|
|
249
|
+
this.clipPlane.multiplyScalar(2.0 / this.clipPlane.dot(this.q));
|
|
250
|
+
// Replacing the third row of the projection matrix
|
|
251
|
+
projectionMatrix.elements[2] = this.clipPlane.x;
|
|
252
|
+
projectionMatrix.elements[6] = this.clipPlane.y;
|
|
253
|
+
projectionMatrix.elements[10] = this.clipPlane.z + 1.0;
|
|
254
|
+
projectionMatrix.elements[14] = this.clipPlane.w;
|
|
255
|
+
}
|
|
256
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsMeshReflectorMaterial, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
257
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.1.0", type: NgtsMeshReflectorMaterial, isStandalone: true, selector: "ngts-mesh-reflector-material", inputs: { attach: { classPropertyName: "attach", publicName: "attach", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "materialRef", first: true, predicate: ["material"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
258
|
+
<ngt-primitive #material *args="[material()]" [attach]="attach()">
|
|
259
|
+
<ng-content />
|
|
260
|
+
</ngt-primitive>
|
|
261
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
262
|
+
}
|
|
263
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsMeshReflectorMaterial, decorators: [{
|
|
264
|
+
type: Component,
|
|
265
|
+
args: [{
|
|
266
|
+
selector: 'ngts-mesh-reflector-material',
|
|
267
|
+
standalone: true,
|
|
268
|
+
template: `
|
|
269
|
+
<ngt-primitive #material *args="[material()]" [attach]="attach()">
|
|
270
|
+
<ng-content />
|
|
271
|
+
</ngt-primitive>
|
|
272
|
+
`,
|
|
273
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
274
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
275
|
+
imports: [NgtArgs],
|
|
276
|
+
}]
|
|
277
|
+
}], ctorParameters: () => [] });
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1yZWZsZWN0b3ItbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvbWF0ZXJpYWxzL3NyYy9saWIvbWVzaC1yZWZsZWN0b3ItbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsRUFDdEIsVUFBVSxFQUVWLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ04sVUFBVSxFQUNWLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsV0FBVyxFQUVYLE9BQU8sRUFFUCxJQUFJLEVBQ0osSUFBSSxHQUNKLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUNOLFdBQVcsRUFDWCxZQUFZLEVBQ1osYUFBYSxFQUNiLFlBQVksRUFDWixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLEtBQUssRUFFTCxpQkFBaUIsRUFDakIsT0FBTyxFQUNQLE9BQU8sRUFDUCxpQkFBaUIsR0FDakIsTUFBTSxPQUFPLENBQUM7O0FBa0JmLE1BQU0sY0FBYyxHQUFxQztJQUN4RCxPQUFPLEVBQUUsQ0FBQztJQUNWLFdBQVcsRUFBRSxDQUFDO0lBQ2QsVUFBVSxFQUFFLEdBQUc7SUFDZixJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1osaUJBQWlCLEVBQUUsR0FBRztJQUN0QixpQkFBaUIsRUFBRSxDQUFDO0lBQ3BCLFVBQVUsRUFBRSxDQUFDO0lB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O0lBQ2xELENBQUM7OEdBdFJXLHlCQUF5QjtrR0FBekIseUJBQXlCLHNkQVQzQjs7OztFQUlULDREQUdTLE9BQU87OzJGQUVMLHlCQUF5QjtrQkFackMsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsOEJBQThCO29CQUN4QyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7O0VBSVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRjb21wdXRlZCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0RGVzdHJveVJlZixcblx0RWxlbWVudFJlZixcblx0aW5qZWN0LFxuXHRpbnB1dCxcblx0dW50cmFja2VkLFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0YXBwbHlQcm9wcyxcblx0Z2V0TG9jYWxTdGF0ZSxcblx0aW5qZWN0QmVmb3JlUmVuZGVyLFxuXHRpbmplY3RTdG9yZSxcblx0Tmd0QW55UmVjb3JkLFxuXHROZ3RBcmdzLFxuXHROZ3RNZXNoU3RhbmRhcmRNYXRlcmlhbCxcblx0b21pdCxcblx0cGljayxcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBCbHVyUGFzcywgTWVzaFJlZmxlY3Rvck1hdGVyaWFsIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL3ZhbmlsbGEtZXhwb3J0cyc7XG5pbXBvcnQgeyBpbmplY3RBdXRvRWZmZWN0IH0gZnJvbSAnbmd4dGVuc2lvbi9hdXRvLWVmZmVjdCc7XG5pbXBvcnQgeyBtZXJnZUlucHV0cyB9IGZyb20gJ25neHRlbnNpb24vaW5qZWN0LWlucHV0cyc7XG5pbXBvcnQge1xuXHREZXB0aEZvcm1hdCxcblx0RGVwdGhUZXh0dXJlLFxuXHRIYWxmRmxvYXRUeXBlLFxuXHRMaW5lYXJGaWx0ZXIsXG5cdE1hdHJpeDQsXG5cdFBlcnNwZWN0aXZlQ2FtZXJhLFxuXHRQbGFuZSxcblx0VGV4dHVyZSxcblx0VW5zaWduZWRTaG9ydFR5cGUsXG5cdFZlY3RvcjMsXG5cdFZlY3RvcjQsXG5cdFdlYkdMUmVuZGVyVGFyZ2V0LFxufSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c01lc2hSZWZsZWN0b3JNYXRlcmlhbE9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPE5ndE1lc2hTdGFuZGFyZE1hdGVyaWFsPiB7XG5cdHJlc29sdXRpb246IG51bWJlcjtcblx0bWl4Qmx1cjogbnVtYmVyO1xuXHRtaXhTdHJlbmd0aDogbnVtYmVyO1xuXHRibHVyOiBbbnVtYmVyLCBudW1iZXJdIHwgbnVtYmVyO1xuXHRtaXJyb3I6IG51bWJlcjtcblx0bWluRGVwdGhUaHJlc2hvbGQ6IG51bWJlcjtcblx0bWF4RGVwdGhUaHJlc2hvbGQ6IG51bWJlcjtcblx0ZGVwdGhTY2FsZTogbnVtYmVyO1xuXHRkZXB0aFRvQmx1clJhdGlvQmlhczogbnVtYmVyO1xuXHRkaXN0b3J0aW9uOiBudW1iZXI7XG5cdG1peENvbnRyYXN0OiBudW1iZXI7XG5cdHJlZmxlY3Rvck9mZnNldDogbnVtYmVyO1xuXHRkaXN0b3J0aW9uTWFwPzogVGV4dHVyZTtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE5ndHNNZXNoUmVmbGVjdG9yTWF0ZXJpYWxPcHRpb25zID0ge1xuXHRtaXhCbHVyOiAwLFxuXHRtaXhTdHJlbmd0aDogMSxcblx0cmVzb2x1dGlvbjogMjU2LFxuXHRibHVyOiBbMCwgMF0sXG5cdG1pbkRlcHRoVGhyZXNob2xkOiAwLjksXG5cdG1heERlcHRoVGhyZXNob2xkOiAxLFxuXHRkZXB0aFNjYWxlOiAwLFxuXHRkZXB0aFRvQmx1clJhdGlvQmlhczogMC4yNSxcblx0bWlycm9yOiAwLFxuXHRkaXN0b3J0aW9uOiAxLFxuXHRtaXhDb250cmFzdDogMSxcblx0cmVmbGVjdG9yT2Zmc2V0OiAwLFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1tZXNoLXJlZmxlY3Rvci1tYXRlcmlhbCcsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1wcmltaXRpdmUgI21hdGVyaWFsICphcmdzPVwiW21hdGVyaWFsKCldXCIgW2F0dGFjaF09XCJhdHRhY2goKVwiPlxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L25ndC1wcmltaXRpdmU+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RBcmdzXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c01lc2hSZWZsZWN0b3JNYXRlcmlhbCB7XG5cdGF0dGFjaCA9IGlucHV0KCdtYXRlcmlhbCcpO1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cdHByaXZhdGUgcGFyYW1ldGVycyA9IG9taXQodGhpcy5vcHRpb25zLCBbXG5cdFx0J2Rpc3RvcnRpb25NYXAnLFxuXHRcdCdyZXNvbHV0aW9uJyxcblx0XHQnbWl4Qmx1cicsXG5cdFx0J21peFN0cmVuZ3RoJyxcblx0XHQnYmx1cicsXG5cdFx0J21pbkRlcHRoVGhyZXNob2xkJyxcblx0XHQnbWF4RGVwdGhUaHJlc2hvbGQnLFxuXHRcdCdkZXB0aFNjYWxlJyxcblx0XHQnZGVwdGhUb0JsdXJSYXRpb0JpYXMnLFxuXHRcdCdtaXJyb3InLFxuXHRcdCdkaXN0b3J0aW9uJyxcblx0XHQnbWl4Q29udHJhc3QnLFxuXHRcdCdyZWZsZWN0b3JPZmZzZXQnLFxuXHRdKTtcblxuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBnbCA9IHRoaXMuc3RvcmUuc2VsZWN0KCdnbCcpO1xuXG5cdHByaXZhdGUgbWF0ZXJpYWxSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxNZXNoUmVmbGVjdG9yTWF0ZXJpYWw+PignbWF0ZXJpYWwnKTtcblxuXHRwcml2YXRlIHJlZmxlY3RPcHRpb25zID0gcGljayh0aGlzLm9wdGlvbnMsIFtcblx0XHQnZGlzdG9ydGlvbk1hcCcsXG5cdFx0J3Jlc29sdXRpb24nLFxuXHRcdCdtaXhCbHVyJyxcblx0XHQnbWl4U3RyZW5ndGgnLFxuXHRcdCdibHVyJyxcblx0XHQnbWluRGVwdGhUaHJlc2hvbGQnLFxuXHRcdCdtYXhEZXB0aFRocmVzaG9sZCcsXG5cdFx0J2RlcHRoU2NhbGUnLFxuXHRcdCdkZXB0aFRvQmx1clJhdGlvQmlhcycsXG5cdFx0J21pcnJvcicsXG5cdFx0J2Rpc3RvcnRpb24nLFxuXHRcdCdtaXhDb250cmFzdCcsXG5cdFx0J3JlZmxlY3Rvck9mZnNldCcsXG5cdF0pO1xuXG5cdHByaXZhdGUgYmx1ciA9IHBpY2sodGhpcy5yZWZsZWN0T3B0aW9ucywgJ2JsdXInKTtcblxuXHRwcml2YXRlIG5vcm1hbGl6ZWRCbHVyID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IGJsdXIgPSB0aGlzLmJsdXIoKTtcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShibHVyKSA/IGJsdXIgOiBbYmx1ciwgYmx1cl07XG5cdH0pO1xuXHRwcml2YXRlIGhhc0JsdXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5vcm1hbGl6ZWRCbHVyKClbMF0gKyB0aGlzLm5vcm1hbGl6ZWRCbHVyKClbMV0gPiAwKTtcblxuXHRwcml2YXRlIHJlZmxlY3RvclBsYW5lID0gbmV3IFBsYW5lKCk7XG5cdHByaXZhdGUgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0cHJpdmF0ZSByZWZsZWN0b3JXb3JsZFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0cHJpdmF0ZSBjYW1lcmFXb3JsZFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0cHJpdmF0ZSByb3RhdGlvbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHByaXZhdGUgbG9va0F0UG9zaXRpb24gPSBuZXcgVmVjdG9yMygwLCAwLCAtMSk7XG5cdHByaXZhdGUgY2xpcFBsYW5lID0gbmV3IFZlY3RvcjQoKTtcblx0cHJpdmF0ZSB2aWV3ID0gbmV3IFZlY3RvcjMoKTtcblx0cHJpdmF0ZSB0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXHRwcml2YXRlIHEgPSBuZXcgVmVjdG9yNCgpO1xuXHRwcml2YXRlIHRleHR1cmVNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRwcml2YXRlIHZpcnR1YWxDYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblxuXHRwcml2YXRlIHJlZmxlY3RTdGF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBbXG5cdFx0XHRnbCxcblx0XHRcdHtcblx0XHRcdFx0cmVzb2x1dGlvbixcblx0XHRcdFx0bWluRGVwdGhUaHJlc2hvbGQsXG5cdFx0XHRcdG1heERlcHRoVGhyZXNob2xkLFxuXHRcdFx0XHRkZXB0aFNjYWxlLFxuXHRcdFx0XHRkZXB0aFRvQmx1clJhdGlvQmlhcyxcblx0XHRcdFx0bWlycm9yLFxuXHRcdFx0XHRtaXhCbHVyLFxuXHRcdFx0XHRtaXhTdHJlbmd0aCxcblx0XHRcdFx0ZGlzdG9ydGlvbixcblx0XHRcdFx0ZGlzdG9ydGlvbk1hcCxcblx0XHRcdFx0bWl4Q29udHJhc3QsXG5cdFx0XHR9LFxuXHRcdFx0Ymx1cixcblx0XHRcdGhhc0JsdXIsXG5cdFx0XSA9IFt0aGlzLmdsKCksIHRoaXMucmVmbGVjdE9wdGlvbnMoKSwgdGhpcy5ub3JtYWxpemVkQmx1cigpLCB0aGlzLmhhc0JsdXIoKV07XG5cblx0XHRjb25zdCByZW5kZXJUYXJnZXRQYXJhbWV0ZXJzID0ge1xuXHRcdFx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG5cdFx0XHRtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcblx0XHRcdHR5cGU6IEhhbGZGbG9hdFR5cGUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IGZibzEgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQocmVzb2x1dGlvbiwgcmVzb2x1dGlvbiwgcmVuZGVyVGFyZ2V0UGFyYW1ldGVycyk7XG5cdFx0ZmJvMS5kZXB0aEJ1ZmZlciA9IHRydWU7XG5cdFx0ZmJvMS5kZXB0aFRleHR1cmUgPSBuZXcgRGVwdGhUZXh0dXJlKHJlc29sdXRpb24sIHJlc29sdXRpb24pO1xuXHRcdGZibzEuZGVwdGhUZXh0dXJlLmZvcm1hdCA9IERlcHRoRm9ybWF0O1xuXHRcdGZibzEuZGVwdGhUZXh0dXJlLnR5cGUgPSBVbnNpZ25lZFNob3J0VHlwZTtcblx0XHRjb25zdCBmYm8yID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KHJlc29sdXRpb24sIHJlc29sdXRpb24sIHJlbmRlclRhcmdldFBhcmFtZXRlcnMpO1xuXG5cdFx0Y29uc3QgYmx1clBhc3MgPSBuZXcgQmx1clBhc3Moe1xuXHRcdFx0Z2wsXG5cdFx0XHRyZXNvbHV0aW9uLFxuXHRcdFx0d2lkdGg6IGJsdXJbMF0sXG5cdFx0XHRoZWlnaHQ6IGJsdXJbMV0sXG5cdFx0XHRtaW5EZXB0aFRocmVzaG9sZCxcblx0XHRcdG1heERlcHRoVGhyZXNob2xkLFxuXHRcdFx0ZGVwdGhTY2FsZSxcblx0XHRcdGRlcHRoVG9CbHVyUmF0aW9CaWFzLFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgZGVmaW5lczogTmd0QW55UmVjb3JkID0ge307XG5cblx0XHRpZiAoaGFzQmx1cikge1xuXHRcdFx0ZGVmaW5lc1snVVNFX0JMVVInXSA9ICcnO1xuXHRcdH1cblxuXHRcdGlmIChkZXB0aFNjYWxlID4gMCkge1xuXHRcdFx0ZGVmaW5lc1snVVNFX0RFUFRIJ10gPSAnJztcblx0XHR9XG5cblx0XHRpZiAoZGlzdG9ydGlvbk1hcCkge1xuXHRcdFx0ZGVmaW5lc1snVVNFX0RJU1RPUlRJT04nXSA9ICcnO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlZmxlY3RvclBhcmFtZXRlcnMgPSB7XG5cdFx0XHRtaXJyb3IsXG5cdFx0XHR0ZXh0dXJlTWF0cml4OiB0aGlzLnRleHR1cmVNYXRyaXgsXG5cdFx0XHRtaXhCbHVyLFxuXHRcdFx0dERpZmZ1c2U6IGZibzEudGV4dHVyZSxcblx0XHRcdHREZXB0aDogZmJvMS5kZXB0aFRleHR1cmUsXG5cdFx0XHR0RGlmZnVzZUJsdXI6IGZibzIudGV4dHVyZSxcblx0XHRcdGhhc0JsdXIsXG5cdFx0XHRtaXhTdHJlbmd0aCxcblx0XHRcdG1pbkRlcHRoVGhyZXNob2xkLFxuXHRcdFx0bWF4RGVwdGhUaHJlc2hvbGQsXG5cdFx0XHRkZXB0aFNjYWxlLFxuXHRcdFx0ZGVwdGhUb0JsdXJSYXRpb0JpYXMsXG5cdFx0XHRkaXN0b3J0aW9uLFxuXHRcdFx0ZGlzdG9ydGlvbk1hcCxcblx0XHRcdG1peENvbnRyYXN0LFxuXHRcdFx0ZGVmaW5lcyxcblx0XHR9O1xuXG5cdFx0cmV0dXJuIHsgZmJvMSwgZmJvMiwgYmx1clBhc3MsIHJlZmxlY3RvclBhcmFtZXRlcnMgfTtcblx0fSk7XG5cblx0cHJpdmF0ZSBkZWZpbmVzS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IGRlZmluZXMgPSB0aGlzLnJlZmxlY3RTdGF0ZSgpLnJlZmxlY3RvclBhcmFtZXRlcnMuZGVmaW5lcztcblx0XHRyZXR1cm4gT2JqZWN0LmVudHJpZXMoZGVmaW5lcykucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4gKHZhbHVlICE9IG51bGwgPyBgJHthY2N9ICR7a2V5fWAgOiBhY2MpLCAnJyk7XG5cdH0pO1xuXG5cdG1hdGVyaWFsID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHByZXZNYXRlcmlhbCA9IHVudHJhY2tlZCh0aGlzLm1hdGVyaWFsUmVmKT8ubmF0aXZlRWxlbWVudDtcblxuXHRcdGlmIChwcmV2TWF0ZXJpYWwpIHtcblx0XHRcdHByZXZNYXRlcmlhbC5kaXNwb3NlKCk7XG5cdFx0XHRkZWxldGUgKHByZXZNYXRlcmlhbCBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9fJ107XG5cdFx0XHRkZWxldGUgKHByZXZNYXRlcmlhbCBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9yZW5kZXJlcl9fJ107XG5cdFx0fVxuXG5cdFx0Ly8gdHJhY2tpbmcgZGVmaW5lcyBrZXkgc28gdGhhdCB0aGUgbWF0ZXJpYWwgaXMgcmVjcmVhdGVkIHdoZW4gdGhlIGRlZmluZXMgY2hhbmdlXG5cdFx0dGhpcy5kZWZpbmVzS2V5KCk7XG5cdFx0cmV0dXJuIG5ldyBNZXNoUmVmbGVjdG9yTWF0ZXJpYWwoKTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Y29uc3QgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRhdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsUmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cdFx0XHRcdGlmICghbWF0ZXJpYWwpIHJldHVybjtcblx0XHRcdFx0Y29uc3QgeyByZWZsZWN0b3JQYXJhbWV0ZXJzIH0gPSB0aGlzLnJlZmxlY3RTdGF0ZSgpO1xuXHRcdFx0XHRhcHBseVByb3BzKG1hdGVyaWFsLCB7IC4uLnJlZmxlY3RvclBhcmFtZXRlcnMsIC4uLnRoaXMucGFyYW1ldGVycygpIH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHtcblx0XHRcdGNvbnN0IG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbFJlZigpPy5uYXRpdmVFbGVtZW50O1xuXHRcdFx0aWYgKG1hdGVyaWFsKSB7XG5cdFx0XHRcdG1hdGVyaWFsLmRpc3Bvc2UoKTtcblx0XHRcdFx0ZGVsZXRlIChtYXRlcmlhbCBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9fJ107XG5cdFx0XHRcdGRlbGV0ZSAobWF0ZXJpYWwgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfcmVuZGVyZXJfXyddO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCh7IGdsLCBzY2VuZSB9KSA9PiB7XG5cdFx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWxSZWYoKT8ubmF0aXZlRWxlbWVudDtcblx0XHRcdGlmICghbWF0ZXJpYWwpIHJldHVybjtcblxuXHRcdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUobWF0ZXJpYWwpO1xuXHRcdFx0aWYgKCFsb2NhbFN0YXRlKSByZXR1cm47XG5cblx0XHRcdGNvbnN0IHBhcmVudCA9IFJlZmxlY3QuZ2V0KG1hdGVyaWFsLCAncGFyZW50JykgPz8gdW50cmFja2VkKGxvY2FsU3RhdGUucGFyZW50KTtcblx0XHRcdGlmICghcGFyZW50KSByZXR1cm47XG5cblx0XHRcdGNvbnN0IHsgZmJvMSwgZmJvMiwgYmx1clBhc3MgfSA9IHRoaXMucmVmbGVjdFN0YXRlKCk7XG5cdFx0XHRjb25zdCBoYXNCbHVyID0gdGhpcy5oYXNCbHVyKCk7XG5cblx0XHRcdHBhcmVudC52aXNpYmxlID0gZmFsc2U7XG5cdFx0XHRjb25zdCBjdXJyZW50WHJFbmFibGVkID0gZ2wueHIuZW5hYmxlZDtcblx0XHRcdGNvbnN0IGN1cnJlbnRTaGFkb3dBdXRvVXBkYXRlID0gZ2wuc2hhZG93TWFwLmF1dG9VcGRhdGU7XG5cdFx0XHR0aGlzLmJlZm9yZVJlbmRlcigpO1xuXHRcdFx0Z2wueHIuZW5hYmxlZCA9IGZhbHNlO1xuXHRcdFx0Z2wuc2hhZG93TWFwLmF1dG9VcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdsLnNldFJlbmRlclRhcmdldChmYm8xKTtcblx0XHRcdGdsLnN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayh0cnVlKTtcblx0XHRcdGlmICghZ2wuYXV0b0NsZWFyKSBnbC5jbGVhcigpO1xuXHRcdFx0Z2wucmVuZGVyKHNjZW5lLCB0aGlzLnZpcnR1YWxDYW1lcmEpO1xuXHRcdFx0aWYgKGhhc0JsdXIpIGJsdXJQYXNzLnJlbmRlcihnbCwgZmJvMSwgZmJvMik7XG5cdFx0XHRnbC54ci5lbmFibGVkID0gY3VycmVudFhyRW5hYmxlZDtcblx0XHRcdGdsLnNoYWRvd01hcC5hdXRvVXBkYXRlID0gY3VycmVudFNoYWRvd0F1dG9VcGRhdGU7XG5cdFx0XHRwYXJlbnQudmlzaWJsZSA9IHRydWU7XG5cdFx0XHRnbC5zZXRSZW5kZXJUYXJnZXQobnVsbCk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGJlZm9yZVJlbmRlcigpIHtcblx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWxSZWYoKT8ubmF0aXZlRWxlbWVudDtcblx0XHRpZiAoIW1hdGVyaWFsKSByZXR1cm47XG5cblx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShtYXRlcmlhbCk7XG5cdFx0aWYgKCFsb2NhbFN0YXRlKSByZXR1cm47XG5cblx0XHRjb25zdCBwYXJlbnQgPSBSZWZsZWN0LmdldChtYXRlcmlhbCwgJ3BhcmVudCcpID8/IHVudHJhY2tlZChsb2NhbFN0YXRlLnBhcmVudCk7XG5cdFx0aWYgKCFwYXJlbnQpIHJldHVybjtcblxuXHRcdGNvbnN0IHsgY2FtZXJhIH0gPSB0aGlzLnN0b3JlLnNuYXBzaG90O1xuXHRcdGNvbnN0IHsgcmVmbGVjdG9yT2Zmc2V0IH0gPSB1bnRyYWNrZWQodGhpcy5yZWZsZWN0T3B0aW9ucyk7XG5cblx0XHR0aGlzLnJlZmxlY3RvcldvcmxkUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHBhcmVudC5tYXRyaXhXb3JsZCk7XG5cdFx0dGhpcy5jYW1lcmFXb3JsZFBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihjYW1lcmEubWF0cml4V29ybGQpO1xuXHRcdHRoaXMucm90YXRpb25NYXRyaXguZXh0cmFjdFJvdGF0aW9uKHBhcmVudC5tYXRyaXhXb3JsZCk7XG5cdFx0dGhpcy5ub3JtYWwuc2V0KDAsIDAsIDEpO1xuXHRcdHRoaXMubm9ybWFsLmFwcGx5TWF0cml4NCh0aGlzLnJvdGF0aW9uTWF0cml4KTtcblx0XHR0aGlzLnJlZmxlY3RvcldvcmxkUG9zaXRpb24uYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLCByZWZsZWN0b3JPZmZzZXQpO1xuXHRcdHRoaXMudmlldy5zdWJWZWN0b3JzKHRoaXMucmVmbGVjdG9yV29ybGRQb3NpdGlvbiwgdGhpcy5jYW1lcmFXb3JsZFBvc2l0aW9uKTtcblx0XHQvLyBBdm9pZCByZW5kZXJpbmcgd2hlbiByZWZsZWN0b3IgaXMgZmFjaW5nIGF3YXlcblx0XHRpZiAodGhpcy52aWV3LmRvdCh0aGlzLm5vcm1hbCkgPiAwKSByZXR1cm47XG5cdFx0dGhpcy52aWV3LnJlZmxlY3QodGhpcy5ub3JtYWwpLm5lZ2F0ZSgpO1xuXHRcdHRoaXMudmlldy5hZGQodGhpcy5yZWZsZWN0b3JXb3JsZFBvc2l0aW9uKTtcblx0XHR0aGlzLnJvdGF0aW9uTWF0cml4LmV4dHJhY3RSb3RhdGlvbihjYW1lcmEubWF0cml4V29ybGQpO1xuXHRcdHRoaXMubG9va0F0UG9zaXRpb24uc2V0KDAsIDAsIC0xKTtcblx0XHR0aGlzLmxvb2tBdFBvc2l0aW9uLmFwcGx5TWF0cml4NCh0aGlzLnJvdGF0aW9uTWF0cml4KTtcblx0XHR0aGlzLmxvb2tBdFBvc2l0aW9uLmFkZCh0aGlzLmNhbWVyYVdvcmxkUG9zaXRpb24pO1xuXHRcdHRoaXMudGFyZ2V0LnN1YlZlY3RvcnModGhpcy5yZWZsZWN0b3JXb3JsZFBvc2l0aW9uLCB0aGlzLmxvb2tBdFBvc2l0aW9uKTtcblx0XHR0aGlzLnRhcmdldC5yZWZsZWN0KHRoaXMubm9ybWFsKS5uZWdhdGUoKTtcblx0XHR0aGlzLnRhcmdldC5hZGQodGhpcy5yZWZsZWN0b3JXb3JsZFBvc2l0aW9uKTtcblx0XHR0aGlzLnZpcnR1YWxDYW1lcmEucG9zaXRpb24uY29weSh0aGlzLnZpZXcpO1xuXHRcdHRoaXMudmlydHVhbENhbWVyYS51cC5zZXQoMCwgMSwgMCk7XG5cdFx0dGhpcy52aXJ0dWFsQ2FtZXJhLnVwLmFwcGx5TWF0cml4NCh0aGlzLnJvdGF0aW9uTWF0cml4KTtcblx0XHR0aGlzLnZpcnR1YWxDYW1lcmEudXAucmVmbGVjdCh0aGlzLm5vcm1hbCk7XG5cdFx0dGhpcy52aXJ0dWFsQ2FtZXJhLmxvb2tBdCh0aGlzLnRhcmdldCk7XG5cdFx0dGhpcy52aXJ0dWFsQ2FtZXJhLmZhciA9IGNhbWVyYS5mYXI7IC8vIFVzZWQgaW4gV2ViR0xCYWNrZ3JvdW5kXG5cdFx0dGhpcy52aXJ0dWFsQ2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cdFx0dGhpcy52aXJ0dWFsQ2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weShjYW1lcmEucHJvamVjdGlvbk1hdHJpeCk7XG5cdFx0Ly8gVXBkYXRlIHRoZSB0ZXh0dXJlIG1hdHJpeFxuXHRcdHRoaXMudGV4dHVyZU1hdHJpeC5zZXQoMC41LCAwLjAsIDAuMCwgMC41LCAwLjAsIDAuNSwgMC4wLCAwLjUsIDAuMCwgMC4wLCAwLjUsIDAuNSwgMC4wLCAwLjAsIDAuMCwgMS4wKTtcblx0XHR0aGlzLnRleHR1cmVNYXRyaXgubXVsdGlwbHkodGhpcy52aXJ0dWFsQ2FtZXJhLnByb2plY3Rpb25NYXRyaXgpO1xuXHRcdHRoaXMudGV4dHVyZU1hdHJpeC5tdWx0aXBseSh0aGlzLnZpcnR1YWxDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcblx0XHR0aGlzLnRleHR1cmVNYXRyaXgubXVsdGlwbHkocGFyZW50Lm1hdHJpeFdvcmxkKTtcblx0XHQvLyBOb3cgdXBkYXRlIHByb2plY3Rpb24gbWF0cml4IHdpdGggbmV3IGNsaXAgcGxhbmUsIGltcGxlbWVudGluZyBjb2RlIGZyb206IGh0dHA6Ly93d3cudGVyYXRob24uY29tL2NvZGUvb2JsaXF1ZS5odG1sXG5cdFx0Ly8gUGFwZXIgZXhwbGFpbmluZyB0aGlzIHRlY2huaXF1ZTogaHR0cDovL3d3dy50ZXJhdGhvbi5jb20vbGVuZ3llbC9MZW5neWVsLU9ibGlxdWUucGRmXG5cdFx0dGhpcy5yZWZsZWN0b3JQbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCh0aGlzLm5vcm1hbCwgdGhpcy5yZWZsZWN0b3JXb3JsZFBvc2l0aW9uKTtcblx0XHR0aGlzLnJlZmxlY3RvclBsYW5lLmFwcGx5TWF0cml4NCh0aGlzLnZpcnR1YWxDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcblx0XHR0aGlzLmNsaXBQbGFuZS5zZXQoXG5cdFx0XHR0aGlzLnJlZmxlY3RvclBsYW5lLm5vcm1hbC54LFxuXHRcdFx0dGhpcy5yZWZsZWN0b3JQbGFuZS5ub3JtYWwueSxcblx0XHRcdHRoaXMucmVmbGVjdG9yUGxhbmUubm9ybWFsLnosXG5cdFx0XHR0aGlzLnJlZmxlY3RvclBsYW5lLmNvbnN0YW50LFxuXHRcdCk7XG5cdFx0Y29uc3QgcHJvamVjdGlvbk1hdHJpeCA9IHRoaXMudmlydHVhbENhbWVyYS5wcm9qZWN0aW9uTWF0cml4O1xuXHRcdHRoaXMucS54ID0gKE1hdGguc2lnbih0aGlzLmNsaXBQbGFuZS54KSArIHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbOF0pIC8gcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1swXTtcblx0XHR0aGlzLnEueSA9IChNYXRoLnNpZ24odGhpcy5jbGlwUGxhbmUueSkgKyBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzldKSAvIHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbNV07XG5cdFx0dGhpcy5xLnogPSAtMS4wO1xuXHRcdHRoaXMucS53ID0gKDEuMCArIHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbMTBdKSAvIHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbMTRdO1xuXHRcdC8vIENhbGN1bGF0ZSB0aGUgc2NhbGVkIHBsYW5lIHZlY3RvclxuXHRcdHRoaXMuY2xpcFBsYW5lLm11bHRpcGx5U2NhbGFyKDIuMCAvIHRoaXMuY2xpcFBsYW5lLmRvdCh0aGlzLnEpKTtcblx0XHQvLyBSZXBsYWNpbmcgdGhlIHRoaXJkIHJvdyBvZiB0aGUgcHJvamVjdGlvbiBtYXRyaXhcblx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzJdID0gdGhpcy5jbGlwUGxhbmUueDtcblx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzZdID0gdGhpcy5jbGlwUGxhbmUueTtcblx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzEwXSA9IHRoaXMuY2xpcFBsYW5lLnogKyAxLjA7XG5cdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sxNF0gPSB0aGlzLmNsaXBQbGFuZS53O1xuXHR9XG59XG4iXX0=
|