@lampdotdev/lamp 0.0.0-stage → 0.36.2-nightly.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +397 -2
- package/Resources/Devices/roku.json +410 -0
- package/Resources/Devices/xbox-one.json +367 -0
- package/Resources/GameKit/NOTICE.md +63 -0
- package/Resources/GameKit/apple/LampPage.swift +1813 -0
- package/Resources/GameKit/apple/LampPlayer.swift +46 -0
- package/Resources/GameKit/apple/LampWebApp.swift +63 -0
- package/Resources/GameKit/apple/LampWebGame.swift +87 -0
- package/Resources/GameKit/apple/Native.swift +12 -0
- package/Resources/GameKit/build.sh +55 -0
- package/Resources/GameKit/lamp_game.h +116 -0
- package/Resources/GameKit/lamp_host.h +19 -0
- package/Resources/GameKit/lamp_kit.cpp +61 -0
- package/Resources/GameKit/lamp_sound.cpp +455 -0
- package/Resources/GameKit/lamp_xbox.cpp +374 -0
- package/Resources/GameKit/libraries/HandmadeMath.h +3940 -0
- package/Resources/GameKit/libraries/cgltf.h +7240 -0
- package/Resources/GameKit/libraries/dr_mp3.h +5430 -0
- package/Resources/GameKit/libraries/dr_wav.h +9209 -0
- package/Resources/GameKit/libraries/sokol_debugtext.h +4754 -0
- package/Resources/GameKit/libraries/sokol_gfx.h +29558 -0
- package/Resources/GameKit/libraries/sokol_gl.h +4538 -0
- package/Resources/GameKit/libraries/sokol_log.h +335 -0
- package/Resources/GameKit/libraries/sokol_shape.h +1531 -0
- package/Resources/GameKit/libraries/stb_image.h +7988 -0
- package/Resources/GameKit/libraries/stb_vorbis.c +5584 -0
- package/Resources/GameKit/page/lamp-live.js +672 -0
- package/Resources/GameKit/scaffold/Game/game.cpp +142 -0
- package/Resources/GameKit/scaffold/Game/scene.glsl +49 -0
- package/Resources/GameKit/scaffold-web/Web/game.js +31 -0
- package/Resources/GameKit/scaffold-web/Web/index.html +13 -0
- package/Resources/GameKit/scaffold-web/Web/making.js +33 -0
- package/Resources/GameKit/scaffold-web/Web/world.js +33 -0
- package/Resources/GameKit/web/lamp-game.js +3042 -0
- package/Resources/GameKit/web/lamp-phaser.js +128 -0
- package/Resources/WebHost/App.exe +0 -0
- package/Resources/WebHost/Microsoft.Web.WebView2.Core.dll +0 -0
- package/Resources/WebHost/WebView2-LICENSE.txt +27 -0
- package/Resources/WebHost/lamp_controllers.h +1506 -0
- package/Resources/WebHost/lamp_web_host.cpp +1173 -0
- package/Resources/WebLibraries/earlier.txt +318 -0
- package/Resources/WebLibraries/phaser/LICENSE.md +20 -0
- package/Resources/WebLibraries/phaser/NOTICE.md +2 -0
- package/Resources/WebLibraries/phaser/phaser.esm.min.js +1 -0
- package/Resources/WebLibraries/qrcode/LICENSE +21 -0
- package/Resources/WebLibraries/qrcode/NOTICE.md +4 -0
- package/Resources/WebLibraries/qrcode/qrcode.js +2297 -0
- package/Resources/WebLibraries/rapier/LICENSE +201 -0
- package/Resources/WebLibraries/rapier/NOTICE.md +3 -0
- package/Resources/WebLibraries/rapier/rapier.js +2 -0
- package/Resources/WebLibraries/three/LICENSE +21 -0
- package/Resources/WebLibraries/three/NOTICE.md +4 -0
- package/Resources/WebLibraries/three/addons/animation/AnimationClipCreator.js +168 -0
- package/Resources/WebLibraries/three/addons/animation/CCDIKSolver.js +607 -0
- package/Resources/WebLibraries/three/addons/controls/ArcballControls.js +3543 -0
- package/Resources/WebLibraries/three/addons/controls/DragControls.js +452 -0
- package/Resources/WebLibraries/three/addons/controls/FirstPersonControls.js +512 -0
- package/Resources/WebLibraries/three/addons/controls/FlyControls.js +384 -0
- package/Resources/WebLibraries/three/addons/controls/MapControls.js +116 -0
- package/Resources/WebLibraries/three/addons/controls/OrbitControls.js +1985 -0
- package/Resources/WebLibraries/three/addons/controls/PointerLockControls.js +264 -0
- package/Resources/WebLibraries/three/addons/controls/TrackballControls.js +1106 -0
- package/Resources/WebLibraries/three/addons/controls/TransformControls.js +2003 -0
- package/Resources/WebLibraries/three/addons/curves/CurveExtras.js +694 -0
- package/Resources/WebLibraries/three/addons/curves/NURBSCurve.js +169 -0
- package/Resources/WebLibraries/three/addons/curves/NURBSSurface.js +98 -0
- package/Resources/WebLibraries/three/addons/curves/NURBSUtils.js +532 -0
- package/Resources/WebLibraries/three/addons/curves/NURBSVolume.js +82 -0
- package/Resources/WebLibraries/three/addons/effects/AnaglyphEffect.js +274 -0
- package/Resources/WebLibraries/three/addons/effects/AsciiEffect.js +323 -0
- package/Resources/WebLibraries/three/addons/effects/OutlineEffect.js +489 -0
- package/Resources/WebLibraries/three/addons/effects/ParallaxBarrierEffect.js +155 -0
- package/Resources/WebLibraries/three/addons/effects/StereoEffect.js +91 -0
- package/Resources/WebLibraries/three/addons/environments/ColorEnvironment.js +59 -0
- package/Resources/WebLibraries/three/addons/environments/DebugEnvironment.js +102 -0
- package/Resources/WebLibraries/three/addons/environments/RoomEnvironment.js +185 -0
- package/Resources/WebLibraries/three/addons/geometries/BoxLineGeometry.js +92 -0
- package/Resources/WebLibraries/three/addons/geometries/ConvexGeometry.js +72 -0
- package/Resources/WebLibraries/three/addons/geometries/DecalGeometry.js +420 -0
- package/Resources/WebLibraries/three/addons/geometries/LoftGeometry.js +355 -0
- package/Resources/WebLibraries/three/addons/geometries/ParametricFunctions.js +100 -0
- package/Resources/WebLibraries/three/addons/geometries/ParametricGeometry.js +172 -0
- package/Resources/WebLibraries/three/addons/geometries/RoundedBoxGeometry.js +216 -0
- package/Resources/WebLibraries/three/addons/geometries/TeapotGeometry.js +689 -0
- package/Resources/WebLibraries/three/addons/geometries/TextGeometry.js +102 -0
- package/Resources/WebLibraries/three/addons/helpers/AnimationPathHelper.js +302 -0
- package/Resources/WebLibraries/three/addons/helpers/LightProbeGridHelper.js +166 -0
- package/Resources/WebLibraries/three/addons/helpers/LightProbeGridHelperWebGL.js +221 -0
- package/Resources/WebLibraries/three/addons/helpers/LightProbeHelper.js +166 -0
- package/Resources/WebLibraries/three/addons/helpers/LightProbeHelperGPU.js +102 -0
- package/Resources/WebLibraries/three/addons/helpers/OctreeHelper.js +109 -0
- package/Resources/WebLibraries/three/addons/helpers/PositionalAudioHelper.js +169 -0
- package/Resources/WebLibraries/three/addons/helpers/RapierHelper.js +59 -0
- package/Resources/WebLibraries/three/addons/helpers/RectAreaLightHelper.js +118 -0
- package/Resources/WebLibraries/three/addons/helpers/TextureHelper.js +265 -0
- package/Resources/WebLibraries/three/addons/helpers/TextureHelperGPU.js +214 -0
- package/Resources/WebLibraries/three/addons/helpers/VertexNormalsHelper.js +155 -0
- package/Resources/WebLibraries/three/addons/helpers/VertexTangentsHelper.js +133 -0
- package/Resources/WebLibraries/three/addons/helpers/ViewHelper.js +529 -0
- package/Resources/WebLibraries/three/addons/interactive/HTMLMesh.js +617 -0
- package/Resources/WebLibraries/three/addons/interactive/InteractiveGroup.js +224 -0
- package/Resources/WebLibraries/three/addons/interactive/SelectionBox.js +324 -0
- package/Resources/WebLibraries/three/addons/interactive/SelectionHelper.js +150 -0
- package/Resources/WebLibraries/three/addons/libs/fflate.module.js +2699 -0
- package/Resources/WebLibraries/three/addons/libs/lil-gui.module.min.js +8 -0
- package/Resources/WebLibraries/three/addons/libs/meshopt_decoder.module.js +196 -0
- package/Resources/WebLibraries/three/addons/libs/potpack.module.js +125 -0
- package/Resources/WebLibraries/three/addons/libs/stats.module.js +167 -0
- package/Resources/WebLibraries/three/addons/libs/tween.module.js +876 -0
- package/Resources/WebLibraries/three/addons/lighting/ClusteredLighting.js +153 -0
- package/Resources/WebLibraries/three/addons/lighting/DynamicLighting.js +82 -0
- package/Resources/WebLibraries/three/addons/lighting/LightMapper.js +295 -0
- package/Resources/WebLibraries/three/addons/lighting/LightProbeGrid.js +923 -0
- package/Resources/WebLibraries/three/addons/lighting/LightProbeGridUtils.js +107 -0
- package/Resources/WebLibraries/three/addons/lighting/LightProbeGridWebGL.js +846 -0
- package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGIConeTracer.js +243 -0
- package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGIIrradiance.js +43 -0
- package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGINode.js +617 -0
- package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGISceneCollector.js +793 -0
- package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGIVolume.js +1440 -0
- package/Resources/WebLibraries/three/addons/lights/LightProbeGenerator.js +337 -0
- package/Resources/WebLibraries/three/addons/lights/RectAreaLightTexturesLib.js +127 -0
- package/Resources/WebLibraries/three/addons/lights/RectAreaLightUniformsLib.js +40 -0
- package/Resources/WebLibraries/three/addons/lights/SunLight.js +100 -0
- package/Resources/WebLibraries/three/addons/lights/SunLightNode.js +56 -0
- package/Resources/WebLibraries/three/addons/lights/SunLightShadow.js +319 -0
- package/Resources/WebLibraries/three/addons/lights/SunShadowNode.js +312 -0
- package/Resources/WebLibraries/three/addons/lines/Line2.js +56 -0
- package/Resources/WebLibraries/three/addons/lines/LineGeometry.js +157 -0
- package/Resources/WebLibraries/three/addons/lines/LineMaterial.js +742 -0
- package/Resources/WebLibraries/three/addons/lines/LineSegments2.js +434 -0
- package/Resources/WebLibraries/three/addons/lines/LineSegmentsGeometry.js +298 -0
- package/Resources/WebLibraries/three/addons/lines/Wireframe.js +108 -0
- package/Resources/WebLibraries/three/addons/lines/WireframeGeometry2.js +49 -0
- package/Resources/WebLibraries/three/addons/lines/webgpu/Line2.js +46 -0
- package/Resources/WebLibraries/three/addons/lines/webgpu/LineSegments2.js +419 -0
- package/Resources/WebLibraries/three/addons/lines/webgpu/Wireframe.js +86 -0
- package/Resources/WebLibraries/three/addons/loaders/EXRLoader.js +3411 -0
- package/Resources/WebLibraries/three/addons/loaders/FBXLoader.js +4660 -0
- package/Resources/WebLibraries/three/addons/loaders/FontLoader.js +262 -0
- package/Resources/WebLibraries/three/addons/loaders/GLTFLoader.js +5006 -0
- package/Resources/WebLibraries/three/addons/loaders/HDRLoader.js +463 -0
- package/Resources/WebLibraries/three/addons/loaders/MTLLoader.js +601 -0
- package/Resources/WebLibraries/three/addons/loaders/OBJLoader.js +961 -0
- package/Resources/WebLibraries/three/addons/loaders/PLYLoader.js +992 -0
- package/Resources/WebLibraries/three/addons/loaders/RGBELoader.js +18 -0
- package/Resources/WebLibraries/three/addons/loaders/STLLoader.js +423 -0
- package/Resources/WebLibraries/three/addons/loaders/SVGLoader.js +3297 -0
- package/Resources/WebLibraries/three/addons/loaders/TGALoader.js +539 -0
- package/Resources/WebLibraries/three/addons/loaders/UltraHDRLoader.js +757 -0
- package/Resources/WebLibraries/three/addons/math/Capsule.js +159 -0
- package/Resources/WebLibraries/three/addons/math/ColorConverter.js +62 -0
- package/Resources/WebLibraries/three/addons/math/ColorSpaces.js +147 -0
- package/Resources/WebLibraries/three/addons/math/ConvexHull.js +1695 -0
- package/Resources/WebLibraries/three/addons/math/ImprovedNoise.js +88 -0
- package/Resources/WebLibraries/three/addons/math/Lut.js +317 -0
- package/Resources/WebLibraries/three/addons/math/MeshSurfaceSampler.js +315 -0
- package/Resources/WebLibraries/three/addons/math/OBB.js +535 -0
- package/Resources/WebLibraries/three/addons/math/Octree.js +825 -0
- package/Resources/WebLibraries/three/addons/math/SimplexNoise.js +470 -0
- package/Resources/WebLibraries/three/addons/misc/ConvexObjectBreaker.js +539 -0
- package/Resources/WebLibraries/three/addons/misc/GPUComputationRenderer.js +508 -0
- package/Resources/WebLibraries/three/addons/misc/Gyroscope.js +78 -0
- package/Resources/WebLibraries/three/addons/misc/MorphAnimMesh.js +119 -0
- package/Resources/WebLibraries/three/addons/misc/MorphBlendMesh.js +425 -0
- package/Resources/WebLibraries/three/addons/misc/ProgressiveLightMap.js +370 -0
- package/Resources/WebLibraries/three/addons/misc/ProgressiveLightMapGPU.js +322 -0
- package/Resources/WebLibraries/three/addons/misc/RollerCoaster.js +661 -0
- package/Resources/WebLibraries/three/addons/misc/Sculptor.js +1679 -0
- package/Resources/WebLibraries/three/addons/misc/SculptorMesh.js +1504 -0
- package/Resources/WebLibraries/three/addons/misc/SculptorTools.js +1180 -0
- package/Resources/WebLibraries/three/addons/misc/SculptorUtils.js +345 -0
- package/Resources/WebLibraries/three/addons/misc/TileCreasedNormalsPlugin.js +270 -0
- package/Resources/WebLibraries/three/addons/misc/TubePainter.js +611 -0
- package/Resources/WebLibraries/three/addons/misc/Volume.js +520 -0
- package/Resources/WebLibraries/three/addons/misc/VolumeSlice.js +275 -0
- package/Resources/WebLibraries/three/addons/modifiers/CurveModifier.js +374 -0
- package/Resources/WebLibraries/three/addons/modifiers/CurveModifierGPU.js +256 -0
- package/Resources/WebLibraries/three/addons/modifiers/EdgeSplitModifier.js +299 -0
- package/Resources/WebLibraries/three/addons/modifiers/TessellateModifier.js +340 -0
- package/Resources/WebLibraries/three/addons/objects/GroundedSkybox.js +69 -0
- package/Resources/WebLibraries/three/addons/objects/Lensflare.js +489 -0
- package/Resources/WebLibraries/three/addons/objects/LensflareMesh.js +376 -0
- package/Resources/WebLibraries/three/addons/objects/MarchingCubes.js +1261 -0
- package/Resources/WebLibraries/three/addons/objects/Reflector.js +390 -0
- package/Resources/WebLibraries/three/addons/objects/ReflectorForSSRPass.js +393 -0
- package/Resources/WebLibraries/three/addons/objects/Refractor.js +389 -0
- package/Resources/WebLibraries/three/addons/objects/ShadowMesh.js +130 -0
- package/Resources/WebLibraries/three/addons/objects/Sky.js +342 -0
- package/Resources/WebLibraries/three/addons/objects/SkyMesh.js +403 -0
- package/Resources/WebLibraries/three/addons/objects/Water.js +374 -0
- package/Resources/WebLibraries/three/addons/objects/Water2.js +403 -0
- package/Resources/WebLibraries/three/addons/objects/Water2Mesh.js +199 -0
- package/Resources/WebLibraries/three/addons/objects/WaterMesh.js +194 -0
- package/Resources/WebLibraries/three/addons/postprocessing/AfterimagePass.js +187 -0
- package/Resources/WebLibraries/three/addons/postprocessing/BloomPass.js +274 -0
- package/Resources/WebLibraries/three/addons/postprocessing/BokehPass.js +218 -0
- package/Resources/WebLibraries/three/addons/postprocessing/ClearPass.js +97 -0
- package/Resources/WebLibraries/three/addons/postprocessing/CubeTexturePass.js +146 -0
- package/Resources/WebLibraries/three/addons/postprocessing/DotScreenPass.js +114 -0
- package/Resources/WebLibraries/three/addons/postprocessing/EffectComposer.js +365 -0
- package/Resources/WebLibraries/three/addons/postprocessing/FXAAPass.js +40 -0
- package/Resources/WebLibraries/three/addons/postprocessing/FilmPass.js +113 -0
- package/Resources/WebLibraries/three/addons/postprocessing/GTAOPass.js +735 -0
- package/Resources/WebLibraries/three/addons/postprocessing/GlitchPass.js +177 -0
- package/Resources/WebLibraries/three/addons/postprocessing/HalftonePass.js +134 -0
- package/Resources/WebLibraries/three/addons/postprocessing/LUTPass.js +138 -0
- package/Resources/WebLibraries/three/addons/postprocessing/MaskPass.js +195 -0
- package/Resources/WebLibraries/three/addons/postprocessing/OutlinePass.js +776 -0
- package/Resources/WebLibraries/three/addons/postprocessing/OutputPass.js +148 -0
- package/Resources/WebLibraries/three/addons/postprocessing/Pass.js +191 -0
- package/Resources/WebLibraries/three/addons/postprocessing/RenderPass.js +193 -0
- package/Resources/WebLibraries/three/addons/postprocessing/RenderPixelatedPass.js +314 -0
- package/Resources/WebLibraries/three/addons/postprocessing/RenderTransitionPass.js +267 -0
- package/Resources/WebLibraries/three/addons/postprocessing/SAOPass.js +407 -0
- package/Resources/WebLibraries/three/addons/postprocessing/SMAAPass.js +230 -0
- package/Resources/WebLibraries/three/addons/postprocessing/SSAARenderPass.js +313 -0
- package/Resources/WebLibraries/three/addons/postprocessing/SSAOPass.js +527 -0
- package/Resources/WebLibraries/three/addons/postprocessing/SSRPass.js +858 -0
- package/Resources/WebLibraries/three/addons/postprocessing/SavePass.js +132 -0
- package/Resources/WebLibraries/three/addons/postprocessing/ShaderPass.js +135 -0
- package/Resources/WebLibraries/three/addons/postprocessing/TAARenderPass.js +243 -0
- package/Resources/WebLibraries/three/addons/postprocessing/TexturePass.js +131 -0
- package/Resources/WebLibraries/three/addons/postprocessing/UnrealBloomPass.js +541 -0
- package/Resources/WebLibraries/three/addons/shaders/ACESFilmicToneMappingShader.js +96 -0
- package/Resources/WebLibraries/three/addons/shaders/AfterimageShader.js +63 -0
- package/Resources/WebLibraries/three/addons/shaders/BasicShader.js +36 -0
- package/Resources/WebLibraries/three/addons/shaders/BleachBypassShader.js +68 -0
- package/Resources/WebLibraries/three/addons/shaders/BlendShader.js +56 -0
- package/Resources/WebLibraries/three/addons/shaders/BokehShader.js +151 -0
- package/Resources/WebLibraries/three/addons/shaders/BokehShader2.js +404 -0
- package/Resources/WebLibraries/three/addons/shaders/BrightnessContrastShader.js +62 -0
- package/Resources/WebLibraries/three/addons/shaders/ColorCorrectionShader.js +59 -0
- package/Resources/WebLibraries/three/addons/shaders/ColorifyShader.js +57 -0
- package/Resources/WebLibraries/three/addons/shaders/ConvolutionShader.js +74 -0
- package/Resources/WebLibraries/three/addons/shaders/CopyShader.js +52 -0
- package/Resources/WebLibraries/three/addons/shaders/DOFMipMapShader.js +63 -0
- package/Resources/WebLibraries/three/addons/shaders/DepthLimitedBlurShader.js +183 -0
- package/Resources/WebLibraries/three/addons/shaders/DigitalGlitch.js +104 -0
- package/Resources/WebLibraries/three/addons/shaders/DotScreenShader.js +75 -0
- package/Resources/WebLibraries/three/addons/shaders/ExposureShader.js +51 -0
- package/Resources/WebLibraries/three/addons/shaders/FXAAShader.js +298 -0
- package/Resources/WebLibraries/three/addons/shaders/FilmShader.js +73 -0
- package/Resources/WebLibraries/three/addons/shaders/FocusShader.js +94 -0
- package/Resources/WebLibraries/three/addons/shaders/FreiChenShader.js +103 -0
- package/Resources/WebLibraries/three/addons/shaders/GTAOShader.js +437 -0
- package/Resources/WebLibraries/three/addons/shaders/GammaCorrectionShader.js +52 -0
- package/Resources/WebLibraries/three/addons/shaders/HalftoneShader.js +332 -0
- package/Resources/WebLibraries/three/addons/shaders/HorizontalBlurShader.js +68 -0
- package/Resources/WebLibraries/three/addons/shaders/HorizontalTiltShiftShader.js +70 -0
- package/Resources/WebLibraries/three/addons/shaders/HueSaturationShader.js +74 -0
- package/Resources/WebLibraries/three/addons/shaders/KaleidoShader.js +65 -0
- package/Resources/WebLibraries/three/addons/shaders/LuminosityHighPassShader.js +68 -0
- package/Resources/WebLibraries/three/addons/shaders/LuminosityShader.js +54 -0
- package/Resources/WebLibraries/three/addons/shaders/MirrorShader.js +62 -0
- package/Resources/WebLibraries/three/addons/shaders/NormalMapShader.js +60 -0
- package/Resources/WebLibraries/three/addons/shaders/OutputShader.js +103 -0
- package/Resources/WebLibraries/three/addons/shaders/PoissonDenoiseShader.js +230 -0
- package/Resources/WebLibraries/three/addons/shaders/RGBShiftShader.js +61 -0
- package/Resources/WebLibraries/three/addons/shaders/SAOShader.js +201 -0
- package/Resources/WebLibraries/three/addons/shaders/SMAAShader.js +489 -0
- package/Resources/WebLibraries/three/addons/shaders/SSAOShader.js +331 -0
- package/Resources/WebLibraries/three/addons/shaders/SSRShader.js +396 -0
- package/Resources/WebLibraries/three/addons/shaders/SepiaShader.js +57 -0
- package/Resources/WebLibraries/three/addons/shaders/SobelOperatorShader.js +98 -0
- package/Resources/WebLibraries/three/addons/shaders/SubsurfaceScatteringShader.js +95 -0
- package/Resources/WebLibraries/three/addons/shaders/TechnicolorShader.js +51 -0
- package/Resources/WebLibraries/three/addons/shaders/ToonShader.js +349 -0
- package/Resources/WebLibraries/three/addons/shaders/TriangleBlurShader.js +79 -0
- package/Resources/WebLibraries/three/addons/shaders/UnpackDepthRGBAShader.js +60 -0
- package/Resources/WebLibraries/three/addons/shaders/VelocityShader.js +137 -0
- package/Resources/WebLibraries/three/addons/shaders/VerticalBlurShader.js +66 -0
- package/Resources/WebLibraries/three/addons/shaders/VerticalTiltShiftShader.js +70 -0
- package/Resources/WebLibraries/three/addons/shaders/VignetteShader.js +56 -0
- package/Resources/WebLibraries/three/addons/shaders/VolumeShader.js +285 -0
- package/Resources/WebLibraries/three/addons/shaders/WaterRefractionShader.js +106 -0
- package/Resources/WebLibraries/three/addons/textures/FlakesTexture.js +54 -0
- package/Resources/WebLibraries/three/addons/tsl/WebGLNodesHandler.js +607 -0
- package/Resources/WebLibraries/three/addons/tsl/display/AfterImageNode.js +256 -0
- package/Resources/WebLibraries/three/addons/tsl/display/AnaglyphPassNode.js +550 -0
- package/Resources/WebLibraries/three/addons/tsl/display/BilateralBlurNode.js +377 -0
- package/Resources/WebLibraries/three/addons/tsl/display/BleachBypass.js +33 -0
- package/Resources/WebLibraries/three/addons/tsl/display/BloomNode.js +599 -0
- package/Resources/WebLibraries/three/addons/tsl/display/CRT.js +150 -0
- package/Resources/WebLibraries/three/addons/tsl/display/ChromaticAberrationNode.js +163 -0
- package/Resources/WebLibraries/three/addons/tsl/display/DenoiseNode.js +354 -0
- package/Resources/WebLibraries/three/addons/tsl/display/DepthOfFieldNode.js +572 -0
- package/Resources/WebLibraries/three/addons/tsl/display/DotScreenNode.js +104 -0
- package/Resources/WebLibraries/three/addons/tsl/display/FSR1Node.js +481 -0
- package/Resources/WebLibraries/three/addons/tsl/display/FXAANode.js +357 -0
- package/Resources/WebLibraries/three/addons/tsl/display/FilmNode.js +101 -0
- package/Resources/WebLibraries/three/addons/tsl/display/GTAONode.js +727 -0
- package/Resources/WebLibraries/three/addons/tsl/display/GaussianBlurNode.js +412 -0
- package/Resources/WebLibraries/three/addons/tsl/display/GodraysNode.js +604 -0
- package/Resources/WebLibraries/three/addons/tsl/display/ImportanceSampledEnvironment.js +564 -0
- package/Resources/WebLibraries/three/addons/tsl/display/LensflareNode.js +282 -0
- package/Resources/WebLibraries/three/addons/tsl/display/Lut3DNode.js +109 -0
- package/Resources/WebLibraries/three/addons/tsl/display/MotionBlur.js +33 -0
- package/Resources/WebLibraries/three/addons/tsl/display/OITPassNode.js +341 -0
- package/Resources/WebLibraries/three/addons/tsl/display/OutlineNode.js +916 -0
- package/Resources/WebLibraries/three/addons/tsl/display/ParallaxBarrierPassNode.js +90 -0
- package/Resources/WebLibraries/three/addons/tsl/display/PixelationPassNode.js +227 -0
- package/Resources/WebLibraries/three/addons/tsl/display/RGBShiftNode.js +96 -0
- package/Resources/WebLibraries/three/addons/tsl/display/RecurrentDenoiseNode.js +812 -0
- package/Resources/WebLibraries/three/addons/tsl/display/RetroPassNode.js +263 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SMAANode.js +729 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SSAAPassNode.js +344 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SSAONode.js +422 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SSGINode.js +698 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SSRNode.js +1430 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SSSNode.js +479 -0
- package/Resources/WebLibraries/three/addons/tsl/display/Sepia.js +24 -0
- package/Resources/WebLibraries/three/addons/tsl/display/Shape.js +29 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SharpenNode.js +284 -0
- package/Resources/WebLibraries/three/addons/tsl/display/SobelOperatorNode.js +168 -0
- package/Resources/WebLibraries/three/addons/tsl/display/StereoCompositePassNode.js +190 -0
- package/Resources/WebLibraries/three/addons/tsl/display/StereoPassNode.js +117 -0
- package/Resources/WebLibraries/three/addons/tsl/display/TAAUNode.js +700 -0
- package/Resources/WebLibraries/three/addons/tsl/display/TRAANode.js +609 -0
- package/Resources/WebLibraries/three/addons/tsl/display/TemporalReprojectNode.js +1024 -0
- package/Resources/WebLibraries/three/addons/tsl/display/TransitionNode.js +141 -0
- package/Resources/WebLibraries/three/addons/tsl/display/boxBlur.js +65 -0
- package/Resources/WebLibraries/three/addons/tsl/display/depthAwareBlend.js +80 -0
- package/Resources/WebLibraries/three/addons/tsl/display/depthAwareBlur.js +63 -0
- package/Resources/WebLibraries/three/addons/tsl/display/hashBlur.js +55 -0
- package/Resources/WebLibraries/three/addons/tsl/display/lensDirt.js +30 -0
- package/Resources/WebLibraries/three/addons/tsl/display/radialBlur.js +68 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/ClusteredLightsNode.js +994 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/DynamicLightsNode.js +201 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/LightProbeGridNode.js +183 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/data/AmbientLightDataNode.js +67 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/data/DirectionalLightDataNode.js +117 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/data/HemisphereLightDataNode.js +105 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/data/PointLightDataNode.js +140 -0
- package/Resources/WebLibraries/three/addons/tsl/lighting/data/SpotLightDataNode.js +167 -0
- package/Resources/WebLibraries/three/addons/tsl/math/Bayer.js +84 -0
- package/Resources/WebLibraries/three/addons/tsl/math/curlNoise.js +107 -0
- package/Resources/WebLibraries/three/addons/tsl/math/voronoiNoise.js +112 -0
- package/Resources/WebLibraries/three/addons/tsl/shadows/TileShadowNode.js +542 -0
- package/Resources/WebLibraries/three/addons/tsl/shadows/TileShadowNodeHelper.js +212 -0
- package/Resources/WebLibraries/three/addons/tsl/utils/GroundedSkybox.js +62 -0
- package/Resources/WebLibraries/three/addons/tsl/utils/RNoise.js +51 -0
- package/Resources/WebLibraries/three/addons/tsl/utils/Raymarching.js +70 -0
- package/Resources/WebLibraries/three/addons/tsl/utils/SoftParticles.js +53 -0
- package/Resources/WebLibraries/three/addons/tsl/utils/SpecularHelpers.js +302 -0
- package/Resources/WebLibraries/three/addons/tsl/utils/TAAUtils.js +184 -0
- package/Resources/WebLibraries/three/addons/utils/BufferGeometryUtils.js +1523 -0
- package/Resources/WebLibraries/three/addons/utils/CameraUtils.js +82 -0
- package/Resources/WebLibraries/three/addons/utils/ColorUtils.js +76 -0
- package/Resources/WebLibraries/three/addons/utils/GaussianSplatUtils.js +229 -0
- package/Resources/WebLibraries/three/addons/utils/GeometryCompressionUtils.js +547 -0
- package/Resources/WebLibraries/three/addons/utils/GeometryUtils.js +226 -0
- package/Resources/WebLibraries/three/addons/utils/LDrawUtils.js +211 -0
- package/Resources/WebLibraries/three/addons/utils/SceneOptimizer.js +459 -0
- package/Resources/WebLibraries/three/addons/utils/SceneUtils.js +363 -0
- package/Resources/WebLibraries/three/addons/utils/ShadowMapViewer.js +244 -0
- package/Resources/WebLibraries/three/addons/utils/ShadowMapViewerGPU.js +233 -0
- package/Resources/WebLibraries/three/addons/utils/SkeletonUtils.js +496 -0
- package/Resources/WebLibraries/three/addons/utils/SortUtils.js +175 -0
- package/Resources/WebLibraries/three/addons/utils/UVsDebug.js +173 -0
- package/Resources/WebLibraries/three/addons/utils/WebGLTextureUtils.js +115 -0
- package/Resources/WebLibraries/three/addons/utils/WebGPUTextureUtils.js +81 -0
- package/Resources/WebLibraries/three/addons/utils/WorkerPool.js +167 -0
- package/Resources/WebLibraries/three/addons/utils/unwrapUVs.js +865 -0
- package/Resources/WebLibraries/three/three.core.js +61162 -0
- package/Resources/WebLibraries/three/three.module.js +19537 -0
- package/Resources/WebLibraries/three/three.tsl.js +41903 -0
- package/Resources/WebLibraries/three/three.webgpu.js +53714 -0
- package/Resources/share-rules.json +64 -0
- package/Resources/skills/2d-game/SKILL.md +305 -0
- package/Resources/skills/3d-game/SKILL.md +274 -0
- package/Resources/skills/accounts/SKILL.md +41 -0
- package/Resources/skills/android-design/SKILL.md +159 -0
- package/Resources/skills/app-ai/SKILL.md +154 -0
- package/Resources/skills/app-intents/SKILL.md +31 -0
- package/Resources/skills/app-kinds/SKILL.md +122 -0
- package/Resources/skills/apple-watch/SKILL.md +43 -0
- package/Resources/skills/assets/SKILL.md +183 -0
- package/Resources/skills/building-blocks/SKILL.md +97 -0
- package/Resources/skills/device-control/SKILL.md +56 -0
- package/Resources/skills/device-integrations/SKILL.md +278 -0
- package/Resources/skills/finder-files/SKILL.md +19 -0
- package/Resources/skills/game/SKILL.md +416 -0
- package/Resources/skills/game-3d/SKILL.md +12 -0
- package/Resources/skills/game-art/SKILL.md +11 -0
- package/Resources/skills/game-feel/SKILL.md +13 -0
- package/Resources/skills/game-levels/SKILL.md +12 -0
- package/Resources/skills/game-live/SKILL.md +12 -0
- package/Resources/skills/game-physics/SKILL.md +13 -0
- package/Resources/skills/game-playtest/SKILL.md +26 -0
- package/Resources/skills/game-ui/SKILL.md +278 -0
- package/Resources/skills/github-projects/SKILL.md +62 -0
- package/Resources/skills/icloud-sync/SKILL.md +30 -0
- package/Resources/skills/iphone-hardware/SKILL.md +57 -0
- package/Resources/skills/iphone-widgets/SKILL.md +53 -0
- package/Resources/skills/lg-developer-mode/SKILL.md +152 -0
- package/Resources/skills/mac-widgets/SKILL.md +60 -0
- package/Resources/skills/maps/SKILL.md +8 -0
- package/Resources/skills/menu-bar/SKILL.md +36 -0
- package/Resources/skills/more-apps/SKILL.md +53 -0
- package/Resources/skills/phone-controllers/SKILL.md +79 -0
- package/Resources/skills/phone-pages/SKILL.md +173 -0
- package/Resources/skills/roku-developer-mode/SKILL.md +106 -0
- package/Resources/skills/scene-3d/SKILL.md +27 -0
- package/Resources/skills/scripting/SKILL.md +17 -0
- package/Resources/skills/share-extension/SKILL.md +22 -0
- package/Resources/skills/tv-design/SKILL.md +72 -0
- package/Resources/skills/web-app/SKILL.md +170 -0
- package/Resources/skills/web-game/SKILL.md +95 -0
- package/Resources/skills/web-or-native/SKILL.md +108 -0
- package/Resources/skills/wish-links/SKILL.md +156 -0
- package/THIRD_PARTY_NOTICES.md +170 -0
- package/cli/ai.mjs +237 -0
- package/cli/android.mjs +941 -0
- package/cli/app-ai.mjs +473 -0
- package/cli/browser.mjs +284 -0
- package/cli/calls.mjs +594 -0
- package/cli/dev.mjs +820 -0
- package/cli/devices.mjs +984 -0
- package/cli/lamp.mjs +1326 -0
- package/cli/lampapp.mjs +332 -0
- package/cli/lamps/android-host/LampPageGateway.kt +345 -0
- package/cli/lamps/android-host/app/build.gradle.kts +40 -0
- package/cli/lamps/android-host/build.gradle.kts +4 -0
- package/cli/lamps/android-host/game/AndroidManifest.xml +33 -0
- package/cli/lamps/android-host/game/MainActivity.kt +173 -0
- package/cli/lamps/android-host/gradle/libs.versions.toml +39 -0
- package/cli/lamps/android-host/gradle.properties +8 -0
- package/cli/lamps/android-host/page/AndroidManifest.xml +35 -0
- package/cli/lamps/android-host/page/MainActivity.kt +193 -0
- package/cli/lamps/android-host/settings.gradle.kts +30 -0
- package/cli/lamps/android-host/tools.json +43 -0
- package/cli/lamps/lamp-controllers.js +2 -0
- package/cli/lamps/lamp-for-games.js +6922 -0
- package/cli/lamps/lamp.js +7082 -0
- package/cli/lamps/mac-starter/.lamp/meta.json +1 -0
- package/cli/lamps/mac-starter/APP.md +12 -0
- package/cli/lamps/mac-starter/Package.swift +8 -0
- package/cli/lamps/mac-starter/Sources/App.swift +11 -0
- package/cli/lamps/mac-starter/Sources/ContentView.swift +17 -0
- package/cli/lamps/mac-starter/Sources/LampSupport.swift +18215 -0
- package/cli/lamps/mac-starter/build.sh +336 -0
- package/cli/lamps/mac-starter/gitignore +3 -0
- package/cli/lamps/mac-starter/lamp-starter.json +6 -0
- package/cli/lamps/web-starter/APP.md +8 -0
- package/cli/lamps/web-starter/app.js +1 -0
- package/cli/lamps/web-starter/index.html +17 -0
- package/cli/lamps/web-starter/lamp-starter.json +5 -0
- package/cli/lamps/web-starter/lamp.js +7082 -0
- package/cli/lamps/web-starter/style.css +25 -0
- package/cli/link.mjs +202 -0
- package/cli/local-ai.mjs +193 -0
- package/cli/mac.mjs +621 -0
- package/cli/mdns.mjs +205 -0
- package/cli/msix.mjs +413 -0
- package/cli/network.mjs +209 -0
- package/cli/openrouter.mjs +133 -0
- package/cli/outside.mjs +203 -0
- package/cli/page.js +317 -0
- package/cli/place.mjs +298 -0
- package/cli/png.mjs +184 -0
- package/cli/share.mjs +270 -0
- package/cli/skill/SKILL.md +280 -0
- package/cli/skills.mjs +71 -0
- package/cli/state.mjs +176 -0
- package/cli/update.mjs +162 -0
- package/package.json +20 -4
- package/site/lib/quota.js +59 -0
- package/site/lib/shared-wishes.js +1727 -0
|
@@ -0,0 +1,727 @@
|
|
|
1
|
+
import { DataTexture, RenderTarget, RepeatWrapping, Vector2, Vector3, Node, QuadMesh, NodeMaterial, RendererUtils, RedFormat } from 'three/webgpu';
|
|
2
|
+
import { reference, getNormalFromDepth, getViewPosition, getScreenPositionFromClip, nodeObject, Fn, float, NodeUpdateType, uv, uniform, Loop, vec2, vec3, vec4, int, dot, max, min, pow, abs, If, textureSize, sin, cos, PI, texture, passTexture, mat3, normalize, cross, mix, acos, clamp, interleavedGradientNoise, screenCoordinate, rand, context, isBackgroundDepth, projectionDepth } from 'three/tsl';
|
|
3
|
+
|
|
4
|
+
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
|
+
const _size = /*@__PURE__*/ new Vector2();
|
|
6
|
+
|
|
7
|
+
// From Activision GTAO paper: https://www.activision.com/cdn/research/s2016_pbs_activision_occlusion.pptx
|
|
8
|
+
const _temporalRotations = [ 60, 300, 180, 240, 120, 0 ];
|
|
9
|
+
const _spatialOffsets = [ 0, 0.5, 0.25, 0.75 ];
|
|
10
|
+
|
|
11
|
+
let _rendererState;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Post processing node for applying Ground Truth Ambient Occlusion (GTAO) to a scene.
|
|
15
|
+
* ```js
|
|
16
|
+
* const renderPipeline = new THREE.RenderPipeline( renderer );
|
|
17
|
+
*
|
|
18
|
+
* // pre-pass for normals and depth
|
|
19
|
+
*
|
|
20
|
+
* const prePass = pass( scene, camera );
|
|
21
|
+
* prePass.setMRT( mrt( {
|
|
22
|
+
* output: normalView
|
|
23
|
+
* } ) );
|
|
24
|
+
*
|
|
25
|
+
* const prePassNormal = prePass.getTextureNode();
|
|
26
|
+
* const prePassDepth = prePass.getTextureNode( 'depth' );
|
|
27
|
+
*
|
|
28
|
+
* // scene pass
|
|
29
|
+
*
|
|
30
|
+
* const scenePass = pass( scene, camera );
|
|
31
|
+
*
|
|
32
|
+
* // ao
|
|
33
|
+
*
|
|
34
|
+
* const aoPass = ao( prePassDepth, prePassNormal, camera );
|
|
35
|
+
* const aoPassOutput = aoPass.getTextureNode();
|
|
36
|
+
*
|
|
37
|
+
* // apply the ambient occlusion to the scene
|
|
38
|
+
*
|
|
39
|
+
* scenePass.contextNode = builtinAOContext( aoPassOutput.sample( screenUV ).r );
|
|
40
|
+
*
|
|
41
|
+
* renderPipeline.outputNode = scenePass;
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* Reference: [Practical Real-Time Strategies for Accurate Indirect Occlusion](https://www.activision.com/cdn/research/Practical_Real_Time_Strategies_for_Accurate_Indirect_Occlusion_NEW%20VERSION_COLOR.pdf).
|
|
45
|
+
*
|
|
46
|
+
* @augments Node
|
|
47
|
+
* @three_import import { ao } from 'three/addons/tsl/display/GTAONode.js';
|
|
48
|
+
*/
|
|
49
|
+
class GTAONode extends Node {
|
|
50
|
+
|
|
51
|
+
static get type() {
|
|
52
|
+
|
|
53
|
+
return 'GTAONode';
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Constructs a new GTAO node.
|
|
59
|
+
*
|
|
60
|
+
* @param {Node<float>} depthNode - A node that represents the scene's depth.
|
|
61
|
+
* @param {?Node<vec3>} normalNode - A node that represents the scene's normals.
|
|
62
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
63
|
+
*/
|
|
64
|
+
constructor( depthNode, normalNode, camera ) {
|
|
65
|
+
|
|
66
|
+
super( 'float' );
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* A node that represents the scene's depth.
|
|
70
|
+
*
|
|
71
|
+
* @type {Node<float>}
|
|
72
|
+
*/
|
|
73
|
+
this.depthNode = depthNode;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* A node that represents the scene's normals. If no normals are passed to the
|
|
77
|
+
* constructor (because MRT is not available), normals can be automatically
|
|
78
|
+
* reconstructed from depth values in the shader.
|
|
79
|
+
*
|
|
80
|
+
* @type {?Node<vec3>}
|
|
81
|
+
*/
|
|
82
|
+
this.normalNode = normalNode;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* The resolution scale. By default the effect is rendered in full resolution
|
|
86
|
+
* for best quality but a value of `0.5` should be sufficient for most scenes.
|
|
87
|
+
*
|
|
88
|
+
* @type {number}
|
|
89
|
+
* @default 1
|
|
90
|
+
*/
|
|
91
|
+
this.resolutionScale = 1;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
95
|
+
* its effect once per frame in `updateBefore()`.
|
|
96
|
+
*
|
|
97
|
+
* @type {string}
|
|
98
|
+
* @default 'frame'
|
|
99
|
+
*/
|
|
100
|
+
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* The render target the ambient occlusion is rendered into.
|
|
104
|
+
*
|
|
105
|
+
* @private
|
|
106
|
+
* @type {RenderTarget}
|
|
107
|
+
*/
|
|
108
|
+
this._aoRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false, format: RedFormat } );
|
|
109
|
+
this._aoRenderTarget.texture.name = 'GTAONode.AO';
|
|
110
|
+
|
|
111
|
+
// uniforms
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* The radius of the ambient occlusion.
|
|
115
|
+
*
|
|
116
|
+
* @type {UniformNode<float>}
|
|
117
|
+
*/
|
|
118
|
+
this.radius = uniform( 0.25 );
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* The thickness of the ambient occlusion.
|
|
122
|
+
*
|
|
123
|
+
* @type {UniformNode<float>}
|
|
124
|
+
*/
|
|
125
|
+
this.thickness = uniform( 1 );
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @deprecated since r186. The new distance model "Quadratic Ray Stepping"
|
|
129
|
+
* does not need it anymore.
|
|
130
|
+
*
|
|
131
|
+
* @type {UniformNode<float>}
|
|
132
|
+
*/
|
|
133
|
+
this.distanceExponent = uniform( 1 );
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* @deprecated since r186. The new distance model "Quadratic Ray Stepping"
|
|
137
|
+
* does not need it anymore.
|
|
138
|
+
*
|
|
139
|
+
* @type {UniformNode<float>}
|
|
140
|
+
*/
|
|
141
|
+
this.distanceFallOff = uniform( 1 );
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* The scale of the ambient occlusion.
|
|
145
|
+
*
|
|
146
|
+
* @type {UniformNode<float>}
|
|
147
|
+
*/
|
|
148
|
+
this.scale = uniform( 1 );
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* How many samples are used to compute the AO.
|
|
152
|
+
* A higher value results in better quality but also
|
|
153
|
+
* in a more expensive runtime behavior.
|
|
154
|
+
*
|
|
155
|
+
* Note: Changing this member triggers a shader recompilation.
|
|
156
|
+
*
|
|
157
|
+
* @type {UniformNode<float>}
|
|
158
|
+
*/
|
|
159
|
+
this.samples = uniform( 16 );
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Whether to use temporal filtering or not. Setting this property to
|
|
163
|
+
* `true` requires the usage of `TRAANode`. This will help to reduce noise
|
|
164
|
+
* although it introduces typical TAA artifacts like ghosting and temporal
|
|
165
|
+
* instabilities.
|
|
166
|
+
*
|
|
167
|
+
* If setting this property to `false`, a manual denoise via `DenoiseNode`
|
|
168
|
+
* might be required.
|
|
169
|
+
*
|
|
170
|
+
* @type {boolean}
|
|
171
|
+
* @default false
|
|
172
|
+
*/
|
|
173
|
+
this.useTemporalFiltering = false;
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* The resolution of the effect. Can be scaled via `resolutionScale`.
|
|
177
|
+
*
|
|
178
|
+
* @private
|
|
179
|
+
* @type {UniformNode<vec2>}
|
|
180
|
+
*/
|
|
181
|
+
this._resolution = uniform( new Vector2() );
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* The internal noise texture used by the AO.
|
|
185
|
+
*
|
|
186
|
+
* @private
|
|
187
|
+
* @type {DataTexture}
|
|
188
|
+
*/
|
|
189
|
+
this._noiseTexture = generateMagicSquareNoise();
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* The node represents the internal noise texture used by the AO.
|
|
193
|
+
*
|
|
194
|
+
* @private
|
|
195
|
+
* @type {TextureNode}
|
|
196
|
+
*/
|
|
197
|
+
this._noiseNode = texture( this._noiseTexture );
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Represents the projection matrix of the scene's camera.
|
|
201
|
+
*
|
|
202
|
+
* @private
|
|
203
|
+
* @type {UniformNode<mat4>}
|
|
204
|
+
*/
|
|
205
|
+
this._cameraProjectionMatrix = uniform( camera.projectionMatrix );
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Represents the inverse projection matrix of the scene's camera.
|
|
209
|
+
*
|
|
210
|
+
* @private
|
|
211
|
+
* @type {UniformNode<mat4>}
|
|
212
|
+
*/
|
|
213
|
+
this._cameraProjectionMatrixInverse = uniform( camera.projectionMatrixInverse );
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Represents the near value of the scene's camera.
|
|
217
|
+
*
|
|
218
|
+
* @private
|
|
219
|
+
* @type {ReferenceNode<float>}
|
|
220
|
+
*/
|
|
221
|
+
this._cameraNear = reference( 'near', 'float', camera );
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Represents the far value of the scene's camera.
|
|
225
|
+
*
|
|
226
|
+
* @private
|
|
227
|
+
* @type {ReferenceNode<float>}
|
|
228
|
+
*/
|
|
229
|
+
this._cameraFar = reference( 'far', 'float', camera );
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* A reference to the scene's camera.
|
|
233
|
+
*
|
|
234
|
+
* @private
|
|
235
|
+
* @type {Camera}
|
|
236
|
+
*/
|
|
237
|
+
this._camera = camera;
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Temporal direction that influences the rotation angle for each slice.
|
|
241
|
+
*
|
|
242
|
+
* @private
|
|
243
|
+
* @type {UniformNode<float>}
|
|
244
|
+
*/
|
|
245
|
+
this._temporalDirection = uniform( 0 );
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Temporal offset added to the initial ray step.
|
|
249
|
+
*
|
|
250
|
+
* @private
|
|
251
|
+
* @type {UniformNode<float>}
|
|
252
|
+
*/
|
|
253
|
+
this._temporalOffset = uniform( 0 );
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Resolution scale uniform.
|
|
257
|
+
*
|
|
258
|
+
* @private
|
|
259
|
+
* @type {UniformNode<float>}
|
|
260
|
+
*/
|
|
261
|
+
this._resolutionScale = uniform( 0 );
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* The TSL function that computes the AO. Required for rebuild.
|
|
265
|
+
*
|
|
266
|
+
* @private
|
|
267
|
+
* @type {?Function}
|
|
268
|
+
* @default null
|
|
269
|
+
*/
|
|
270
|
+
this._ao = null;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* The sample count currently baked into the shader.
|
|
274
|
+
*
|
|
275
|
+
* @private
|
|
276
|
+
* @type {number}
|
|
277
|
+
*/
|
|
278
|
+
this._currentSamples = - 1;
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* The shared builder context. Required for rebuild.
|
|
282
|
+
*
|
|
283
|
+
* @private
|
|
284
|
+
* @type {?Object}
|
|
285
|
+
* @default null
|
|
286
|
+
*/
|
|
287
|
+
this._sharedContext = null;
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* The material that is used to render the effect.
|
|
291
|
+
*
|
|
292
|
+
* @private
|
|
293
|
+
* @type {NodeMaterial}
|
|
294
|
+
*/
|
|
295
|
+
this._material = new NodeMaterial();
|
|
296
|
+
this._material.name = 'GTAO';
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* The result of the effect is represented as a separate texture node.
|
|
300
|
+
*
|
|
301
|
+
* @private
|
|
302
|
+
* @type {PassTextureNode}
|
|
303
|
+
*/
|
|
304
|
+
this._textureNode = passTexture( this, this._aoRenderTarget.texture );
|
|
305
|
+
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Returns the result of the effect as a texture node.
|
|
310
|
+
*
|
|
311
|
+
* @return {PassTextureNode} A texture node that represents the result of the effect.
|
|
312
|
+
*/
|
|
313
|
+
getTextureNode() {
|
|
314
|
+
|
|
315
|
+
return this._textureNode;
|
|
316
|
+
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Sets the size of the effect.
|
|
321
|
+
*
|
|
322
|
+
* @param {number} width - The width of the effect.
|
|
323
|
+
* @param {number} height - The height of the effect.
|
|
324
|
+
*/
|
|
325
|
+
setSize( width, height ) {
|
|
326
|
+
|
|
327
|
+
width = Math.round( this.resolutionScale * width );
|
|
328
|
+
height = Math.round( this.resolutionScale * height );
|
|
329
|
+
|
|
330
|
+
this._resolutionScale.value = this.resolutionScale;
|
|
331
|
+
this._resolution.value.set( width, height );
|
|
332
|
+
this._aoRenderTarget.setSize( width, height );
|
|
333
|
+
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* This method is used to render the effect once per frame.
|
|
338
|
+
*
|
|
339
|
+
* @param {NodeFrame} frame - The current node frame.
|
|
340
|
+
*/
|
|
341
|
+
updateBefore( frame ) {
|
|
342
|
+
|
|
343
|
+
const { renderer } = frame;
|
|
344
|
+
|
|
345
|
+
_rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
|
|
346
|
+
|
|
347
|
+
// update temporal uniforms
|
|
348
|
+
|
|
349
|
+
if ( this.useTemporalFiltering === true ) {
|
|
350
|
+
|
|
351
|
+
const frameId = frame.frameId;
|
|
352
|
+
|
|
353
|
+
this._temporalDirection.value = _temporalRotations[ frameId % 6 ] / 360;
|
|
354
|
+
this._temporalOffset.value = _spatialOffsets[ frameId % 4 ];
|
|
355
|
+
|
|
356
|
+
} else {
|
|
357
|
+
|
|
358
|
+
this._temporalDirection.value = 0;
|
|
359
|
+
this._temporalOffset.value = 1;
|
|
360
|
+
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// rebuild the material if the sample count has changed
|
|
364
|
+
|
|
365
|
+
if ( this.samples.value !== this._currentSamples ) {
|
|
366
|
+
|
|
367
|
+
this._currentSamples = this.samples.value;
|
|
368
|
+
|
|
369
|
+
this._material.contextNode = context( this._sharedContext );
|
|
370
|
+
this._material.fragmentNode = this._ao();
|
|
371
|
+
this._material.needsUpdate = true;
|
|
372
|
+
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
//
|
|
376
|
+
|
|
377
|
+
const size = renderer.getDrawingBufferSize( _size );
|
|
378
|
+
this.setSize( size.width, size.height );
|
|
379
|
+
|
|
380
|
+
_quadMesh.material = this._material;
|
|
381
|
+
_quadMesh.name = 'AO';
|
|
382
|
+
|
|
383
|
+
// clear
|
|
384
|
+
|
|
385
|
+
renderer.setClearColor( 0xffffff, 1 );
|
|
386
|
+
|
|
387
|
+
// ao
|
|
388
|
+
|
|
389
|
+
renderer.setRenderTarget( this._aoRenderTarget );
|
|
390
|
+
_quadMesh.render( renderer );
|
|
391
|
+
|
|
392
|
+
// restore
|
|
393
|
+
|
|
394
|
+
RendererUtils.restoreRendererState( renderer, _rendererState );
|
|
395
|
+
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* This method is used to setup the effect's TSL code.
|
|
400
|
+
*
|
|
401
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
402
|
+
* @return {PassTextureNode}
|
|
403
|
+
*/
|
|
404
|
+
setup( builder ) {
|
|
405
|
+
|
|
406
|
+
const uvNode = uv();
|
|
407
|
+
|
|
408
|
+
const sampleDepth = ( uv ) => projectionDepth( this.depthNode.sample( uv ).r, this._cameraNear, this._cameraFar );
|
|
409
|
+
|
|
410
|
+
const sampleCenterDepth = ( uv ) => {
|
|
411
|
+
|
|
412
|
+
// Sidestep the nearest-rounding during depth access for the unjittered center pixel to avoid banding
|
|
413
|
+
|
|
414
|
+
const g = this.depthNode.gather().sample( uv );
|
|
415
|
+
const depth = builder.renderer.reversedDepthBuffer === true ? max( max( g.x, g.y ), max( g.z, g.w ) ) : min( min( g.x, g.y ), min( g.z, g.w ) );
|
|
416
|
+
|
|
417
|
+
return projectionDepth( depth, this._cameraNear, this._cameraFar );
|
|
418
|
+
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
const sampleNoise = ( uv ) => this._noiseNode.sample( uv );
|
|
422
|
+
const sampleNormal = ( uv ) => ( this.normalNode !== null ) ? this.normalNode.sample( uv ).rgb.normalize() : getNormalFromDepth( uv, this.depthNode.value, this._cameraProjectionMatrixInverse );
|
|
423
|
+
|
|
424
|
+
const isValidSample = Fn( ( [ uv, centerTexel, size ] ) => {
|
|
425
|
+
|
|
426
|
+
const texel = uv.mul( size ).floor().toConst();
|
|
427
|
+
|
|
428
|
+
// rejects off-screen samples and samples that fall into the center texel
|
|
429
|
+
|
|
430
|
+
return uv.x.greaterThan( 0 ).and( uv.x.lessThan( 1 ) ).and( uv.y.greaterThan( 0 ) ).and( uv.y.lessThan( 1 ) )
|
|
431
|
+
.and( texel.x.notEqual( centerTexel.x ).or( texel.y.notEqual( centerTexel.y ) ) );
|
|
432
|
+
|
|
433
|
+
}, { uv: 'vec2', centerTexel: 'vec2', size: 'vec2', return: 'bool' } );
|
|
434
|
+
|
|
435
|
+
this._ao = Fn( () => {
|
|
436
|
+
|
|
437
|
+
const depth = this._resolutionScale.lessThan( 1 ).select( sampleCenterDepth( uvNode ), sampleDepth( uvNode ) ).toConst();
|
|
438
|
+
|
|
439
|
+
isBackgroundDepth( depth ).discard();
|
|
440
|
+
|
|
441
|
+
const depthSize = vec2( textureSize( this.depthNode, 0 ) ).toConst();
|
|
442
|
+
const centerTexel = uvNode.mul( depthSize ).floor().toConst();
|
|
443
|
+
|
|
444
|
+
const viewPosition = getViewPosition( uvNode, depth, this._cameraProjectionMatrixInverse ).toConst();
|
|
445
|
+
const viewNormal = sampleNormal( uvNode ).toConst();
|
|
446
|
+
|
|
447
|
+
const radius = this.radius;
|
|
448
|
+
const invRadius = radius.reciprocal().toConst();
|
|
449
|
+
const viewDir = ( this._camera.isPerspectiveCamera === true ) ? normalize( viewPosition.xyz.negate() ).toConst() : vec3( 0, 0, 1 ).toConst();
|
|
450
|
+
const clipPosition = this._cameraProjectionMatrix.mul( vec4( viewPosition, 1.0 ) ).toConst();
|
|
451
|
+
|
|
452
|
+
const noiseResolution = textureSize( this._noiseNode, 0 );
|
|
453
|
+
let noiseUv = vec2( uvNode.x, uvNode.y.oneMinus() );
|
|
454
|
+
noiseUv = noiseUv.mul( this._resolution.div( noiseResolution ) );
|
|
455
|
+
|
|
456
|
+
const noiseTexel = sampleNoise( noiseUv );
|
|
457
|
+
const randomVec = noiseTexel.xyz.mul( 2.0 ).sub( 1.0 );
|
|
458
|
+
const tangent = vec3( randomVec.xy, 0.0 ).normalize();
|
|
459
|
+
const bitangent = vec3( tangent.y.mul( - 1.0 ), tangent.x, 0.0 );
|
|
460
|
+
const kernelMatrix = mat3( tangent, bitangent, vec3( 0.0, 0.0, 1.0 ) );
|
|
461
|
+
|
|
462
|
+
// The sample count is baked into the shader so loop unrolling works
|
|
463
|
+
|
|
464
|
+
const SAMPLES = this.samples.value;
|
|
465
|
+
const DIRECTIONS = SAMPLES < 30 ? 3 : 5;
|
|
466
|
+
const STEPS = Math.ceil( SAMPLES / DIRECTIONS );
|
|
467
|
+
const invSteps = 1 / STEPS;
|
|
468
|
+
|
|
469
|
+
const ao = float( 0 ).toVar();
|
|
470
|
+
|
|
471
|
+
// Each iteration analyzes one vertical "slice" of the 3D space around the fragment.
|
|
472
|
+
|
|
473
|
+
// Per-step phase jitter for spatio-temporal decorrelation.
|
|
474
|
+
const noiseJitterIdx = this._temporalDirection.mul( 0.02 );
|
|
475
|
+
const stepJitter = interleavedGradientNoise( screenCoordinate.add( this._temporalOffset ) ).add( rand( uvNode.add( noiseJitterIdx ).mul( 2 ).sub( 1 ) ) );
|
|
476
|
+
|
|
477
|
+
Loop( { start: int( 0 ), end: int( DIRECTIONS ), type: 'int', condition: '<' }, ( { i } ) => {
|
|
478
|
+
|
|
479
|
+
const angle = float( i ).div( DIRECTIONS ).mul( PI ).add( this._temporalDirection ).toConst();
|
|
480
|
+
const sampleDir = kernelMatrix.mul( vec3( cos( angle ), sin( angle ), 0 ) ).toConst();
|
|
481
|
+
const clipDirRadius = this._cameraProjectionMatrix.mul( vec4( sampleDir, 0.0 ) ).mul( radius ).toConst();
|
|
482
|
+
|
|
483
|
+
const sliceBitangent = normalize( cross( sampleDir, viewDir ) ).toConst();
|
|
484
|
+
const sliceTangent = cross( sliceBitangent, viewDir ).toConst();
|
|
485
|
+
|
|
486
|
+
// Project the view normal onto the slice plane (remove component along sliceBitangent).
|
|
487
|
+
// The unnormalized length is the foreshortening weight applied at slice integration.
|
|
488
|
+
// (Activision GTAO paper, Section 3.2 "Per-pixel sampling".)
|
|
489
|
+
const projNRaw = viewNormal.sub( sliceBitangent.mul( dot( viewNormal, sliceBitangent ) ) ).toConst();
|
|
490
|
+
const projNLen = projNRaw.length().toConst();
|
|
491
|
+
const projN = projNRaw.div( max( projNLen, float( 0.0001 ) ) ).toConst();
|
|
492
|
+
|
|
493
|
+
// γ — angle of projN within the slice plane, signed by the tangent direction.
|
|
494
|
+
const nSin = dot( projN, sliceTangent ).toConst();
|
|
495
|
+
const nCos = clamp( dot( projN, viewDir ), 0, 1 ).toConst();
|
|
496
|
+
const signNSin = nSin.greaterThanEqual( 0 ).select( float( 1 ), float( - 1 ) );
|
|
497
|
+
const angleN = signNSin.mul( acos( nCos ) ).toConst();
|
|
498
|
+
|
|
499
|
+
const tangentToNormalInSlice = cross( projN, sliceBitangent ).toConst();
|
|
500
|
+
const cosHorizon = dot( viewDir, tangentToNormalInSlice ).toConst();
|
|
501
|
+
const cosHorizons = vec2( cosHorizon, cosHorizon.negate() ).toVar();
|
|
502
|
+
|
|
503
|
+
// For each slice, the inner loop performs ray marching to find the horizons.
|
|
504
|
+
|
|
505
|
+
Loop( { end: int( STEPS ), type: 'int', name: 'j', condition: '<' }, ( { j } ) => {
|
|
506
|
+
|
|
507
|
+
// Quadratic step distribution ( sampleDist = t² ) concentrates samples in the
|
|
508
|
+
// near-field. (Blender's Eevee adaptation)
|
|
509
|
+
const t = float( j ).add( 1.0 ).add( stepJitter ).mul( invSteps ).toConst();
|
|
510
|
+
const sampleDist = t.mul( t );
|
|
511
|
+
const clipOffset = clipDirRadius.mul( sampleDist ).toConst();
|
|
512
|
+
|
|
513
|
+
// The loop marches in two opposite directions (x and y) along the slice's line to find the horizon on both sides.
|
|
514
|
+
|
|
515
|
+
// x
|
|
516
|
+
|
|
517
|
+
const sampleScreenPositionX = getScreenPositionFromClip( clipPosition.add( clipOffset ) ).toConst();
|
|
518
|
+
const sampleDepthX = sampleDepth( sampleScreenPositionX ).toConst();
|
|
519
|
+
const sampleSceneViewPositionX = getViewPosition( sampleScreenPositionX, sampleDepthX, this._cameraProjectionMatrixInverse ).toConst();
|
|
520
|
+
const viewDeltaX = sampleSceneViewPositionX.sub( viewPosition ).toConst();
|
|
521
|
+
const lenX = viewDeltaX.length().toConst();
|
|
522
|
+
|
|
523
|
+
// Manual normalize guards against zero-length delta.
|
|
524
|
+
const sHX = dot( viewDir, viewDeltaX ).div( max( lenX, float( 0.0001 ) ) );
|
|
525
|
+
|
|
526
|
+
// Sphere falloff: ( dist / radius )² fades the sample's horizon contribution
|
|
527
|
+
// back toward the prior horizon as it approaches the radius boundary.
|
|
528
|
+
// (squared variant of the paper's near-field attenuation;
|
|
529
|
+
// Activision GTAO paper, Section 4.3 "Bounding the sampling area")
|
|
530
|
+
const distFacX = min( lenX.mul( invRadius ), 1 );
|
|
531
|
+
const distFacSqX = distFacX.mul( distFacX );
|
|
532
|
+
|
|
533
|
+
If( isValidSample( sampleScreenPositionX, centerTexel, depthSize ).and( abs( viewDeltaX.z ).lessThan( this.thickness ) ), () => {
|
|
534
|
+
|
|
535
|
+
cosHorizons.x.assign( mix( max( cosHorizons.x, sHX ), cosHorizons.x, distFacSqX ) );
|
|
536
|
+
|
|
537
|
+
} );
|
|
538
|
+
|
|
539
|
+
// y
|
|
540
|
+
|
|
541
|
+
const sampleScreenPositionY = getScreenPositionFromClip( clipPosition.sub( clipOffset ) ).toConst();
|
|
542
|
+
const sampleDepthY = sampleDepth( sampleScreenPositionY ).toConst();
|
|
543
|
+
const sampleSceneViewPositionY = getViewPosition( sampleScreenPositionY, sampleDepthY, this._cameraProjectionMatrixInverse ).toConst();
|
|
544
|
+
const viewDeltaY = sampleSceneViewPositionY.sub( viewPosition ).toConst();
|
|
545
|
+
const lenY = viewDeltaY.length().toConst();
|
|
546
|
+
|
|
547
|
+
const sHY = dot( viewDir, viewDeltaY ).div( max( lenY, float( 0.0001 ) ) );
|
|
548
|
+
|
|
549
|
+
const distFacY = min( lenY.mul( invRadius ), 1 );
|
|
550
|
+
const distFacSqY = distFacY.mul( distFacY );
|
|
551
|
+
|
|
552
|
+
If( isValidSample( sampleScreenPositionY, centerTexel, depthSize ).and( abs( viewDeltaY.z ).lessThan( this.thickness ) ), () => {
|
|
553
|
+
|
|
554
|
+
cosHorizons.y.assign( mix( max( cosHorizons.y, sHY ), cosHorizons.y, distFacSqY ) );
|
|
555
|
+
|
|
556
|
+
} );
|
|
557
|
+
|
|
558
|
+
} );
|
|
559
|
+
|
|
560
|
+
// Cosine-weighted inner integral, closed-form (Activision GTAO paper, Eq. 7).
|
|
561
|
+
// Per horizon h_i: term_i = −cos( 2 h_i − γ ) + cos( γ ) + 2 h_i sin( γ )
|
|
562
|
+
// The 0.25 factor is ½ (integral normalization) × ½ (averaging the two horizons).
|
|
563
|
+
//
|
|
564
|
+
// In this slice setup `sliceTangent = cross( sliceBitangent, viewDir )` works out
|
|
565
|
+
// opposite to `sampleDir`, so the +sampleDir samples (cosHorizons.x) live on the
|
|
566
|
+
// −T side of the slice and −sampleDir samples (cosHorizons.y) on the +T side.
|
|
567
|
+
// γ is signed by +T (sliceTangent), so hPos must read from cosHorizons.y.
|
|
568
|
+
|
|
569
|
+
const hPos = acos( cosHorizons.y ).toConst();
|
|
570
|
+
const hNeg = acos( cosHorizons.x ).negate().toConst();
|
|
571
|
+
|
|
572
|
+
const termPos = cos( hPos.mul( 2 ).sub( angleN ) ).negate().add( nCos ).add( hPos.mul( 2 ).mul( nSin ) );
|
|
573
|
+
const termNeg = cos( hNeg.mul( 2 ).sub( angleN ) ).negate().add( nCos ).add( hNeg.mul( 2 ).mul( nSin ) );
|
|
574
|
+
const a = termPos.add( termNeg ).mul( 0.25 );
|
|
575
|
+
|
|
576
|
+
// |projN| is the foreshortening weight from the per-slice normal projection.
|
|
577
|
+
ao.addAssign( projNLen.mul( a ) );
|
|
578
|
+
|
|
579
|
+
} );
|
|
580
|
+
|
|
581
|
+
ao.assign( clamp( ao.div( DIRECTIONS ), 0, 1 ) );
|
|
582
|
+
ao.assign( pow( ao, this.scale ) );
|
|
583
|
+
|
|
584
|
+
return ao;
|
|
585
|
+
|
|
586
|
+
} );
|
|
587
|
+
|
|
588
|
+
this._sharedContext = builder.getSharedContext();
|
|
589
|
+
this._currentSamples = this.samples.value;
|
|
590
|
+
|
|
591
|
+
this._material.contextNode = context( builder.getSharedContext() );
|
|
592
|
+
this._material.fragmentNode = this._ao();
|
|
593
|
+
this._material.needsUpdate = true;
|
|
594
|
+
|
|
595
|
+
//
|
|
596
|
+
|
|
597
|
+
return this._textureNode;
|
|
598
|
+
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/**
|
|
602
|
+
* Frees internal resources. This method should be called
|
|
603
|
+
* when the effect is no longer required.
|
|
604
|
+
*/
|
|
605
|
+
dispose() {
|
|
606
|
+
|
|
607
|
+
super.dispose();
|
|
608
|
+
|
|
609
|
+
this._aoRenderTarget.dispose();
|
|
610
|
+
|
|
611
|
+
this._noiseTexture.dispose();
|
|
612
|
+
|
|
613
|
+
this._material.dispose();
|
|
614
|
+
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
export default GTAONode;
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* Generates the AO's noise texture for the given size.
|
|
623
|
+
*
|
|
624
|
+
* @param {number} [size=5] - The noise size.
|
|
625
|
+
* @return {DataTexture} The generated noise texture.
|
|
626
|
+
*/
|
|
627
|
+
function generateMagicSquareNoise( size = 5 ) {
|
|
628
|
+
|
|
629
|
+
const noiseSize = Math.floor( size ) % 2 === 0 ? Math.floor( size ) + 1 : Math.floor( size );
|
|
630
|
+
const magicSquare = generateMagicSquare( noiseSize );
|
|
631
|
+
const noiseSquareSize = magicSquare.length;
|
|
632
|
+
const data = new Uint8Array( noiseSquareSize * 4 );
|
|
633
|
+
|
|
634
|
+
for ( let inx = 0; inx < noiseSquareSize; ++ inx ) {
|
|
635
|
+
|
|
636
|
+
const iAng = magicSquare[ inx ];
|
|
637
|
+
const angle = ( 2 * Math.PI * iAng ) / noiseSquareSize;
|
|
638
|
+
const randomVec = new Vector3(
|
|
639
|
+
Math.cos( angle ),
|
|
640
|
+
Math.sin( angle ),
|
|
641
|
+
0
|
|
642
|
+
).normalize();
|
|
643
|
+
data[ inx * 4 ] = ( randomVec.x * 0.5 + 0.5 ) * 255;
|
|
644
|
+
data[ inx * 4 + 1 ] = ( randomVec.y * 0.5 + 0.5 ) * 255;
|
|
645
|
+
data[ inx * 4 + 2 ] = 127;
|
|
646
|
+
data[ inx * 4 + 3 ] = 255;
|
|
647
|
+
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
const noiseTexture = new DataTexture( data, noiseSize, noiseSize );
|
|
651
|
+
noiseTexture.wrapS = RepeatWrapping;
|
|
652
|
+
noiseTexture.wrapT = RepeatWrapping;
|
|
653
|
+
noiseTexture.needsUpdate = true;
|
|
654
|
+
|
|
655
|
+
return noiseTexture;
|
|
656
|
+
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
/**
|
|
660
|
+
* Computes an array of magic square values required to generate the noise texture.
|
|
661
|
+
*
|
|
662
|
+
* @param {number} size - The noise size.
|
|
663
|
+
* @return {Array<number>} The magic square values.
|
|
664
|
+
*/
|
|
665
|
+
function generateMagicSquare( size ) {
|
|
666
|
+
|
|
667
|
+
const noiseSize = Math.floor( size ) % 2 === 0 ? Math.floor( size ) + 1 : Math.floor( size );
|
|
668
|
+
const noiseSquareSize = noiseSize * noiseSize;
|
|
669
|
+
const magicSquare = Array( noiseSquareSize ).fill( 0 );
|
|
670
|
+
let i = Math.floor( noiseSize / 2 );
|
|
671
|
+
let j = noiseSize - 1;
|
|
672
|
+
|
|
673
|
+
for ( let num = 1; num <= noiseSquareSize; ) {
|
|
674
|
+
|
|
675
|
+
if ( i === - 1 && j === noiseSize ) {
|
|
676
|
+
|
|
677
|
+
j = noiseSize - 2;
|
|
678
|
+
i = 0;
|
|
679
|
+
|
|
680
|
+
} else {
|
|
681
|
+
|
|
682
|
+
if ( j === noiseSize ) {
|
|
683
|
+
|
|
684
|
+
j = 0;
|
|
685
|
+
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
if ( i < 0 ) {
|
|
689
|
+
|
|
690
|
+
i = noiseSize - 1;
|
|
691
|
+
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
if ( magicSquare[ i * noiseSize + j ] !== 0 ) {
|
|
697
|
+
|
|
698
|
+
j -= 2;
|
|
699
|
+
i ++;
|
|
700
|
+
continue;
|
|
701
|
+
|
|
702
|
+
} else {
|
|
703
|
+
|
|
704
|
+
magicSquare[ i * noiseSize + j ] = num ++;
|
|
705
|
+
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
j ++;
|
|
709
|
+
i --;
|
|
710
|
+
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
return magicSquare;
|
|
714
|
+
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
/**
|
|
718
|
+
* TSL function for creating a Ground Truth Ambient Occlusion (GTAO) effect.
|
|
719
|
+
*
|
|
720
|
+
* @tsl
|
|
721
|
+
* @function
|
|
722
|
+
* @param {Node<float>} depthNode - A node that represents the scene's depth.
|
|
723
|
+
* @param {?Node<vec3>} normalNode - A node that represents the scene's normals.
|
|
724
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
725
|
+
* @returns {GTAONode}
|
|
726
|
+
*/
|
|
727
|
+
export const ao = ( depthNode, normalNode, camera ) => new GTAONode( nodeObject( depthNode ), nodeObject( normalNode ), camera );
|