@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.
Files changed (470) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +397 -2
  3. package/Resources/Devices/roku.json +410 -0
  4. package/Resources/Devices/xbox-one.json +367 -0
  5. package/Resources/GameKit/NOTICE.md +63 -0
  6. package/Resources/GameKit/apple/LampPage.swift +1813 -0
  7. package/Resources/GameKit/apple/LampPlayer.swift +46 -0
  8. package/Resources/GameKit/apple/LampWebApp.swift +63 -0
  9. package/Resources/GameKit/apple/LampWebGame.swift +87 -0
  10. package/Resources/GameKit/apple/Native.swift +12 -0
  11. package/Resources/GameKit/build.sh +55 -0
  12. package/Resources/GameKit/lamp_game.h +116 -0
  13. package/Resources/GameKit/lamp_host.h +19 -0
  14. package/Resources/GameKit/lamp_kit.cpp +61 -0
  15. package/Resources/GameKit/lamp_sound.cpp +455 -0
  16. package/Resources/GameKit/lamp_xbox.cpp +374 -0
  17. package/Resources/GameKit/libraries/HandmadeMath.h +3940 -0
  18. package/Resources/GameKit/libraries/cgltf.h +7240 -0
  19. package/Resources/GameKit/libraries/dr_mp3.h +5430 -0
  20. package/Resources/GameKit/libraries/dr_wav.h +9209 -0
  21. package/Resources/GameKit/libraries/sokol_debugtext.h +4754 -0
  22. package/Resources/GameKit/libraries/sokol_gfx.h +29558 -0
  23. package/Resources/GameKit/libraries/sokol_gl.h +4538 -0
  24. package/Resources/GameKit/libraries/sokol_log.h +335 -0
  25. package/Resources/GameKit/libraries/sokol_shape.h +1531 -0
  26. package/Resources/GameKit/libraries/stb_image.h +7988 -0
  27. package/Resources/GameKit/libraries/stb_vorbis.c +5584 -0
  28. package/Resources/GameKit/page/lamp-live.js +672 -0
  29. package/Resources/GameKit/scaffold/Game/game.cpp +142 -0
  30. package/Resources/GameKit/scaffold/Game/scene.glsl +49 -0
  31. package/Resources/GameKit/scaffold-web/Web/game.js +31 -0
  32. package/Resources/GameKit/scaffold-web/Web/index.html +13 -0
  33. package/Resources/GameKit/scaffold-web/Web/making.js +33 -0
  34. package/Resources/GameKit/scaffold-web/Web/world.js +33 -0
  35. package/Resources/GameKit/web/lamp-game.js +3042 -0
  36. package/Resources/GameKit/web/lamp-phaser.js +128 -0
  37. package/Resources/WebHost/App.exe +0 -0
  38. package/Resources/WebHost/Microsoft.Web.WebView2.Core.dll +0 -0
  39. package/Resources/WebHost/WebView2-LICENSE.txt +27 -0
  40. package/Resources/WebHost/lamp_controllers.h +1506 -0
  41. package/Resources/WebHost/lamp_web_host.cpp +1173 -0
  42. package/Resources/WebLibraries/earlier.txt +318 -0
  43. package/Resources/WebLibraries/phaser/LICENSE.md +20 -0
  44. package/Resources/WebLibraries/phaser/NOTICE.md +2 -0
  45. package/Resources/WebLibraries/phaser/phaser.esm.min.js +1 -0
  46. package/Resources/WebLibraries/qrcode/LICENSE +21 -0
  47. package/Resources/WebLibraries/qrcode/NOTICE.md +4 -0
  48. package/Resources/WebLibraries/qrcode/qrcode.js +2297 -0
  49. package/Resources/WebLibraries/rapier/LICENSE +201 -0
  50. package/Resources/WebLibraries/rapier/NOTICE.md +3 -0
  51. package/Resources/WebLibraries/rapier/rapier.js +2 -0
  52. package/Resources/WebLibraries/three/LICENSE +21 -0
  53. package/Resources/WebLibraries/three/NOTICE.md +4 -0
  54. package/Resources/WebLibraries/three/addons/animation/AnimationClipCreator.js +168 -0
  55. package/Resources/WebLibraries/three/addons/animation/CCDIKSolver.js +607 -0
  56. package/Resources/WebLibraries/three/addons/controls/ArcballControls.js +3543 -0
  57. package/Resources/WebLibraries/three/addons/controls/DragControls.js +452 -0
  58. package/Resources/WebLibraries/three/addons/controls/FirstPersonControls.js +512 -0
  59. package/Resources/WebLibraries/three/addons/controls/FlyControls.js +384 -0
  60. package/Resources/WebLibraries/three/addons/controls/MapControls.js +116 -0
  61. package/Resources/WebLibraries/three/addons/controls/OrbitControls.js +1985 -0
  62. package/Resources/WebLibraries/three/addons/controls/PointerLockControls.js +264 -0
  63. package/Resources/WebLibraries/three/addons/controls/TrackballControls.js +1106 -0
  64. package/Resources/WebLibraries/three/addons/controls/TransformControls.js +2003 -0
  65. package/Resources/WebLibraries/three/addons/curves/CurveExtras.js +694 -0
  66. package/Resources/WebLibraries/three/addons/curves/NURBSCurve.js +169 -0
  67. package/Resources/WebLibraries/three/addons/curves/NURBSSurface.js +98 -0
  68. package/Resources/WebLibraries/three/addons/curves/NURBSUtils.js +532 -0
  69. package/Resources/WebLibraries/three/addons/curves/NURBSVolume.js +82 -0
  70. package/Resources/WebLibraries/three/addons/effects/AnaglyphEffect.js +274 -0
  71. package/Resources/WebLibraries/three/addons/effects/AsciiEffect.js +323 -0
  72. package/Resources/WebLibraries/three/addons/effects/OutlineEffect.js +489 -0
  73. package/Resources/WebLibraries/three/addons/effects/ParallaxBarrierEffect.js +155 -0
  74. package/Resources/WebLibraries/three/addons/effects/StereoEffect.js +91 -0
  75. package/Resources/WebLibraries/three/addons/environments/ColorEnvironment.js +59 -0
  76. package/Resources/WebLibraries/three/addons/environments/DebugEnvironment.js +102 -0
  77. package/Resources/WebLibraries/three/addons/environments/RoomEnvironment.js +185 -0
  78. package/Resources/WebLibraries/three/addons/geometries/BoxLineGeometry.js +92 -0
  79. package/Resources/WebLibraries/three/addons/geometries/ConvexGeometry.js +72 -0
  80. package/Resources/WebLibraries/three/addons/geometries/DecalGeometry.js +420 -0
  81. package/Resources/WebLibraries/three/addons/geometries/LoftGeometry.js +355 -0
  82. package/Resources/WebLibraries/three/addons/geometries/ParametricFunctions.js +100 -0
  83. package/Resources/WebLibraries/three/addons/geometries/ParametricGeometry.js +172 -0
  84. package/Resources/WebLibraries/three/addons/geometries/RoundedBoxGeometry.js +216 -0
  85. package/Resources/WebLibraries/three/addons/geometries/TeapotGeometry.js +689 -0
  86. package/Resources/WebLibraries/three/addons/geometries/TextGeometry.js +102 -0
  87. package/Resources/WebLibraries/three/addons/helpers/AnimationPathHelper.js +302 -0
  88. package/Resources/WebLibraries/three/addons/helpers/LightProbeGridHelper.js +166 -0
  89. package/Resources/WebLibraries/three/addons/helpers/LightProbeGridHelperWebGL.js +221 -0
  90. package/Resources/WebLibraries/three/addons/helpers/LightProbeHelper.js +166 -0
  91. package/Resources/WebLibraries/three/addons/helpers/LightProbeHelperGPU.js +102 -0
  92. package/Resources/WebLibraries/three/addons/helpers/OctreeHelper.js +109 -0
  93. package/Resources/WebLibraries/three/addons/helpers/PositionalAudioHelper.js +169 -0
  94. package/Resources/WebLibraries/three/addons/helpers/RapierHelper.js +59 -0
  95. package/Resources/WebLibraries/three/addons/helpers/RectAreaLightHelper.js +118 -0
  96. package/Resources/WebLibraries/three/addons/helpers/TextureHelper.js +265 -0
  97. package/Resources/WebLibraries/three/addons/helpers/TextureHelperGPU.js +214 -0
  98. package/Resources/WebLibraries/three/addons/helpers/VertexNormalsHelper.js +155 -0
  99. package/Resources/WebLibraries/three/addons/helpers/VertexTangentsHelper.js +133 -0
  100. package/Resources/WebLibraries/three/addons/helpers/ViewHelper.js +529 -0
  101. package/Resources/WebLibraries/three/addons/interactive/HTMLMesh.js +617 -0
  102. package/Resources/WebLibraries/three/addons/interactive/InteractiveGroup.js +224 -0
  103. package/Resources/WebLibraries/three/addons/interactive/SelectionBox.js +324 -0
  104. package/Resources/WebLibraries/three/addons/interactive/SelectionHelper.js +150 -0
  105. package/Resources/WebLibraries/three/addons/libs/fflate.module.js +2699 -0
  106. package/Resources/WebLibraries/three/addons/libs/lil-gui.module.min.js +8 -0
  107. package/Resources/WebLibraries/three/addons/libs/meshopt_decoder.module.js +196 -0
  108. package/Resources/WebLibraries/three/addons/libs/potpack.module.js +125 -0
  109. package/Resources/WebLibraries/three/addons/libs/stats.module.js +167 -0
  110. package/Resources/WebLibraries/three/addons/libs/tween.module.js +876 -0
  111. package/Resources/WebLibraries/three/addons/lighting/ClusteredLighting.js +153 -0
  112. package/Resources/WebLibraries/three/addons/lighting/DynamicLighting.js +82 -0
  113. package/Resources/WebLibraries/three/addons/lighting/LightMapper.js +295 -0
  114. package/Resources/WebLibraries/three/addons/lighting/LightProbeGrid.js +923 -0
  115. package/Resources/WebLibraries/three/addons/lighting/LightProbeGridUtils.js +107 -0
  116. package/Resources/WebLibraries/three/addons/lighting/LightProbeGridWebGL.js +846 -0
  117. package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGIConeTracer.js +243 -0
  118. package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGIIrradiance.js +43 -0
  119. package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGINode.js +617 -0
  120. package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGISceneCollector.js +793 -0
  121. package/Resources/WebLibraries/three/addons/lighting/vxgi/VXGIVolume.js +1440 -0
  122. package/Resources/WebLibraries/three/addons/lights/LightProbeGenerator.js +337 -0
  123. package/Resources/WebLibraries/three/addons/lights/RectAreaLightTexturesLib.js +127 -0
  124. package/Resources/WebLibraries/three/addons/lights/RectAreaLightUniformsLib.js +40 -0
  125. package/Resources/WebLibraries/three/addons/lights/SunLight.js +100 -0
  126. package/Resources/WebLibraries/three/addons/lights/SunLightNode.js +56 -0
  127. package/Resources/WebLibraries/three/addons/lights/SunLightShadow.js +319 -0
  128. package/Resources/WebLibraries/three/addons/lights/SunShadowNode.js +312 -0
  129. package/Resources/WebLibraries/three/addons/lines/Line2.js +56 -0
  130. package/Resources/WebLibraries/three/addons/lines/LineGeometry.js +157 -0
  131. package/Resources/WebLibraries/three/addons/lines/LineMaterial.js +742 -0
  132. package/Resources/WebLibraries/three/addons/lines/LineSegments2.js +434 -0
  133. package/Resources/WebLibraries/three/addons/lines/LineSegmentsGeometry.js +298 -0
  134. package/Resources/WebLibraries/three/addons/lines/Wireframe.js +108 -0
  135. package/Resources/WebLibraries/three/addons/lines/WireframeGeometry2.js +49 -0
  136. package/Resources/WebLibraries/three/addons/lines/webgpu/Line2.js +46 -0
  137. package/Resources/WebLibraries/three/addons/lines/webgpu/LineSegments2.js +419 -0
  138. package/Resources/WebLibraries/three/addons/lines/webgpu/Wireframe.js +86 -0
  139. package/Resources/WebLibraries/three/addons/loaders/EXRLoader.js +3411 -0
  140. package/Resources/WebLibraries/three/addons/loaders/FBXLoader.js +4660 -0
  141. package/Resources/WebLibraries/three/addons/loaders/FontLoader.js +262 -0
  142. package/Resources/WebLibraries/three/addons/loaders/GLTFLoader.js +5006 -0
  143. package/Resources/WebLibraries/three/addons/loaders/HDRLoader.js +463 -0
  144. package/Resources/WebLibraries/three/addons/loaders/MTLLoader.js +601 -0
  145. package/Resources/WebLibraries/three/addons/loaders/OBJLoader.js +961 -0
  146. package/Resources/WebLibraries/three/addons/loaders/PLYLoader.js +992 -0
  147. package/Resources/WebLibraries/three/addons/loaders/RGBELoader.js +18 -0
  148. package/Resources/WebLibraries/three/addons/loaders/STLLoader.js +423 -0
  149. package/Resources/WebLibraries/three/addons/loaders/SVGLoader.js +3297 -0
  150. package/Resources/WebLibraries/three/addons/loaders/TGALoader.js +539 -0
  151. package/Resources/WebLibraries/three/addons/loaders/UltraHDRLoader.js +757 -0
  152. package/Resources/WebLibraries/three/addons/math/Capsule.js +159 -0
  153. package/Resources/WebLibraries/three/addons/math/ColorConverter.js +62 -0
  154. package/Resources/WebLibraries/three/addons/math/ColorSpaces.js +147 -0
  155. package/Resources/WebLibraries/three/addons/math/ConvexHull.js +1695 -0
  156. package/Resources/WebLibraries/three/addons/math/ImprovedNoise.js +88 -0
  157. package/Resources/WebLibraries/three/addons/math/Lut.js +317 -0
  158. package/Resources/WebLibraries/three/addons/math/MeshSurfaceSampler.js +315 -0
  159. package/Resources/WebLibraries/three/addons/math/OBB.js +535 -0
  160. package/Resources/WebLibraries/three/addons/math/Octree.js +825 -0
  161. package/Resources/WebLibraries/three/addons/math/SimplexNoise.js +470 -0
  162. package/Resources/WebLibraries/three/addons/misc/ConvexObjectBreaker.js +539 -0
  163. package/Resources/WebLibraries/three/addons/misc/GPUComputationRenderer.js +508 -0
  164. package/Resources/WebLibraries/three/addons/misc/Gyroscope.js +78 -0
  165. package/Resources/WebLibraries/three/addons/misc/MorphAnimMesh.js +119 -0
  166. package/Resources/WebLibraries/three/addons/misc/MorphBlendMesh.js +425 -0
  167. package/Resources/WebLibraries/three/addons/misc/ProgressiveLightMap.js +370 -0
  168. package/Resources/WebLibraries/three/addons/misc/ProgressiveLightMapGPU.js +322 -0
  169. package/Resources/WebLibraries/three/addons/misc/RollerCoaster.js +661 -0
  170. package/Resources/WebLibraries/three/addons/misc/Sculptor.js +1679 -0
  171. package/Resources/WebLibraries/three/addons/misc/SculptorMesh.js +1504 -0
  172. package/Resources/WebLibraries/three/addons/misc/SculptorTools.js +1180 -0
  173. package/Resources/WebLibraries/three/addons/misc/SculptorUtils.js +345 -0
  174. package/Resources/WebLibraries/three/addons/misc/TileCreasedNormalsPlugin.js +270 -0
  175. package/Resources/WebLibraries/three/addons/misc/TubePainter.js +611 -0
  176. package/Resources/WebLibraries/three/addons/misc/Volume.js +520 -0
  177. package/Resources/WebLibraries/three/addons/misc/VolumeSlice.js +275 -0
  178. package/Resources/WebLibraries/three/addons/modifiers/CurveModifier.js +374 -0
  179. package/Resources/WebLibraries/three/addons/modifiers/CurveModifierGPU.js +256 -0
  180. package/Resources/WebLibraries/three/addons/modifiers/EdgeSplitModifier.js +299 -0
  181. package/Resources/WebLibraries/three/addons/modifiers/TessellateModifier.js +340 -0
  182. package/Resources/WebLibraries/three/addons/objects/GroundedSkybox.js +69 -0
  183. package/Resources/WebLibraries/three/addons/objects/Lensflare.js +489 -0
  184. package/Resources/WebLibraries/three/addons/objects/LensflareMesh.js +376 -0
  185. package/Resources/WebLibraries/three/addons/objects/MarchingCubes.js +1261 -0
  186. package/Resources/WebLibraries/three/addons/objects/Reflector.js +390 -0
  187. package/Resources/WebLibraries/three/addons/objects/ReflectorForSSRPass.js +393 -0
  188. package/Resources/WebLibraries/three/addons/objects/Refractor.js +389 -0
  189. package/Resources/WebLibraries/three/addons/objects/ShadowMesh.js +130 -0
  190. package/Resources/WebLibraries/three/addons/objects/Sky.js +342 -0
  191. package/Resources/WebLibraries/three/addons/objects/SkyMesh.js +403 -0
  192. package/Resources/WebLibraries/three/addons/objects/Water.js +374 -0
  193. package/Resources/WebLibraries/three/addons/objects/Water2.js +403 -0
  194. package/Resources/WebLibraries/three/addons/objects/Water2Mesh.js +199 -0
  195. package/Resources/WebLibraries/three/addons/objects/WaterMesh.js +194 -0
  196. package/Resources/WebLibraries/three/addons/postprocessing/AfterimagePass.js +187 -0
  197. package/Resources/WebLibraries/three/addons/postprocessing/BloomPass.js +274 -0
  198. package/Resources/WebLibraries/three/addons/postprocessing/BokehPass.js +218 -0
  199. package/Resources/WebLibraries/three/addons/postprocessing/ClearPass.js +97 -0
  200. package/Resources/WebLibraries/three/addons/postprocessing/CubeTexturePass.js +146 -0
  201. package/Resources/WebLibraries/three/addons/postprocessing/DotScreenPass.js +114 -0
  202. package/Resources/WebLibraries/three/addons/postprocessing/EffectComposer.js +365 -0
  203. package/Resources/WebLibraries/three/addons/postprocessing/FXAAPass.js +40 -0
  204. package/Resources/WebLibraries/three/addons/postprocessing/FilmPass.js +113 -0
  205. package/Resources/WebLibraries/three/addons/postprocessing/GTAOPass.js +735 -0
  206. package/Resources/WebLibraries/three/addons/postprocessing/GlitchPass.js +177 -0
  207. package/Resources/WebLibraries/three/addons/postprocessing/HalftonePass.js +134 -0
  208. package/Resources/WebLibraries/three/addons/postprocessing/LUTPass.js +138 -0
  209. package/Resources/WebLibraries/three/addons/postprocessing/MaskPass.js +195 -0
  210. package/Resources/WebLibraries/three/addons/postprocessing/OutlinePass.js +776 -0
  211. package/Resources/WebLibraries/three/addons/postprocessing/OutputPass.js +148 -0
  212. package/Resources/WebLibraries/three/addons/postprocessing/Pass.js +191 -0
  213. package/Resources/WebLibraries/three/addons/postprocessing/RenderPass.js +193 -0
  214. package/Resources/WebLibraries/three/addons/postprocessing/RenderPixelatedPass.js +314 -0
  215. package/Resources/WebLibraries/three/addons/postprocessing/RenderTransitionPass.js +267 -0
  216. package/Resources/WebLibraries/three/addons/postprocessing/SAOPass.js +407 -0
  217. package/Resources/WebLibraries/three/addons/postprocessing/SMAAPass.js +230 -0
  218. package/Resources/WebLibraries/three/addons/postprocessing/SSAARenderPass.js +313 -0
  219. package/Resources/WebLibraries/three/addons/postprocessing/SSAOPass.js +527 -0
  220. package/Resources/WebLibraries/three/addons/postprocessing/SSRPass.js +858 -0
  221. package/Resources/WebLibraries/three/addons/postprocessing/SavePass.js +132 -0
  222. package/Resources/WebLibraries/three/addons/postprocessing/ShaderPass.js +135 -0
  223. package/Resources/WebLibraries/three/addons/postprocessing/TAARenderPass.js +243 -0
  224. package/Resources/WebLibraries/three/addons/postprocessing/TexturePass.js +131 -0
  225. package/Resources/WebLibraries/three/addons/postprocessing/UnrealBloomPass.js +541 -0
  226. package/Resources/WebLibraries/three/addons/shaders/ACESFilmicToneMappingShader.js +96 -0
  227. package/Resources/WebLibraries/three/addons/shaders/AfterimageShader.js +63 -0
  228. package/Resources/WebLibraries/three/addons/shaders/BasicShader.js +36 -0
  229. package/Resources/WebLibraries/three/addons/shaders/BleachBypassShader.js +68 -0
  230. package/Resources/WebLibraries/three/addons/shaders/BlendShader.js +56 -0
  231. package/Resources/WebLibraries/three/addons/shaders/BokehShader.js +151 -0
  232. package/Resources/WebLibraries/three/addons/shaders/BokehShader2.js +404 -0
  233. package/Resources/WebLibraries/three/addons/shaders/BrightnessContrastShader.js +62 -0
  234. package/Resources/WebLibraries/three/addons/shaders/ColorCorrectionShader.js +59 -0
  235. package/Resources/WebLibraries/three/addons/shaders/ColorifyShader.js +57 -0
  236. package/Resources/WebLibraries/three/addons/shaders/ConvolutionShader.js +74 -0
  237. package/Resources/WebLibraries/three/addons/shaders/CopyShader.js +52 -0
  238. package/Resources/WebLibraries/three/addons/shaders/DOFMipMapShader.js +63 -0
  239. package/Resources/WebLibraries/three/addons/shaders/DepthLimitedBlurShader.js +183 -0
  240. package/Resources/WebLibraries/three/addons/shaders/DigitalGlitch.js +104 -0
  241. package/Resources/WebLibraries/three/addons/shaders/DotScreenShader.js +75 -0
  242. package/Resources/WebLibraries/three/addons/shaders/ExposureShader.js +51 -0
  243. package/Resources/WebLibraries/three/addons/shaders/FXAAShader.js +298 -0
  244. package/Resources/WebLibraries/three/addons/shaders/FilmShader.js +73 -0
  245. package/Resources/WebLibraries/three/addons/shaders/FocusShader.js +94 -0
  246. package/Resources/WebLibraries/three/addons/shaders/FreiChenShader.js +103 -0
  247. package/Resources/WebLibraries/three/addons/shaders/GTAOShader.js +437 -0
  248. package/Resources/WebLibraries/three/addons/shaders/GammaCorrectionShader.js +52 -0
  249. package/Resources/WebLibraries/three/addons/shaders/HalftoneShader.js +332 -0
  250. package/Resources/WebLibraries/three/addons/shaders/HorizontalBlurShader.js +68 -0
  251. package/Resources/WebLibraries/three/addons/shaders/HorizontalTiltShiftShader.js +70 -0
  252. package/Resources/WebLibraries/three/addons/shaders/HueSaturationShader.js +74 -0
  253. package/Resources/WebLibraries/three/addons/shaders/KaleidoShader.js +65 -0
  254. package/Resources/WebLibraries/three/addons/shaders/LuminosityHighPassShader.js +68 -0
  255. package/Resources/WebLibraries/three/addons/shaders/LuminosityShader.js +54 -0
  256. package/Resources/WebLibraries/three/addons/shaders/MirrorShader.js +62 -0
  257. package/Resources/WebLibraries/three/addons/shaders/NormalMapShader.js +60 -0
  258. package/Resources/WebLibraries/three/addons/shaders/OutputShader.js +103 -0
  259. package/Resources/WebLibraries/three/addons/shaders/PoissonDenoiseShader.js +230 -0
  260. package/Resources/WebLibraries/three/addons/shaders/RGBShiftShader.js +61 -0
  261. package/Resources/WebLibraries/three/addons/shaders/SAOShader.js +201 -0
  262. package/Resources/WebLibraries/three/addons/shaders/SMAAShader.js +489 -0
  263. package/Resources/WebLibraries/three/addons/shaders/SSAOShader.js +331 -0
  264. package/Resources/WebLibraries/three/addons/shaders/SSRShader.js +396 -0
  265. package/Resources/WebLibraries/three/addons/shaders/SepiaShader.js +57 -0
  266. package/Resources/WebLibraries/three/addons/shaders/SobelOperatorShader.js +98 -0
  267. package/Resources/WebLibraries/three/addons/shaders/SubsurfaceScatteringShader.js +95 -0
  268. package/Resources/WebLibraries/three/addons/shaders/TechnicolorShader.js +51 -0
  269. package/Resources/WebLibraries/three/addons/shaders/ToonShader.js +349 -0
  270. package/Resources/WebLibraries/three/addons/shaders/TriangleBlurShader.js +79 -0
  271. package/Resources/WebLibraries/three/addons/shaders/UnpackDepthRGBAShader.js +60 -0
  272. package/Resources/WebLibraries/three/addons/shaders/VelocityShader.js +137 -0
  273. package/Resources/WebLibraries/three/addons/shaders/VerticalBlurShader.js +66 -0
  274. package/Resources/WebLibraries/three/addons/shaders/VerticalTiltShiftShader.js +70 -0
  275. package/Resources/WebLibraries/three/addons/shaders/VignetteShader.js +56 -0
  276. package/Resources/WebLibraries/three/addons/shaders/VolumeShader.js +285 -0
  277. package/Resources/WebLibraries/three/addons/shaders/WaterRefractionShader.js +106 -0
  278. package/Resources/WebLibraries/three/addons/textures/FlakesTexture.js +54 -0
  279. package/Resources/WebLibraries/three/addons/tsl/WebGLNodesHandler.js +607 -0
  280. package/Resources/WebLibraries/three/addons/tsl/display/AfterImageNode.js +256 -0
  281. package/Resources/WebLibraries/three/addons/tsl/display/AnaglyphPassNode.js +550 -0
  282. package/Resources/WebLibraries/three/addons/tsl/display/BilateralBlurNode.js +377 -0
  283. package/Resources/WebLibraries/three/addons/tsl/display/BleachBypass.js +33 -0
  284. package/Resources/WebLibraries/three/addons/tsl/display/BloomNode.js +599 -0
  285. package/Resources/WebLibraries/three/addons/tsl/display/CRT.js +150 -0
  286. package/Resources/WebLibraries/three/addons/tsl/display/ChromaticAberrationNode.js +163 -0
  287. package/Resources/WebLibraries/three/addons/tsl/display/DenoiseNode.js +354 -0
  288. package/Resources/WebLibraries/three/addons/tsl/display/DepthOfFieldNode.js +572 -0
  289. package/Resources/WebLibraries/three/addons/tsl/display/DotScreenNode.js +104 -0
  290. package/Resources/WebLibraries/three/addons/tsl/display/FSR1Node.js +481 -0
  291. package/Resources/WebLibraries/three/addons/tsl/display/FXAANode.js +357 -0
  292. package/Resources/WebLibraries/three/addons/tsl/display/FilmNode.js +101 -0
  293. package/Resources/WebLibraries/three/addons/tsl/display/GTAONode.js +727 -0
  294. package/Resources/WebLibraries/three/addons/tsl/display/GaussianBlurNode.js +412 -0
  295. package/Resources/WebLibraries/three/addons/tsl/display/GodraysNode.js +604 -0
  296. package/Resources/WebLibraries/three/addons/tsl/display/ImportanceSampledEnvironment.js +564 -0
  297. package/Resources/WebLibraries/three/addons/tsl/display/LensflareNode.js +282 -0
  298. package/Resources/WebLibraries/three/addons/tsl/display/Lut3DNode.js +109 -0
  299. package/Resources/WebLibraries/three/addons/tsl/display/MotionBlur.js +33 -0
  300. package/Resources/WebLibraries/three/addons/tsl/display/OITPassNode.js +341 -0
  301. package/Resources/WebLibraries/three/addons/tsl/display/OutlineNode.js +916 -0
  302. package/Resources/WebLibraries/three/addons/tsl/display/ParallaxBarrierPassNode.js +90 -0
  303. package/Resources/WebLibraries/three/addons/tsl/display/PixelationPassNode.js +227 -0
  304. package/Resources/WebLibraries/three/addons/tsl/display/RGBShiftNode.js +96 -0
  305. package/Resources/WebLibraries/three/addons/tsl/display/RecurrentDenoiseNode.js +812 -0
  306. package/Resources/WebLibraries/three/addons/tsl/display/RetroPassNode.js +263 -0
  307. package/Resources/WebLibraries/three/addons/tsl/display/SMAANode.js +729 -0
  308. package/Resources/WebLibraries/three/addons/tsl/display/SSAAPassNode.js +344 -0
  309. package/Resources/WebLibraries/three/addons/tsl/display/SSAONode.js +422 -0
  310. package/Resources/WebLibraries/three/addons/tsl/display/SSGINode.js +698 -0
  311. package/Resources/WebLibraries/three/addons/tsl/display/SSRNode.js +1430 -0
  312. package/Resources/WebLibraries/three/addons/tsl/display/SSSNode.js +479 -0
  313. package/Resources/WebLibraries/three/addons/tsl/display/Sepia.js +24 -0
  314. package/Resources/WebLibraries/three/addons/tsl/display/Shape.js +29 -0
  315. package/Resources/WebLibraries/three/addons/tsl/display/SharpenNode.js +284 -0
  316. package/Resources/WebLibraries/three/addons/tsl/display/SobelOperatorNode.js +168 -0
  317. package/Resources/WebLibraries/three/addons/tsl/display/StereoCompositePassNode.js +190 -0
  318. package/Resources/WebLibraries/three/addons/tsl/display/StereoPassNode.js +117 -0
  319. package/Resources/WebLibraries/three/addons/tsl/display/TAAUNode.js +700 -0
  320. package/Resources/WebLibraries/three/addons/tsl/display/TRAANode.js +609 -0
  321. package/Resources/WebLibraries/three/addons/tsl/display/TemporalReprojectNode.js +1024 -0
  322. package/Resources/WebLibraries/three/addons/tsl/display/TransitionNode.js +141 -0
  323. package/Resources/WebLibraries/three/addons/tsl/display/boxBlur.js +65 -0
  324. package/Resources/WebLibraries/three/addons/tsl/display/depthAwareBlend.js +80 -0
  325. package/Resources/WebLibraries/three/addons/tsl/display/depthAwareBlur.js +63 -0
  326. package/Resources/WebLibraries/three/addons/tsl/display/hashBlur.js +55 -0
  327. package/Resources/WebLibraries/three/addons/tsl/display/lensDirt.js +30 -0
  328. package/Resources/WebLibraries/three/addons/tsl/display/radialBlur.js +68 -0
  329. package/Resources/WebLibraries/three/addons/tsl/lighting/ClusteredLightsNode.js +994 -0
  330. package/Resources/WebLibraries/three/addons/tsl/lighting/DynamicLightsNode.js +201 -0
  331. package/Resources/WebLibraries/three/addons/tsl/lighting/LightProbeGridNode.js +183 -0
  332. package/Resources/WebLibraries/three/addons/tsl/lighting/data/AmbientLightDataNode.js +67 -0
  333. package/Resources/WebLibraries/three/addons/tsl/lighting/data/DirectionalLightDataNode.js +117 -0
  334. package/Resources/WebLibraries/three/addons/tsl/lighting/data/HemisphereLightDataNode.js +105 -0
  335. package/Resources/WebLibraries/three/addons/tsl/lighting/data/PointLightDataNode.js +140 -0
  336. package/Resources/WebLibraries/three/addons/tsl/lighting/data/SpotLightDataNode.js +167 -0
  337. package/Resources/WebLibraries/three/addons/tsl/math/Bayer.js +84 -0
  338. package/Resources/WebLibraries/three/addons/tsl/math/curlNoise.js +107 -0
  339. package/Resources/WebLibraries/three/addons/tsl/math/voronoiNoise.js +112 -0
  340. package/Resources/WebLibraries/three/addons/tsl/shadows/TileShadowNode.js +542 -0
  341. package/Resources/WebLibraries/three/addons/tsl/shadows/TileShadowNodeHelper.js +212 -0
  342. package/Resources/WebLibraries/three/addons/tsl/utils/GroundedSkybox.js +62 -0
  343. package/Resources/WebLibraries/three/addons/tsl/utils/RNoise.js +51 -0
  344. package/Resources/WebLibraries/three/addons/tsl/utils/Raymarching.js +70 -0
  345. package/Resources/WebLibraries/three/addons/tsl/utils/SoftParticles.js +53 -0
  346. package/Resources/WebLibraries/three/addons/tsl/utils/SpecularHelpers.js +302 -0
  347. package/Resources/WebLibraries/three/addons/tsl/utils/TAAUtils.js +184 -0
  348. package/Resources/WebLibraries/three/addons/utils/BufferGeometryUtils.js +1523 -0
  349. package/Resources/WebLibraries/three/addons/utils/CameraUtils.js +82 -0
  350. package/Resources/WebLibraries/three/addons/utils/ColorUtils.js +76 -0
  351. package/Resources/WebLibraries/three/addons/utils/GaussianSplatUtils.js +229 -0
  352. package/Resources/WebLibraries/three/addons/utils/GeometryCompressionUtils.js +547 -0
  353. package/Resources/WebLibraries/three/addons/utils/GeometryUtils.js +226 -0
  354. package/Resources/WebLibraries/three/addons/utils/LDrawUtils.js +211 -0
  355. package/Resources/WebLibraries/three/addons/utils/SceneOptimizer.js +459 -0
  356. package/Resources/WebLibraries/three/addons/utils/SceneUtils.js +363 -0
  357. package/Resources/WebLibraries/three/addons/utils/ShadowMapViewer.js +244 -0
  358. package/Resources/WebLibraries/three/addons/utils/ShadowMapViewerGPU.js +233 -0
  359. package/Resources/WebLibraries/three/addons/utils/SkeletonUtils.js +496 -0
  360. package/Resources/WebLibraries/three/addons/utils/SortUtils.js +175 -0
  361. package/Resources/WebLibraries/three/addons/utils/UVsDebug.js +173 -0
  362. package/Resources/WebLibraries/three/addons/utils/WebGLTextureUtils.js +115 -0
  363. package/Resources/WebLibraries/three/addons/utils/WebGPUTextureUtils.js +81 -0
  364. package/Resources/WebLibraries/three/addons/utils/WorkerPool.js +167 -0
  365. package/Resources/WebLibraries/three/addons/utils/unwrapUVs.js +865 -0
  366. package/Resources/WebLibraries/three/three.core.js +61162 -0
  367. package/Resources/WebLibraries/three/three.module.js +19537 -0
  368. package/Resources/WebLibraries/three/three.tsl.js +41903 -0
  369. package/Resources/WebLibraries/three/three.webgpu.js +53714 -0
  370. package/Resources/share-rules.json +64 -0
  371. package/Resources/skills/2d-game/SKILL.md +305 -0
  372. package/Resources/skills/3d-game/SKILL.md +274 -0
  373. package/Resources/skills/accounts/SKILL.md +41 -0
  374. package/Resources/skills/android-design/SKILL.md +159 -0
  375. package/Resources/skills/app-ai/SKILL.md +154 -0
  376. package/Resources/skills/app-intents/SKILL.md +31 -0
  377. package/Resources/skills/app-kinds/SKILL.md +122 -0
  378. package/Resources/skills/apple-watch/SKILL.md +43 -0
  379. package/Resources/skills/assets/SKILL.md +183 -0
  380. package/Resources/skills/building-blocks/SKILL.md +97 -0
  381. package/Resources/skills/device-control/SKILL.md +56 -0
  382. package/Resources/skills/device-integrations/SKILL.md +278 -0
  383. package/Resources/skills/finder-files/SKILL.md +19 -0
  384. package/Resources/skills/game/SKILL.md +416 -0
  385. package/Resources/skills/game-3d/SKILL.md +12 -0
  386. package/Resources/skills/game-art/SKILL.md +11 -0
  387. package/Resources/skills/game-feel/SKILL.md +13 -0
  388. package/Resources/skills/game-levels/SKILL.md +12 -0
  389. package/Resources/skills/game-live/SKILL.md +12 -0
  390. package/Resources/skills/game-physics/SKILL.md +13 -0
  391. package/Resources/skills/game-playtest/SKILL.md +26 -0
  392. package/Resources/skills/game-ui/SKILL.md +278 -0
  393. package/Resources/skills/github-projects/SKILL.md +62 -0
  394. package/Resources/skills/icloud-sync/SKILL.md +30 -0
  395. package/Resources/skills/iphone-hardware/SKILL.md +57 -0
  396. package/Resources/skills/iphone-widgets/SKILL.md +53 -0
  397. package/Resources/skills/lg-developer-mode/SKILL.md +152 -0
  398. package/Resources/skills/mac-widgets/SKILL.md +60 -0
  399. package/Resources/skills/maps/SKILL.md +8 -0
  400. package/Resources/skills/menu-bar/SKILL.md +36 -0
  401. package/Resources/skills/more-apps/SKILL.md +53 -0
  402. package/Resources/skills/phone-controllers/SKILL.md +79 -0
  403. package/Resources/skills/phone-pages/SKILL.md +173 -0
  404. package/Resources/skills/roku-developer-mode/SKILL.md +106 -0
  405. package/Resources/skills/scene-3d/SKILL.md +27 -0
  406. package/Resources/skills/scripting/SKILL.md +17 -0
  407. package/Resources/skills/share-extension/SKILL.md +22 -0
  408. package/Resources/skills/tv-design/SKILL.md +72 -0
  409. package/Resources/skills/web-app/SKILL.md +170 -0
  410. package/Resources/skills/web-game/SKILL.md +95 -0
  411. package/Resources/skills/web-or-native/SKILL.md +108 -0
  412. package/Resources/skills/wish-links/SKILL.md +156 -0
  413. package/THIRD_PARTY_NOTICES.md +170 -0
  414. package/cli/ai.mjs +237 -0
  415. package/cli/android.mjs +941 -0
  416. package/cli/app-ai.mjs +473 -0
  417. package/cli/browser.mjs +284 -0
  418. package/cli/calls.mjs +594 -0
  419. package/cli/dev.mjs +820 -0
  420. package/cli/devices.mjs +984 -0
  421. package/cli/lamp.mjs +1326 -0
  422. package/cli/lampapp.mjs +332 -0
  423. package/cli/lamps/android-host/LampPageGateway.kt +345 -0
  424. package/cli/lamps/android-host/app/build.gradle.kts +40 -0
  425. package/cli/lamps/android-host/build.gradle.kts +4 -0
  426. package/cli/lamps/android-host/game/AndroidManifest.xml +33 -0
  427. package/cli/lamps/android-host/game/MainActivity.kt +173 -0
  428. package/cli/lamps/android-host/gradle/libs.versions.toml +39 -0
  429. package/cli/lamps/android-host/gradle.properties +8 -0
  430. package/cli/lamps/android-host/page/AndroidManifest.xml +35 -0
  431. package/cli/lamps/android-host/page/MainActivity.kt +193 -0
  432. package/cli/lamps/android-host/settings.gradle.kts +30 -0
  433. package/cli/lamps/android-host/tools.json +43 -0
  434. package/cli/lamps/lamp-controllers.js +2 -0
  435. package/cli/lamps/lamp-for-games.js +6922 -0
  436. package/cli/lamps/lamp.js +7082 -0
  437. package/cli/lamps/mac-starter/.lamp/meta.json +1 -0
  438. package/cli/lamps/mac-starter/APP.md +12 -0
  439. package/cli/lamps/mac-starter/Package.swift +8 -0
  440. package/cli/lamps/mac-starter/Sources/App.swift +11 -0
  441. package/cli/lamps/mac-starter/Sources/ContentView.swift +17 -0
  442. package/cli/lamps/mac-starter/Sources/LampSupport.swift +18215 -0
  443. package/cli/lamps/mac-starter/build.sh +336 -0
  444. package/cli/lamps/mac-starter/gitignore +3 -0
  445. package/cli/lamps/mac-starter/lamp-starter.json +6 -0
  446. package/cli/lamps/web-starter/APP.md +8 -0
  447. package/cli/lamps/web-starter/app.js +1 -0
  448. package/cli/lamps/web-starter/index.html +17 -0
  449. package/cli/lamps/web-starter/lamp-starter.json +5 -0
  450. package/cli/lamps/web-starter/lamp.js +7082 -0
  451. package/cli/lamps/web-starter/style.css +25 -0
  452. package/cli/link.mjs +202 -0
  453. package/cli/local-ai.mjs +193 -0
  454. package/cli/mac.mjs +621 -0
  455. package/cli/mdns.mjs +205 -0
  456. package/cli/msix.mjs +413 -0
  457. package/cli/network.mjs +209 -0
  458. package/cli/openrouter.mjs +133 -0
  459. package/cli/outside.mjs +203 -0
  460. package/cli/page.js +317 -0
  461. package/cli/place.mjs +298 -0
  462. package/cli/png.mjs +184 -0
  463. package/cli/share.mjs +270 -0
  464. package/cli/skill/SKILL.md +280 -0
  465. package/cli/skills.mjs +71 -0
  466. package/cli/state.mjs +176 -0
  467. package/cli/update.mjs +162 -0
  468. package/package.json +20 -4
  469. package/site/lib/quota.js +59 -0
  470. package/site/lib/shared-wishes.js +1727 -0
@@ -0,0 +1,916 @@
1
+ import { DepthTexture, FloatType, RenderTarget, Vector2, Node, QuadMesh, NodeMaterial, SpriteNodeMaterial, RendererUtils, NodeUpdateType } from 'three/webgpu';
2
+ import { Loop, int, exp, min, float, mul, uv, vec2, vec3, Fn, textureSize, orthographicDepthToViewZ, screenUV, nodeObject, uniform, vec4, passTexture, texture, perspectiveDepthToViewZ, positionView, reference, color } from 'three/tsl';
3
+
4
+ const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
+ const _size = /*@__PURE__*/ new Vector2();
6
+ const _BLUR_DIRECTION_X = /*@__PURE__*/ new Vector2( 1.0, 0.0 );
7
+ const _BLUR_DIRECTION_Y = /*@__PURE__*/ new Vector2( 0.0, 1.0 );
8
+
9
+ let _rendererState;
10
+
11
+ /**
12
+ * Post processing node for rendering outlines around selected objects. The node
13
+ * gives you great flexibility in composing the final outline look depending on
14
+ * your requirements.
15
+ * ```js
16
+ * const renderPipeline = new THREE.RenderPipeline( renderer );
17
+ *
18
+ * const scenePass = pass( scene, camera );
19
+ *
20
+ * // outline parameter
21
+ *
22
+ * const edgeStrength = uniform( 3.0 );
23
+ * const edgeGlow = uniform( 0.0 );
24
+ * const edgeThickness = uniform( 1.0 );
25
+ * const visibleEdgeColor = uniform( new THREE.Color( 0xffffff ) );
26
+ * const hiddenEdgeColor = uniform( new THREE.Color( 0x4e3636 ) );
27
+ *
28
+ * outlinePass = outline( scene, camera, {
29
+ * selectedObjects,
30
+ * edgeGlow,
31
+ * edgeThickness
32
+ * } );
33
+ *
34
+ * // compose custom outline
35
+ *
36
+ * const { visibleEdge, hiddenEdge } = outlinePass;
37
+ * const outlineColor = visibleEdge.mul( visibleEdgeColor ).add( hiddenEdge.mul( hiddenEdgeColor ) ).mul( edgeStrength );
38
+ *
39
+ * renderPipeline.outputNode = outlineColor.add( scenePass );
40
+ * ```
41
+ *
42
+ * @augments Node
43
+ * @three_import import { outline } from 'three/addons/tsl/display/OutlineNode.js';
44
+ */
45
+ class OutlineNode extends Node {
46
+
47
+ static get type() {
48
+
49
+ return 'OutlineNode';
50
+
51
+ }
52
+
53
+ /**
54
+ * Constructs a new outline node.
55
+ *
56
+ * @param {Scene} scene - A reference to the scene.
57
+ * @param {Camera} camera - The camera the scene is rendered with.
58
+ * @param {Object} params - The configuration parameters.
59
+ * @param {Array<Object3D>} [params.selectedObjects] - An array of selected objects.
60
+ * @param {Node<float>} [params.edgeThickness=float(1)] - The thickness of the edges.
61
+ * @param {Node<float>} [params.edgeGlow=float(0)] - Can be used for an animated glow/pulse effects.
62
+ * @param {number} [params.downSampleRatio=2] - The downsample ratio.
63
+ */
64
+ constructor( scene, camera, params = {} ) {
65
+
66
+ super( 'vec4' );
67
+
68
+ const {
69
+ selectedObjects = [],
70
+ edgeThickness = float( 1 ),
71
+ edgeGlow = float( 0 ),
72
+ downSampleRatio = 2
73
+ } = params;
74
+
75
+ /**
76
+ * A reference to the scene.
77
+ *
78
+ * @type {Scene}
79
+ */
80
+ this.scene = scene;
81
+
82
+ /**
83
+ * The camera the scene is rendered with.
84
+ *
85
+ * @type {Camera}
86
+ */
87
+ this.camera = camera;
88
+
89
+ /**
90
+ * An array of selected objects.
91
+ *
92
+ * @type {Array<Object3D>}
93
+ */
94
+ this.selectedObjects = selectedObjects;
95
+
96
+ /**
97
+ * The thickness of the edges.
98
+ *
99
+ * @type {Node<float>}
100
+ */
101
+ this.edgeThicknessNode = nodeObject( edgeThickness );
102
+
103
+ /**
104
+ * Can be used for an animated glow/pulse effect.
105
+ *
106
+ * @type {Node<float>}
107
+ */
108
+ this.edgeGlowNode = nodeObject( edgeGlow );
109
+
110
+ /**
111
+ * The downsample ratio.
112
+ *
113
+ * @type {number}
114
+ * @default 2
115
+ */
116
+ this.downSampleRatio = downSampleRatio;
117
+
118
+ /**
119
+ * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
120
+ * its effect once per frame in `updateBefore()`.
121
+ *
122
+ * @type {string}
123
+ * @default 'frame'
124
+ */
125
+ this.updateBeforeType = NodeUpdateType.FRAME;
126
+
127
+ // render targets
128
+
129
+ /**
130
+ * The render target for the depth pre-pass.
131
+ *
132
+ * @private
133
+ * @type {RenderTarget}
134
+ */
135
+ this._renderTargetDepthBuffer = new RenderTarget();
136
+ this._renderTargetDepthBuffer.depthTexture = new DepthTexture();
137
+ this._renderTargetDepthBuffer.depthTexture.type = FloatType;
138
+
139
+ /**
140
+ * The render target for the mask pass.
141
+ *
142
+ * @private
143
+ * @type {RenderTarget}
144
+ */
145
+ this._renderTargetMaskBuffer = new RenderTarget();
146
+
147
+ /**
148
+ * The render target for the mask downsample.
149
+ *
150
+ * @private
151
+ * @type {RenderTarget}
152
+ */
153
+ this._renderTargetMaskDownSampleBuffer = new RenderTarget( 1, 1, { depthBuffer: false } );
154
+
155
+ /**
156
+ * The first render target for the edge detection.
157
+ *
158
+ * @private
159
+ * @type {RenderTarget}
160
+ */
161
+ this._renderTargetEdgeBuffer1 = new RenderTarget( 1, 1, { depthBuffer: false } );
162
+
163
+ /**
164
+ * The second render target for the edge detection.
165
+ *
166
+ * @private
167
+ * @type {RenderTarget}
168
+ */
169
+ this._renderTargetEdgeBuffer2 = new RenderTarget( 1, 1, { depthBuffer: false } );
170
+
171
+ /**
172
+ * The first render target for the blur pass.
173
+ *
174
+ * @private
175
+ * @type {RenderTarget}
176
+ */
177
+ this._renderTargetBlurBuffer1 = new RenderTarget( 1, 1, { depthBuffer: false } );
178
+
179
+ /**
180
+ * The second render target for the blur pass.
181
+ *
182
+ * @private
183
+ * @type {RenderTarget}
184
+ */
185
+ this._renderTargetBlurBuffer2 = new RenderTarget( 1, 1, { depthBuffer: false } );
186
+
187
+ /**
188
+ * The render target for the final composite.
189
+ *
190
+ * @private
191
+ * @type {RenderTarget}
192
+ */
193
+ this._renderTargetComposite = new RenderTarget( 1, 1, { depthBuffer: false } );
194
+
195
+ // uniforms
196
+
197
+ /**
198
+ * Represents the near value of the scene's camera.
199
+ *
200
+ * @private
201
+ * @type {ReferenceNode<float>}
202
+ */
203
+ this._cameraNear = reference( 'near', 'float', camera );
204
+
205
+ /**
206
+ * Represents the far value of the scene's camera.
207
+ *
208
+ * @private
209
+ * @type {ReferenceNode<float>}
210
+ */
211
+ this._cameraFar = reference( 'far', 'float', camera );
212
+
213
+ /**
214
+ * Uniform that represents the blur direction of the pass.
215
+ *
216
+ * @private
217
+ * @type {UniformNode<vec2>}
218
+ */
219
+ this._blurDirection = uniform( new Vector2() );
220
+
221
+ /**
222
+ * Texture node that holds the data from the depth pre-pass.
223
+ *
224
+ * @private
225
+ * @type {TextureNode}
226
+ */
227
+ this._depthTextureUniform = texture( this._renderTargetDepthBuffer.depthTexture );
228
+
229
+ /**
230
+ * Texture node that holds the data from the mask pass.
231
+ *
232
+ * @private
233
+ * @type {TextureNode}
234
+ */
235
+ this._maskTextureUniform = texture( this._renderTargetMaskBuffer.texture );
236
+
237
+ /**
238
+ * Texture node that holds the data from the mask downsample pass.
239
+ *
240
+ * @private
241
+ * @type {TextureNode}
242
+ */
243
+ this._maskTextureDownsSampleUniform = texture( this._renderTargetMaskDownSampleBuffer.texture );
244
+
245
+ /**
246
+ * Texture node that holds the data from the first edge detection pass.
247
+ *
248
+ * @private
249
+ * @type {TextureNode}
250
+ */
251
+ this._edge1TextureUniform = texture( this._renderTargetEdgeBuffer1.texture );
252
+
253
+ /**
254
+ * Texture node that holds the data from the second edge detection pass.
255
+ *
256
+ * @private
257
+ * @type {TextureNode}
258
+ */
259
+ this._edge2TextureUniform = texture( this._renderTargetEdgeBuffer2.texture );
260
+
261
+ /**
262
+ * Texture node that holds the current blurred color data.
263
+ *
264
+ * @private
265
+ * @type {TextureNode}
266
+ */
267
+ this._blurColorTextureUniform = texture( this._renderTargetEdgeBuffer1.texture );
268
+
269
+ // constants
270
+
271
+ /**
272
+ * Visible edge color.
273
+ *
274
+ * @private
275
+ * @type {Node<vec3>}
276
+ */
277
+ this._visibleEdgeColor = vec3( 1, 0, 0 );
278
+
279
+ /**
280
+ * Hidden edge color.
281
+ *
282
+ * @private
283
+ * @type {Node<vec3>}
284
+ */
285
+ this._hiddenEdgeColor = vec3( 0, 1, 0 );
286
+
287
+ // materials
288
+
289
+ /**
290
+ * The material for the depth pre-pass.
291
+ *
292
+ * @private
293
+ * @type {NodeMaterial}
294
+ */
295
+ this._depthMaterial = new NodeMaterial();
296
+ this._depthMaterial.colorNode = color( 0, 0, 0 );
297
+ this._depthMaterial.name = 'OutlineNode.depth';
298
+
299
+ this._depthSpriteMaterial = new SpriteNodeMaterial();
300
+ this._depthSpriteMaterial.colorNode = color( 0, 0, 0 );
301
+ this._depthSpriteMaterial.name = 'OutlineNode.depthSprite';
302
+
303
+ /**
304
+ * The material for preparing the mask.
305
+ *
306
+ * @private
307
+ * @type {NodeMaterial}
308
+ */
309
+ this._prepareMaskMaterial = new NodeMaterial();
310
+ this._prepareMaskMaterial.name = 'OutlineNode.prepareMask';
311
+
312
+ this._prepareMaskSpriteMaterial = new SpriteNodeMaterial();
313
+ this._prepareMaskSpriteMaterial.name = 'OutlineNode.prepareMaskSprite';
314
+
315
+ /**
316
+ * The copy material
317
+ *
318
+ * @private
319
+ * @type {NodeMaterial}
320
+ */
321
+ this._materialCopy = new NodeMaterial();
322
+ this._materialCopy.name = 'OutlineNode.copy';
323
+
324
+ /**
325
+ * The edge detection material.
326
+ *
327
+ * @private
328
+ * @type {NodeMaterial}
329
+ */
330
+ this._edgeDetectionMaterial = new NodeMaterial();
331
+ this._edgeDetectionMaterial.name = 'OutlineNode.edgeDetection';
332
+
333
+ /**
334
+ * The material that is used to render in the blur pass.
335
+ *
336
+ * @private
337
+ * @type {NodeMaterial}
338
+ */
339
+ this._separableBlurMaterial = new NodeMaterial();
340
+ this._separableBlurMaterial.name = 'OutlineNode.separableBlur';
341
+
342
+ /**
343
+ * The material that is used to render in the blur pass.
344
+ *
345
+ * @private
346
+ * @type {NodeMaterial}
347
+ */
348
+ this._separableBlurMaterial2 = new NodeMaterial();
349
+ this._separableBlurMaterial2.name = 'OutlineNode.separableBlur2';
350
+
351
+ /**
352
+ * The final composite material.
353
+ *
354
+ * @private
355
+ * @type {NodeMaterial}
356
+ */
357
+ this._compositeMaterial = new NodeMaterial();
358
+ this._compositeMaterial.name = 'OutlineNode.composite';
359
+
360
+ /**
361
+ * An internal cache for depth materials.
362
+ *
363
+ * @private
364
+ * @type {Map<Material, NodeMaterial>}
365
+ */
366
+ this._depthMaterialCache = new Map();
367
+
368
+ /**
369
+ * An internal cache for mask materials.
370
+ *
371
+ * @private
372
+ * @type {Map<Material, NodeMaterial>}
373
+ */
374
+ this._prepareMaskMaterialCache = new Map();
375
+
376
+ /**
377
+ * Disposes the pass materials of a disposed material.
378
+ *
379
+ * @private
380
+ * @type {Function}
381
+ */
382
+ this._onMaterialDispose = ( event ) => {
383
+
384
+ const originalMaterial = event.target;
385
+
386
+ originalMaterial.removeEventListener( 'dispose', this._onMaterialDispose );
387
+
388
+ for ( const cache of [ this._depthMaterialCache, this._prepareMaskMaterialCache ] ) {
389
+
390
+ const passMaterial = cache.get( originalMaterial );
391
+
392
+ if ( passMaterial !== undefined ) {
393
+
394
+ passMaterial.dispose();
395
+ cache.delete( originalMaterial );
396
+
397
+ }
398
+
399
+ }
400
+
401
+ };
402
+
403
+ /**
404
+ * A set to cache selected objects in the scene.
405
+ *
406
+ * @private
407
+ * @type {Set<Object3D>}
408
+ */
409
+ this._selectionCache = new Set();
410
+
411
+ /**
412
+ * The number of selected objects from the previous frame. Used to detect
413
+ * the transition to an empty selection so the composite render target can
414
+ * be cleared once and avoid leaving a stale outline on screen.
415
+ *
416
+ * @private
417
+ * @type {number}
418
+ * @default 0
419
+ */
420
+ this._lastSelectionCount = 0;
421
+
422
+ /**
423
+ * The result of the effect is represented as a separate texture node.
424
+ *
425
+ * @private
426
+ * @type {PassTextureNode}
427
+ */
428
+ this._textureNode = passTexture( this, this._renderTargetComposite.texture );
429
+
430
+ }
431
+
432
+ /**
433
+ * A mask value that represents the visible edge.
434
+ *
435
+ * @return {Node<float>} The visible edge.
436
+ */
437
+ get visibleEdge() {
438
+
439
+ return this.r;
440
+
441
+ }
442
+
443
+ /**
444
+ * A mask value that represents the hidden edge.
445
+ *
446
+ * @return {Node<float>} The hidden edge.
447
+ */
448
+ get hiddenEdge() {
449
+
450
+ return this.g;
451
+
452
+ }
453
+
454
+ /**
455
+ * Returns the result of the effect as a texture node.
456
+ *
457
+ * @return {PassTextureNode} A texture node that represents the result of the effect.
458
+ */
459
+ getTextureNode() {
460
+
461
+ return this._textureNode;
462
+
463
+ }
464
+
465
+ /**
466
+ * Sets the size of the effect.
467
+ *
468
+ * @param {number} width - The width of the effect.
469
+ * @param {number} height - The height of the effect.
470
+ */
471
+ setSize( width, height ) {
472
+
473
+ this._renderTargetDepthBuffer.setSize( width, height );
474
+ this._renderTargetMaskBuffer.setSize( width, height );
475
+ this._renderTargetComposite.setSize( width, height );
476
+
477
+ // downsample 1
478
+
479
+ let resx = Math.round( width / this.downSampleRatio );
480
+ let resy = Math.round( height / this.downSampleRatio );
481
+
482
+ this._renderTargetMaskDownSampleBuffer.setSize( resx, resy );
483
+ this._renderTargetEdgeBuffer1.setSize( resx, resy );
484
+ this._renderTargetBlurBuffer1.setSize( resx, resy );
485
+
486
+ // downsample 2
487
+
488
+ resx = Math.round( resx / 2 );
489
+ resy = Math.round( resy / 2 );
490
+
491
+ this._renderTargetEdgeBuffer2.setSize( resx, resy );
492
+ this._renderTargetBlurBuffer2.setSize( resx, resy );
493
+
494
+ }
495
+
496
+ /**
497
+ * This method is used to render the effect once per frame.
498
+ *
499
+ * @param {NodeFrame} frame - The current node frame.
500
+ */
501
+ updateBefore( frame ) {
502
+
503
+ const { renderer } = frame;
504
+ const { camera, scene } = this;
505
+
506
+ this._updateSelectionCache();
507
+
508
+ // If no objects are selected, all subsequent passes can be skipped since
509
+ // the outline would be empty anyway. The composite render target is cleared
510
+ // once when transitioning to an empty selection so a previously rendered
511
+ // outline does not linger on screen.
512
+
513
+ if ( this._selectionCache.size === 0 ) {
514
+
515
+ if ( this._lastSelectionCount > 0 ) {
516
+
517
+ _rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
518
+
519
+ renderer.setRenderTarget( this._renderTargetComposite );
520
+ renderer.setClearColor( 0x000000, 0 );
521
+ renderer.clear();
522
+
523
+ RendererUtils.restoreRendererState( renderer, _rendererState );
524
+
525
+ this._lastSelectionCount = 0;
526
+
527
+ }
528
+
529
+ return;
530
+
531
+ }
532
+
533
+ this._lastSelectionCount = this._selectionCache.size;
534
+
535
+ _rendererState = RendererUtils.resetRendererAndSceneState( renderer, scene, _rendererState );
536
+
537
+ //
538
+
539
+ const size = renderer.getDrawingBufferSize( _size );
540
+ this.setSize( size.width, size.height );
541
+
542
+ //
543
+
544
+ renderer.setClearColor( 0xffffff, 1 );
545
+
546
+ const currentSceneName = scene.name;
547
+
548
+ // 1. Draw non-selected objects in the depth buffer
549
+
550
+ renderer.setRenderTarget( this._renderTargetDepthBuffer );
551
+ renderer.setRenderObjectFunction( ( object, scene, camera, geometry, material, group, lightsNode, clippingContext ) => {
552
+
553
+ if ( this._selectionCache.has( object ) === false ) {
554
+
555
+ const baseMaterial = object.isSprite ? this._depthSpriteMaterial : this._depthMaterial;
556
+ const overrideMaterial = this._getPassMaterial( this._depthMaterialCache, baseMaterial, material );
557
+
558
+ renderer.renderObject( object, scene, camera, geometry, overrideMaterial, group, lightsNode, clippingContext );
559
+
560
+ }
561
+
562
+ } );
563
+
564
+ scene.name = 'Outline [ Non-Selected Objects Pass ]';
565
+ renderer.render( scene, camera );
566
+
567
+ // 2. Draw only the selected objects by comparing the depth buffer of non-selected objects
568
+
569
+ renderer.setRenderTarget( this._renderTargetMaskBuffer );
570
+ renderer.setRenderObjectFunction( ( object, scene, camera, geometry, material, group, lightsNode, clippingContext ) => {
571
+
572
+ if ( this._selectionCache.has( object ) === true ) {
573
+
574
+ const baseMaterial = object.isSprite ? this._prepareMaskSpriteMaterial : this._prepareMaskMaterial;
575
+ const overrideMaterial = this._getPassMaterial( this._prepareMaskMaterialCache, baseMaterial, material );
576
+
577
+ renderer.renderObject( object, scene, camera, geometry, overrideMaterial, group, lightsNode, clippingContext );
578
+
579
+ }
580
+
581
+ } );
582
+
583
+ scene.name = 'Outline [ Selected Objects Pass ]';
584
+ renderer.render( scene, camera );
585
+
586
+ //
587
+
588
+ renderer.setRenderObjectFunction( _rendererState.renderObjectFunction );
589
+
590
+ this._selectionCache.clear();
591
+
592
+ scene.name = currentSceneName;
593
+
594
+ // 3. Downsample to (at least) half resolution
595
+
596
+ _quadMesh.material = this._materialCopy;
597
+ _quadMesh.name = 'Outline [ Downsample ]';
598
+ renderer.setRenderTarget( this._renderTargetMaskDownSampleBuffer );
599
+ _quadMesh.render( renderer );
600
+
601
+ // 4. Perform edge detection (half resolution)
602
+
603
+ _quadMesh.material = this._edgeDetectionMaterial;
604
+ _quadMesh.name = 'Outline [ Edge Detection ]';
605
+ renderer.setRenderTarget( this._renderTargetEdgeBuffer1 );
606
+ _quadMesh.render( renderer );
607
+
608
+ // 5. Apply blur (half resolution)
609
+
610
+ this._blurColorTextureUniform.value = this._renderTargetEdgeBuffer1.texture;
611
+ this._blurDirection.value.copy( _BLUR_DIRECTION_X );
612
+
613
+ _quadMesh.material = this._separableBlurMaterial;
614
+ _quadMesh.name = 'Outline [ Blur Half Resolution ]';
615
+ renderer.setRenderTarget( this._renderTargetBlurBuffer1 );
616
+ _quadMesh.render( renderer );
617
+
618
+ this._blurColorTextureUniform.value = this._renderTargetBlurBuffer1.texture;
619
+ this._blurDirection.value.copy( _BLUR_DIRECTION_Y );
620
+
621
+ renderer.setRenderTarget( this._renderTargetEdgeBuffer1 );
622
+ _quadMesh.render( renderer );
623
+
624
+ // 6. Apply blur (quarter resolution)
625
+
626
+ this._blurColorTextureUniform.value = this._renderTargetEdgeBuffer1.texture;
627
+ this._blurDirection.value.copy( _BLUR_DIRECTION_X );
628
+
629
+ _quadMesh.material = this._separableBlurMaterial2;
630
+ _quadMesh.name = 'Outline [ Blur Quarter Resolution ]';
631
+ renderer.setRenderTarget( this._renderTargetBlurBuffer2 );
632
+ _quadMesh.render( renderer );
633
+
634
+ this._blurColorTextureUniform.value = this._renderTargetBlurBuffer2.texture;
635
+ this._blurDirection.value.copy( _BLUR_DIRECTION_Y );
636
+
637
+ renderer.setRenderTarget( this._renderTargetEdgeBuffer2 );
638
+ _quadMesh.render( renderer );
639
+
640
+ // 7. Composite
641
+
642
+ _quadMesh.material = this._compositeMaterial;
643
+ _quadMesh.name = 'Outline [ Blur Quarter Resolution ]';
644
+ renderer.setRenderTarget( this._renderTargetComposite );
645
+ _quadMesh.render( renderer );
646
+
647
+ // restore
648
+
649
+ RendererUtils.restoreRendererAndSceneState( renderer, scene, _rendererState );
650
+
651
+ }
652
+
653
+ /**
654
+ * This method is used to setup the effect's TSL code.
655
+ *
656
+ * @param {NodeBuilder} builder - The current node builder.
657
+ * @return {PassTextureNode}
658
+ */
659
+ setup() {
660
+
661
+ // prepare mask material
662
+
663
+ const prepareMask = () => {
664
+
665
+ const depth = this._depthTextureUniform.sample( screenUV );
666
+
667
+ let viewZNode;
668
+
669
+ if ( this.camera.isPerspectiveCamera ) {
670
+
671
+ viewZNode = perspectiveDepthToViewZ( depth, this._cameraNear, this._cameraFar );
672
+
673
+ } else {
674
+
675
+ viewZNode = orthographicDepthToViewZ( depth, this._cameraNear, this._cameraFar );
676
+
677
+ }
678
+
679
+ const depthTest = positionView.z.lessThanEqual( viewZNode ).select( 1, 0 );
680
+ return vec3( 0.0, depthTest, 1.0 );
681
+
682
+ };
683
+
684
+ this._prepareMaskMaterial.colorNode = prepareMask();
685
+ this._prepareMaskMaterial.needsUpdate = true;
686
+
687
+ this._prepareMaskSpriteMaterial.colorNode = prepareMask();
688
+ this._prepareMaskSpriteMaterial.needsUpdate = true;
689
+
690
+ // copy material
691
+
692
+ this._materialCopy.fragmentNode = this._maskTextureUniform;
693
+ this._materialCopy.needsUpdate = true;
694
+
695
+ // edge detection material
696
+
697
+ const edgeDetection = Fn( () => {
698
+
699
+ const resolution = textureSize( this._maskTextureDownsSampleUniform );
700
+ const invSize = vec2( 1 ).div( resolution ).toVar();
701
+ const uvOffset = vec4( 1.0, 0.0, 0.0, 1.0 ).mul( vec4( invSize, invSize ) );
702
+
703
+ const uvNode = uv();
704
+ const c1 = this._maskTextureDownsSampleUniform.sample( uvNode.add( uvOffset.xy ) ).toVar();
705
+ const c2 = this._maskTextureDownsSampleUniform.sample( uvNode.sub( uvOffset.xy ) ).toVar();
706
+ const c3 = this._maskTextureDownsSampleUniform.sample( uvNode.add( uvOffset.yw ) ).toVar();
707
+ const c4 = this._maskTextureDownsSampleUniform.sample( uvNode.sub( uvOffset.yw ) ).toVar();
708
+
709
+ const diff1 = mul( c1.r.sub( c2.r ), 0.5 );
710
+ const diff2 = mul( c3.r.sub( c4.r ), 0.5 );
711
+ const d = vec2( diff1, diff2 ).length();
712
+ const a1 = min( c1.g, c2.g );
713
+ const a2 = min( c3.g, c4.g );
714
+ const visibilityFactor = min( a1, a2 );
715
+ const edgeColor = visibilityFactor.oneMinus().greaterThan( 0.001 ).select( this._visibleEdgeColor, this._hiddenEdgeColor );
716
+ return vec4( edgeColor, 1 ).mul( d );
717
+
718
+ } );
719
+
720
+ this._edgeDetectionMaterial.fragmentNode = edgeDetection();
721
+ this._edgeDetectionMaterial.needsUpdate = true;
722
+
723
+ // separable blur material
724
+
725
+ const MAX_RADIUS = 4;
726
+
727
+ const gaussianPdf = Fn( ( [ x, sigma ] ) => {
728
+
729
+ return float( 0.39894 ).mul( exp( float( - 0.5 ).mul( x ).mul( x ).div( sigma.mul( sigma ) ) ).div( sigma ) );
730
+
731
+ } );
732
+
733
+ const separableBlur = Fn( ( [ kernelRadius ] ) => {
734
+
735
+ const resolution = textureSize( this._maskTextureDownsSampleUniform );
736
+ const invSize = vec2( 1 ).div( resolution ).toVar();
737
+ const uvNode = uv();
738
+
739
+ const sigma = kernelRadius.div( 2 ).toVar();
740
+ const weightSum = gaussianPdf( 0, sigma ).toVar();
741
+ const diffuseSum = this._blurColorTextureUniform.sample( uvNode ).mul( weightSum ).toVar();
742
+ const delta = this._blurDirection.mul( invSize ).mul( kernelRadius ).div( MAX_RADIUS ).toVar();
743
+
744
+ const uvOffset = delta.toVar();
745
+
746
+ Loop( { start: int( 1 ), end: int( MAX_RADIUS ), type: 'int', condition: '<=' }, ( { i } ) => {
747
+
748
+ const x = kernelRadius.mul( float( i ) ).div( MAX_RADIUS );
749
+ const w = gaussianPdf( x, sigma );
750
+ const sample1 = this._blurColorTextureUniform.sample( uvNode.add( uvOffset ) );
751
+ const sample2 = this._blurColorTextureUniform.sample( uvNode.sub( uvOffset ) );
752
+
753
+ diffuseSum.addAssign( sample1.add( sample2 ).mul( w ) );
754
+ weightSum.addAssign( w.mul( 2 ) );
755
+ uvOffset.addAssign( delta );
756
+
757
+ } );
758
+
759
+ return diffuseSum.div( weightSum );
760
+
761
+ } );
762
+
763
+ this._separableBlurMaterial.fragmentNode = separableBlur( this.edgeThicknessNode );
764
+ this._separableBlurMaterial.needsUpdate = true;
765
+
766
+ this._separableBlurMaterial2.fragmentNode = separableBlur( MAX_RADIUS );
767
+ this._separableBlurMaterial2.needsUpdate = true;
768
+
769
+ // composite material
770
+
771
+ const composite = Fn( () => {
772
+
773
+ const edgeValue1 = this._edge1TextureUniform;
774
+ const edgeValue2 = this._edge2TextureUniform;
775
+ const maskColor = this._maskTextureUniform;
776
+
777
+ const edgeValue = edgeValue1.add( edgeValue2.mul( this.edgeGlowNode ) );
778
+
779
+ return maskColor.r.mul( edgeValue );
780
+
781
+ } );
782
+
783
+ this._compositeMaterial.fragmentNode = composite();
784
+ this._compositeMaterial.needsUpdate = true;
785
+
786
+ return this._textureNode;
787
+
788
+ }
789
+
790
+ /**
791
+ * Frees internal resources. This method should be called
792
+ * when the effect is no longer required.
793
+ */
794
+ dispose() {
795
+
796
+ super.dispose();
797
+
798
+ this.selectedObjects.length = 0;
799
+
800
+ this._renderTargetDepthBuffer.dispose();
801
+ this._renderTargetMaskBuffer.dispose();
802
+ this._renderTargetMaskDownSampleBuffer.dispose();
803
+ this._renderTargetEdgeBuffer1.dispose();
804
+ this._renderTargetEdgeBuffer2.dispose();
805
+ this._renderTargetBlurBuffer1.dispose();
806
+ this._renderTargetBlurBuffer2.dispose();
807
+ this._renderTargetComposite.dispose();
808
+
809
+ this._depthMaterial.dispose();
810
+ this._depthSpriteMaterial.dispose();
811
+ this._prepareMaskMaterial.dispose();
812
+ this._prepareMaskSpriteMaterial.dispose();
813
+ this._materialCopy.dispose();
814
+ this._edgeDetectionMaterial.dispose();
815
+ this._separableBlurMaterial.dispose();
816
+ this._separableBlurMaterial2.dispose();
817
+ this._compositeMaterial.dispose();
818
+
819
+ for ( const cache of [ this._depthMaterialCache, this._prepareMaskMaterialCache ] ) {
820
+
821
+ for ( const [ originalMaterial, passMaterial ] of cache ) {
822
+
823
+ originalMaterial.removeEventListener( 'dispose', this._onMaterialDispose );
824
+
825
+ passMaterial.dispose();
826
+
827
+ }
828
+
829
+ cache.clear();
830
+
831
+ }
832
+
833
+ }
834
+
835
+ /**
836
+ * Updates the selection cache based on the selected objects.
837
+ *
838
+ * @private
839
+ */
840
+ _updateSelectionCache() {
841
+
842
+ for ( let i = 0; i < this.selectedObjects.length; i ++ ) {
843
+
844
+ const selectedObject = this.selectedObjects[ i ];
845
+ selectedObject.traverse( ( object ) => {
846
+
847
+ if ( object.isMesh || object.isSprite ) this._selectionCache.add( object );
848
+
849
+ } );
850
+
851
+ }
852
+
853
+ }
854
+
855
+ /**
856
+ * For the given material, this method returns the corresponding pass material.
857
+ *
858
+ * @private
859
+ * @param {Map<Material, NodeMaterial>} cache - The material cache of the pass.
860
+ * @param {NodeMaterial} baseMaterial - The pass material to derive from.
861
+ * @param {Material} originalMaterial - The object's material.
862
+ * @return {NodeMaterial} The pass material.
863
+ */
864
+ _getPassMaterial( cache, baseMaterial, originalMaterial ) {
865
+
866
+ if ( ! originalMaterial.positionNode ) return baseMaterial; // early out if there are no node modifications
867
+
868
+ let force = false;
869
+ let passMaterial = cache.get( originalMaterial );
870
+
871
+ // create
872
+
873
+ if ( passMaterial === undefined ) {
874
+
875
+ passMaterial = baseMaterial.clone();
876
+
877
+ cache.set( originalMaterial, passMaterial );
878
+
879
+ originalMaterial.addEventListener( 'dispose', this._onMaterialDispose );
880
+
881
+ force = true;
882
+
883
+ }
884
+
885
+ // update
886
+
887
+ if ( passMaterial.version !== originalMaterial.version || force === true ) {
888
+
889
+ passMaterial.positionNode = originalMaterial.positionNode || null;
890
+ passMaterial.version = originalMaterial.version;
891
+
892
+ }
893
+
894
+ return passMaterial;
895
+
896
+ }
897
+
898
+ }
899
+
900
+ export default OutlineNode;
901
+
902
+ /**
903
+ * TSL function for creating an outline effect around selected objects.
904
+ *
905
+ * @tsl
906
+ * @function
907
+ * @param {Scene} scene - A reference to the scene.
908
+ * @param {Camera} camera - The camera the scene is rendered with.
909
+ * @param {Object} params - The configuration parameters.
910
+ * @param {Array<Object3D>} [params.selectedObjects] - An array of selected objects.
911
+ * @param {Node<float>} [params.edgeThickness=float(1)] - The thickness of the edges.
912
+ * @param {Node<float>} [params.edgeGlow=float(0)] - Can be used for animated glow/pulse effects.
913
+ * @param {number} [params.downSampleRatio=2] - The downsample ratio.
914
+ * @returns {OutlineNode}
915
+ */
916
+ export const outline = ( scene, camera, params ) => new OutlineNode( scene, camera, params );