pptx-react-viewer 1.1.3 → 1.1.5

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 (39) hide show
  1. package/dist/index.js +1099 -384
  2. package/dist/index.mjs +1099 -385
  3. package/dist/pptx-viewer.css +1 -1
  4. package/dist/viewer/index.js +1117 -390
  5. package/dist/viewer/index.mjs +1117 -391
  6. package/node_modules/emf-converter/dist/index.d.mts +2 -2
  7. package/node_modules/emf-converter/dist/index.d.ts +2 -2
  8. package/node_modules/emf-converter/dist/index.js +91 -33
  9. package/node_modules/emf-converter/dist/index.mjs +91 -33
  10. package/node_modules/emf-converter/package.json +2 -2
  11. package/node_modules/mtx-decompressor/dist/index.js +39 -9
  12. package/node_modules/mtx-decompressor/dist/index.mjs +39 -9
  13. package/node_modules/mtx-decompressor/package.json +2 -2
  14. package/node_modules/pptx-viewer-core/dist/{SvgExporter-BMjoxMDV.d.ts → SvgExporter-0TxiiorD.d.ts} +1 -1
  15. package/node_modules/pptx-viewer-core/dist/{SvgExporter-z6AbXRQg.d.mts → SvgExporter-BQ4KbRO9.d.mts} +1 -1
  16. package/node_modules/pptx-viewer-core/dist/cli/index.d.mts +2 -2
  17. package/node_modules/pptx-viewer-core/dist/cli/index.d.ts +2 -2
  18. package/node_modules/pptx-viewer-core/dist/cli/index.js +0 -0
  19. package/node_modules/pptx-viewer-core/dist/cli/index.mjs +0 -0
  20. package/node_modules/pptx-viewer-core/dist/converter/index.d.mts +3 -3
  21. package/node_modules/pptx-viewer-core/dist/converter/index.d.ts +3 -3
  22. package/node_modules/pptx-viewer-core/dist/converter/index.js +0 -0
  23. package/node_modules/pptx-viewer-core/dist/converter/index.mjs +0 -0
  24. package/node_modules/pptx-viewer-core/dist/index.d.mts +786 -54
  25. package/node_modules/pptx-viewer-core/dist/index.d.ts +786 -54
  26. package/node_modules/pptx-viewer-core/dist/index.js +3589 -630
  27. package/node_modules/pptx-viewer-core/dist/index.mjs +3575 -630
  28. package/node_modules/pptx-viewer-core/dist/{presentation-CchuDGfU.d.mts → presentation-ArhfImJ5.d.mts} +225 -8
  29. package/node_modules/pptx-viewer-core/dist/{presentation-CchuDGfU.d.ts → presentation-ArhfImJ5.d.ts} +225 -8
  30. package/node_modules/pptx-viewer-core/dist/{signature-inspection-status-BcJSdOvb.d.mts → signature-inspection-status-BCUpfCQh.d.mts} +13 -2
  31. package/node_modules/pptx-viewer-core/dist/{signature-inspection-status-BcJSdOvb.d.ts → signature-inspection-status-BCUpfCQh.d.ts} +13 -2
  32. package/node_modules/pptx-viewer-core/dist/signature-node/index.d.mts +2 -2
  33. package/node_modules/pptx-viewer-core/dist/signature-node/index.d.ts +2 -2
  34. package/node_modules/pptx-viewer-core/dist/signature-node/index.js +17 -3
  35. package/node_modules/pptx-viewer-core/dist/signature-node/index.mjs +16 -4
  36. package/node_modules/pptx-viewer-core/dist/{text-operations-CeukUztU.d.mts → text-operations-CLj-sJyk.d.mts} +1 -1
  37. package/node_modules/pptx-viewer-core/dist/{text-operations-e7JxgI5l.d.ts → text-operations-rhJV-A_W.d.ts} +1 -1
  38. package/node_modules/pptx-viewer-core/package.json +5 -5
  39. package/package.json +22 -20
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ var clsx = require('clsx');
7
7
  var tailwindMerge = require('tailwind-merge');
8
8
  var lu = require('react-icons/lu');
9
9
  var pptxViewerCore = require('pptx-viewer-core');
10
+ var DOMPurify = require('dompurify');
10
11
  var reactI18next = require('react-i18next');
11
12
  var html2canvasPro = require('html2canvas-pro');
12
13
  var JSZip = require('jszip');
@@ -33,6 +34,7 @@ function _interopNamespace(e) {
33
34
 
34
35
  var React10__namespace = /*#__PURE__*/_interopNamespace(React10);
35
36
  var ReactDOM__namespace = /*#__PURE__*/_interopNamespace(ReactDOM);
37
+ var DOMPurify__default = /*#__PURE__*/_interopDefault(DOMPurify);
36
38
  var html2canvasPro__default = /*#__PURE__*/_interopDefault(html2canvasPro);
37
39
  var JSZip__default = /*#__PURE__*/_interopDefault(JSZip);
38
40
 
@@ -90,7 +92,7 @@ var init_extends = __esm({
90
92
  }
91
93
  });
92
94
 
93
- // ../../node_modules/.bun/three@0.183.2/node_modules/three/build/three.core.js
95
+ // ../../node_modules/.bun/three@0.184.0/node_modules/three/build/three.core.js
94
96
  function arrayNeedsUint32(array) {
95
97
  for (let i3 = array.length - 1; i3 >= 0; --i3) {
96
98
  if (array[i3] >= 65535) return true;
@@ -1258,7 +1260,7 @@ function cloneUniforms(src) {
1258
1260
  dst[u2] = {};
1259
1261
  for (const p3 in src[u2]) {
1260
1262
  const property = src[u2][p3];
1261
- if (property && (property.isColor || property.isMatrix3 || property.isMatrix4 || property.isVector2 || property.isVector3 || property.isVector4 || property.isTexture || property.isQuaternion)) {
1263
+ if (isThreeObject(property)) {
1262
1264
  if (property.isRenderTargetTexture) {
1263
1265
  warn("UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().");
1264
1266
  dst[u2][p3] = null;
@@ -1266,7 +1268,15 @@ function cloneUniforms(src) {
1266
1268
  dst[u2][p3] = property.clone();
1267
1269
  }
1268
1270
  } else if (Array.isArray(property)) {
1269
- dst[u2][p3] = property.slice();
1271
+ if (isThreeObject(property[0])) {
1272
+ const clonedProperty = [];
1273
+ for (let i3 = 0, l2 = property.length; i3 < l2; i3++) {
1274
+ clonedProperty[i3] = property[i3].clone();
1275
+ }
1276
+ dst[u2][p3] = clonedProperty;
1277
+ } else {
1278
+ dst[u2][p3] = property.slice();
1279
+ }
1270
1280
  } else {
1271
1281
  dst[u2][p3] = property;
1272
1282
  }
@@ -1277,13 +1287,16 @@ function cloneUniforms(src) {
1277
1287
  function mergeUniforms(uniforms) {
1278
1288
  const merged = {};
1279
1289
  for (let u2 = 0; u2 < uniforms.length; u2++) {
1280
- const tmp2 = cloneUniforms(uniforms[u2]);
1281
- for (const p3 in tmp2) {
1282
- merged[p3] = tmp2[p3];
1290
+ const tmp3 = cloneUniforms(uniforms[u2]);
1291
+ for (const p3 in tmp3) {
1292
+ merged[p3] = tmp3[p3];
1283
1293
  }
1284
1294
  }
1285
1295
  return merged;
1286
1296
  }
1297
+ function isThreeObject(property) {
1298
+ return property && (property.isColor || property.isMatrix3 || property.isMatrix4 || property.isVector2 || property.isVector3 || property.isVector4 || property.isTexture || property.isQuaternion);
1299
+ }
1287
1300
  function cloneUniformsGroups(src) {
1288
1301
  const dst = [];
1289
1302
  for (let u2 = 0; u2 < src.length; u2++) {
@@ -1706,10 +1719,10 @@ function getTextureTypeByteLength(type) {
1706
1719
  }
1707
1720
  throw new Error(`Unknown texture type ${type}.`);
1708
1721
  }
1709
- var REVISION, MOUSE, TOUCH, CullFaceNone, CullFaceBack, CullFaceFront, CullFaceFrontBack, BasicShadowMap, PCFShadowMap, PCFSoftShadowMap, VSMShadowMap, FrontSide, BackSide, DoubleSide, NoBlending, NormalBlending, AdditiveBlending, SubtractiveBlending, MultiplyBlending, CustomBlending, MaterialBlending, AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation, ZeroFactor, OneFactor, SrcColorFactor, OneMinusSrcColorFactor, SrcAlphaFactor, OneMinusSrcAlphaFactor, DstAlphaFactor, OneMinusDstAlphaFactor, DstColorFactor, OneMinusDstColorFactor, SrcAlphaSaturateFactor, ConstantColorFactor, OneMinusConstantColorFactor, ConstantAlphaFactor, OneMinusConstantAlphaFactor, NeverDepth, AlwaysDepth, LessDepth, LessEqualDepth, EqualDepth, GreaterEqualDepth, GreaterDepth, NotEqualDepth, MultiplyOperation, MixOperation, AddOperation, NoToneMapping, LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, CustomToneMapping, AgXToneMapping, NeutralToneMapping, AttachedBindMode, DetachedBindMode, UVMapping, CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping, CubeUVReflectionMapping, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter, NearestMipmapNearestFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipMapLinearFilter, LinearFilter, LinearMipmapNearestFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipMapLinearFilter, UnsignedByteType, ByteType, ShortType, UnsignedShortType, IntType, UnsignedIntType, FloatType, HalfFloatType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedInt101111Type, AlphaFormat, RGBFormat, RGBAFormat, DepthFormat, DepthStencilFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, R11_EAC_Format, SIGNED_R11_EAC_Format, RG11_EAC_Format, SIGNED_RG11_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, LoopOnce, LoopRepeat, LoopPingPong, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolateBezier, ZeroCurvatureEnding, ZeroSlopeEnding, WrapAroundEnding, NormalAnimationBlendMode, AdditiveAnimationBlendMode, TrianglesDrawMode, TriangleStripDrawMode, TriangleFanDrawMode, BasicDepthPacking, RGBADepthPacking, RGBDepthPacking, RGDepthPacking, TangentSpaceNormalMap, ObjectSpaceNormalMap, NoColorSpace, SRGBColorSpace, LinearSRGBColorSpace, LinearTransfer, SRGBTransfer, NoNormalPacking, NormalRGPacking, NormalGAPacking, ZeroStencilOp, KeepStencilOp, ReplaceStencilOp, IncrementStencilOp, DecrementStencilOp, IncrementWrapStencilOp, DecrementWrapStencilOp, InvertStencilOp, NeverStencilFunc, LessStencilFunc, EqualStencilFunc, LessEqualStencilFunc, GreaterStencilFunc, NotEqualStencilFunc, GreaterEqualStencilFunc, AlwaysStencilFunc, NeverCompare, LessCompare, EqualCompare, LessEqualCompare, GreaterCompare, NotEqualCompare, GreaterEqualCompare, AlwaysCompare, StaticDrawUsage, DynamicDrawUsage, StreamDrawUsage, StaticReadUsage, DynamicReadUsage, StreamReadUsage, StaticCopyUsage, DynamicCopyUsage, StreamCopyUsage, GLSL1, GLSL3, WebGLCoordinateSystem, WebGPUCoordinateSystem, TimestampQuery, InterpolationSamplingType, InterpolationSamplingMode, Compatibility, TYPED_ARRAYS, _cache, _setConsoleFunction, ReversedDepthFuncs, EventDispatcher, _lut, _seed, DEG2RAD, RAD2DEG, MathUtils, Vector2, Quaternion, Vector3, _vector$c, _quaternion$5, Matrix3, _m3, LINEAR_REC709_TO_XYZ, XYZ_TO_LINEAR_REC709, ColorManagement, _canvas, ImageUtils, _sourceId, Source, _textureId, _tempVec3, Texture, Vector4, RenderTarget, WebGLRenderTarget, DataArrayTexture, WebGLArrayRenderTarget, Data3DTexture, WebGL3DRenderTarget, Matrix4, _v1$7, _m1$2, _zero, _one, _x, _y, _z, _matrix$2, _quaternion$4, Euler, Layers, _object3DId, _v1$6, _q1, _m1$1, _target, _position$4, _scale$3, _quaternion$3, _xAxis, _yAxis, _zAxis, _addedEvent, _removedEvent, _childaddedEvent, _childremovedEvent, Object3D, Group, _moveEvent, WebXRController, _colorKeywords, _hslA, _hslB, Color, _color, FogExp2, Fog, Scene, _v0$2, _v1$5, _v2$4, _v3$2, _vab, _vac, _vbc, _vap, _vbp, _vcp, _v40, _v41, _v42, Triangle, Box3, _points, _vector$b, _box$4, _v0$1, _v1$4, _v2$3, _f0, _f1, _f2, _center, _extents, _triangleNormal, _testAxis, _tables, DataUtils, _vector$a, _vector2$1, _id$2, BufferAttribute, Int8BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Int16BufferAttribute, Uint16BufferAttribute, Int32BufferAttribute, Uint32BufferAttribute, Float16BufferAttribute, Float32BufferAttribute, _box$3, _v1$3, _v2$2, Sphere, _id$1, _m1, _obj, _offset, _box$2, _boxMorphTargets, _vector$9, BufferGeometry, InterleavedBuffer, _vector$8, InterleavedBufferAttribute, _materialId, Material, SpriteMaterial, _geometry, _intersectPoint, _worldScale, _mvPosition, _alignedPosition, _rotatedPosition, _viewWorldMatrix, _vA$1, _vB$1, _vC$1, _uvA, _uvB, _uvC, Sprite, _v1$2, _v2$1, LOD, _vector$7, _segCenter, _segDir, _diff, _edge1, _edge2, _normal$1, Ray, MeshBasicMaterial, _inverseMatrix$3, _ray$3, _sphere$6, _sphereHitAt, _vA, _vB, _vC, _tempA, _morphA, _intersectionPoint, _intersectionPointWorld, Mesh, _basePosition, _skinIndex, _skinWeight, _vector3, _matrix4, _vertex, _sphere$5, _inverseMatrix$2, _ray$2, SkinnedMesh, Bone, DataTexture, _offsetMatrix, _identityMatrix, Skeleton, InstancedBufferAttribute, _instanceLocalMatrix, _instanceWorldMatrix, _instanceIntersects, _box3, _identity, _mesh$1, _sphere$4, InstancedMesh, _vector1, _vector2, _normalMatrix, Plane, _sphere$3, _defaultSpriteCenter, _vector$6, Frustum, _projScreenMatrix$1, _frustum$1, FrustumArray, MultiDrawRenderList, _matrix$1, _whiteColor, _frustum, _frustumArray, _box$1, _sphere$2, _vector$5, _forward$1, _temp, _renderList, _mesh, _batchIntersects, BatchedMesh, LineBasicMaterial, _vStart, _vEnd, _inverseMatrix$1, _ray$1, _sphere$1, _intersectPointOnRay, _intersectPointOnSegment, Line, _start, _end, LineSegments, LineLoop, PointsMaterial, _inverseMatrix, _ray, _sphere, _position$3, Points, VideoTexture, VideoFrameTexture, FramebufferTexture, CompressedTexture, CompressedArrayTexture, CompressedCubeTexture, CubeTexture, CanvasTexture, DepthTexture, CubeDepthTexture, ExternalTexture, BoxGeometry, CapsuleGeometry, CircleGeometry, CylinderGeometry, ConeGeometry, PolyhedronGeometry, DodecahedronGeometry, _v0, _v1$1, _normal, _triangle, EdgesGeometry, Curve, EllipseCurve, ArcCurve, tmp, px, py, pz, CatmullRomCurve3, CubicBezierCurve, CubicBezierCurve3, LineCurve, LineCurve3, QuadraticBezierCurve, QuadraticBezierCurve3, SplineCurve, Curves, CurvePath, Path, Shape, Earcut, ShapeUtils, ExtrudeGeometry, WorldUVGenerator, IcosahedronGeometry, LatheGeometry, OctahedronGeometry, PlaneGeometry, RingGeometry, ShapeGeometry, SphereGeometry, TetrahedronGeometry, TorusGeometry, TorusKnotGeometry, TubeGeometry, WireframeGeometry, Geometries, ShadowMaterial, UniformsUtils, default_vertex, default_fragment, ShaderMaterial, RawShaderMaterial, MeshStandardMaterial, MeshPhysicalMaterial, MeshPhongMaterial, MeshToonMaterial, MeshNormalMaterial, MeshLambertMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshMatcapMaterial, LineDashedMaterial, AnimationUtils, Interpolant, CubicInterpolant, LinearInterpolant, DiscreteInterpolant, BezierInterpolant, KeyframeTrack, BooleanKeyframeTrack, ColorKeyframeTrack, NumberKeyframeTrack, QuaternionLinearInterpolant, QuaternionKeyframeTrack, StringKeyframeTrack, VectorKeyframeTrack, AnimationClip, Cache, LoadingManager, DefaultLoadingManager, Loader, loading, HttpError, FileLoader, AnimationLoader, CompressedTextureLoader, _loading, ImageLoader, CubeTextureLoader, DataTextureLoader, TextureLoader, Light, HemisphereLight, _projScreenMatrix, _lightPositionWorld, _lookTarget, LightShadow, _position$2, _quaternion$2, _scale$2, Camera, _v3$1, _minTarget, _maxTarget, PerspectiveCamera, SpotLightShadow, SpotLight, PointLightShadow, PointLight, OrthographicCamera, DirectionalLightShadow, DirectionalLight, AmbientLight, RectAreaLight, SphericalHarmonics3, LightProbe, MaterialLoader, LoaderUtils, InstancedBufferGeometry, BufferGeometryLoader, ObjectLoader, TEXTURE_MAPPING, TEXTURE_WRAPPING, TEXTURE_FILTER, _errorMap, ImageBitmapLoader, _context, AudioContext, AudioLoader, _eyeRight, _eyeLeft, _projectionMatrix, StereoCamera, fov, aspect, CubeCamera, ArrayCamera, Timer, _position$1, _quaternion$1, _scale$1, _forward, _up, AudioListener, Audio2, _position, _quaternion, _scale, _orientation, PositionalAudio, AudioAnalyser, PropertyMixer, _RESERVED_CHARS_RE, _reservedRe, _wordChar, _wordCharOrDot, _directoryRe, _nodeRe, _objectRe, _propertyRe, _trackRe, _supportedObjectNames, Composite, PropertyBinding, AnimationObjectGroup, AnimationAction, _controlInterpolantsResultBuffer, AnimationMixer, RenderTarget3D, Uniform, _id, UniformsGroup, InstancedInterleavedBuffer, GLBufferAttribute, _matrix, Raycaster, Clock, Spherical, Cylindrical, Matrix2, _vector$4, Box2, _startP, _startEnd, _d1, _d2, _r, _c1, _c2, Line3, _vector$3, SpotLightHelper, _vector$2, _boneMatrix, _matrixWorldInv, SkeletonHelper, PointLightHelper, _vector$1, _color1, _color2, HemisphereLightHelper, GridHelper, PolarGridHelper, _v1, _v2, _v3, DirectionalLightHelper, _vector, _camera, CameraHelper, _box, BoxHelper, Box3Helper, PlaneHelper, _axis, _lineGeometry, _coneGeometry, ArrowHelper, AxesHelper, ShapePath, Controls, TextureUtils;
1722
+ var REVISION, MOUSE, TOUCH, CullFaceNone, CullFaceBack, CullFaceFront, CullFaceFrontBack, BasicShadowMap, PCFShadowMap, PCFSoftShadowMap, VSMShadowMap, FrontSide, BackSide, DoubleSide, NoBlending, NormalBlending, AdditiveBlending, SubtractiveBlending, MultiplyBlending, CustomBlending, MaterialBlending, AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation, ZeroFactor, OneFactor, SrcColorFactor, OneMinusSrcColorFactor, SrcAlphaFactor, OneMinusSrcAlphaFactor, DstAlphaFactor, OneMinusDstAlphaFactor, DstColorFactor, OneMinusDstColorFactor, SrcAlphaSaturateFactor, ConstantColorFactor, OneMinusConstantColorFactor, ConstantAlphaFactor, OneMinusConstantAlphaFactor, NeverDepth, AlwaysDepth, LessDepth, LessEqualDepth, EqualDepth, GreaterEqualDepth, GreaterDepth, NotEqualDepth, MultiplyOperation, MixOperation, AddOperation, NoToneMapping, LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, CustomToneMapping, AgXToneMapping, NeutralToneMapping, AttachedBindMode, DetachedBindMode, UVMapping, CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping, CubeUVReflectionMapping, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter, NearestMipmapNearestFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipMapLinearFilter, LinearFilter, LinearMipmapNearestFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipMapLinearFilter, UnsignedByteType, ByteType, ShortType, UnsignedShortType, IntType, UnsignedIntType, FloatType, HalfFloatType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedInt101111Type, AlphaFormat, RGBFormat, RGBAFormat, DepthFormat, DepthStencilFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, R11_EAC_Format, SIGNED_R11_EAC_Format, RG11_EAC_Format, SIGNED_RG11_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, LoopOnce, LoopRepeat, LoopPingPong, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolateBezier, ZeroCurvatureEnding, ZeroSlopeEnding, WrapAroundEnding, NormalAnimationBlendMode, AdditiveAnimationBlendMode, TrianglesDrawMode, TriangleStripDrawMode, TriangleFanDrawMode, BasicDepthPacking, RGBADepthPacking, RGBDepthPacking, RGDepthPacking, TangentSpaceNormalMap, ObjectSpaceNormalMap, NoColorSpace, SRGBColorSpace, LinearSRGBColorSpace, LinearTransfer, SRGBTransfer, NoNormalPacking, NormalRGPacking, NormalGAPacking, ZeroStencilOp, KeepStencilOp, ReplaceStencilOp, IncrementStencilOp, DecrementStencilOp, IncrementWrapStencilOp, DecrementWrapStencilOp, InvertStencilOp, NeverStencilFunc, LessStencilFunc, EqualStencilFunc, LessEqualStencilFunc, GreaterStencilFunc, NotEqualStencilFunc, GreaterEqualStencilFunc, AlwaysStencilFunc, NeverCompare, LessCompare, EqualCompare, LessEqualCompare, GreaterCompare, NotEqualCompare, GreaterEqualCompare, AlwaysCompare, StaticDrawUsage, DynamicDrawUsage, StreamDrawUsage, StaticReadUsage, DynamicReadUsage, StreamReadUsage, StaticCopyUsage, DynamicCopyUsage, StreamCopyUsage, GLSL1, GLSL3, WebGLCoordinateSystem, WebGPUCoordinateSystem, TimestampQuery, InterpolationSamplingType, InterpolationSamplingMode, Compatibility, TYPED_ARRAYS, _cache, _setConsoleFunction, ReversedDepthFuncs, EventDispatcher, _lut, _seed, DEG2RAD, RAD2DEG, MathUtils, Vector2, Quaternion, Vector3, _vector$c, _quaternion$5, Matrix3, _m3, LINEAR_REC709_TO_XYZ, XYZ_TO_LINEAR_REC709, ColorManagement, _canvas, ImageUtils, _sourceId, Source, _textureId, _tempVec3, Texture, Vector4, RenderTarget, WebGLRenderTarget, DataArrayTexture, WebGLArrayRenderTarget, Data3DTexture, WebGL3DRenderTarget, Matrix4, _v1$7, _m1$2, _zero, _one, _x, _y, _z, _matrix$2, _quaternion$4, Euler, Layers, _object3DId, _v1$6, _q1, _m1$1, _target, _position$4, _scale$3, _quaternion$3, _xAxis, _yAxis, _zAxis, _addedEvent, _removedEvent, _childaddedEvent, _childremovedEvent, Object3D, Group, _moveEvent, WebXRController, _colorKeywords, _hslA, _hslB, Color, _color, FogExp2, Fog, Scene, _v0$2, _v1$5, _v2$4, _v3$2, _vab, _vac, _vbc, _vap, _vbp, _vcp, _v40, _v41, _v42, Triangle, Box3, _points, _vector$b, _box$4, _v0$1, _v1$4, _v2$3, _f0, _f1, _f2, _center, _extents, _triangleNormal, _testAxis, _tables, DataUtils, _vector$a, _vector2$1, _id$2, BufferAttribute, Int8BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Int16BufferAttribute, Uint16BufferAttribute, Int32BufferAttribute, Uint32BufferAttribute, Float16BufferAttribute, Float32BufferAttribute, _box$3, _v1$3, _v2$2, Sphere, _id$1, _m1, _obj, _offset, _box$2, _boxMorphTargets, _vector$9, BufferGeometry, InterleavedBuffer, _vector$8, InterleavedBufferAttribute, _materialId, Material, SpriteMaterial, _geometry, _intersectPoint, _worldScale, _mvPosition, _alignedPosition, _rotatedPosition, _viewWorldMatrix, _vA$1, _vB$1, _vC$1, _uvA, _uvB, _uvC, Sprite, _v1$2, _v2$1, LOD, _vector$7, _segCenter, _segDir, _diff, _edge1, _edge2, _normal$1, Ray, MeshBasicMaterial, _inverseMatrix$3, _ray$3, _sphere$6, _sphereHitAt, _vA, _vB, _vC, _tempA, _morphA, _intersectionPoint, _intersectionPointWorld, Mesh, _baseVector, _skinIndex, _skinWeight, _vector4, _matrix4, _vertex, _sphere$5, _inverseMatrix$2, _ray$2, SkinnedMesh, Bone, DataTexture, _offsetMatrix, _identityMatrix, Skeleton, InstancedBufferAttribute, _instanceLocalMatrix, _instanceWorldMatrix, _instanceIntersects, _box3, _identity, _mesh$1, _sphere$4, InstancedMesh, _vector1, _vector2, _normalMatrix, Plane, _sphere$3, _defaultSpriteCenter, _vector$6, Frustum, _projScreenMatrix$1, _frustum$1, FrustumArray, MultiDrawRenderList, _matrix$1, _whiteColor, _frustum, _frustumArray, _box$1, _sphere$2, _vector$5, _forward$1, _temp, _renderList, _mesh, _batchIntersects, BatchedMesh, LineBasicMaterial, _vStart, _vEnd, _inverseMatrix$1, _ray$1, _sphere$1, _intersectPointOnRay, _intersectPointOnSegment, Line, _start, _end, LineSegments, LineLoop, PointsMaterial, _inverseMatrix, _ray, _sphere, _position$3, Points, VideoTexture, VideoFrameTexture, FramebufferTexture, CompressedTexture, CompressedArrayTexture, CompressedCubeTexture, CubeTexture, CanvasTexture, HTMLTexture, DepthTexture, CubeDepthTexture, ExternalTexture, BoxGeometry, CapsuleGeometry, CircleGeometry, CylinderGeometry, ConeGeometry, PolyhedronGeometry, DodecahedronGeometry, _v0, _v1$1, _normal, _triangle, EdgesGeometry, Curve, EllipseCurve, ArcCurve, tmp, tmp2, px, py, pz, CatmullRomCurve3, CubicBezierCurve, CubicBezierCurve3, LineCurve, LineCurve3, QuadraticBezierCurve, QuadraticBezierCurve3, SplineCurve, Curves, CurvePath, Path, Shape, Earcut, ShapeUtils, ExtrudeGeometry, WorldUVGenerator, IcosahedronGeometry, LatheGeometry, OctahedronGeometry, PlaneGeometry, RingGeometry, ShapeGeometry, SphereGeometry, TetrahedronGeometry, TorusGeometry, TorusKnotGeometry, TubeGeometry, WireframeGeometry, Geometries, ShadowMaterial, UniformsUtils, default_vertex, default_fragment, ShaderMaterial, RawShaderMaterial, MeshStandardMaterial, MeshPhysicalMaterial, MeshPhongMaterial, MeshToonMaterial, MeshNormalMaterial, MeshLambertMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshMatcapMaterial, LineDashedMaterial, AnimationUtils, Interpolant, CubicInterpolant, LinearInterpolant, DiscreteInterpolant, BezierInterpolant, KeyframeTrack, BooleanKeyframeTrack, ColorKeyframeTrack, NumberKeyframeTrack, QuaternionLinearInterpolant, QuaternionKeyframeTrack, StringKeyframeTrack, VectorKeyframeTrack, AnimationClip, Cache, LoadingManager, DefaultLoadingManager, Loader, loading, HttpError, FileLoader, AnimationLoader, CompressedTextureLoader, _loading, ImageLoader, CubeTextureLoader, DataTextureLoader, TextureLoader, Light, HemisphereLight, _projScreenMatrix, _lightPositionWorld, _lookTarget, LightShadow, _position$2, _quaternion$2, _scale$2, Camera, _v3$1, _minTarget, _maxTarget, PerspectiveCamera, SpotLightShadow, SpotLight, PointLightShadow, PointLight, OrthographicCamera, DirectionalLightShadow, DirectionalLight, AmbientLight, RectAreaLight, SphericalHarmonics3, LightProbe, MaterialLoader, LoaderUtils, InstancedBufferGeometry, BufferGeometryLoader, _customGeometries, ObjectLoader, TEXTURE_MAPPING, TEXTURE_WRAPPING, TEXTURE_FILTER, _errorMap, ImageBitmapLoader, _context, AudioContext, AudioLoader, _eyeRight, _eyeLeft, _projectionMatrix, StereoCamera, fov, aspect, CubeCamera, ArrayCamera, Timer, _position$1, _quaternion$1, _scale$1, _forward, _up, AudioListener, Audio2, _position, _quaternion, _scale, _orientation, PositionalAudio, AudioAnalyser, PropertyMixer, _RESERVED_CHARS_RE, _reservedRe, _wordChar, _wordCharOrDot, _directoryRe, _nodeRe, _objectRe, _propertyRe, _trackRe, _supportedObjectNames, Composite, PropertyBinding, AnimationObjectGroup, AnimationAction, _controlInterpolantsResultBuffer, AnimationMixer, RenderTarget3D, Uniform, _id, UniformsGroup, InstancedInterleavedBuffer, GLBufferAttribute, _matrix, Raycaster, Clock, Spherical, Cylindrical, Matrix2, _vector$4, Box2, _startP, _startEnd, _d1, _d2, _r, _c1, _c2, Line3, _vector$3, SpotLightHelper, _vector$2, _boneMatrix, _matrixWorldInv, SkeletonHelper, PointLightHelper, _vector$1, _color1, _color2, HemisphereLightHelper, GridHelper, PolarGridHelper, _v1, _v2, _v3, DirectionalLightHelper, _vector, _camera, CameraHelper, _box, BoxHelper, Box3Helper, PlaneHelper, _axis, _lineGeometry, _coneGeometry, ArrowHelper, AxesHelper, ShapePath, Controls, TextureUtils;
1710
1723
  var init_three_core = __esm({
1711
- "../../node_modules/.bun/three@0.183.2/node_modules/three/build/three.core.js"() {
1712
- REVISION = "183";
1724
+ "../../node_modules/.bun/three@0.184.0/node_modules/three/build/three.core.js"() {
1725
+ REVISION = "184";
1713
1726
  MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };
1714
1727
  TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };
1715
1728
  CullFaceNone = 0;
@@ -2272,6 +2285,9 @@ var init_three_core = __esm({
2272
2285
  denormalize
2273
2286
  };
2274
2287
  Vector2 = class _Vector2 {
2288
+ static {
2289
+ _Vector2.prototype.isVector2 = true;
2290
+ }
2275
2291
  /**
2276
2292
  * Constructs a new 2D vector.
2277
2293
  *
@@ -2279,7 +2295,6 @@ var init_three_core = __esm({
2279
2295
  * @param {number} [y=0] - The y value of this vector.
2280
2296
  */
2281
2297
  constructor(x2 = 0, y = 0) {
2282
- _Vector2.prototype.isVector2 = true;
2283
2298
  this.x = x2;
2284
2299
  this.y = y;
2285
2300
  }
@@ -3497,6 +3512,9 @@ var init_three_core = __esm({
3497
3512
  }
3498
3513
  };
3499
3514
  Vector3 = class _Vector3 {
3515
+ static {
3516
+ _Vector3.prototype.isVector3 = true;
3517
+ }
3500
3518
  /**
3501
3519
  * Constructs a new 3D vector.
3502
3520
  *
@@ -3505,7 +3523,6 @@ var init_three_core = __esm({
3505
3523
  * @param {number} [z=0] - The z value of this vector.
3506
3524
  */
3507
3525
  constructor(x2 = 0, y = 0, z = 0) {
3508
- _Vector3.prototype.isVector3 = true;
3509
3526
  this.x = x2;
3510
3527
  this.y = y;
3511
3528
  this.z = z;
@@ -4403,6 +4420,9 @@ var init_three_core = __esm({
4403
4420
  _vector$c = /* @__PURE__ */ new Vector3();
4404
4421
  _quaternion$5 = /* @__PURE__ */ new Quaternion();
4405
4422
  Matrix3 = class _Matrix3 {
4423
+ static {
4424
+ _Matrix3.prototype.isMatrix3 = true;
4425
+ }
4406
4426
  /**
4407
4427
  * Constructs a new 3x3 matrix. The arguments are supposed to be
4408
4428
  * in row-major order. If no arguments are provided, the constructor
@@ -4419,7 +4439,6 @@ var init_three_core = __esm({
4419
4439
  * @param {number} [n33] - 3-3 matrix element.
4420
4440
  */
4421
4441
  constructor(n11, n12, n13, n21, n22, n23, n31, n32, n33) {
4422
- _Matrix3.prototype.isMatrix3 = true;
4423
4442
  this.elements = [
4424
4443
  1,
4425
4444
  0,
@@ -4641,17 +4660,17 @@ var init_three_core = __esm({
4641
4660
  * @return {Matrix3} A reference to this matrix.
4642
4661
  */
4643
4662
  transpose() {
4644
- let tmp2;
4663
+ let tmp3;
4645
4664
  const m2 = this.elements;
4646
- tmp2 = m2[1];
4665
+ tmp3 = m2[1];
4647
4666
  m2[1] = m2[3];
4648
- m2[3] = tmp2;
4649
- tmp2 = m2[2];
4667
+ m2[3] = tmp3;
4668
+ tmp3 = m2[2];
4650
4669
  m2[2] = m2[6];
4651
- m2[6] = tmp2;
4652
- tmp2 = m2[5];
4670
+ m2[6] = tmp3;
4671
+ tmp3 = m2[5];
4653
4672
  m2[5] = m2[7];
4654
- m2[7] = tmp2;
4673
+ m2[7] = tmp3;
4655
4674
  return this;
4656
4675
  }
4657
4676
  /**
@@ -5001,7 +5020,7 @@ var init_three_core = __esm({
5001
5020
  if (typeof HTMLVideoElement !== "undefined" && data instanceof HTMLVideoElement) {
5002
5021
  target.set(data.videoWidth, data.videoHeight, 0);
5003
5022
  } else if (typeof VideoFrame !== "undefined" && data instanceof VideoFrame) {
5004
- target.set(data.displayHeight, data.displayWidth, 0);
5023
+ target.set(data.displayWidth, data.displayHeight, 0);
5005
5024
  } else if (data !== null) {
5006
5025
  target.set(data.width, data.height, data.depth || 0);
5007
5026
  } else {
@@ -5114,6 +5133,7 @@ var init_three_core = __esm({
5114
5133
  this.isRenderTargetTexture = false;
5115
5134
  this.isArrayTexture = image && image.depth && image.depth > 1 ? true : false;
5116
5135
  this.pmremVersion = 0;
5136
+ this.normalized = false;
5117
5137
  }
5118
5138
  /**
5119
5139
  * The width of the texture in pixels.
@@ -5141,11 +5161,11 @@ var init_three_core = __esm({
5141
5161
  get image() {
5142
5162
  return this.source.data;
5143
5163
  }
5144
- set image(value = null) {
5164
+ set image(value) {
5145
5165
  this.source.data = value;
5146
5166
  }
5147
5167
  /**
5148
- * Updates the texture transformation matrix from the from the properties {@link Texture#offset},
5168
+ * Updates the texture transformation matrix from the properties {@link Texture#offset},
5149
5169
  * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}.
5150
5170
  */
5151
5171
  updateMatrix() {
@@ -5194,6 +5214,7 @@ var init_three_core = __esm({
5194
5214
  this.format = source.format;
5195
5215
  this.internalFormat = source.internalFormat;
5196
5216
  this.type = source.type;
5217
+ this.normalized = source.normalized;
5197
5218
  this.offset.copy(source.offset);
5198
5219
  this.repeat.copy(source.repeat);
5199
5220
  this.center.copy(source.center);
@@ -5270,6 +5291,7 @@ var init_three_core = __esm({
5270
5291
  format: this.format,
5271
5292
  internalFormat: this.internalFormat,
5272
5293
  type: this.type,
5294
+ normalized: this.normalized,
5273
5295
  colorSpace: this.colorSpace,
5274
5296
  minFilter: this.minFilter,
5275
5297
  magFilter: this.magFilter,
@@ -5375,6 +5397,9 @@ var init_three_core = __esm({
5375
5397
  Texture.DEFAULT_MAPPING = UVMapping;
5376
5398
  Texture.DEFAULT_ANISOTROPY = 1;
5377
5399
  Vector4 = class _Vector4 {
5400
+ static {
5401
+ _Vector4.prototype.isVector4 = true;
5402
+ }
5378
5403
  /**
5379
5404
  * Constructs a new 4D vector.
5380
5405
  *
@@ -5384,7 +5409,6 @@ var init_three_core = __esm({
5384
5409
  * @param {number} [w=1] - The w value of this vector.
5385
5410
  */
5386
5411
  constructor(x2 = 0, y = 0, z = 0, w = 1) {
5387
- _Vector4.prototype.isVector4 = true;
5388
5412
  this.x = x2;
5389
5413
  this.y = y;
5390
5414
  this.z = z;
@@ -6292,6 +6316,7 @@ var init_three_core = __esm({
6292
6316
  this.resolveStencilBuffer = source.resolveStencilBuffer;
6293
6317
  if (source.depthTexture !== null) this.depthTexture = source.depthTexture.clone();
6294
6318
  this.samples = source.samples;
6319
+ this.multiview = source.multiview;
6295
6320
  return this;
6296
6321
  }
6297
6322
  /**
@@ -6415,6 +6440,9 @@ var init_three_core = __esm({
6415
6440
  }
6416
6441
  };
6417
6442
  Matrix4 = class _Matrix4 {
6443
+ static {
6444
+ _Matrix4.prototype.isMatrix4 = true;
6445
+ }
6418
6446
  /**
6419
6447
  * Constructs a new 4x4 matrix. The arguments are supposed to be
6420
6448
  * in row-major order. If no arguments are provided, the constructor
@@ -6438,7 +6466,6 @@ var init_three_core = __esm({
6438
6466
  * @param {number} [n44] - 4-4 matrix element.
6439
6467
  */
6440
6468
  constructor(n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44) {
6441
- _Matrix4.prototype.isMatrix4 = true;
6442
6469
  this.elements = [
6443
6470
  1,
6444
6471
  0,
@@ -6943,25 +6970,25 @@ var init_three_core = __esm({
6943
6970
  */
6944
6971
  transpose() {
6945
6972
  const te = this.elements;
6946
- let tmp2;
6947
- tmp2 = te[1];
6973
+ let tmp3;
6974
+ tmp3 = te[1];
6948
6975
  te[1] = te[4];
6949
- te[4] = tmp2;
6950
- tmp2 = te[2];
6976
+ te[4] = tmp3;
6977
+ tmp3 = te[2];
6951
6978
  te[2] = te[8];
6952
- te[8] = tmp2;
6953
- tmp2 = te[6];
6979
+ te[8] = tmp3;
6980
+ tmp3 = te[6];
6954
6981
  te[6] = te[9];
6955
- te[9] = tmp2;
6956
- tmp2 = te[3];
6982
+ te[9] = tmp3;
6983
+ tmp3 = te[3];
6957
6984
  te[3] = te[12];
6958
- te[12] = tmp2;
6959
- tmp2 = te[7];
6985
+ te[12] = tmp3;
6986
+ tmp3 = te[7];
6960
6987
  te[7] = te[13];
6961
- te[13] = tmp2;
6962
- tmp2 = te[11];
6988
+ te[13] = tmp3;
6989
+ tmp3 = te[11];
6963
6990
  te[11] = te[14];
6964
- te[14] = tmp2;
6991
+ te[14] = tmp3;
6965
6992
  return this;
6966
6993
  }
6967
6994
  /**
@@ -8801,9 +8828,7 @@ var init_three_core = __esm({
8801
8828
  this.rotation.order = source.rotation.order;
8802
8829
  this.quaternion.copy(source.quaternion);
8803
8830
  this.scale.copy(source.scale);
8804
- if (source.pivot !== null) {
8805
- this.pivot = source.pivot.clone();
8806
- }
8831
+ this.pivot = source.pivot !== null ? source.pivot.clone() : null;
8807
8832
  this.matrix.copy(source.matrix);
8808
8833
  this.matrixWorld.copy(source.matrixWorld);
8809
8834
  this.matrixAutoUpdate = source.matrixAutoUpdate;
@@ -8893,6 +8918,7 @@ var init_three_core = __esm({
8893
8918
  this._grip.linearVelocity = new Vector3();
8894
8919
  this._grip.hasAngularVelocity = false;
8895
8920
  this._grip.angularVelocity = new Vector3();
8921
+ this._grip.eventsEnabled = false;
8896
8922
  }
8897
8923
  return this._grip;
8898
8924
  }
@@ -9022,6 +9048,13 @@ var init_three_core = __esm({
9022
9048
  } else {
9023
9049
  grip.hasAngularVelocity = false;
9024
9050
  }
9051
+ if (grip.eventsEnabled) {
9052
+ grip.dispatchEvent({
9053
+ type: "gripUpdated",
9054
+ data: inputSource,
9055
+ target: this
9056
+ });
9057
+ }
9025
9058
  }
9026
9059
  }
9027
9060
  }
@@ -10101,7 +10134,7 @@ var init_three_core = __esm({
10101
10134
  static isFrontFacing(a2, b2, c2, direction) {
10102
10135
  _v0$2.subVectors(c2, b2);
10103
10136
  _v1$5.subVectors(a2, b2);
10104
- return _v0$2.cross(_v1$5).dot(direction) < 0 ? true : false;
10137
+ return _v0$2.cross(_v1$5).dot(direction) < 0;
10105
10138
  }
10106
10139
  /**
10107
10140
  * Sets the triangle's vertices by copying the given values.
@@ -10872,7 +10905,7 @@ var init_three_core = __esm({
10872
10905
  _vector$a = /* @__PURE__ */ new Vector3();
10873
10906
  _vector2$1 = /* @__PURE__ */ new Vector2();
10874
10907
  _id$2 = 0;
10875
- BufferAttribute = class {
10908
+ BufferAttribute = class extends EventDispatcher {
10876
10909
  /**
10877
10910
  * Constructs a new buffer attribute.
10878
10911
  *
@@ -10881,6 +10914,7 @@ var init_three_core = __esm({
10881
10914
  * @param {boolean} [normalized=false] - Whether the data are normalized or not.
10882
10915
  */
10883
10916
  constructor(array, itemSize, normalized = false) {
10917
+ super();
10884
10918
  if (Array.isArray(array)) {
10885
10919
  throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");
10886
10920
  }
@@ -11277,6 +11311,12 @@ var init_three_core = __esm({
11277
11311
  if (this.usage !== StaticDrawUsage) data.usage = this.usage;
11278
11312
  return data;
11279
11313
  }
11314
+ /**
11315
+ * Disposes of the buffer attribute. Available only in {@link WebGPURenderer}.
11316
+ */
11317
+ dispose() {
11318
+ this.dispatchEvent({ type: "dispose" });
11319
+ }
11280
11320
  };
11281
11321
  Int8BufferAttribute = class extends BufferAttribute {
11282
11322
  /**
@@ -12218,18 +12258,18 @@ var init_three_core = __esm({
12218
12258
  );
12219
12259
  }
12220
12260
  }
12221
- const tmp2 = new Vector3(), tmp22 = new Vector3();
12261
+ const tmp3 = new Vector3(), tmp22 = new Vector3();
12222
12262
  const n = new Vector3(), n2 = new Vector3();
12223
12263
  function handleVertex(v) {
12224
12264
  n.fromBufferAttribute(normalAttribute, v);
12225
12265
  n2.copy(n);
12226
12266
  const t2 = tan1[v];
12227
- tmp2.copy(t2);
12228
- tmp2.sub(n.multiplyScalar(n.dot(t2))).normalize();
12267
+ tmp3.copy(t2);
12268
+ tmp3.sub(n.multiplyScalar(n.dot(t2))).normalize();
12229
12269
  tmp22.crossVectors(n2, t2);
12230
12270
  const test = tmp22.dot(tan2[v]);
12231
12271
  const w = test < 0 ? -1 : 1;
12232
- tangentAttribute.setXYZW(v, tmp2.x, tmp2.y, tmp2.z, w);
12272
+ tangentAttribute.setXYZW(v, tmp3.x, tmp3.y, tmp3.z, w);
12233
12273
  }
12234
12274
  for (let i3 = 0, il = groups.length; i3 < il; ++i3) {
12235
12275
  const group = groups[i3];
@@ -14380,10 +14420,10 @@ var init_three_core = __esm({
14380
14420
  }
14381
14421
  }
14382
14422
  };
14383
- _basePosition = /* @__PURE__ */ new Vector3();
14423
+ _baseVector = /* @__PURE__ */ new Vector4();
14384
14424
  _skinIndex = /* @__PURE__ */ new Vector4();
14385
14425
  _skinWeight = /* @__PURE__ */ new Vector4();
14386
- _vector3 = /* @__PURE__ */ new Vector3();
14426
+ _vector4 = /* @__PURE__ */ new Vector4();
14387
14427
  _matrix4 = /* @__PURE__ */ new Matrix4();
14388
14428
  _vertex = /* @__PURE__ */ new Vector3();
14389
14429
  _sphere$5 = /* @__PURE__ */ new Sphere();
@@ -14525,28 +14565,37 @@ var init_three_core = __esm({
14525
14565
  }
14526
14566
  /**
14527
14567
  * Applies the bone transform associated with the given index to the given
14528
- * vertex position. Returns the updated vector.
14568
+ * vector. Can be used to transform positions or direction vectors by providing
14569
+ * a Vector4 with 1 or 0 in the w component respectively. Returns the updated vector.
14529
14570
  *
14530
14571
  * @param {number} index - The vertex index.
14531
- * @param {Vector3} target - The target object that is used to store the method's result.
14532
- * the skinned mesh's world matrix will be used instead.
14533
- * @return {Vector3} The updated vertex position.
14572
+ * @param {Vector3|Vector4} target - The target object that is used to store the method's result.
14573
+ * @return {Vector3|Vector4} The updated vertex attribute data.
14534
14574
  */
14535
14575
  applyBoneTransform(index, target) {
14536
14576
  const skeleton = this.skeleton;
14537
14577
  const geometry = this.geometry;
14538
14578
  _skinIndex.fromBufferAttribute(geometry.attributes.skinIndex, index);
14539
14579
  _skinWeight.fromBufferAttribute(geometry.attributes.skinWeight, index);
14540
- _basePosition.copy(target).applyMatrix4(this.bindMatrix);
14541
- target.set(0, 0, 0);
14580
+ if (target.isVector4) {
14581
+ _baseVector.copy(target);
14582
+ target.set(0, 0, 0, 0);
14583
+ } else {
14584
+ _baseVector.set(...target, 1);
14585
+ target.set(0, 0, 0);
14586
+ }
14587
+ _baseVector.applyMatrix4(this.bindMatrix);
14542
14588
  for (let i3 = 0; i3 < 4; i3++) {
14543
14589
  const weight = _skinWeight.getComponent(i3);
14544
14590
  if (weight !== 0) {
14545
14591
  const boneIndex = _skinIndex.getComponent(i3);
14546
14592
  _matrix4.multiplyMatrices(skeleton.bones[boneIndex].matrixWorld, skeleton.boneInverses[boneIndex]);
14547
- target.addScaledVector(_vector3.copy(_basePosition).applyMatrix4(_matrix4), weight);
14593
+ target.addScaledVector(_vector4.copy(_baseVector).applyMatrix4(_matrix4), weight);
14548
14594
  }
14549
14595
  }
14596
+ if (target.isVector4) {
14597
+ target.w = _baseVector.w;
14598
+ }
14550
14599
  return target.applyMatrix4(this.bindMatrixInverse);
14551
14600
  }
14552
14601
  };
@@ -14894,18 +14943,24 @@ var init_three_core = __esm({
14894
14943
  *
14895
14944
  * @param {number} index - The instance index.
14896
14945
  * @param {Color} color - The target object that is used to store the method's result.
14946
+ * @return {Color} A reference to the target color.
14897
14947
  */
14898
14948
  getColorAt(index, color) {
14899
- color.fromArray(this.instanceColor.array, index * 3);
14949
+ if (this.instanceColor === null) {
14950
+ return color.setRGB(1, 1, 1);
14951
+ } else {
14952
+ return color.fromArray(this.instanceColor.array, index * 3);
14953
+ }
14900
14954
  }
14901
14955
  /**
14902
14956
  * Gets the local transformation matrix of the defined instance.
14903
14957
  *
14904
14958
  * @param {number} index - The instance index.
14905
14959
  * @param {Matrix4} matrix - The target object that is used to store the method's result.
14960
+ * @return {Matrix4} A reference to the target matrix.
14906
14961
  */
14907
14962
  getMatrixAt(index, matrix) {
14908
- matrix.fromArray(this.instanceMatrix.array, index * 16);
14963
+ return matrix.fromArray(this.instanceMatrix.array, index * 16);
14909
14964
  }
14910
14965
  /**
14911
14966
  * Gets the morph target weights of the defined instance.
@@ -14952,22 +15007,26 @@ var init_three_core = __esm({
14952
15007
  *
14953
15008
  * @param {number} index - The instance index.
14954
15009
  * @param {Color} color - The instance color.
15010
+ * @return {InstancedMesh} A reference to this instanced mesh.
14955
15011
  */
14956
15012
  setColorAt(index, color) {
14957
15013
  if (this.instanceColor === null) {
14958
15014
  this.instanceColor = new InstancedBufferAttribute(new Float32Array(this.instanceMatrix.count * 3).fill(1), 3);
14959
15015
  }
14960
15016
  color.toArray(this.instanceColor.array, index * 3);
15017
+ return this;
14961
15018
  }
14962
15019
  /**
14963
15020
  * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of
14964
- * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors.
15021
+ * {@link InstancedMesh#instanceMatrix} to `true` after updating all the matrices.
14965
15022
  *
14966
15023
  * @param {number} index - The instance index.
14967
15024
  * @param {Matrix4} matrix - The local transformation.
15025
+ * @return {InstancedMesh} A reference to this instanced mesh.
14968
15026
  */
14969
15027
  setMatrixAt(index, matrix) {
14970
15028
  matrix.toArray(this.instanceMatrix.array, index * 16);
15029
+ return this;
14971
15030
  }
14972
15031
  /**
14973
15032
  * Sets the morph target weights to the defined instance. Make sure you set the `needsUpdate` flag of
@@ -14976,6 +15035,7 @@ var init_three_core = __esm({
14976
15035
  * @param {number} index - The instance index.
14977
15036
  * @param {Mesh} object - A mesh which `morphTargetInfluences` property containing the morph target weights
14978
15037
  * of a single instance.
15038
+ * @return {InstancedMesh} A reference to this instanced mesh.
14979
15039
  */
14980
15040
  setMorphAt(index, object) {
14981
15041
  const objectInfluences = object.morphTargetInfluences;
@@ -14992,6 +15052,7 @@ var init_three_core = __esm({
14992
15052
  const dataIndex = len * index;
14993
15053
  array[dataIndex] = morphBaseInfluence;
14994
15054
  array.set(objectInfluences, dataIndex + 1);
15055
+ return this;
14995
15056
  }
14996
15057
  updateMorphTargets() {
14997
15058
  }
@@ -15144,9 +15205,10 @@ var init_three_core = __esm({
15144
15205
  *
15145
15206
  * @param {Line3} line - The line to compute the intersection for.
15146
15207
  * @param {Vector3} target - The target vector that is used to store the method's result.
15147
- * @return {?Vector3} The intersection point.
15208
+ * @param {boolean} [clampToLine=true] - Whether to clamp the intersection to the line segment.
15209
+ * @return {?Vector3} The intersection point. Returns `null` if no intersection is detected.
15148
15210
  */
15149
- intersectLine(line, target) {
15211
+ intersectLine(line, target, clampToLine = true) {
15150
15212
  const direction = line.delta(_vector1);
15151
15213
  const denominator = this.normal.dot(direction);
15152
15214
  if (denominator === 0) {
@@ -15156,7 +15218,7 @@ var init_three_core = __esm({
15156
15218
  return null;
15157
15219
  }
15158
15220
  const t2 = -(line.start.dot(this.normal) + this.constant) / denominator;
15159
- if (t2 < 0 || t2 > 1) {
15221
+ if (clampToLine === true && (t2 < 0 || t2 > 1)) {
15160
15222
  return null;
15161
15223
  }
15162
15224
  return target.copy(line.start).addScaledVector(direction, t2);
@@ -15664,7 +15726,6 @@ var init_three_core = __esm({
15664
15726
  this._multiDrawCounts = new Int32Array(maxInstanceCount);
15665
15727
  this._multiDrawStarts = new Int32Array(maxInstanceCount);
15666
15728
  this._multiDrawCount = 0;
15667
- this._multiDrawInstances = null;
15668
15729
  this._matricesTexture = null;
15669
15730
  this._indirectTexture = null;
15670
15731
  this._colorsTexture = null;
@@ -16209,7 +16270,15 @@ var init_three_core = __esm({
16209
16270
  */
16210
16271
  getColorAt(instanceId, color) {
16211
16272
  this.validateInstanceId(instanceId);
16212
- return color.fromArray(this._colorsTexture.image.data, instanceId * 4);
16273
+ if (this._colorsTexture === null) {
16274
+ if (color.isVector4) {
16275
+ return color.set(1, 1, 1, 1);
16276
+ } else {
16277
+ return color.setRGB(1, 1, 1);
16278
+ }
16279
+ } else {
16280
+ return color.fromArray(this._colorsTexture.image.data, instanceId * 4);
16281
+ }
16213
16282
  }
16214
16283
  /**
16215
16284
  * Sets the visibility of the instance.
@@ -17113,6 +17182,41 @@ var init_three_core = __esm({
17113
17182
  this.needsUpdate = true;
17114
17183
  }
17115
17184
  };
17185
+ HTMLTexture = class extends Texture {
17186
+ /**
17187
+ * Constructs a new texture.
17188
+ *
17189
+ * @param {HTMLElement} [element] - The HTML element.
17190
+ * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.
17191
+ * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.
17192
+ * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.
17193
+ * @param {number} [magFilter=LinearFilter] - The mag filter value.
17194
+ * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.
17195
+ * @param {number} [format=RGBAFormat] - The texture format.
17196
+ * @param {number} [type=UnsignedByteType] - The texture type.
17197
+ * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.
17198
+ */
17199
+ constructor(element2, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy) {
17200
+ super(element2, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy);
17201
+ this.isHTMLTexture = true;
17202
+ this.generateMipmaps = false;
17203
+ this.needsUpdate = true;
17204
+ const parent = element2 ? element2.parentNode : null;
17205
+ if (parent !== null && "requestPaint" in parent) {
17206
+ parent.onpaint = () => {
17207
+ this.needsUpdate = true;
17208
+ };
17209
+ parent.requestPaint();
17210
+ }
17211
+ }
17212
+ dispose() {
17213
+ const parent = this.image ? this.image.parentNode : null;
17214
+ if (parent !== null && "onpaint" in parent) {
17215
+ parent.onpaint = null;
17216
+ }
17217
+ super.dispose();
17218
+ }
17219
+ };
17116
17220
  DepthTexture = class extends Texture {
17117
17221
  /**
17118
17222
  * Constructs a new depth texture.
@@ -18567,6 +18671,7 @@ var init_three_core = __esm({
18567
18671
  }
18568
18672
  };
18569
18673
  tmp = /* @__PURE__ */ new Vector3();
18674
+ tmp2 = /* @__PURE__ */ new Vector3();
18570
18675
  px = /* @__PURE__ */ new CubicPoly();
18571
18676
  py = /* @__PURE__ */ new CubicPoly();
18572
18677
  pz = /* @__PURE__ */ new CubicPoly();
@@ -18612,8 +18717,8 @@ var init_three_core = __esm({
18612
18717
  if (this.closed || intPoint > 0) {
18613
18718
  p0 = points[(intPoint - 1) % l2];
18614
18719
  } else {
18615
- tmp.subVectors(points[0], points[1]).add(points[0]);
18616
- p0 = tmp;
18720
+ tmp2.subVectors(points[0], points[1]).add(points[0]);
18721
+ p0 = tmp2;
18617
18722
  }
18618
18723
  const p1 = points[intPoint % l2];
18619
18724
  const p22 = points[(intPoint + 1) % l2];
@@ -23462,7 +23567,6 @@ var init_three_core = __esm({
23462
23567
  * @param {function(any)} onLoad - Executed when the loading process has been finished.
23463
23568
  * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.
23464
23569
  * @param {onErrorCallback} [onError] - Executed when errors occur.
23465
- * @return {any|undefined} The cached resource if available.
23466
23570
  */
23467
23571
  load(url, onLoad, onProgress, onError) {
23468
23572
  if (url === void 0) url = "";
@@ -23475,7 +23579,7 @@ var init_three_core = __esm({
23475
23579
  if (onLoad) onLoad(cached);
23476
23580
  this.manager.itemEnd(url);
23477
23581
  }, 0);
23478
- return cached;
23582
+ return;
23479
23583
  }
23480
23584
  if (loading[url] !== void 0) {
23481
23585
  loading[url].push({
@@ -23919,13 +24023,13 @@ var init_three_core = __esm({
23919
24023
  let texData;
23920
24024
  try {
23921
24025
  texData = scope.parse(buffer);
23922
- } catch (error2) {
24026
+ } catch (e2) {
23923
24027
  if (onError !== void 0) {
23924
- onError(error2);
24028
+ onError(e2);
23925
24029
  } else {
23926
- error2(error2);
23927
- return;
24030
+ error(e2);
23928
24031
  }
24032
+ return;
23929
24033
  }
23930
24034
  if (texData.image !== void 0) {
23931
24035
  texture.image = texData.image;
@@ -25261,7 +25365,7 @@ var init_three_core = __esm({
25261
25365
  if (json.userData !== void 0) material.userData = json.userData;
25262
25366
  if (json.vertexColors !== void 0) {
25263
25367
  if (typeof json.vertexColors === "number") {
25264
- material.vertexColors = json.vertexColors > 0 ? true : false;
25368
+ material.vertexColors = json.vertexColors > 0;
25265
25369
  } else {
25266
25370
  material.vertexColors = json.vertexColors;
25267
25371
  }
@@ -25589,6 +25693,7 @@ var init_three_core = __esm({
25589
25693
  return geometry;
25590
25694
  }
25591
25695
  };
25696
+ _customGeometries = {};
25592
25697
  ObjectLoader = class extends Loader {
25593
25698
  /**
25594
25699
  * Constructs a new object loader.
@@ -25618,9 +25723,9 @@ var init_three_core = __esm({
25618
25723
  let json = null;
25619
25724
  try {
25620
25725
  json = JSON.parse(text2);
25621
- } catch (error2) {
25622
- if (onError !== void 0) onError(error2);
25623
- error2("ObjectLoader: Can't parse " + url + ".", error2.message);
25726
+ } catch (e2) {
25727
+ if (onError !== void 0) onError(e2);
25728
+ error("ObjectLoader: Can't parse " + url + ".", e2.message);
25624
25729
  return;
25625
25730
  }
25626
25731
  const metadata = json.metadata;
@@ -25713,6 +25818,17 @@ var init_three_core = __esm({
25713
25818
  this.bindLightTargets(object);
25714
25819
  return object;
25715
25820
  }
25821
+ /**
25822
+ * Registers the given geometry at the internal
25823
+ * geometry library.
25824
+ *
25825
+ * @static
25826
+ * @param {string} type - The geometry type.
25827
+ * @param {BufferGeometry.constructor} geometryClass - The geometry class.
25828
+ */
25829
+ static registerGeometry(type, geometryClass) {
25830
+ _customGeometries[type] = geometryClass;
25831
+ }
25716
25832
  // internals
25717
25833
  parseShapes(json) {
25718
25834
  const shapes = {};
@@ -25753,8 +25869,10 @@ var init_three_core = __esm({
25753
25869
  default:
25754
25870
  if (data.type in Geometries) {
25755
25871
  geometry = Geometries[data.type].fromJSON(data, shapes);
25872
+ } else if (data.type in _customGeometries) {
25873
+ geometry = _customGeometries[data.type].fromJSON(data, shapes);
25756
25874
  } else {
25757
- warn(`ObjectLoader: Unsupported geometry type "${data.type}"`);
25875
+ warn(`ObjectLoader: Unknown geometry type "${data.type}". Use .registerGeometry() before starting the deserialization process.`);
25758
25876
  }
25759
25877
  }
25760
25878
  geometry.uuid = data.uuid;
@@ -25955,6 +26073,7 @@ var init_three_core = __esm({
25955
26073
  if (data.premultiplyAlpha !== void 0) texture.premultiplyAlpha = data.premultiplyAlpha;
25956
26074
  if (data.unpackAlignment !== void 0) texture.unpackAlignment = data.unpackAlignment;
25957
26075
  if (data.compareFunction !== void 0) texture.compareFunction = data.compareFunction;
26076
+ if (data.normalized !== void 0) texture.normalized = data.normalized;
25958
26077
  if (data.userData !== void 0) texture.userData = data.userData;
25959
26078
  textures[data.uuid] = texture;
25960
26079
  }
@@ -26286,6 +26405,9 @@ var init_three_core = __esm({
26286
26405
  * Sets the given loader options. The structure of the object must match the `options` parameter of
26287
26406
  * [createImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap).
26288
26407
  *
26408
+ * Note: When caching is enabled, the cache key is based on the URL only. Loading the same URL with
26409
+ * different options will return the cached result of the first request.
26410
+ *
26289
26411
  * @param {Object} options - The loader options to set.
26290
26412
  * @return {ImageBitmapLoader} A reference to this image bitmap loader.
26291
26413
  */
@@ -26300,7 +26422,6 @@ var init_three_core = __esm({
26300
26422
  * @param {function(ImageBitmap)} onLoad - Executed when the loading process has been finished.
26301
26423
  * @param {onProgressCallback} onProgress - Unsupported in this loader.
26302
26424
  * @param {onErrorCallback} onError - Executed when errors occur.
26303
- * @return {ImageBitmap|undefined} The image bitmap.
26304
26425
  */
26305
26426
  load(url, onLoad, onProgress, onError) {
26306
26427
  if (url === void 0) url = "";
@@ -26319,7 +26440,6 @@ var init_three_core = __esm({
26319
26440
  } else {
26320
26441
  if (onLoad) onLoad(imageBitmap);
26321
26442
  scope.manager.itemEnd(url);
26322
- return imageBitmap;
26323
26443
  }
26324
26444
  });
26325
26445
  return;
@@ -26328,7 +26448,7 @@ var init_three_core = __esm({
26328
26448
  if (onLoad) onLoad(cached);
26329
26449
  scope.manager.itemEnd(url);
26330
26450
  }, 0);
26331
- return cached;
26451
+ return;
26332
26452
  }
26333
26453
  const fetchOptions = {};
26334
26454
  fetchOptions.credentials = this.crossOrigin === "anonymous" ? "same-origin" : "include";
@@ -26342,7 +26462,6 @@ var init_three_core = __esm({
26342
26462
  Cache.add(`image-bitmap:${url}`, imageBitmap);
26343
26463
  if (onLoad) onLoad(imageBitmap);
26344
26464
  scope.manager.itemEnd(url);
26345
- return imageBitmap;
26346
26465
  }).catch(function(e2) {
26347
26466
  if (onError) onError(e2);
26348
26467
  _errorMap.set(promise, e2);
@@ -26368,7 +26487,7 @@ var init_three_core = __esm({
26368
26487
  /**
26369
26488
  * Returns the global native audio context.
26370
26489
  *
26371
- * @return {AudioContext} The native audio context.
26490
+ * @return {Window.AudioContext} The native audio context.
26372
26491
  */
26373
26492
  static getContext() {
26374
26493
  if (_context === void 0) {
@@ -26379,7 +26498,7 @@ var init_three_core = __esm({
26379
26498
  /**
26380
26499
  * Allows to set the global native audio context from outside.
26381
26500
  *
26382
- * @param {AudioContext} value - The native context to set.
26501
+ * @param {Window.AudioContext} value - The native context to set.
26383
26502
  */
26384
26503
  static setContext(value) {
26385
26504
  _context = value;
@@ -26414,9 +26533,15 @@ var init_three_core = __esm({
26414
26533
  try {
26415
26534
  const bufferCopy = buffer.slice(0);
26416
26535
  const context2 = AudioContext.getContext();
26536
+ const decodeUrl = url + "#decode";
26537
+ scope.manager.itemStart(decodeUrl);
26417
26538
  context2.decodeAudioData(bufferCopy, function(audioBuffer) {
26418
26539
  onLoad(audioBuffer);
26419
- }).catch(handleError);
26540
+ scope.manager.itemEnd(decodeUrl);
26541
+ }).catch(function(e2) {
26542
+ handleError(e2);
26543
+ scope.manager.itemEnd(decodeUrl);
26544
+ });
26420
26545
  } catch (e2) {
26421
26546
  handleError(e2);
26422
26547
  }
@@ -28252,6 +28377,9 @@ var init_three_core = __esm({
28252
28377
  for (let i3 = 0; i3 !== nTracks; ++i3) {
28253
28378
  const interpolant = tracks[i3].createInterpolant(null);
28254
28379
  interpolants[i3] = interpolant;
28380
+ if (interpolant.settings) {
28381
+ Object.assign(interpolantSettings, interpolant.settings);
28382
+ }
28255
28383
  interpolant.settings = interpolantSettings;
28256
28384
  }
28257
28385
  this._interpolantSettings = interpolantSettings;
@@ -28695,6 +28823,7 @@ var init_three_core = __esm({
28695
28823
  });
28696
28824
  }
28697
28825
  } else {
28826
+ this._loopCount = loopCount;
28698
28827
  this.time = time;
28699
28828
  }
28700
28829
  if (pingPong && (loopCount & 1) === 1) {
@@ -29534,7 +29663,7 @@ var init_three_core = __esm({
29534
29663
  this.oldTime = 0;
29535
29664
  this.elapsedTime = 0;
29536
29665
  this.running = false;
29537
- warn("THREE.Clock: This module has been deprecated. Please use THREE.Timer instead.");
29666
+ warn("Clock: This module has been deprecated. Please use THREE.Timer instead.");
29538
29667
  }
29539
29668
  /**
29540
29669
  * Starts the clock. When `autoStart` is set to `true`, the method is automatically
@@ -29744,6 +29873,9 @@ var init_three_core = __esm({
29744
29873
  }
29745
29874
  };
29746
29875
  Matrix2 = class _Matrix2 {
29876
+ static {
29877
+ _Matrix2.prototype.isMatrix2 = true;
29878
+ }
29747
29879
  /**
29748
29880
  * Constructs a new 2x2 matrix. The arguments are supposed to be
29749
29881
  * in row-major order. If no arguments are provided, the constructor
@@ -29755,7 +29887,6 @@ var init_three_core = __esm({
29755
29887
  * @param {number} [n22] - 2-2 matrix element.
29756
29888
  */
29757
29889
  constructor(n11, n12, n21, n22) {
29758
- _Matrix2.prototype.isMatrix2 = true;
29759
29890
  this.elements = [
29760
29891
  1,
29761
29892
  0,
@@ -30167,6 +30298,7 @@ var init_three_core = __esm({
30167
30298
  _startP.subVectors(point, this.start);
30168
30299
  _startEnd.subVectors(this.end, this.start);
30169
30300
  const startEnd2 = _startEnd.dot(_startEnd);
30301
+ if (startEnd2 === 0) return 0;
30170
30302
  const startEnd_startP = _startEnd.dot(_startP);
30171
30303
  let t2 = startEnd_startP / startEnd2;
30172
30304
  if (clampToLine) {
@@ -31583,7 +31715,7 @@ var init_three_core = __esm({
31583
31715
  }
31584
31716
  });
31585
31717
 
31586
- // ../../node_modules/.bun/three@0.183.2/node_modules/three/build/three.module.js
31718
+ // ../../node_modules/.bun/three@0.184.0/node_modules/three/build/three.module.js
31587
31719
  var three_module_exports = {};
31588
31720
  __export(three_module_exports, {
31589
31721
  ACESFilmicToneMapping: () => ACESFilmicToneMapping,
@@ -31725,6 +31857,7 @@ __export(three_module_exports, {
31725
31857
  GreaterStencilFunc: () => GreaterStencilFunc,
31726
31858
  GridHelper: () => GridHelper,
31727
31859
  Group: () => Group,
31860
+ HTMLTexture: () => HTMLTexture,
31728
31861
  HalfFloatType: () => HalfFloatType,
31729
31862
  HemisphereLight: () => HemisphereLight,
31730
31863
  HemisphereLightHelper: () => HemisphereLightHelper,
@@ -32040,11 +32173,12 @@ function WebGLAnimation() {
32040
32173
  start: function() {
32041
32174
  if (isAnimating === true) return;
32042
32175
  if (animationLoop === null) return;
32176
+ if (context2 === null) return;
32043
32177
  requestId = context2.requestAnimationFrame(onAnimationFrame);
32044
32178
  isAnimating = true;
32045
32179
  },
32046
32180
  stop: function() {
32047
- context2.cancelAnimationFrame(requestId);
32181
+ if (context2 !== null) context2.cancelAnimationFrame(requestId);
32048
32182
  isAnimating = false;
32049
32183
  },
32050
32184
  setAnimationLoop: function(callback) {
@@ -32247,19 +32381,13 @@ function WebGLBackground(renderer, environments, state2, objects, alpha, premult
32247
32381
  });
32248
32382
  objects.update(boxMesh);
32249
32383
  }
32250
- _e1$1.copy(scene.backgroundRotation);
32251
- _e1$1.x *= -1;
32252
- _e1$1.y *= -1;
32253
- _e1$1.z *= -1;
32254
- if (background.isCubeTexture && background.isRenderTargetTexture === false) {
32255
- _e1$1.y *= -1;
32256
- _e1$1.z *= -1;
32257
- }
32258
32384
  boxMesh.material.uniforms.envMap.value = background;
32259
- boxMesh.material.uniforms.flipEnvMap.value = background.isCubeTexture && background.isRenderTargetTexture === false ? -1 : 1;
32260
32385
  boxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;
32261
32386
  boxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;
32262
- boxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4(_m1$12.makeRotationFromEuler(_e1$1));
32387
+ boxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4(_m1$12.makeRotationFromEuler(scene.backgroundRotation)).transpose();
32388
+ if (background.isCubeTexture && background.isRenderTargetTexture === false) {
32389
+ boxMesh.material.uniforms.backgroundRotation.value.premultiply(_m$1);
32390
+ }
32263
32391
  boxMesh.material.toneMapped = ColorManagement.getTransfer(background.colorSpace) !== SRGBTransfer;
32264
32392
  if (currentBackground !== background || currentBackgroundVersion !== background.version || currentTonemapping !== renderer.toneMapping) {
32265
32393
  boxMesh.material.needsUpdate = true;
@@ -32735,27 +32863,10 @@ function WebGLBufferRenderer(gl, extensions2, info) {
32735
32863
  }
32736
32864
  info.update(elementCount, mode, 1);
32737
32865
  }
32738
- function renderMultiDrawInstances(starts, counts, drawCount, primcount) {
32739
- if (drawCount === 0) return;
32740
- const extension = extensions2.get("WEBGL_multi_draw");
32741
- if (extension === null) {
32742
- for (let i3 = 0; i3 < starts.length; i3++) {
32743
- renderInstances(starts[i3], counts[i3], primcount[i3]);
32744
- }
32745
- } else {
32746
- extension.multiDrawArraysInstancedWEBGL(mode, starts, 0, counts, 0, primcount, 0, drawCount);
32747
- let elementCount = 0;
32748
- for (let i3 = 0; i3 < drawCount; i3++) {
32749
- elementCount += counts[i3] * primcount[i3];
32750
- }
32751
- info.update(elementCount, mode, 1);
32752
- }
32753
- }
32754
32866
  this.setMode = setMode;
32755
32867
  this.render = render;
32756
32868
  this.renderInstances = renderInstances;
32757
32869
  this.renderMultiDraw = renderMultiDraw;
32758
- this.renderMultiDrawInstances = renderMultiDrawInstances;
32759
32870
  }
32760
32871
  function WebGLCapabilities(gl, extensions2, parameters, utils) {
32761
32872
  let maxAnisotropy;
@@ -32805,6 +32916,9 @@ function WebGLCapabilities(gl, extensions2, parameters, utils) {
32805
32916
  }
32806
32917
  const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
32807
32918
  const reversedDepthBuffer = parameters.reversedDepthBuffer === true && extensions2.has("EXT_clip_control");
32919
+ if (parameters.reversedDepthBuffer === true && reversedDepthBuffer === false) {
32920
+ warn("WebGLRenderer: Unable to use reversed depth buffer due to missing EXT_clip_control extension. Fallback to default depth buffer.");
32921
+ }
32808
32922
  const maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
32809
32923
  const maxVertexTextures = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS);
32810
32924
  const maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
@@ -33610,28 +33724,11 @@ function WebGLIndexedBufferRenderer(gl, extensions2, info) {
33610
33724
  }
33611
33725
  info.update(elementCount, mode, 1);
33612
33726
  }
33613
- function renderMultiDrawInstances(starts, counts, drawCount, primcount) {
33614
- if (drawCount === 0) return;
33615
- const extension = extensions2.get("WEBGL_multi_draw");
33616
- if (extension === null) {
33617
- for (let i3 = 0; i3 < starts.length; i3++) {
33618
- renderInstances(starts[i3] / bytesPerElement, counts[i3], primcount[i3]);
33619
- }
33620
- } else {
33621
- extension.multiDrawElementsInstancedWEBGL(mode, counts, 0, type, starts, 0, primcount, 0, drawCount);
33622
- let elementCount = 0;
33623
- for (let i3 = 0; i3 < drawCount; i3++) {
33624
- elementCount += counts[i3] * primcount[i3];
33625
- }
33626
- info.update(elementCount, mode, 1);
33627
- }
33628
- }
33629
33727
  this.setMode = setMode;
33630
33728
  this.setIndex = setIndex;
33631
33729
  this.render = render;
33632
33730
  this.renderInstances = renderInstances;
33633
33731
  this.renderMultiDraw = renderMultiDraw;
33634
- this.renderMultiDrawInstances = renderMultiDrawInstances;
33635
33732
  }
33636
33733
  function WebGLInfo(gl) {
33637
33734
  const memory = {
@@ -33825,7 +33922,8 @@ function WebGLOutput(type, width, height, depth, stencil) {
33825
33922
  const targetA = new WebGLRenderTarget(width, height, {
33826
33923
  type,
33827
33924
  depthBuffer: depth,
33828
- stencilBuffer: stencil
33925
+ stencilBuffer: stencil,
33926
+ depthTexture: depth ? new DepthTexture(width, height) : void 0
33829
33927
  });
33830
33928
  const targetB = new WebGLRenderTarget(width, height, {
33831
33929
  type: HalfFloatType,
@@ -33978,6 +34076,7 @@ function WebGLOutput(type, width, height, depth, stencil) {
33978
34076
  return _isCompositing;
33979
34077
  };
33980
34078
  this.dispose = function() {
34079
+ if (targetA.depthTexture) targetA.depthTexture.dispose();
33981
34080
  targetA.dispose();
33982
34081
  targetB.dispose();
33983
34082
  geometry.dispose();
@@ -34865,6 +34964,7 @@ function WebGLProgram(renderer, cacheKey, parameters, bindingStates) {
34865
34964
  parameters.thicknessMapUv ? "#define THICKNESSMAP_UV " + parameters.thicknessMapUv : "",
34866
34965
  //
34867
34966
  parameters.vertexTangents && parameters.flatShading === false ? "#define USE_TANGENT" : "",
34967
+ parameters.vertexNormals ? "#define HAS_NORMAL" : "",
34868
34968
  parameters.vertexColors ? "#define USE_COLOR" : "",
34869
34969
  parameters.vertexAlphas ? "#define USE_COLOR_ALPHA" : "",
34870
34970
  parameters.vertexUv1s ? "#define USE_UV1" : "",
@@ -34951,6 +35051,7 @@ function WebGLProgram(renderer, cacheKey, parameters, bindingStates) {
34951
35051
  parameters.normalMap ? "#define USE_NORMALMAP" : "",
34952
35052
  parameters.normalMapObjectSpace ? "#define USE_NORMALMAP_OBJECTSPACE" : "",
34953
35053
  parameters.normalMapTangentSpace ? "#define USE_NORMALMAP_TANGENTSPACE" : "",
35054
+ parameters.packedNormalMap ? "#define USE_PACKED_NORMALMAP" : "",
34954
35055
  parameters.emissiveMap ? "#define USE_EMISSIVEMAP" : "",
34955
35056
  parameters.anisotropy ? "#define USE_ANISOTROPY" : "",
34956
35057
  parameters.anisotropyMap ? "#define USE_ANISOTROPYMAP" : "",
@@ -34991,6 +35092,7 @@ function WebGLProgram(renderer, cacheKey, parameters, bindingStates) {
34991
35092
  parameters.shadowMapEnabled ? "#define " + shadowMapTypeDefine : "",
34992
35093
  parameters.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA" : "",
34993
35094
  parameters.numLightProbes > 0 ? "#define USE_LIGHT_PROBES" : "",
35095
+ parameters.numLightProbeGrids > 0 ? "#define USE_LIGHT_PROBES_GRID" : "",
34994
35096
  parameters.decodeVideoTexture ? "#define DECODE_VIDEO_TEXTURE" : "",
34995
35097
  parameters.decodeVideoTextureEmissive ? "#define DECODE_VIDEO_TEXTURE_EMISSIVE" : "",
34996
35098
  parameters.logarithmicDepthBuffer ? "#define USE_LOGARITHMIC_DEPTH_BUFFER" : "",
@@ -35138,6 +35240,9 @@ function WebGLProgram(renderer, cacheKey, parameters, bindingStates) {
35138
35240
  this.fragmentShader = glFragmentShader;
35139
35241
  return this;
35140
35242
  }
35243
+ function isPackedRGFormat(format) {
35244
+ return format === RGFormat || format === RG11_EAC_Format || format === RED_GREEN_RGTC2_Format;
35245
+ }
35141
35246
  function WebGLPrograms(renderer, environments, extensions2, capabilities, bindingStates, clipping) {
35142
35247
  const _programLayers = new Layers();
35143
35248
  const _customShaders = new WebGLShaderCache();
@@ -35168,7 +35273,7 @@ function WebGLPrograms(renderer, environments, extensions2, capabilities, bindin
35168
35273
  if (value === 0) return "uv";
35169
35274
  return `uv${value}`;
35170
35275
  }
35171
- function getParameters(material, lights, shadows, scene, object) {
35276
+ function getParameters(material, lights, shadows, scene, object, lightProbeGrids) {
35172
35277
  const fog = scene.fog;
35173
35278
  const geometry = object.geometry;
35174
35279
  const environment = material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ? scene.environment : null;
@@ -35263,7 +35368,7 @@ function WebGLPrograms(renderer, environments, extensions2, capabilities, bindin
35263
35368
  instancing: IS_INSTANCEDMESH,
35264
35369
  instancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,
35265
35370
  instancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,
35266
- outputColorSpace: currentRenderTarget === null ? renderer.outputColorSpace : currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace,
35371
+ outputColorSpace: currentRenderTarget === null ? renderer.outputColorSpace : currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : ColorManagement.workingColorSpace,
35267
35372
  alphaToCoverage: !!material.alphaToCoverage,
35268
35373
  map: HAS_MAP,
35269
35374
  matcap: HAS_MATCAP,
@@ -35278,6 +35383,7 @@ function WebGLPrograms(renderer, environments, extensions2, capabilities, bindin
35278
35383
  emissiveMap: HAS_EMISSIVEMAP,
35279
35384
  normalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,
35280
35385
  normalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,
35386
+ packedNormalMap: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap && isPackedRGFormat(material.normalMap.format),
35281
35387
  metalnessMap: HAS_METALNESSMAP,
35282
35388
  roughnessMap: HAS_ROUGHNESSMAP,
35283
35389
  anisotropy: HAS_ANISOTROPY,
@@ -35331,6 +35437,7 @@ function WebGLPrograms(renderer, environments, extensions2, capabilities, bindin
35331
35437
  alphaMapUv: HAS_ALPHAMAP && getChannel2(material.alphaMap.channel),
35332
35438
  //
35333
35439
  vertexTangents: !!geometry.attributes.tangent && (HAS_NORMALMAP || HAS_ANISOTROPY),
35440
+ vertexNormals: !!geometry.attributes.normal,
35334
35441
  vertexColors: material.vertexColors,
35335
35442
  vertexAlphas: material.vertexColors === true && !!geometry.attributes.color && geometry.attributes.color.itemSize === 4,
35336
35443
  pointsUvs: object.isPoints === true && !!geometry.attributes.uv && (HAS_MAP || HAS_ALPHAMAP),
@@ -35358,6 +35465,7 @@ function WebGLPrograms(renderer, environments, extensions2, capabilities, bindin
35358
35465
  numSpotLightShadows: lights.spotShadowMap.length,
35359
35466
  numSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,
35360
35467
  numLightProbes: lights.numLightProbes,
35468
+ numLightProbeGrids: lightProbeGrids.length,
35361
35469
  numClippingPlanes: clipping.numPlanes,
35362
35470
  numClipIntersection: clipping.numIntersection,
35363
35471
  dithering: material.dithering,
@@ -35501,6 +35609,10 @@ function WebGLPrograms(renderer, environments, extensions2, capabilities, bindin
35501
35609
  _programLayers.enable(20);
35502
35610
  if (parameters.gradientMap)
35503
35611
  _programLayers.enable(21);
35612
+ if (parameters.packedNormalMap)
35613
+ _programLayers.enable(22);
35614
+ if (parameters.vertexNormals)
35615
+ _programLayers.enable(23);
35504
35616
  array.push(_programLayers.mask);
35505
35617
  _programLayers.disableAll();
35506
35618
  if (parameters.fog)
@@ -35547,6 +35659,8 @@ function WebGLPrograms(renderer, environments, extensions2, capabilities, bindin
35547
35659
  _programLayers.enable(20);
35548
35660
  if (parameters.alphaToCoverage)
35549
35661
  _programLayers.enable(21);
35662
+ if (parameters.numLightProbeGrids > 0)
35663
+ _programLayers.enable(22);
35550
35664
  array.push(_programLayers.mask);
35551
35665
  }
35552
35666
  function getUniforms(material) {
@@ -36145,10 +36259,12 @@ function WebGLRenderState(extensions2) {
36145
36259
  const lights = new WebGLLights(extensions2);
36146
36260
  const lightsArray = [];
36147
36261
  const shadowsArray = [];
36262
+ const lightProbeGridArray = [];
36148
36263
  function init(camera) {
36149
36264
  state2.camera = camera;
36150
36265
  lightsArray.length = 0;
36151
36266
  shadowsArray.length = 0;
36267
+ lightProbeGridArray.length = 0;
36152
36268
  }
36153
36269
  function pushLight(light) {
36154
36270
  lightsArray.push(light);
@@ -36156,6 +36272,9 @@ function WebGLRenderState(extensions2) {
36156
36272
  function pushShadow(shadowLight) {
36157
36273
  shadowsArray.push(shadowLight);
36158
36274
  }
36275
+ function pushLightProbeGrid(volume) {
36276
+ lightProbeGridArray.push(volume);
36277
+ }
36159
36278
  function setupLights() {
36160
36279
  lights.setup(lightsArray);
36161
36280
  }
@@ -36165,9 +36284,11 @@ function WebGLRenderState(extensions2) {
36165
36284
  const state2 = {
36166
36285
  lightsArray,
36167
36286
  shadowsArray,
36287
+ lightProbeGridArray,
36168
36288
  camera: null,
36169
36289
  lights,
36170
- transmissionRenderTarget: {}
36290
+ transmissionRenderTarget: {},
36291
+ textureUnits: 0
36171
36292
  };
36172
36293
  return {
36173
36294
  init,
@@ -36175,7 +36296,8 @@ function WebGLRenderState(extensions2) {
36175
36296
  setupLights,
36176
36297
  setupLightsView,
36177
36298
  pushLight,
36178
- pushShadow
36299
+ pushShadow,
36300
+ pushLightProbeGrid
36179
36301
  };
36180
36302
  }
36181
36303
  function WebGLRenderStates(extensions2) {
@@ -36714,6 +36836,7 @@ function WebGLState(gl, extensions2) {
36714
36836
  const uboBindings = /* @__PURE__ */ new WeakMap();
36715
36837
  const uboProgramMap = /* @__PURE__ */ new WeakMap();
36716
36838
  let enabledCapabilities = {};
36839
+ let parameters = {};
36717
36840
  let currentBoundFramebuffers = {};
36718
36841
  let currentDrawbuffers = /* @__PURE__ */ new WeakMap();
36719
36842
  let defaultDrawbuffers = [];
@@ -37138,6 +37261,19 @@ function WebGLState(gl, extensions2) {
37138
37261
  error("WebGLState:", e2);
37139
37262
  }
37140
37263
  }
37264
+ function getParameter(name) {
37265
+ if (parameters[name] !== void 0) {
37266
+ return parameters[name];
37267
+ } else {
37268
+ return gl.getParameter(name);
37269
+ }
37270
+ }
37271
+ function pixelStorei(name, value) {
37272
+ if (parameters[name] !== value) {
37273
+ gl.pixelStorei(name, value);
37274
+ parameters[name] = value;
37275
+ }
37276
+ }
37141
37277
  function scissor(scissor2) {
37142
37278
  if (currentScissor.equals(scissor2) === false) {
37143
37279
  gl.scissor(scissor2.x, scissor2.y, scissor2.z, scissor2.w);
@@ -37203,7 +37339,21 @@ function WebGLState(gl, extensions2) {
37203
37339
  gl.lineWidth(1);
37204
37340
  gl.scissor(0, 0, gl.canvas.width, gl.canvas.height);
37205
37341
  gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
37342
+ gl.pixelStorei(gl.PACK_ALIGNMENT, 4);
37343
+ gl.pixelStorei(gl.UNPACK_ALIGNMENT, 4);
37344
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
37345
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
37346
+ gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.BROWSER_DEFAULT_WEBGL);
37347
+ gl.pixelStorei(gl.PACK_ROW_LENGTH, 0);
37348
+ gl.pixelStorei(gl.PACK_SKIP_PIXELS, 0);
37349
+ gl.pixelStorei(gl.PACK_SKIP_ROWS, 0);
37350
+ gl.pixelStorei(gl.UNPACK_ROW_LENGTH, 0);
37351
+ gl.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, 0);
37352
+ gl.pixelStorei(gl.UNPACK_SKIP_PIXELS, 0);
37353
+ gl.pixelStorei(gl.UNPACK_SKIP_ROWS, 0);
37354
+ gl.pixelStorei(gl.UNPACK_SKIP_IMAGES, 0);
37206
37355
  enabledCapabilities = {};
37356
+ parameters = {};
37207
37357
  currentTextureSlot = null;
37208
37358
  currentBoundTextures = {};
37209
37359
  currentBoundFramebuffers = {};
@@ -37257,6 +37407,8 @@ function WebGLState(gl, extensions2) {
37257
37407
  compressedTexImage3D,
37258
37408
  texImage2D,
37259
37409
  texImage3D,
37410
+ pixelStorei,
37411
+ getParameter,
37260
37412
  updateUBOMapping,
37261
37413
  uniformBlockBinding,
37262
37414
  texStorage2D,
@@ -37275,6 +37427,7 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37275
37427
  const supportsInvalidateFramebuffer = typeof navigator === "undefined" ? false : /OculusBrowser/g.test(navigator.userAgent);
37276
37428
  const _imageDimensions = new Vector2();
37277
37429
  const _videoTextures = /* @__PURE__ */ new WeakMap();
37430
+ const _htmlTextures = /* @__PURE__ */ new Set();
37278
37431
  let _canvas2;
37279
37432
  const _sources = /* @__PURE__ */ new WeakMap();
37280
37433
  let useOffscreenCanvas = false;
@@ -37324,16 +37477,25 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37324
37477
  if (texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture) return _gl.TEXTURE_2D_ARRAY;
37325
37478
  return _gl.TEXTURE_2D;
37326
37479
  }
37327
- function getInternalFormat(internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false) {
37480
+ function getInternalFormat(internalFormatName, glFormat, glType, normalized, colorSpace, forceLinearTransfer = false) {
37328
37481
  if (internalFormatName !== null) {
37329
37482
  if (_gl[internalFormatName] !== void 0) return _gl[internalFormatName];
37330
37483
  warn("WebGLRenderer: Attempt to use non-existing WebGL internal format '" + internalFormatName + "'");
37331
37484
  }
37485
+ let ext_texture_norm16;
37486
+ if (normalized) {
37487
+ ext_texture_norm16 = extensions2.get("EXT_texture_norm16");
37488
+ if (!ext_texture_norm16) {
37489
+ warn("WebGLRenderer: Unable to use normalized textures without EXT_texture_norm16 extension");
37490
+ }
37491
+ }
37332
37492
  let internalFormat = glFormat;
37333
37493
  if (glFormat === _gl.RED) {
37334
37494
  if (glType === _gl.FLOAT) internalFormat = _gl.R32F;
37335
37495
  if (glType === _gl.HALF_FLOAT) internalFormat = _gl.R16F;
37336
37496
  if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.R8;
37497
+ if (glType === _gl.UNSIGNED_SHORT && ext_texture_norm16) internalFormat = ext_texture_norm16.R16_EXT;
37498
+ if (glType === _gl.SHORT && ext_texture_norm16) internalFormat = ext_texture_norm16.R16_SNORM_EXT;
37337
37499
  }
37338
37500
  if (glFormat === _gl.RED_INTEGER) {
37339
37501
  if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.R8UI;
@@ -37347,6 +37509,8 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37347
37509
  if (glType === _gl.FLOAT) internalFormat = _gl.RG32F;
37348
37510
  if (glType === _gl.HALF_FLOAT) internalFormat = _gl.RG16F;
37349
37511
  if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RG8;
37512
+ if (glType === _gl.UNSIGNED_SHORT && ext_texture_norm16) internalFormat = ext_texture_norm16.RG16_EXT;
37513
+ if (glType === _gl.SHORT && ext_texture_norm16) internalFormat = ext_texture_norm16.RG16_SNORM_EXT;
37350
37514
  }
37351
37515
  if (glFormat === _gl.RG_INTEGER) {
37352
37516
  if (glType === _gl.UNSIGNED_BYTE) internalFormat = _gl.RG8UI;
@@ -37373,6 +37537,8 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37373
37537
  if (glType === _gl.INT) internalFormat = _gl.RGBA32I;
37374
37538
  }
37375
37539
  if (glFormat === _gl.RGB) {
37540
+ if (glType === _gl.UNSIGNED_SHORT && ext_texture_norm16) internalFormat = ext_texture_norm16.RGB16_EXT;
37541
+ if (glType === _gl.SHORT && ext_texture_norm16) internalFormat = ext_texture_norm16.RGB16_SNORM_EXT;
37376
37542
  if (glType === _gl.UNSIGNED_INT_5_9_9_9_REV) internalFormat = _gl.RGB9_E5;
37377
37543
  if (glType === _gl.UNSIGNED_INT_10F_11F_11F_REV) internalFormat = _gl.R11F_G11F_B10F;
37378
37544
  }
@@ -37381,6 +37547,8 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37381
37547
  if (glType === _gl.FLOAT) internalFormat = _gl.RGBA32F;
37382
37548
  if (glType === _gl.HALF_FLOAT) internalFormat = _gl.RGBA16F;
37383
37549
  if (glType === _gl.UNSIGNED_BYTE) internalFormat = transfer === SRGBTransfer ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;
37550
+ if (glType === _gl.UNSIGNED_SHORT && ext_texture_norm16) internalFormat = ext_texture_norm16.RGBA16_EXT;
37551
+ if (glType === _gl.SHORT && ext_texture_norm16) internalFormat = ext_texture_norm16.RGBA16_SNORM_EXT;
37384
37552
  if (glType === _gl.UNSIGNED_SHORT_4_4_4_4) internalFormat = _gl.RGBA4;
37385
37553
  if (glType === _gl.UNSIGNED_SHORT_5_5_5_1) internalFormat = _gl.RGB5_A1;
37386
37554
  }
@@ -37429,6 +37597,9 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37429
37597
  if (texture.isVideoTexture) {
37430
37598
  _videoTextures.delete(texture);
37431
37599
  }
37600
+ if (texture.isHTMLTexture) {
37601
+ _htmlTextures.delete(texture);
37602
+ }
37432
37603
  }
37433
37604
  function onRenderTargetDispose(event) {
37434
37605
  const renderTarget2 = event.target;
@@ -37505,6 +37676,12 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37505
37676
  function resetTextureUnits() {
37506
37677
  textureUnits = 0;
37507
37678
  }
37679
+ function getTextureUnits() {
37680
+ return textureUnits;
37681
+ }
37682
+ function setTextureUnits(value) {
37683
+ textureUnits = value;
37684
+ }
37508
37685
  function allocateTextureUnit() {
37509
37686
  const textureUnit = textureUnits;
37510
37687
  if (textureUnit >= capabilities.maxTextures) {
@@ -37687,10 +37864,10 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37687
37864
  }
37688
37865
  }
37689
37866
  updateRanges.length = mergeIndex + 1;
37690
- const currentUnpackRowLen = _gl.getParameter(_gl.UNPACK_ROW_LENGTH);
37691
- const currentUnpackSkipPixels = _gl.getParameter(_gl.UNPACK_SKIP_PIXELS);
37692
- const currentUnpackSkipRows = _gl.getParameter(_gl.UNPACK_SKIP_ROWS);
37693
- _gl.pixelStorei(_gl.UNPACK_ROW_LENGTH, image.width);
37867
+ const currentUnpackRowLen = state2.getParameter(_gl.UNPACK_ROW_LENGTH);
37868
+ const currentUnpackSkipPixels = state2.getParameter(_gl.UNPACK_SKIP_PIXELS);
37869
+ const currentUnpackSkipRows = state2.getParameter(_gl.UNPACK_SKIP_ROWS);
37870
+ state2.pixelStorei(_gl.UNPACK_ROW_LENGTH, image.width);
37694
37871
  for (let i3 = 0, l2 = updateRanges.length; i3 < l2; i3++) {
37695
37872
  const range = updateRanges[i3];
37696
37873
  const pixelStart = Math.floor(range.start / componentStride);
@@ -37699,14 +37876,14 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37699
37876
  const y = Math.floor(pixelStart / image.width);
37700
37877
  const width = pixelCount;
37701
37878
  const height = 1;
37702
- _gl.pixelStorei(_gl.UNPACK_SKIP_PIXELS, x2);
37703
- _gl.pixelStorei(_gl.UNPACK_SKIP_ROWS, y);
37879
+ state2.pixelStorei(_gl.UNPACK_SKIP_PIXELS, x2);
37880
+ state2.pixelStorei(_gl.UNPACK_SKIP_ROWS, y);
37704
37881
  state2.texSubImage2D(_gl.TEXTURE_2D, 0, x2, y, width, height, glFormat, glType, image.data);
37705
37882
  }
37706
37883
  texture.clearUpdateRanges();
37707
- _gl.pixelStorei(_gl.UNPACK_ROW_LENGTH, currentUnpackRowLen);
37708
- _gl.pixelStorei(_gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels);
37709
- _gl.pixelStorei(_gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows);
37884
+ state2.pixelStorei(_gl.UNPACK_ROW_LENGTH, currentUnpackRowLen);
37885
+ state2.pixelStorei(_gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels);
37886
+ state2.pixelStorei(_gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows);
37710
37887
  }
37711
37888
  }
37712
37889
  function uploadTexture(textureProperties, texture, slot) {
@@ -37719,18 +37896,21 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37719
37896
  const sourceProperties = properties.get(source);
37720
37897
  if (source.version !== sourceProperties.__version || forceUpload === true) {
37721
37898
  state2.activeTexture(_gl.TEXTURE0 + slot);
37722
- const workingPrimaries = ColorManagement.getPrimaries(ColorManagement.workingColorSpace);
37723
- const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries(texture.colorSpace);
37724
- const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;
37725
- _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY);
37726
- _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha);
37727
- _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, texture.unpackAlignment);
37728
- _gl.pixelStorei(_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion);
37899
+ const isImageBitmap = typeof ImageBitmap !== "undefined" && texture.image instanceof ImageBitmap;
37900
+ if (isImageBitmap === false) {
37901
+ const workingPrimaries = ColorManagement.getPrimaries(ColorManagement.workingColorSpace);
37902
+ const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries(texture.colorSpace);
37903
+ const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;
37904
+ state2.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY);
37905
+ state2.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha);
37906
+ state2.pixelStorei(_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion);
37907
+ }
37908
+ state2.pixelStorei(_gl.UNPACK_ALIGNMENT, texture.unpackAlignment);
37729
37909
  let image = resizeImage(texture.image, false, capabilities.maxTextureSize);
37730
37910
  image = verifyColorSpace(texture, image);
37731
37911
  const glFormat = utils.convert(texture.format, texture.colorSpace);
37732
37912
  const glType = utils.convert(texture.type);
37733
- let glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture);
37913
+ let glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.normalized, texture.colorSpace, texture.isVideoTexture);
37734
37914
  setTextureParameters(textureType, texture);
37735
37915
  let mipmap;
37736
37916
  const mipmaps = texture.mipmaps;
@@ -37892,6 +38072,35 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37892
38072
  }
37893
38073
  }
37894
38074
  }
38075
+ } else if (texture.isHTMLTexture) {
38076
+ if ("texElementImage2D" in _gl) {
38077
+ const canvas = _gl.canvas;
38078
+ if (!canvas.hasAttribute("layoutsubtree")) {
38079
+ canvas.setAttribute("layoutsubtree", "true");
38080
+ }
38081
+ if (image.parentNode !== canvas) {
38082
+ canvas.appendChild(image);
38083
+ _htmlTextures.add(texture);
38084
+ canvas.onpaint = (event) => {
38085
+ const changed = event.changedElements;
38086
+ for (const t2 of _htmlTextures) {
38087
+ if (changed.includes(t2.image)) {
38088
+ t2.needsUpdate = true;
38089
+ }
38090
+ }
38091
+ };
38092
+ canvas.requestPaint();
38093
+ return;
38094
+ }
38095
+ const level = 0;
38096
+ const internalFormat = _gl.RGBA;
38097
+ const srcFormat = _gl.RGBA;
38098
+ const srcType = _gl.UNSIGNED_BYTE;
38099
+ _gl.texElementImage2D(_gl.TEXTURE_2D, level, internalFormat, srcFormat, srcType, image);
38100
+ _gl.texParameteri(_gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.LINEAR);
38101
+ _gl.texParameteri(_gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE);
38102
+ _gl.texParameteri(_gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE);
38103
+ }
37895
38104
  } else {
37896
38105
  if (mipmaps.length > 0) {
37897
38106
  if (useTexStorage && allocateMemory) {
@@ -37942,10 +38151,10 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37942
38151
  const workingPrimaries = ColorManagement.getPrimaries(ColorManagement.workingColorSpace);
37943
38152
  const texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries(texture.colorSpace);
37944
38153
  const unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;
37945
- _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY);
37946
- _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha);
37947
- _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, texture.unpackAlignment);
37948
- _gl.pixelStorei(_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion);
38154
+ state2.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, texture.flipY);
38155
+ state2.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha);
38156
+ state2.pixelStorei(_gl.UNPACK_ALIGNMENT, texture.unpackAlignment);
38157
+ state2.pixelStorei(_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion);
37949
38158
  const isCompressed = texture.isCompressedTexture || texture.image[0].isCompressedTexture;
37950
38159
  const isDataTexture = texture.image[0] && texture.image[0].isDataTexture;
37951
38160
  const cubeImage = [];
@@ -37957,7 +38166,7 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
37957
38166
  }
37958
38167
  cubeImage[i3] = verifyColorSpace(texture, cubeImage[i3]);
37959
38168
  }
37960
- const image = cubeImage[0], glFormat = utils.convert(texture.format, texture.colorSpace), glType = utils.convert(texture.type), glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace);
38169
+ const image = cubeImage[0], glFormat = utils.convert(texture.format, texture.colorSpace), glType = utils.convert(texture.type), glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.normalized, texture.colorSpace);
37961
38170
  const useTexStorage = texture.isVideoTexture !== true;
37962
38171
  const allocateMemory = sourceProperties.__version === void 0 || forceUpload === true;
37963
38172
  const dataReady = source.dataReady;
@@ -38054,7 +38263,7 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
38054
38263
  function setupFrameBufferTexture(framebuffer, renderTarget2, texture, attachment, textureTarget, level) {
38055
38264
  const glFormat = utils.convert(texture.format, texture.colorSpace);
38056
38265
  const glType = utils.convert(texture.type);
38057
- const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace);
38266
+ const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.normalized, texture.colorSpace);
38058
38267
  const renderTargetProperties = properties.get(renderTarget2);
38059
38268
  const textureProperties = properties.get(texture);
38060
38269
  textureProperties.__renderTarget = renderTarget2;
@@ -38096,7 +38305,7 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
38096
38305
  const texture = textures[i3];
38097
38306
  const glFormat = utils.convert(texture.format, texture.colorSpace);
38098
38307
  const glType = utils.convert(texture.type);
38099
- const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.colorSpace);
38308
+ const glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType, texture.normalized, texture.colorSpace);
38100
38309
  if (useMultisampledRTT(renderTarget2)) {
38101
38310
  multisampledRTTExt.renderbufferStorageMultisampleEXT(_gl.RENDERBUFFER, getRenderTargetSamples(renderTarget2), glInternalFormat, renderTarget2.width, renderTarget2.height);
38102
38311
  } else if (useMultisample) {
@@ -38296,7 +38505,7 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
38296
38505
  _gl.bindRenderbuffer(_gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i3]);
38297
38506
  const glFormat = utils.convert(texture2.format, texture2.colorSpace);
38298
38507
  const glType = utils.convert(texture2.type);
38299
- const glInternalFormat = getInternalFormat(texture2.internalFormat, glFormat, glType, texture2.colorSpace, renderTarget2.isXRRenderTarget === true);
38508
+ const glInternalFormat = getInternalFormat(texture2.internalFormat, glFormat, glType, texture2.normalized, texture2.colorSpace, renderTarget2.isXRRenderTarget === true);
38300
38509
  const samples = getRenderTargetSamples(renderTarget2);
38301
38510
  _gl.renderbufferStorageMultisample(_gl.RENDERBUFFER, samples, glInternalFormat, renderTarget2.width, renderTarget2.height);
38302
38511
  _gl.framebufferRenderbuffer(_gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i3, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[i3]);
@@ -38492,6 +38701,8 @@ function WebGLTextures(_gl, extensions2, state2, properties, capabilities, utils
38492
38701
  }
38493
38702
  this.allocateTextureUnit = allocateTextureUnit;
38494
38703
  this.resetTextureUnits = resetTextureUnits;
38704
+ this.getTextureUnits = getTextureUnits;
38705
+ this.setTextureUnits = setTextureUnits;
38495
38706
  this.setTexture2D = setTexture2D;
38496
38707
  this.setTexture2DArray = setTexture2DArray;
38497
38708
  this.setTexture3D = setTexture3D;
@@ -38644,7 +38855,9 @@ function WebGLMaterials(renderer, properties) {
38644
38855
  }
38645
38856
  }
38646
38857
  function refreshMaterialUniforms(uniforms, material, pixelRatio, height, transmissionRenderTarget) {
38647
- if (material.isMeshBasicMaterial) {
38858
+ if (material.isNodeMaterial) {
38859
+ material.uniformsNeedUpdate = false;
38860
+ } else if (material.isMeshBasicMaterial) {
38648
38861
  refreshUniformsCommon(uniforms, material);
38649
38862
  } else if (material.isMeshLambertMaterial) {
38650
38863
  refreshUniformsCommon(uniforms, material);
@@ -38746,16 +38959,10 @@ function WebGLMaterials(renderer, properties) {
38746
38959
  const envMapRotation = materialProperties.envMapRotation;
38747
38960
  if (envMap) {
38748
38961
  uniforms.envMap.value = envMap;
38749
- _e1.copy(envMapRotation);
38750
- _e1.x *= -1;
38751
- _e1.y *= -1;
38752
- _e1.z *= -1;
38962
+ uniforms.envMapRotation.value.setFromMatrix4(_m12.makeRotationFromEuler(envMapRotation)).transpose();
38753
38963
  if (envMap.isCubeTexture && envMap.isRenderTargetTexture === false) {
38754
- _e1.y *= -1;
38755
- _e1.z *= -1;
38964
+ uniforms.envMapRotation.value.premultiply(_m);
38756
38965
  }
38757
- uniforms.envMapRotation.value.setFromMatrix4(_m12.makeRotationFromEuler(_e1));
38758
- uniforms.flipEnvMap.value = envMap.isCubeTexture && envMap.isRenderTargetTexture === false ? -1 : 1;
38759
38966
  uniforms.reflectivity.value = material.reflectivity;
38760
38967
  uniforms.ior.value = material.ior;
38761
38968
  uniforms.refractionRatio.value = material.refractionRatio;
@@ -39021,6 +39228,8 @@ function WebGLUniformsGroups(gl, info, capabilities, state2) {
39021
39228
  uniform.__data[9] = value.elements[7];
39022
39229
  uniform.__data[10] = value.elements[8];
39023
39230
  uniform.__data[11] = 0;
39231
+ } else if (ArrayBuffer.isView(value)) {
39232
+ uniform.__data.set(new value.constructor(value.buffer, value.byteOffset, uniform.__data.length));
39024
39233
  } else {
39025
39234
  value.toArray(uniform.__data, arrayOffset);
39026
39235
  arrayOffset += info2.storage / Float32Array.BYTES_PER_ELEMENT;
@@ -39038,6 +39247,8 @@ function WebGLUniformsGroups(gl, info, capabilities, state2) {
39038
39247
  if (cache[indexString] === void 0) {
39039
39248
  if (typeof value === "number" || typeof value === "boolean") {
39040
39249
  cache[indexString] = value;
39250
+ } else if (ArrayBuffer.isView(value)) {
39251
+ cache[indexString] = value.slice();
39041
39252
  } else {
39042
39253
  cache[indexString] = value.clone();
39043
39254
  }
@@ -39049,6 +39260,8 @@ function WebGLUniformsGroups(gl, info, capabilities, state2) {
39049
39260
  cache[indexString] = value;
39050
39261
  return true;
39051
39262
  }
39263
+ } else if (ArrayBuffer.isView(value)) {
39264
+ return true;
39052
39265
  } else {
39053
39266
  if (cachedObject.equals(value) === false) {
39054
39267
  cachedObject.copy(value);
@@ -39116,6 +39329,9 @@ function WebGLUniformsGroups(gl, info, capabilities, state2) {
39116
39329
  info2.storage = 64;
39117
39330
  } else if (value.isTexture) {
39118
39331
  warn("WebGLRenderer: Texture samplers can not be part of an uniforms group.");
39332
+ } else if (ArrayBuffer.isView(value)) {
39333
+ info2.boundary = 16;
39334
+ info2.storage = value.byteLength;
39119
39335
  } else {
39120
39336
  warn("WebGLRenderer: Unsupported uniform value type.", value);
39121
39337
  }
@@ -39157,9 +39373,9 @@ function getDFGLUT() {
39157
39373
  }
39158
39374
  return lut;
39159
39375
  }
39160
- var alphahash_fragment, alphahash_pars_fragment, alphamap_fragment, alphamap_pars_fragment, alphatest_fragment, alphatest_pars_fragment, aomap_fragment, aomap_pars_fragment, batching_pars_vertex, batching_vertex, begin_vertex, beginnormal_vertex, bsdfs, iridescence_fragment, bumpmap_pars_fragment, clipping_planes_fragment, clipping_planes_pars_fragment, clipping_planes_pars_vertex, clipping_planes_vertex, color_fragment, color_pars_fragment, color_pars_vertex, color_vertex, common, cube_uv_reflection_fragment, defaultnormal_vertex, displacementmap_pars_vertex, displacementmap_vertex, emissivemap_fragment, emissivemap_pars_fragment, colorspace_fragment, colorspace_pars_fragment, envmap_fragment, envmap_common_pars_fragment, envmap_pars_fragment, envmap_pars_vertex, envmap_vertex, fog_vertex, fog_pars_vertex, fog_fragment, fog_pars_fragment, gradientmap_pars_fragment, lightmap_pars_fragment, lights_lambert_fragment, lights_lambert_pars_fragment, lights_pars_begin, envmap_physical_pars_fragment, lights_toon_fragment, lights_toon_pars_fragment, lights_phong_fragment, lights_phong_pars_fragment, lights_physical_fragment, lights_physical_pars_fragment, lights_fragment_begin, lights_fragment_maps, lights_fragment_end, logdepthbuf_fragment, logdepthbuf_pars_fragment, logdepthbuf_pars_vertex, logdepthbuf_vertex, map_fragment, map_pars_fragment, map_particle_fragment, map_particle_pars_fragment, metalnessmap_fragment, metalnessmap_pars_fragment, morphinstance_vertex, morphcolor_vertex, morphnormal_vertex, morphtarget_pars_vertex, morphtarget_vertex, normal_fragment_begin, normal_fragment_maps, normal_pars_fragment, normal_pars_vertex, normal_vertex, normalmap_pars_fragment, clearcoat_normal_fragment_begin, clearcoat_normal_fragment_maps, clearcoat_pars_fragment, iridescence_pars_fragment, opaque_fragment, packing, premultiplied_alpha_fragment, project_vertex, dithering_fragment, dithering_pars_fragment, roughnessmap_fragment, roughnessmap_pars_fragment, shadowmap_pars_fragment, shadowmap_pars_vertex, shadowmap_vertex, shadowmask_pars_fragment, skinbase_vertex, skinning_pars_vertex, skinning_vertex, skinnormal_vertex, specularmap_fragment, specularmap_pars_fragment, tonemapping_fragment, tonemapping_pars_fragment, transmission_fragment, transmission_pars_fragment, uv_pars_fragment, uv_pars_vertex, uv_vertex, worldpos_vertex, vertex$h, fragment$h, vertex$g, fragment$g, vertex$f, fragment$f, vertex$e, fragment$e, vertex$d, fragment$d, vertex$c, fragment$c, vertex$b, fragment$b, vertex$a, fragment$a, vertex$9, fragment$9, vertex$8, fragment$8, vertex$7, fragment$7, vertex$6, fragment$6, vertex$5, fragment$5, vertex$4, fragment$4, vertex$3, fragment$3, vertex$2, fragment$2, vertex$1, fragment$1, ShaderChunk, UniformsLib, ShaderLib, _rgb, _e1$1, _m1$12, LOD_MIN, EXTRA_LOD_SIGMA, MAX_SAMPLES, GGX_SAMPLES, _flatCamera, _clearColor, _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel, _oldXrEnabled, _origin, PMREMGenerator, WebGLCubeRenderTarget, toneMappingMap, emptyTexture, emptyShadowTexture, emptyArrayTexture, empty3dTexture, emptyCubeTexture, arrayCacheF32, arrayCacheI32, mat4array, mat3array, mat2array, SingleUniform, PureArrayUniform, StructuredUniform, RePathPart, WebGLUniforms, COMPLETION_STATUS_KHR, programIdCount, _m0, toneMappingFunctions, _v02, includePattern, shaderChunkMap, unrollLoopPattern, shadowMapTypeDefines, envMapTypeDefines, envMapModeDefines, envMapBlendingDefines, _id2, WebGLShaderCache, WebGLShaderStage, nextVersion, vertex, fragment, _cubeDirections, _cubeUps, _projScreenMatrix2, _lightPositionWorld2, _lookTarget2, _occlusion_vertex, _occlusion_fragment, WebXRDepthSensing, WebXRManager, _e1, _m12, DATA, lut, WebGLRenderer;
39376
+ var alphahash_fragment, alphahash_pars_fragment, alphamap_fragment, alphamap_pars_fragment, alphatest_fragment, alphatest_pars_fragment, aomap_fragment, aomap_pars_fragment, batching_pars_vertex, batching_vertex, begin_vertex, beginnormal_vertex, bsdfs, iridescence_fragment, bumpmap_pars_fragment, clipping_planes_fragment, clipping_planes_pars_fragment, clipping_planes_pars_vertex, clipping_planes_vertex, color_fragment, color_pars_fragment, color_pars_vertex, color_vertex, common, cube_uv_reflection_fragment, defaultnormal_vertex, displacementmap_pars_vertex, displacementmap_vertex, emissivemap_fragment, emissivemap_pars_fragment, colorspace_fragment, colorspace_pars_fragment, envmap_fragment, envmap_common_pars_fragment, envmap_pars_fragment, envmap_pars_vertex, envmap_vertex, fog_vertex, fog_pars_vertex, fog_fragment, fog_pars_fragment, gradientmap_pars_fragment, lightmap_pars_fragment, lights_lambert_fragment, lights_lambert_pars_fragment, lights_pars_begin, envmap_physical_pars_fragment, lights_toon_fragment, lights_toon_pars_fragment, lights_phong_fragment, lights_phong_pars_fragment, lights_physical_fragment, lights_physical_pars_fragment, lights_fragment_begin, lights_fragment_maps, lights_fragment_end, lightprobes_pars_fragment, logdepthbuf_fragment, logdepthbuf_pars_fragment, logdepthbuf_pars_vertex, logdepthbuf_vertex, map_fragment, map_pars_fragment, map_particle_fragment, map_particle_pars_fragment, metalnessmap_fragment, metalnessmap_pars_fragment, morphinstance_vertex, morphcolor_vertex, morphnormal_vertex, morphtarget_pars_vertex, morphtarget_vertex, normal_fragment_begin, normal_fragment_maps, normal_pars_fragment, normal_pars_vertex, normal_vertex, normalmap_pars_fragment, clearcoat_normal_fragment_begin, clearcoat_normal_fragment_maps, clearcoat_pars_fragment, iridescence_pars_fragment, opaque_fragment, packing, premultiplied_alpha_fragment, project_vertex, dithering_fragment, dithering_pars_fragment, roughnessmap_fragment, roughnessmap_pars_fragment, shadowmap_pars_fragment, shadowmap_pars_vertex, shadowmap_vertex, shadowmask_pars_fragment, skinbase_vertex, skinning_pars_vertex, skinning_vertex, skinnormal_vertex, specularmap_fragment, specularmap_pars_fragment, tonemapping_fragment, tonemapping_pars_fragment, transmission_fragment, transmission_pars_fragment, uv_pars_fragment, uv_pars_vertex, uv_vertex, worldpos_vertex, vertex$h, fragment$h, vertex$g, fragment$g, vertex$f, fragment$f, vertex$e, fragment$e, vertex$d, fragment$d, vertex$c, fragment$c, vertex$b, fragment$b, vertex$a, fragment$a, vertex$9, fragment$9, vertex$8, fragment$8, vertex$7, fragment$7, vertex$6, fragment$6, vertex$5, fragment$5, vertex$4, fragment$4, vertex$3, fragment$3, vertex$2, fragment$2, vertex$1, fragment$1, ShaderChunk, UniformsLib, ShaderLib, _rgb, _m1$12, _m$1, LOD_MIN, EXTRA_LOD_SIGMA, MAX_SAMPLES, GGX_SAMPLES, _flatCamera, _clearColor, _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel, _oldXrEnabled, _origin, PMREMGenerator, WebGLCubeRenderTarget, toneMappingMap, emptyTexture, emptyShadowTexture, emptyArrayTexture, empty3dTexture, emptyCubeTexture, arrayCacheF32, arrayCacheI32, mat4array, mat3array, mat2array, SingleUniform, PureArrayUniform, StructuredUniform, RePathPart, WebGLUniforms, COMPLETION_STATUS_KHR, programIdCount, _m0, toneMappingFunctions, _v02, includePattern, shaderChunkMap, unrollLoopPattern, shadowMapTypeDefines, envMapTypeDefines, envMapModeDefines, envMapBlendingDefines, _id2, WebGLShaderCache, WebGLShaderStage, nextVersion, vertex, fragment, _cubeDirections, _cubeUps, _projScreenMatrix2, _lightPositionWorld2, _lookTarget2, _occlusion_vertex, _occlusion_fragment, WebXRDepthSensing, WebXRManager, _m12, _m, DATA, lut, WebGLRenderer;
39161
39377
  var init_three_module = __esm({
39162
- "../../node_modules/.bun/three@0.183.2/node_modules/three/build/three.module.js"() {
39378
+ "../../node_modules/.bun/three@0.184.0/node_modules/three/build/three.module.js"() {
39163
39379
  init_three_core();
39164
39380
  init_three_core();
39165
39381
  alphahash_fragment = "#ifdef USE_ALPHAHASH\n if ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\n#endif";
@@ -39194,8 +39410,8 @@ var init_three_module = __esm({
39194
39410
  emissivemap_pars_fragment = "#ifdef USE_EMISSIVEMAP\n uniform sampler2D emissiveMap;\n#endif";
39195
39411
  colorspace_fragment = "gl_FragColor = linearToOutputTexel( gl_FragColor );";
39196
39412
  colorspace_pars_fragment = "vec4 LinearTransferOETF( in vec4 value ) {\n return value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}";
39197
- envmap_fragment = "#ifdef USE_ENVMAP\n #ifdef ENV_WORLDPOS\n vec3 cameraToFrag;\n if ( isOrthographic ) {\n cameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n } else {\n cameraToFrag = normalize( vWorldPosition - cameraPosition );\n }\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n #ifdef ENVMAP_MODE_REFLECTION\n vec3 reflectVec = reflect( cameraToFrag, worldNormal );\n #else\n vec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n #endif\n #else\n vec3 reflectVec = vReflect;\n #endif\n #ifdef ENVMAP_TYPE_CUBE\n vec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n #ifdef ENVMAP_BLENDING_MULTIPLY\n outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n #elif defined( ENVMAP_BLENDING_MIX )\n outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n #elif defined( ENVMAP_BLENDING_ADD )\n outgoingLight += envColor.xyz * specularStrength * reflectivity;\n #endif\n #endif\n#endif";
39198
- envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n uniform float envMapIntensity;\n uniform float flipEnvMap;\n uniform mat3 envMapRotation;\n #ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n #else\n uniform sampler2D envMap;\n #endif\n#endif";
39413
+ envmap_fragment = "#ifdef USE_ENVMAP\n #ifdef ENV_WORLDPOS\n vec3 cameraToFrag;\n if ( isOrthographic ) {\n cameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n } else {\n cameraToFrag = normalize( vWorldPosition - cameraPosition );\n }\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n #ifdef ENVMAP_MODE_REFLECTION\n vec3 reflectVec = reflect( cameraToFrag, worldNormal );\n #else\n vec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n #endif\n #else\n vec3 reflectVec = vReflect;\n #endif\n #ifdef ENVMAP_TYPE_CUBE\n vec4 envColor = textureCube( envMap, envMapRotation * reflectVec );\n #ifdef ENVMAP_BLENDING_MULTIPLY\n outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n #elif defined( ENVMAP_BLENDING_MIX )\n outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n #elif defined( ENVMAP_BLENDING_ADD )\n outgoingLight += envColor.xyz * specularStrength * reflectivity;\n #endif\n #endif\n#endif";
39414
+ envmap_common_pars_fragment = "#ifdef USE_ENVMAP\n uniform float envMapIntensity;\n uniform mat3 envMapRotation;\n #ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n #else\n uniform sampler2D envMap;\n #endif\n#endif";
39199
39415
  envmap_pars_fragment = "#ifdef USE_ENVMAP\n uniform float reflectivity;\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n #define ENV_WORLDPOS\n #endif\n #ifdef ENV_WORLDPOS\n varying vec3 vWorldPosition;\n uniform float refractionRatio;\n #else\n varying vec3 vReflect;\n #endif\n#endif";
39200
39416
  envmap_pars_vertex = "#ifdef USE_ENVMAP\n #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n #define ENV_WORLDPOS\n #endif\n #ifdef ENV_WORLDPOS\n \n varying vec3 vWorldPosition;\n #else\n varying vec3 vReflect;\n uniform float refractionRatio;\n #endif\n#endif";
39201
39417
  envmap_vertex = "#ifdef USE_ENVMAP\n #ifdef ENV_WORLDPOS\n vWorldPosition = worldPosition.xyz;\n #else\n vec3 cameraToVertex;\n if ( isOrthographic ) {\n cameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n } else {\n cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n }\n vec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n #ifdef ENVMAP_MODE_REFLECTION\n vReflect = reflect( cameraToVertex, worldNormal );\n #else\n vReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n #endif\n #endif\n#endif";
@@ -39207,17 +39423,18 @@ var init_three_module = __esm({
39207
39423
  lightmap_pars_fragment = "#ifdef USE_LIGHTMAP\n uniform sampler2D lightMap;\n uniform float lightMapIntensity;\n#endif";
39208
39424
  lights_lambert_fragment = "LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;";
39209
39425
  lights_lambert_pars_fragment = "varying vec3 vViewPosition;\nstruct LambertMaterial {\n vec3 diffuseColor;\n float specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct RE_Direct_Lambert\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert";
39210
- lights_pars_begin = "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n uniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n float x = normal.x, y = normal.y, z = normal.z;\n vec3 result = shCoefficients[ 0 ] * 0.886227;\n result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n return result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n vec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n return irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n vec3 irradiance = ambientLightColor;\n return irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n if ( cutoffDistance > 0.0 ) {\n distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n }\n return distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n return smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n struct DirectionalLight {\n vec3 direction;\n vec3 color;\n };\n uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n void getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n light.color = directionalLight.color;\n light.direction = directionalLight.direction;\n light.visible = true;\n }\n#endif\n#if NUM_POINT_LIGHTS > 0\n struct PointLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n };\n uniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n void getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n vec3 lVector = pointLight.position - geometryPosition;\n light.direction = normalize( lVector );\n float lightDistance = length( lVector );\n light.color = pointLight.color;\n light.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n light.visible = ( light.color != vec3( 0.0 ) );\n }\n#endif\n#if NUM_SPOT_LIGHTS > 0\n struct SpotLight {\n vec3 position;\n vec3 direction;\n vec3 color;\n float distance;\n float decay;\n float coneCos;\n float penumbraCos;\n };\n uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n void getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n vec3 lVector = spotLight.position - geometryPosition;\n light.direction = normalize( lVector );\n float angleCos = dot( light.direction, spotLight.direction );\n float spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n if ( spotAttenuation > 0.0 ) {\n float lightDistance = length( lVector );\n light.color = spotLight.color * spotAttenuation;\n light.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n light.visible = ( light.color != vec3( 0.0 ) );\n } else {\n light.color = vec3( 0.0 );\n light.visible = false;\n }\n }\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n struct RectAreaLight {\n vec3 color;\n vec3 position;\n vec3 halfWidth;\n vec3 halfHeight;\n };\n uniform sampler2D ltc_1; uniform sampler2D ltc_2;\n uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n struct HemisphereLight {\n vec3 direction;\n vec3 skyColor;\n vec3 groundColor;\n };\n uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n float dotNL = dot( normal, hemiLight.direction );\n float hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n return irradiance;\n }\n#endif";
39426
+ lights_pars_begin = "uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n uniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n float x = normal.x, y = normal.y, z = normal.z;\n vec3 result = shCoefficients[ 0 ] * 0.886227;\n result += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n result += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n result += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n result += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n result += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n result += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n result += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n result += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n return result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n vec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n return irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n vec3 irradiance = ambientLightColor;\n return irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n if ( cutoffDistance > 0.0 ) {\n distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n }\n return distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n return smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n struct DirectionalLight {\n vec3 direction;\n vec3 color;\n };\n uniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n void getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n light.color = directionalLight.color;\n light.direction = directionalLight.direction;\n light.visible = true;\n }\n#endif\n#if NUM_POINT_LIGHTS > 0\n struct PointLight {\n vec3 position;\n vec3 color;\n float distance;\n float decay;\n };\n uniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n void getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n vec3 lVector = pointLight.position - geometryPosition;\n light.direction = normalize( lVector );\n float lightDistance = length( lVector );\n light.color = pointLight.color;\n light.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n light.visible = ( light.color != vec3( 0.0 ) );\n }\n#endif\n#if NUM_SPOT_LIGHTS > 0\n struct SpotLight {\n vec3 position;\n vec3 direction;\n vec3 color;\n float distance;\n float decay;\n float coneCos;\n float penumbraCos;\n };\n uniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n void getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n vec3 lVector = spotLight.position - geometryPosition;\n light.direction = normalize( lVector );\n float angleCos = dot( light.direction, spotLight.direction );\n float spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n if ( spotAttenuation > 0.0 ) {\n float lightDistance = length( lVector );\n light.color = spotLight.color * spotAttenuation;\n light.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n light.visible = ( light.color != vec3( 0.0 ) );\n } else {\n light.color = vec3( 0.0 );\n light.visible = false;\n }\n }\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n struct RectAreaLight {\n vec3 color;\n vec3 position;\n vec3 halfWidth;\n vec3 halfHeight;\n };\n uniform sampler2D ltc_1; uniform sampler2D ltc_2;\n uniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n struct HemisphereLight {\n vec3 direction;\n vec3 skyColor;\n vec3 groundColor;\n };\n uniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n vec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n float dotNL = dot( normal, hemiLight.direction );\n float hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n return irradiance;\n }\n#endif\n#include <lightprobes_pars_fragment>";
39211
39427
  envmap_physical_pars_fragment = "#ifdef USE_ENVMAP\n vec3 getIBLIrradiance( const in vec3 normal ) {\n #ifdef ENVMAP_TYPE_CUBE_UV\n vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n vec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n return PI * envMapColor.rgb * envMapIntensity;\n #else\n return vec3( 0.0 );\n #endif\n }\n vec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n #ifdef ENVMAP_TYPE_CUBE_UV\n vec3 reflectVec = reflect( - viewDir, normal );\n reflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\n reflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n vec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n return envMapColor.rgb * envMapIntensity;\n #else\n return vec3( 0.0 );\n #endif\n }\n #ifdef USE_ANISOTROPY\n vec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n #ifdef ENVMAP_TYPE_CUBE_UV\n vec3 bentNormal = cross( bitangent, viewDir );\n bentNormal = normalize( cross( bentNormal, bitangent ) );\n bentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n return getIBLRadiance( viewDir, bentNormal, roughness );\n #else\n return vec3( 0.0 );\n #endif\n }\n #endif\n#endif";
39212
39428
  lights_toon_fragment = "ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;";
39213
39429
  lights_toon_pars_fragment = "varying vec3 vViewPosition;\nstruct ToonMaterial {\n vec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n vec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct RE_Direct_Toon\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon";
39214
39430
  lights_phong_fragment = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;";
39215
39431
  lights_phong_pars_fragment = "varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n vec3 diffuseColor;\n vec3 specularColor;\n float specularShininess;\n float specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n reflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct RE_Direct_BlinnPhong\n#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong";
39216
39432
  lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.metalness = metalnessFactor;\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n material.ior = ior;\n #ifdef USE_SPECULAR\n float specularIntensityFactor = specularIntensity;\n vec3 specularColorFactor = specularColor;\n #ifdef USE_SPECULAR_COLORMAP\n specularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n #endif\n #ifdef USE_SPECULAR_INTENSITYMAP\n specularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n #endif\n material.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n #else\n float specularIntensityFactor = 1.0;\n vec3 specularColorFactor = vec3( 1.0 );\n material.specularF90 = 1.0;\n #endif\n material.specularColor = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\n material.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n#else\n material.specularColor = vec3( 0.04 );\n material.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n material.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n material.clearcoat = clearcoat;\n material.clearcoatRoughness = clearcoatRoughness;\n material.clearcoatF0 = vec3( 0.04 );\n material.clearcoatF90 = 1.0;\n #ifdef USE_CLEARCOATMAP\n material.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n #endif\n #ifdef USE_CLEARCOAT_ROUGHNESSMAP\n material.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n #endif\n material.clearcoat = saturate( material.clearcoat ); material.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n material.clearcoatRoughness += geometryRoughness;\n material.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n material.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n material.iridescence = iridescence;\n material.iridescenceIOR = iridescenceIOR;\n #ifdef USE_IRIDESCENCEMAP\n material.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n #endif\n #ifdef USE_IRIDESCENCE_THICKNESSMAP\n material.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n #else\n material.iridescenceThickness = iridescenceThicknessMaximum;\n #endif\n#endif\n#ifdef USE_SHEEN\n material.sheenColor = sheenColor;\n #ifdef USE_SHEEN_COLORMAP\n material.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n #endif\n material.sheenRoughness = clamp( sheenRoughness, 0.0001, 1.0 );\n #ifdef USE_SHEEN_ROUGHNESSMAP\n material.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n #endif\n#endif\n#ifdef USE_ANISOTROPY\n #ifdef USE_ANISOTROPYMAP\n mat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n vec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n vec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n #else\n vec2 anisotropyV = anisotropyVector;\n #endif\n material.anisotropy = length( anisotropyV );\n if( material.anisotropy == 0.0 ) {\n anisotropyV = vec2( 1.0, 0.0 );\n } else {\n anisotropyV /= material.anisotropy;\n material.anisotropy = saturate( material.anisotropy );\n }\n material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif";
39217
- lights_physical_pars_fragment = "uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n vec3 diffuseColor;\n vec3 diffuseContribution;\n vec3 specularColor;\n vec3 specularColorBlended;\n float roughness;\n float metalness;\n float specularF90;\n float dispersion;\n #ifdef USE_CLEARCOAT\n float clearcoat;\n float clearcoatRoughness;\n vec3 clearcoatF0;\n float clearcoatF90;\n #endif\n #ifdef USE_IRIDESCENCE\n float iridescence;\n float iridescenceIOR;\n float iridescenceThickness;\n vec3 iridescenceFresnel;\n vec3 iridescenceF0;\n vec3 iridescenceFresnelDielectric;\n vec3 iridescenceFresnelMetallic;\n #endif\n #ifdef USE_SHEEN\n vec3 sheenColor;\n float sheenRoughness;\n #endif\n #ifdef IOR\n float ior;\n #endif\n #ifdef USE_TRANSMISSION\n float transmission;\n float transmissionAlpha;\n float thickness;\n float attenuationDistance;\n vec3 attenuationColor;\n #endif\n #ifdef USE_ANISOTROPY\n float anisotropy;\n float alphaT;\n vec3 anisotropyT;\n vec3 anisotropyB;\n #endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n float a2 = pow2( alpha );\n float gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n float gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n return 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n float a2 = pow2( alpha );\n float denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n return RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n float V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n float gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n float gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n float v = 0.5 / ( gv + gl );\n return v;\n }\n float D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n float a2 = alphaT * alphaB;\n highp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n highp float v2 = dot( v, v );\n float w2 = a2 / v2;\n return RECIPROCAL_PI * a2 * pow2 ( w2 );\n }\n#endif\n#ifdef USE_CLEARCOAT\n vec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n vec3 f0 = material.clearcoatF0;\n float f90 = material.clearcoatF90;\n float roughness = material.clearcoatRoughness;\n float alpha = pow2( roughness );\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( f0, f90, dotVH );\n float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n float D = D_GGX( alpha, dotNH );\n return F * ( V * D );\n }\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n vec3 f0 = material.specularColorBlended;\n float f90 = material.specularF90;\n float roughness = material.roughness;\n float alpha = pow2( roughness );\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( f0, f90, dotVH );\n #ifdef USE_IRIDESCENCE\n F = mix( F, material.iridescenceFresnel, material.iridescence );\n #endif\n #ifdef USE_ANISOTROPY\n float dotTL = dot( material.anisotropyT, lightDir );\n float dotTV = dot( material.anisotropyT, viewDir );\n float dotTH = dot( material.anisotropyT, halfDir );\n float dotBL = dot( material.anisotropyB, lightDir );\n float dotBV = dot( material.anisotropyB, viewDir );\n float dotBH = dot( material.anisotropyB, halfDir );\n float V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n float D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n #else\n float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n float D = D_GGX( alpha, dotNH );\n #endif\n return F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n const float LUT_SIZE = 64.0;\n const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n const float LUT_BIAS = 0.5 / LUT_SIZE;\n float dotNV = saturate( dot( N, V ) );\n vec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n uv = uv * LUT_SCALE + LUT_BIAS;\n return uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n float l = length( f );\n return max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n float x = dot( v1, v2 );\n float y = abs( x );\n float a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n float b = 3.4175940 + ( 4.1616724 + y ) * y;\n float v = a / b;\n float theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n return cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n vec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n vec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n vec3 lightNormal = cross( v1, v2 );\n if( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n vec3 T1, T2;\n T1 = normalize( V - N * dot( V, N ) );\n T2 = - cross( N, T1 );\n mat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n vec3 coords[ 4 ];\n coords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n coords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n coords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n coords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n coords[ 0 ] = normalize( coords[ 0 ] );\n coords[ 1 ] = normalize( coords[ 1 ] );\n coords[ 2 ] = normalize( coords[ 2 ] );\n coords[ 3 ] = normalize( coords[ 3 ] );\n vec3 vectorFormFactor = vec3( 0.0 );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n float result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n return vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n float alpha = pow2( roughness );\n float invAlpha = 1.0 / alpha;\n float cos2h = dotNH * dotNH;\n float sin2h = max( 1.0 - cos2h, 0.0078125 );\n return ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n return saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float D = D_Charlie( sheenRoughness, dotNH );\n float V = V_Neubelt( dotNV, dotNL );\n return sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n float dotNV = saturate( dot( normal, viewDir ) );\n float r2 = roughness * roughness;\n float rInv = 1.0 / ( roughness + 0.1 );\n float a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\n float b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\n float DG = exp( a * dotNV + b );\n return saturate( DG );\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n float dotNV = saturate( dot( normal, viewDir ) );\n vec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n return specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n float dotNV = saturate( dot( normal, viewDir ) );\n vec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n #ifdef USE_IRIDESCENCE\n vec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n #else\n vec3 Fr = specularColor;\n #endif\n vec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n float Ess = fab.x + fab.y;\n float Ems = 1.0 - Ess;\n vec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619; vec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n singleScatter += FssEss;\n multiScatter += Fms * Ems;\n}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n vec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n vec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\n vec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\n vec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\n vec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\n float Ess_V = dfgV.x + dfgV.y;\n float Ess_L = dfgL.x + dfgL.y;\n float Ems_V = 1.0 - Ess_V;\n float Ems_L = 1.0 - Ess_L;\n vec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\n vec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\n float compensationFactor = Ems_V * Ems_L;\n vec3 multiScatter = Fms * compensationFactor;\n return singleScatter + multiScatter;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n vec3 normal = geometryNormal;\n vec3 viewDir = geometryViewDir;\n vec3 position = geometryPosition;\n vec3 lightPos = rectAreaLight.position;\n vec3 halfWidth = rectAreaLight.halfWidth;\n vec3 halfHeight = rectAreaLight.halfHeight;\n vec3 lightColor = rectAreaLight.color;\n float roughness = material.roughness;\n vec3 rectCoords[ 4 ];\n rectCoords[ 0 ] = lightPos + halfWidth - halfHeight; rectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n rectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n rectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n vec2 uv = LTC_Uv( normal, viewDir, roughness );\n vec4 t1 = texture2D( ltc_1, uv );\n vec4 t2 = texture2D( ltc_2, uv );\n mat3 mInv = mat3(\n vec3( t1.x, 0, t1.y ),\n vec3( 0, 1, 0 ),\n vec3( t1.z, 0, t1.w )\n );\n vec3 fresnel = ( material.specularColorBlended * t2.x + ( material.specularF90 - material.specularColorBlended ) * t2.y );\n reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n reflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n #ifdef USE_CLEARCOAT\n vec3 Ncc = geometryClearcoatNormal;\n vec2 uvClearcoat = LTC_Uv( Ncc, viewDir, material.clearcoatRoughness );\n vec4 t1Clearcoat = texture2D( ltc_1, uvClearcoat );\n vec4 t2Clearcoat = texture2D( ltc_2, uvClearcoat );\n mat3 mInvClearcoat = mat3(\n vec3( t1Clearcoat.x, 0, t1Clearcoat.y ),\n vec3( 0, 1, 0 ),\n vec3( t1Clearcoat.z, 0, t1Clearcoat.w )\n );\n vec3 fresnelClearcoat = material.clearcoatF0 * t2Clearcoat.x + ( material.clearcoatF90 - material.clearcoatF0 ) * t2Clearcoat.y;\n clearcoatSpecularDirect += lightColor * fresnelClearcoat * LTC_Evaluate( Ncc, viewDir, position, mInvClearcoat, rectCoords );\n #endif\n }\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n #ifdef USE_CLEARCOAT\n float dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n vec3 ccIrradiance = dotNLcc * directLight.color;\n clearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n #endif\n #ifdef USE_SHEEN\n \n sheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n \n float sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n float sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\n \n float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\n \n irradiance *= sheenEnergyComp;\n \n #endif\n reflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n vec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\n #ifdef USE_SHEEN\n float sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n diffuse *= sheenEnergyComp;\n #endif\n reflectedLight.indirectDiffuse += diffuse;\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n #ifdef USE_CLEARCOAT\n clearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n #endif\n #ifdef USE_SHEEN\n sheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ) * RECIPROCAL_PI;\n #endif\n vec3 singleScatteringDielectric = vec3( 0.0 );\n vec3 multiScatteringDielectric = vec3( 0.0 );\n vec3 singleScatteringMetallic = vec3( 0.0 );\n vec3 multiScatteringMetallic = vec3( 0.0 );\n #ifdef USE_IRIDESCENCE\n computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n #else\n computeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n computeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n #endif\n vec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\n vec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\n vec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\n vec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\n vec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n vec3 indirectSpecular = radiance * singleScattering;\n indirectSpecular += multiScattering * cosineWeightedIrradiance;\n vec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\n #ifdef USE_SHEEN\n float sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n indirectSpecular *= sheenEnergyComp;\n indirectDiffuse *= sheenEnergyComp;\n #endif\n reflectedLight.indirectSpecular += indirectSpecular;\n reflectedLight.indirectDiffuse += indirectDiffuse;\n}\n#define RE_Direct RE_Direct_Physical\n#define RE_Direct_RectArea RE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular RE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}";
39218
- lights_fragment_begin = "\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n geometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n float dotNVi = saturate( dot( normal, geometryViewDir ) );\n if ( material.iridescenceThickness == 0.0 ) {\n material.iridescence = 0.0;\n } else {\n material.iridescence = saturate( material.iridescence );\n }\n if ( material.iridescence > 0.0 ) {\n material.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n material.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n material.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\n material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n }\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n PointLight pointLight;\n #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n PointLightShadow pointLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n pointLight = pointLights[ i ];\n getPointLightInfo( pointLight, geometryPosition, directLight );\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n pointLightShadow = pointLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n SpotLight spotLight;\n vec4 spotColor;\n vec3 spotLightCoord;\n bool inSpotLightMap;\n #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n spotLight = spotLights[ i ];\n getSpotLightInfo( spotLight, geometryPosition, directLight );\n #if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n #elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n #define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n #else\n #define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #endif\n #if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n spotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n inSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n spotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n directLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n #endif\n #undef SPOT_LIGHT_MAP_INDEX\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n spotLightShadow = spotLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n DirectionalLight directionalLight;\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n directionalLight = directionalLights[ i ];\n getDirectionalLightInfo( directionalLight, directLight );\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n directionalLightShadow = directionalLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n RectAreaLight rectAreaLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n rectAreaLight = rectAreaLights[ i ];\n RE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n vec3 iblIrradiance = vec3( 0.0 );\n vec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n #if defined( USE_LIGHT_PROBES )\n irradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n #endif\n #if ( NUM_HEMI_LIGHTS > 0 )\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n }\n #pragma unroll_loop_end\n #endif\n#endif\n#if defined( RE_IndirectSpecular )\n vec3 radiance = vec3( 0.0 );\n vec3 clearcoatRadiance = vec3( 0.0 );\n#endif";
39433
+ lights_physical_pars_fragment = "uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n vec3 diffuseColor;\n vec3 diffuseContribution;\n vec3 specularColor;\n vec3 specularColorBlended;\n float roughness;\n float metalness;\n float specularF90;\n float dispersion;\n #ifdef USE_CLEARCOAT\n float clearcoat;\n float clearcoatRoughness;\n vec3 clearcoatF0;\n float clearcoatF90;\n #endif\n #ifdef USE_IRIDESCENCE\n float iridescence;\n float iridescenceIOR;\n float iridescenceThickness;\n vec3 iridescenceFresnel;\n vec3 iridescenceF0;\n vec3 iridescenceFresnelDielectric;\n vec3 iridescenceFresnelMetallic;\n #endif\n #ifdef USE_SHEEN\n vec3 sheenColor;\n float sheenRoughness;\n #endif\n #ifdef IOR\n float ior;\n #endif\n #ifdef USE_TRANSMISSION\n float transmission;\n float transmissionAlpha;\n float thickness;\n float attenuationDistance;\n vec3 attenuationColor;\n #endif\n #ifdef USE_ANISOTROPY\n float anisotropy;\n float alphaT;\n vec3 anisotropyT;\n vec3 anisotropyB;\n #endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n float a2 = pow2( alpha );\n float gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n float gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n return 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n float a2 = pow2( alpha );\n float denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n return RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n float V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n float gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n float gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n return 0.5 / max( gv + gl, EPSILON );\n }\n float D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n float a2 = alphaT * alphaB;\n highp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n highp float v2 = dot( v, v );\n float w2 = a2 / v2;\n return RECIPROCAL_PI * a2 * pow2 ( w2 );\n }\n#endif\n#ifdef USE_CLEARCOAT\n vec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n vec3 f0 = material.clearcoatF0;\n float f90 = material.clearcoatF90;\n float roughness = material.clearcoatRoughness;\n float alpha = pow2( roughness );\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( f0, f90, dotVH );\n float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n float D = D_GGX( alpha, dotNH );\n return F * ( V * D );\n }\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n vec3 f0 = material.specularColorBlended;\n float f90 = material.specularF90;\n float roughness = material.roughness;\n float alpha = pow2( roughness );\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float dotVH = saturate( dot( viewDir, halfDir ) );\n vec3 F = F_Schlick( f0, f90, dotVH );\n #ifdef USE_IRIDESCENCE\n F = mix( F, material.iridescenceFresnel, material.iridescence );\n #endif\n #ifdef USE_ANISOTROPY\n float dotTL = dot( material.anisotropyT, lightDir );\n float dotTV = dot( material.anisotropyT, viewDir );\n float dotTH = dot( material.anisotropyT, halfDir );\n float dotBL = dot( material.anisotropyB, lightDir );\n float dotBV = dot( material.anisotropyB, viewDir );\n float dotBH = dot( material.anisotropyB, halfDir );\n float V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n float D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n #else\n float V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n float D = D_GGX( alpha, dotNH );\n #endif\n return F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n const float LUT_SIZE = 64.0;\n const float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n const float LUT_BIAS = 0.5 / LUT_SIZE;\n float dotNV = saturate( dot( N, V ) );\n vec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n uv = uv * LUT_SCALE + LUT_BIAS;\n return uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n float l = length( f );\n return max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n float x = dot( v1, v2 );\n float y = abs( x );\n float a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n float b = 3.4175940 + ( 4.1616724 + y ) * y;\n float v = a / b;\n float theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n return cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n vec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n vec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n vec3 lightNormal = cross( v1, v2 );\n if( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n vec3 T1, T2;\n T1 = normalize( V - N * dot( V, N ) );\n T2 = - cross( N, T1 );\n mat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n vec3 coords[ 4 ];\n coords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n coords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n coords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n coords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n coords[ 0 ] = normalize( coords[ 0 ] );\n coords[ 1 ] = normalize( coords[ 1 ] );\n coords[ 2 ] = normalize( coords[ 2 ] );\n coords[ 3 ] = normalize( coords[ 3 ] );\n vec3 vectorFormFactor = vec3( 0.0 );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n vectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n float result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n return vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n float alpha = pow2( roughness );\n float invAlpha = 1.0 / alpha;\n float cos2h = dotNH * dotNH;\n float sin2h = max( 1.0 - cos2h, 0.0078125 );\n return ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n return saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n vec3 halfDir = normalize( lightDir + viewDir );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n float dotNH = saturate( dot( normal, halfDir ) );\n float D = D_Charlie( sheenRoughness, dotNH );\n float V = V_Neubelt( dotNV, dotNL );\n return sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n float dotNV = saturate( dot( normal, viewDir ) );\n float r2 = roughness * roughness;\n float rInv = 1.0 / ( roughness + 0.1 );\n float a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\n float b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\n float DG = exp( a * dotNV + b );\n return saturate( DG );\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n float dotNV = saturate( dot( normal, viewDir ) );\n vec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n return specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n float dotNV = saturate( dot( normal, viewDir ) );\n vec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n #ifdef USE_IRIDESCENCE\n vec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n #else\n vec3 Fr = specularColor;\n #endif\n vec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n float Ess = fab.x + fab.y;\n float Ems = 1.0 - Ess;\n vec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619; vec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n singleScatter += FssEss;\n multiScatter += Fms * Ems;\n}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n vec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n float dotNL = saturate( dot( normal, lightDir ) );\n float dotNV = saturate( dot( normal, viewDir ) );\n vec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\n vec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\n vec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\n vec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\n float Ess_V = dfgV.x + dfgV.y;\n float Ess_L = dfgL.x + dfgL.y;\n float Ems_V = 1.0 - Ess_V;\n float Ems_L = 1.0 - Ess_L;\n vec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\n vec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\n float compensationFactor = Ems_V * Ems_L;\n vec3 multiScatter = Fms * compensationFactor;\n return singleScatter + multiScatter;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n vec3 normal = geometryNormal;\n vec3 viewDir = geometryViewDir;\n vec3 position = geometryPosition;\n vec3 lightPos = rectAreaLight.position;\n vec3 halfWidth = rectAreaLight.halfWidth;\n vec3 halfHeight = rectAreaLight.halfHeight;\n vec3 lightColor = rectAreaLight.color;\n float roughness = material.roughness;\n vec3 rectCoords[ 4 ];\n rectCoords[ 0 ] = lightPos + halfWidth - halfHeight; rectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n rectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n rectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n vec2 uv = LTC_Uv( normal, viewDir, roughness );\n vec4 t1 = texture2D( ltc_1, uv );\n vec4 t2 = texture2D( ltc_2, uv );\n mat3 mInv = mat3(\n vec3( t1.x, 0, t1.y ),\n vec3( 0, 1, 0 ),\n vec3( t1.z, 0, t1.w )\n );\n vec3 fresnel = ( material.specularColorBlended * t2.x + ( material.specularF90 - material.specularColorBlended ) * t2.y );\n reflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n reflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n #ifdef USE_CLEARCOAT\n vec3 Ncc = geometryClearcoatNormal;\n vec2 uvClearcoat = LTC_Uv( Ncc, viewDir, material.clearcoatRoughness );\n vec4 t1Clearcoat = texture2D( ltc_1, uvClearcoat );\n vec4 t2Clearcoat = texture2D( ltc_2, uvClearcoat );\n mat3 mInvClearcoat = mat3(\n vec3( t1Clearcoat.x, 0, t1Clearcoat.y ),\n vec3( 0, 1, 0 ),\n vec3( t1Clearcoat.z, 0, t1Clearcoat.w )\n );\n vec3 fresnelClearcoat = material.clearcoatF0 * t2Clearcoat.x + ( material.clearcoatF90 - material.clearcoatF0 ) * t2Clearcoat.y;\n clearcoatSpecularDirect += lightColor * fresnelClearcoat * LTC_Evaluate( Ncc, viewDir, position, mInvClearcoat, rectCoords );\n #endif\n }\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n float dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n vec3 irradiance = dotNL * directLight.color;\n #ifdef USE_CLEARCOAT\n float dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n vec3 ccIrradiance = dotNLcc * directLight.color;\n clearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n #endif\n #ifdef USE_SHEEN\n \n sheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n \n float sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n float sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\n \n float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\n \n irradiance *= sheenEnergyComp;\n \n #endif\n reflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n reflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n vec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\n #ifdef USE_SHEEN\n float sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n diffuse *= sheenEnergyComp;\n #endif\n reflectedLight.indirectDiffuse += diffuse;\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n #ifdef USE_CLEARCOAT\n clearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n #endif\n #ifdef USE_SHEEN\n sheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ) * RECIPROCAL_PI;\n #endif\n vec3 singleScatteringDielectric = vec3( 0.0 );\n vec3 multiScatteringDielectric = vec3( 0.0 );\n vec3 singleScatteringMetallic = vec3( 0.0 );\n vec3 multiScatteringMetallic = vec3( 0.0 );\n #ifdef USE_IRIDESCENCE\n computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n computeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n #else\n computeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n computeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n #endif\n vec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\n vec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\n vec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\n vec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\n vec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n vec3 indirectSpecular = radiance * singleScattering;\n indirectSpecular += multiScattering * cosineWeightedIrradiance;\n vec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\n #ifdef USE_SHEEN\n float sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n float sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n indirectSpecular *= sheenEnergyComp;\n indirectDiffuse *= sheenEnergyComp;\n #endif\n reflectedLight.indirectSpecular += indirectSpecular;\n reflectedLight.indirectDiffuse += indirectDiffuse;\n}\n#define RE_Direct RE_Direct_Physical\n#define RE_Direct_RectArea RE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular RE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}";
39434
+ lights_fragment_begin = "\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n geometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n float dotNVi = saturate( dot( normal, geometryViewDir ) );\n if ( material.iridescenceThickness == 0.0 ) {\n material.iridescence = 0.0;\n } else {\n material.iridescence = saturate( material.iridescence );\n }\n if ( material.iridescence > 0.0 ) {\n material.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n material.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n material.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\n material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n }\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n PointLight pointLight;\n #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n PointLightShadow pointLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n pointLight = pointLights[ i ];\n getPointLightInfo( pointLight, geometryPosition, directLight );\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n pointLightShadow = pointLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n SpotLight spotLight;\n vec4 spotColor;\n vec3 spotLightCoord;\n bool inSpotLightMap;\n #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n spotLight = spotLights[ i ];\n getSpotLightInfo( spotLight, geometryPosition, directLight );\n #if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n #elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n #define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n #else\n #define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #endif\n #if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n spotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n inSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n spotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n directLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n #endif\n #undef SPOT_LIGHT_MAP_INDEX\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n spotLightShadow = spotLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n DirectionalLight directionalLight;\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n directionalLight = directionalLights[ i ];\n getDirectionalLightInfo( directionalLight, directLight );\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n directionalLightShadow = directionalLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n RectAreaLight rectAreaLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n rectAreaLight = rectAreaLights[ i ];\n RE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n vec3 iblIrradiance = vec3( 0.0 );\n vec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n #if defined( USE_LIGHT_PROBES )\n irradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n #endif\n #if ( NUM_HEMI_LIGHTS > 0 )\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n }\n #pragma unroll_loop_end\n #endif\n #ifdef USE_LIGHT_PROBES_GRID\n vec3 probeWorldPos = ( ( vec4( geometryPosition, 1.0 ) - viewMatrix[ 3 ] ) * viewMatrix ).xyz;\n vec3 probeWorldNormal = inverseTransformDirection( geometryNormal, viewMatrix );\n irradiance += getLightProbeGridIrradiance( probeWorldPos, probeWorldNormal );\n #endif\n#endif\n#if defined( RE_IndirectSpecular )\n vec3 radiance = vec3( 0.0 );\n vec3 clearcoatRadiance = vec3( 0.0 );\n#endif";
39219
39435
  lights_fragment_maps = "#if defined( RE_IndirectDiffuse )\n #ifdef USE_LIGHTMAP\n vec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n irradiance += lightMapIrradiance;\n #endif\n #if defined( USE_ENVMAP ) && defined( ENVMAP_TYPE_CUBE_UV )\n #if defined( STANDARD ) || defined( LAMBERT ) || defined( PHONG )\n iblIrradiance += getIBLIrradiance( geometryNormal );\n #endif\n #endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n #ifdef USE_ANISOTROPY\n radiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n #else\n radiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n #endif\n #ifdef USE_CLEARCOAT\n clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n #endif\n#endif";
39220
39436
  lights_fragment_end = "#if defined( RE_IndirectDiffuse )\n #if defined( LAMBERT ) || defined( PHONG )\n irradiance += iblIrradiance;\n #endif\n RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif";
39437
+ lightprobes_pars_fragment = "#ifdef USE_LIGHT_PROBES_GRID\nuniform highp sampler3D probesSH;\nuniform vec3 probesMin;\nuniform vec3 probesMax;\nuniform vec3 probesResolution;\nvec3 getLightProbeGridIrradiance( vec3 worldPos, vec3 worldNormal ) {\n vec3 res = probesResolution;\n vec3 gridRange = probesMax - probesMin;\n vec3 resMinusOne = res - 1.0;\n vec3 probeSpacing = gridRange / resMinusOne;\n vec3 samplePos = worldPos + worldNormal * probeSpacing * 0.5;\n vec3 uvw = clamp( ( samplePos - probesMin ) / gridRange, 0.0, 1.0 );\n uvw = uvw * resMinusOne / res + 0.5 / res;\n float nz = res.z;\n float paddedSlices = nz + 2.0;\n float atlasDepth = 7.0 * paddedSlices;\n float uvZBase = uvw.z * nz + 1.0;\n vec4 s0 = texture( probesSH, vec3( uvw.xy, ( uvZBase ) / atlasDepth ) );\n vec4 s1 = texture( probesSH, vec3( uvw.xy, ( uvZBase + paddedSlices ) / atlasDepth ) );\n vec4 s2 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 2.0 * paddedSlices ) / atlasDepth ) );\n vec4 s3 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 3.0 * paddedSlices ) / atlasDepth ) );\n vec4 s4 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 4.0 * paddedSlices ) / atlasDepth ) );\n vec4 s5 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 5.0 * paddedSlices ) / atlasDepth ) );\n vec4 s6 = texture( probesSH, vec3( uvw.xy, ( uvZBase + 6.0 * paddedSlices ) / atlasDepth ) );\n vec3 c0 = s0.xyz;\n vec3 c1 = vec3( s0.w, s1.xy );\n vec3 c2 = vec3( s1.zw, s2.x );\n vec3 c3 = s2.yzw;\n vec3 c4 = s3.xyz;\n vec3 c5 = vec3( s3.w, s4.xy );\n vec3 c6 = vec3( s4.zw, s5.x );\n vec3 c7 = s5.yzw;\n vec3 c8 = s6.xyz;\n float x = worldNormal.x, y = worldNormal.y, z = worldNormal.z;\n vec3 result = c0 * 0.886227;\n result += c1 * 2.0 * 0.511664 * y;\n result += c2 * 2.0 * 0.511664 * z;\n result += c3 * 2.0 * 0.511664 * x;\n result += c4 * 2.0 * 0.429043 * x * y;\n result += c5 * 2.0 * 0.429043 * y * z;\n result += c6 * ( 0.743125 * z * z - 0.247708 );\n result += c7 * 2.0 * 0.429043 * x * z;\n result += c8 * 0.429043 * ( x * x - y * y );\n return max( result, vec3( 0.0 ) );\n}\n#endif";
39221
39438
  logdepthbuf_fragment = "#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif";
39222
39439
  logdepthbuf_pars_fragment = "#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n uniform float logDepthBufFC;\n varying float vFragDepth;\n varying float vIsPerspective;\n#endif";
39223
39440
  logdepthbuf_pars_vertex = "#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n varying float vFragDepth;\n varying float vIsPerspective;\n#endif";
@@ -39234,7 +39451,7 @@ var init_three_module = __esm({
39234
39451
  morphtarget_pars_vertex = "#ifdef USE_MORPHTARGETS\n #ifndef USE_INSTANCING_MORPH\n uniform float morphTargetBaseInfluence;\n uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n #endif\n uniform sampler2DArray morphTargetsTexture;\n uniform ivec2 morphTargetsTextureSize;\n vec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n int texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n int y = texelIndex / morphTargetsTextureSize.x;\n int x = texelIndex - y * morphTargetsTextureSize.x;\n ivec3 morphUV = ivec3( x, y, morphTargetIndex );\n return texelFetch( morphTargetsTexture, morphUV, 0 );\n }\n#endif";
39235
39452
  morphtarget_vertex = "#ifdef USE_MORPHTARGETS\n transformed *= morphTargetBaseInfluence;\n for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n }\n#endif";
39236
39453
  normal_fragment_begin = "float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n vec3 fdx = dFdx( vViewPosition );\n vec3 fdy = dFdy( vViewPosition );\n vec3 normal = normalize( cross( fdx, fdy ) );\n#else\n vec3 normal = normalize( vNormal );\n #ifdef DOUBLE_SIDED\n normal *= faceDirection;\n #endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n #ifdef USE_TANGENT\n mat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n #else\n mat3 tbn = getTangentFrame( - vViewPosition, normal,\n #if defined( USE_NORMALMAP )\n vNormalMapUv\n #elif defined( USE_CLEARCOAT_NORMALMAP )\n vClearcoatNormalMapUv\n #else\n vUv\n #endif\n );\n #endif\n #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n tbn[0] *= faceDirection;\n tbn[1] *= faceDirection;\n #endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n #ifdef USE_TANGENT\n mat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n #else\n mat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n #endif\n #if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n tbn2[0] *= faceDirection;\n tbn2[1] *= faceDirection;\n #endif\n#endif\nvec3 nonPerturbedNormal = normal;";
39237
- normal_fragment_maps = "#ifdef USE_NORMALMAP_OBJECTSPACE\n normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n #ifdef FLIP_SIDED\n normal = - normal;\n #endif\n #ifdef DOUBLE_SIDED\n normal = normal * faceDirection;\n #endif\n normal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n vec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n mapN.xy *= normalScale;\n normal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif";
39454
+ normal_fragment_maps = "#ifdef USE_NORMALMAP_OBJECTSPACE\n normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n #ifdef FLIP_SIDED\n normal = - normal;\n #endif\n #ifdef DOUBLE_SIDED\n normal = normal * faceDirection;\n #endif\n normal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n vec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n #if defined( USE_PACKED_NORMALMAP )\n mapN = vec3( mapN.xy, sqrt( saturate( 1.0 - dot( mapN.xy, mapN.xy ) ) ) );\n #endif\n mapN.xy *= normalScale;\n normal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif";
39238
39455
  normal_pars_fragment = "#ifndef FLAT_SHADED\n varying vec3 vNormal;\n #ifdef USE_TANGENT\n varying vec3 vTangent;\n varying vec3 vBitangent;\n #endif\n#endif";
39239
39456
  normal_pars_vertex = "#ifndef FLAT_SHADED\n varying vec3 vNormal;\n #ifdef USE_TANGENT\n varying vec3 vTangent;\n varying vec3 vBitangent;\n #endif\n#endif";
39240
39457
  normal_vertex = "#ifndef FLAT_SHADED\n vNormal = normalize( transformedNormal );\n #ifdef USE_TANGENT\n vTangent = normalize( transformedTangent );\n vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n #endif\n#endif";
@@ -39253,7 +39470,7 @@ var init_three_module = __esm({
39253
39470
  roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n uniform sampler2D roughnessMap;\n#endif";
39254
39471
  shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n uniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n #if NUM_DIR_LIGHT_SHADOWS > 0\n #if defined( SHADOWMAP_TYPE_PCF )\n uniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n #else\n uniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n #endif\n varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n struct DirectionalLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n #endif\n #if NUM_SPOT_LIGHT_SHADOWS > 0\n #if defined( SHADOWMAP_TYPE_PCF )\n uniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n #else\n uniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n #endif\n struct SpotLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n #if defined( SHADOWMAP_TYPE_PCF )\n uniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n #elif defined( SHADOWMAP_TYPE_BASIC )\n uniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n #endif\n varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n struct PointLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n float shadowCameraNear;\n float shadowCameraFar;\n };\n uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n #endif\n #if defined( SHADOWMAP_TYPE_PCF )\n float interleavedGradientNoise( vec2 position ) {\n return fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n }\n vec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n const float goldenAngle = 2.399963229728653;\n float r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n float theta = float( sampleIndex ) * goldenAngle + phi;\n return vec2( cos( theta ), sin( theta ) ) * r;\n }\n #endif\n #if defined( SHADOWMAP_TYPE_PCF )\n float getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n float shadow = 1.0;\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias;\n bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n bool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n if ( frustumTest ) {\n vec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n float radius = shadowRadius * texelSize.x;\n float phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n shadow = (\n texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n texture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n ) * 0.2;\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n #elif defined( SHADOWMAP_TYPE_VSM )\n float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n float shadow = 1.0;\n shadowCoord.xyz /= shadowCoord.w;\n #ifdef USE_REVERSED_DEPTH_BUFFER\n shadowCoord.z -= shadowBias;\n #else\n shadowCoord.z += shadowBias;\n #endif\n bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n bool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n if ( frustumTest ) {\n vec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n float mean = distribution.x;\n float variance = distribution.y * distribution.y;\n #ifdef USE_REVERSED_DEPTH_BUFFER\n float hard_shadow = step( mean, shadowCoord.z );\n #else\n float hard_shadow = step( shadowCoord.z, mean );\n #endif\n \n if ( hard_shadow == 1.0 ) {\n shadow = 1.0;\n } else {\n variance = max( variance, 0.0000001 );\n float d = shadowCoord.z - mean;\n float p_max = variance / ( variance + d * d );\n p_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n shadow = max( hard_shadow, p_max );\n }\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n #else\n float getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n float shadow = 1.0;\n shadowCoord.xyz /= shadowCoord.w;\n #ifdef USE_REVERSED_DEPTH_BUFFER\n shadowCoord.z -= shadowBias;\n #else\n shadowCoord.z += shadowBias;\n #endif\n bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n bool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n if ( frustumTest ) {\n float depth = texture2D( shadowMap, shadowCoord.xy ).r;\n #ifdef USE_REVERSED_DEPTH_BUFFER\n shadow = step( depth, shadowCoord.z );\n #else\n shadow = step( shadowCoord.z, depth );\n #endif\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n #if defined( SHADOWMAP_TYPE_PCF )\n float getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n float shadow = 1.0;\n vec3 lightToPosition = shadowCoord.xyz;\n vec3 bd3D = normalize( lightToPosition );\n vec3 absVec = abs( lightToPosition );\n float viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n if ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n #ifdef USE_REVERSED_DEPTH_BUFFER\n float dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n dp -= shadowBias;\n #else\n float dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n dp += shadowBias;\n #endif\n float texelSize = shadowRadius / shadowMapSize.x;\n vec3 absDir = abs( bd3D );\n vec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n tangent = normalize( cross( bd3D, tangent ) );\n vec3 bitangent = cross( bd3D, tangent );\n float phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n vec2 sample0 = vogelDiskSample( 0, 5, phi );\n vec2 sample1 = vogelDiskSample( 1, 5, phi );\n vec2 sample2 = vogelDiskSample( 2, 5, phi );\n vec2 sample3 = vogelDiskSample( 3, 5, phi );\n vec2 sample4 = vogelDiskSample( 4, 5, phi );\n shadow = (\n texture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n texture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n texture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n texture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n texture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n ) * 0.2;\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n #elif defined( SHADOWMAP_TYPE_BASIC )\n float getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n float shadow = 1.0;\n vec3 lightToPosition = shadowCoord.xyz;\n vec3 absVec = abs( lightToPosition );\n float viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n if ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n float dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n dp += shadowBias;\n vec3 bd3D = normalize( lightToPosition );\n float depth = textureCube( shadowMap, bd3D ).r;\n #ifdef USE_REVERSED_DEPTH_BUFFER\n depth = 1.0 - depth;\n #endif\n shadow = step( dp, depth );\n }\n return mix( 1.0, shadow, shadowIntensity );\n }\n #endif\n #endif\n#endif";
39255
39472
  shadowmap_pars_vertex = "#if NUM_SPOT_LIGHT_COORDS > 0\n uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n #if NUM_DIR_LIGHT_SHADOWS > 0\n uniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n varying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n struct DirectionalLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n #endif\n #if NUM_SPOT_LIGHT_SHADOWS > 0\n struct SpotLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n };\n uniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n uniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n varying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n struct PointLightShadow {\n float shadowIntensity;\n float shadowBias;\n float shadowNormalBias;\n float shadowRadius;\n vec2 shadowMapSize;\n float shadowCameraNear;\n float shadowCameraFar;\n };\n uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n #endif\n#endif";
39256
- shadowmap_vertex = "#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n vec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n #if NUM_DIR_LIGHT_SHADOWS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n #endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n shadowWorldPosition = worldPosition;\n #if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n shadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n #endif\n vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n#endif";
39473
+ shadowmap_vertex = "#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n #ifdef HAS_NORMAL\n vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n #else\n vec3 shadowWorldNormal = vec3( 0.0 );\n #endif\n vec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n #if NUM_DIR_LIGHT_SHADOWS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n vDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n shadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n vPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n #endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n shadowWorldPosition = worldPosition;\n #if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n shadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n #endif\n vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n }\n #pragma unroll_loop_end\n#endif";
39257
39474
  shadowmask_pars_fragment = "float getShadowMask() {\n float shadow = 1.0;\n #ifdef USE_SHADOWMAP\n #if NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n directionalLight = directionalLightShadows[ i ];\n shadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n spotLight = spotLightShadows[ i ];\n shadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n }\n #pragma unroll_loop_end\n #endif\n #if NUM_POINT_LIGHT_SHADOWS > 0 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n PointLightShadow pointLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n pointLight = pointLightShadows[ i ];\n shadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n }\n #pragma unroll_loop_end\n #endif\n #endif\n return shadow;\n}";
39258
39475
  skinbase_vertex = "#ifdef USE_SKINNING\n mat4 boneMatX = getBoneMatrix( skinIndex.x );\n mat4 boneMatY = getBoneMatrix( skinIndex.y );\n mat4 boneMatZ = getBoneMatrix( skinIndex.z );\n mat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif";
39259
39476
  skinning_pars_vertex = "#ifdef USE_SKINNING\n uniform mat4 bindMatrix;\n uniform mat4 bindMatrixInverse;\n uniform highp sampler2D boneTexture;\n mat4 getBoneMatrix( const in float i ) {\n int size = textureSize( boneTexture, 0 ).x;\n int j = int( i ) * 4;\n int x = j % size;\n int y = j / size;\n vec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n vec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n vec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n return mat4( v1, v2, v3, v4 );\n }\n#endif";
@@ -39272,7 +39489,7 @@ var init_three_module = __esm({
39272
39489
  vertex$h = "varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n vUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n gl_Position = vec4( position.xy, 1.0, 1.0 );\n}";
39273
39490
  fragment$h = "uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n vec4 texColor = texture2D( t2D, vUv );\n #ifdef DECODE_VIDEO_TEXTURE\n texColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n #endif\n texColor.rgb *= backgroundIntensity;\n gl_FragColor = texColor;\n #include <tonemapping_fragment>\n #include <colorspace_fragment>\n}";
39274
39491
  vertex$g = "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n vWorldDirection = transformDirection( position, modelMatrix );\n #include <begin_vertex>\n #include <project_vertex>\n gl_Position.z = gl_Position.w;\n}";
39275
- fragment$g = "#ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n uniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n #ifdef ENVMAP_TYPE_CUBE\n vec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n #elif defined( ENVMAP_TYPE_CUBE_UV )\n vec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n #else\n vec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n #endif\n texColor.rgb *= backgroundIntensity;\n gl_FragColor = texColor;\n #include <tonemapping_fragment>\n #include <colorspace_fragment>\n}";
39492
+ fragment$g = "#ifdef ENVMAP_TYPE_CUBE\n uniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n uniform sampler2D envMap;\n#endif\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n #ifdef ENVMAP_TYPE_CUBE\n vec4 texColor = textureCube( envMap, backgroundRotation * vWorldDirection );\n #elif defined( ENVMAP_TYPE_CUBE_UV )\n vec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n #else\n vec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n #endif\n texColor.rgb *= backgroundIntensity;\n gl_FragColor = texColor;\n #include <tonemapping_fragment>\n #include <colorspace_fragment>\n}";
39276
39493
  vertex$f = "varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n vWorldDirection = transformDirection( position, modelMatrix );\n #include <begin_vertex>\n #include <project_vertex>\n gl_Position.z = gl_Position.w;\n}";
39277
39494
  fragment$f = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n vec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n gl_FragColor = texColor;\n gl_FragColor.a *= opacity;\n #include <tonemapping_fragment>\n #include <colorspace_fragment>\n}";
39278
39495
  vertex$e = "#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n #include <uv_vertex>\n #include <batching_vertex>\n #include <skinbase_vertex>\n #include <morphinstance_vertex>\n #ifdef USE_DISPLACEMENTMAP\n #include <beginnormal_vertex>\n #include <morphnormal_vertex>\n #include <skinnormal_vertex>\n #endif\n #include <begin_vertex>\n #include <morphtarget_vertex>\n #include <skinning_vertex>\n #include <displacementmap_vertex>\n #include <project_vertex>\n #include <logdepthbuf_vertex>\n #include <clipping_planes_vertex>\n vHighPrecisionZW = gl_Position.zw;\n}";
@@ -39360,6 +39577,7 @@ var init_three_module = __esm({
39360
39577
  lights_fragment_begin,
39361
39578
  lights_fragment_maps,
39362
39579
  lights_fragment_end,
39580
+ lightprobes_pars_fragment,
39363
39581
  logdepthbuf_fragment,
39364
39582
  logdepthbuf_pars_fragment,
39365
39583
  logdepthbuf_pars_vertex,
@@ -39463,7 +39681,6 @@ var init_three_module = __esm({
39463
39681
  envmap: {
39464
39682
  envMap: { value: null },
39465
39683
  envMapRotation: { value: /* @__PURE__ */ new Matrix3() },
39466
- flipEnvMap: { value: -1 },
39467
39684
  reflectivity: { value: 1 },
39468
39685
  // basic, lambert, phong
39469
39686
  ior: { value: 1.5 },
@@ -39582,7 +39799,11 @@ var init_three_module = __esm({
39582
39799
  height: {}
39583
39800
  } },
39584
39801
  ltc_1: { value: null },
39585
- ltc_2: { value: null }
39802
+ ltc_2: { value: null },
39803
+ probesSH: { value: null },
39804
+ probesMin: { value: /* @__PURE__ */ new Vector3() },
39805
+ probesMax: { value: /* @__PURE__ */ new Vector3() },
39806
+ probesResolution: { value: /* @__PURE__ */ new Vector3() }
39586
39807
  },
39587
39808
  points: {
39588
39809
  diffuse: { value: /* @__PURE__ */ new Color(16777215) },
@@ -39783,7 +40004,6 @@ var init_three_module = __esm({
39783
40004
  backgroundCube: {
39784
40005
  uniforms: {
39785
40006
  envMap: { value: null },
39786
- flipEnvMap: { value: -1 },
39787
40007
  backgroundBlurriness: { value: 0 },
39788
40008
  backgroundIntensity: { value: 1 },
39789
40009
  backgroundRotation: { value: /* @__PURE__ */ new Matrix3() }
@@ -39887,8 +40107,9 @@ var init_three_module = __esm({
39887
40107
  fragmentShader: ShaderChunk.meshphysical_frag
39888
40108
  };
39889
40109
  _rgb = { r: 0, b: 0, g: 0 };
39890
- _e1$1 = /* @__PURE__ */ new Euler();
39891
40110
  _m1$12 = /* @__PURE__ */ new Matrix4();
40111
+ _m$1 = /* @__PURE__ */ new Matrix3();
40112
+ _m$1.set(-1, 0, 0, 0, 1, 0, 0, 0, 1);
39892
40113
  LOD_MIN = 4;
39893
40114
  EXTRA_LOD_SIGMA = [0.125, 0.215, 0.35, 0.446, 0.526, 0.582];
39894
40115
  MAX_SAMPLES = 20;
@@ -41232,8 +41453,9 @@ void main() {
41232
41453
  };
41233
41454
  }
41234
41455
  };
41235
- _e1 = /* @__PURE__ */ new Euler();
41236
41456
  _m12 = /* @__PURE__ */ new Matrix4();
41457
+ _m = /* @__PURE__ */ new Matrix3();
41458
+ _m.set(-1, 0, 0, 0, 1, 0, 0, 0, 1);
41237
41459
  DATA = new Uint16Array([
41238
41460
  12469,
41239
41461
  15057,
@@ -41796,6 +42018,7 @@ void main() {
41796
42018
  ]);
41797
42019
  const uintClearColor = new Uint32Array(4);
41798
42020
  const intClearColor = new Int32Array(4);
42021
+ const objectPosition = new Vector3();
41799
42022
  let currentRenderList = null;
41800
42023
  let currentRenderState = null;
41801
42024
  const renderListStack = [];
@@ -41826,6 +42049,7 @@ void main() {
41826
42049
  this.transmissionResolutionScale = 1;
41827
42050
  const _this = this;
41828
42051
  let _isContextLost = false;
42052
+ let _nodesHandler = null;
41829
42053
  this._outputColorSpace = SRGBColorSpace;
41830
42054
  let _currentActiveCubeFace = 0;
41831
42055
  let _currentActiveMipmapLevel = 0;
@@ -41849,8 +42073,8 @@ void main() {
41849
42073
  let _clippingEnabled = false;
41850
42074
  let _localClippingEnabled = false;
41851
42075
  const _projScreenMatrix3 = new Matrix4();
41852
- const _vector32 = new Vector3();
41853
- const _vector4 = new Vector4();
42076
+ const _vector3 = new Vector3();
42077
+ const _vector42 = new Vector4();
41854
42078
  const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };
41855
42079
  let _renderBackground = false;
41856
42080
  function getTargetPixelRatio() {
@@ -41994,13 +42218,13 @@ void main() {
41994
42218
  };
41995
42219
  this.setEffects = function(effects) {
41996
42220
  if (_outputBufferType === UnsignedByteType) {
41997
- console.error("THREE.WebGLRenderer: setEffects() requires outputBufferType set to HalfFloatType or FloatType.");
42221
+ error("THREE.WebGLRenderer: setEffects() requires outputBufferType set to HalfFloatType or FloatType.");
41998
42222
  return;
41999
42223
  }
42000
42224
  if (effects) {
42001
42225
  for (let i3 = 0; i3 < effects.length; i3++) {
42002
42226
  if (effects[i3].isOutputPass === true) {
42003
- console.warn("THREE.WebGLRenderer: OutputPass is not needed in setEffects(). Tone mapping and color space conversion are applied automatically.");
42227
+ warn("THREE.WebGLRenderer: OutputPass is not needed in setEffects(). Tone mapping and color space conversion are applied automatically.");
42004
42228
  break;
42005
42229
  }
42006
42230
  }
@@ -42091,6 +42315,7 @@ void main() {
42091
42315
  }
42092
42316
  if (depth2) {
42093
42317
  bits |= _gl.DEPTH_BUFFER_BIT;
42318
+ this.state.buffers.depth.setMask(true);
42094
42319
  }
42095
42320
  if (stencil2) {
42096
42321
  bits |= _gl.STENCIL_BUFFER_BIT;
@@ -42109,6 +42334,10 @@ void main() {
42109
42334
  this.clearStencil = function() {
42110
42335
  this.clear(false, false, true);
42111
42336
  };
42337
+ this.setNodesHandler = function(nodesHandler) {
42338
+ nodesHandler.setRenderer(this);
42339
+ _nodesHandler = nodesHandler;
42340
+ };
42112
42341
  this.dispose = function() {
42113
42342
  canvas.removeEventListener("webglcontextlost", onContextLost, false);
42114
42343
  canvas.removeEventListener("webglcontextrestored", onContextRestore, false);
@@ -42231,23 +42460,18 @@ void main() {
42231
42460
  renderer.setMode(_gl.TRIANGLES);
42232
42461
  }
42233
42462
  if (object.isBatchedMesh) {
42234
- if (object._multiDrawInstances !== null) {
42235
- warnOnce("WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");
42236
- renderer.renderMultiDrawInstances(object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances);
42237
- } else {
42238
- if (!extensions2.get("WEBGL_multi_draw")) {
42239
- const starts = object._multiDrawStarts;
42240
- const counts = object._multiDrawCounts;
42241
- const drawCount2 = object._multiDrawCount;
42242
- const bytesPerElement = index ? attributes.get(index).bytesPerElement : 1;
42243
- const uniforms = properties.get(material).currentProgram.getUniforms();
42244
- for (let i3 = 0; i3 < drawCount2; i3++) {
42245
- uniforms.setValue(_gl, "_gl_DrawID", i3);
42246
- renderer.render(starts[i3] / bytesPerElement, counts[i3]);
42247
- }
42248
- } else {
42249
- renderer.renderMultiDraw(object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount);
42463
+ if (!extensions2.get("WEBGL_multi_draw")) {
42464
+ const starts = object._multiDrawStarts;
42465
+ const counts = object._multiDrawCounts;
42466
+ const drawCount2 = object._multiDrawCount;
42467
+ const bytesPerElement = index ? attributes.get(index).bytesPerElement : 1;
42468
+ const uniforms = properties.get(material).currentProgram.getUniforms();
42469
+ for (let i3 = 0; i3 < drawCount2; i3++) {
42470
+ uniforms.setValue(_gl, "_gl_DrawID", i3);
42471
+ renderer.render(starts[i3] / bytesPerElement, counts[i3]);
42250
42472
  }
42473
+ } else {
42474
+ renderer.renderMultiDraw(object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount);
42251
42475
  }
42252
42476
  } else if (object.isInstancedMesh) {
42253
42477
  renderer.renderInstances(drawStart, drawCount, object.count);
@@ -42368,6 +42592,9 @@ void main() {
42368
42592
  return;
42369
42593
  }
42370
42594
  if (_isContextLost === true) return;
42595
+ if (_nodesHandler !== null) {
42596
+ _nodesHandler.renderStart(scene, camera);
42597
+ }
42371
42598
  const isXRPresenting = xr.enabled === true && xr.isPresenting === true;
42372
42599
  const useOutput = output !== null && (_currentRenderTarget === null || isXRPresenting) && output.begin(_this, _currentRenderTarget);
42373
42600
  if (scene.matrixWorldAutoUpdate === true) scene.updateMatrixWorld();
@@ -42379,6 +42606,7 @@ void main() {
42379
42606
  if (scene.isScene === true) scene.onBeforeRender(_this, scene, camera, _currentRenderTarget);
42380
42607
  currentRenderState = renderStates.get(scene, renderStateStack.length);
42381
42608
  currentRenderState.init(camera);
42609
+ currentRenderState.state.textureUnits = textures.getTextureUnits();
42382
42610
  renderStateStack.push(currentRenderState);
42383
42611
  _projScreenMatrix3.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
42384
42612
  _frustum2.setFromProjectionMatrix(_projScreenMatrix3, WebGLCoordinateSystem, camera.reversedDepth);
@@ -42446,6 +42674,7 @@ void main() {
42446
42674
  renderStateStack.pop();
42447
42675
  if (renderStateStack.length > 0) {
42448
42676
  currentRenderState = renderStateStack[renderStateStack.length - 1];
42677
+ textures.setTextureUnits(currentRenderState.state.textureUnits);
42449
42678
  if (_clippingEnabled === true) clipping.setGlobalState(_this.clippingPlanes, currentRenderState.state.camera);
42450
42679
  } else {
42451
42680
  currentRenderState = null;
@@ -42456,6 +42685,9 @@ void main() {
42456
42685
  } else {
42457
42686
  currentRenderList = null;
42458
42687
  }
42688
+ if (_nodesHandler !== null) {
42689
+ _nodesHandler.renderEnd();
42690
+ }
42459
42691
  };
42460
42692
  function projectObject(object, camera, groupOrder, sortObjects) {
42461
42693
  if (object.visible === false) return;
@@ -42465,6 +42697,8 @@ void main() {
42465
42697
  groupOrder = object.renderOrder;
42466
42698
  } else if (object.isLOD) {
42467
42699
  if (object.autoUpdate === true) object.update(camera);
42700
+ } else if (object.isLightProbeGrid) {
42701
+ currentRenderState.pushLightProbeGrid(object);
42468
42702
  } else if (object.isLight) {
42469
42703
  currentRenderState.pushLight(object);
42470
42704
  if (object.castShadow) {
@@ -42473,12 +42707,12 @@ void main() {
42473
42707
  } else if (object.isSprite) {
42474
42708
  if (!object.frustumCulled || _frustum2.intersectsSprite(object)) {
42475
42709
  if (sortObjects) {
42476
- _vector4.setFromMatrixPosition(object.matrixWorld).applyMatrix4(_projScreenMatrix3);
42710
+ _vector42.setFromMatrixPosition(object.matrixWorld).applyMatrix4(_projScreenMatrix3);
42477
42711
  }
42478
42712
  const geometry = objects.update(object);
42479
42713
  const material = object.material;
42480
42714
  if (material.visible) {
42481
- currentRenderList.push(object, geometry, material, groupOrder, _vector4.z, null);
42715
+ currentRenderList.push(object, geometry, material, groupOrder, _vector42.z, null);
42482
42716
  }
42483
42717
  }
42484
42718
  } else if (object.isMesh || object.isLine || object.isPoints) {
@@ -42488,12 +42722,12 @@ void main() {
42488
42722
  if (sortObjects) {
42489
42723
  if (object.boundingSphere !== void 0) {
42490
42724
  if (object.boundingSphere === null) object.computeBoundingSphere();
42491
- _vector4.copy(object.boundingSphere.center);
42725
+ _vector42.copy(object.boundingSphere.center);
42492
42726
  } else {
42493
42727
  if (geometry.boundingSphere === null) geometry.computeBoundingSphere();
42494
- _vector4.copy(geometry.boundingSphere.center);
42728
+ _vector42.copy(geometry.boundingSphere.center);
42495
42729
  }
42496
- _vector4.applyMatrix4(object.matrixWorld).applyMatrix4(_projScreenMatrix3);
42730
+ _vector42.applyMatrix4(object.matrixWorld).applyMatrix4(_projScreenMatrix3);
42497
42731
  }
42498
42732
  if (Array.isArray(material)) {
42499
42733
  const groups = geometry.groups;
@@ -42501,11 +42735,11 @@ void main() {
42501
42735
  const group = groups[i3];
42502
42736
  const groupMaterial = material[group.materialIndex];
42503
42737
  if (groupMaterial && groupMaterial.visible) {
42504
- currentRenderList.push(object, geometry, groupMaterial, groupOrder, _vector4.z, group);
42738
+ currentRenderList.push(object, geometry, groupMaterial, groupOrder, _vector42.z, group);
42505
42739
  }
42506
42740
  }
42507
42741
  } else if (material.visible) {
42508
- currentRenderList.push(object, geometry, material, groupOrder, _vector4.z, null);
42742
+ currentRenderList.push(object, geometry, material, groupOrder, _vector42.z, null);
42509
42743
  }
42510
42744
  }
42511
42745
  }
@@ -42631,7 +42865,7 @@ void main() {
42631
42865
  const lights = currentRenderState.state.lights;
42632
42866
  const shadowsArray = currentRenderState.state.shadowsArray;
42633
42867
  const lightsStateVersion = lights.state.version;
42634
- const parameters2 = programCache.getParameters(material, lights.state, shadowsArray, scene, object);
42868
+ const parameters2 = programCache.getParameters(material, lights.state, shadowsArray, scene, object, currentRenderState.state.lightProbeGridArray);
42635
42869
  const programCacheKey = programCache.getProgramCacheKey(parameters2);
42636
42870
  let programs = materialProperties.programs;
42637
42871
  materialProperties.environment = material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ? scene.environment : null;
@@ -42652,6 +42886,9 @@ void main() {
42652
42886
  }
42653
42887
  } else {
42654
42888
  parameters2.uniforms = programCache.getUniforms(material);
42889
+ if (_nodesHandler !== null && material.isNodeMaterial) {
42890
+ _nodesHandler.build(material, object, parameters2);
42891
+ }
42655
42892
  material.onBeforeCompile(parameters2, _this);
42656
42893
  program = programCache.acquireProgram(parameters2, programCacheKey);
42657
42894
  programs.set(programCacheKey, program);
@@ -42682,6 +42919,7 @@ void main() {
42682
42919
  uniforms.spotLightMap.value = lights.state.spotLightMap;
42683
42920
  uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;
42684
42921
  }
42922
+ materialProperties.lightProbeGrid = currentRenderState.state.lightProbeGridArray.length > 0;
42685
42923
  materialProperties.currentProgram = program;
42686
42924
  materialProperties.uniformsList = null;
42687
42925
  return program;
@@ -42712,12 +42950,24 @@ void main() {
42712
42950
  materialProperties.vertexTangents = parameters2.vertexTangents;
42713
42951
  materialProperties.toneMapping = parameters2.toneMapping;
42714
42952
  }
42953
+ function findLightProbeGrid(volumes, object) {
42954
+ if (volumes.length === 0) return null;
42955
+ if (volumes.length === 1) {
42956
+ return volumes[0].texture !== null ? volumes[0] : null;
42957
+ }
42958
+ objectPosition.setFromMatrixPosition(object.matrixWorld);
42959
+ for (let i3 = 0, l2 = volumes.length; i3 < l2; i3++) {
42960
+ const v = volumes[i3];
42961
+ if (v.texture !== null && v.boundingBox.containsPoint(objectPosition)) return v;
42962
+ }
42963
+ return null;
42964
+ }
42715
42965
  function setProgram(camera, scene, geometry, material, object) {
42716
42966
  if (scene.isScene !== true) scene = _emptyScene;
42717
42967
  textures.resetTextureUnits();
42718
42968
  const fog = scene.fog;
42719
42969
  const environment = material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ? scene.environment : null;
42720
- const colorSpace = _currentRenderTarget === null ? _this.outputColorSpace : _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace;
42970
+ const colorSpace = _currentRenderTarget === null ? _this.outputColorSpace : _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : ColorManagement.workingColorSpace;
42721
42971
  const usePMREM = material.isMeshStandardMaterial || material.isMeshLambertMaterial && !material.envMap || material.isMeshPhongMaterial && !material.envMap;
42722
42972
  const envMap = environments.get(material.envMap || environment, usePMREM);
42723
42973
  const vertexAlphas = material.vertexColors === true && !!geometry.attributes.color && geometry.attributes.color.itemSize === 4;
@@ -42791,6 +43041,8 @@ void main() {
42791
43041
  needsProgramChange = true;
42792
43042
  } else if (materialProperties.morphTargetsCount !== morphTargetsCount) {
42793
43043
  needsProgramChange = true;
43044
+ } else if (!!materialProperties.lightProbeGrid !== currentRenderState.state.lightProbeGridArray.length > 0) {
43045
+ needsProgramChange = true;
42794
43046
  }
42795
43047
  } else {
42796
43048
  needsProgramChange = true;
@@ -42799,6 +43051,9 @@ void main() {
42799
43051
  let program = materialProperties.currentProgram;
42800
43052
  if (needsProgramChange === true) {
42801
43053
  program = getProgram(material, scene, object);
43054
+ if (_nodesHandler && material.isNodeMaterial) {
43055
+ _nodesHandler.onUpdateProgram(material, program, materialProperties);
43056
+ }
42802
43057
  }
42803
43058
  let refreshProgram = false;
42804
43059
  let refreshMaterial = false;
@@ -42813,6 +43068,13 @@ void main() {
42813
43068
  _currentMaterialId = material.id;
42814
43069
  refreshMaterial = true;
42815
43070
  }
43071
+ if (materialProperties.needsLights) {
43072
+ const objectVolume = findLightProbeGrid(currentRenderState.state.lightProbeGridArray, object);
43073
+ if (materialProperties.lightProbeGrid !== objectVolume) {
43074
+ materialProperties.lightProbeGrid = objectVolume;
43075
+ refreshMaterial = true;
43076
+ }
43077
+ }
42816
43078
  if (refreshProgram || _currentCamera !== camera) {
42817
43079
  const reversedDepthBuffer2 = state2.buffers.depth.getReversed();
42818
43080
  if (reversedDepthBuffer2 && camera.reversedDepth !== true) {
@@ -42823,7 +43085,7 @@ void main() {
42823
43085
  p_uniforms.setValue(_gl, "viewMatrix", camera.matrixWorldInverse);
42824
43086
  const uCamPos = p_uniforms.map.cameraPosition;
42825
43087
  if (uCamPos !== void 0) {
42826
- uCamPos.setValue(_gl, _vector32.setFromMatrixPosition(camera.matrixWorld));
43088
+ uCamPos.setValue(_gl, _vector3.setFromMatrixPosition(camera.matrixWorld));
42827
43089
  }
42828
43090
  if (capabilities.logarithmicDepthBuffer) {
42829
43091
  p_uniforms.setValue(
@@ -42894,6 +43156,13 @@ void main() {
42894
43156
  materials.refreshFogUniforms(m_uniforms, fog);
42895
43157
  }
42896
43158
  materials.refreshMaterialUniforms(m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[camera.id]);
43159
+ if (materialProperties.needsLights && materialProperties.lightProbeGrid) {
43160
+ const volume = materialProperties.lightProbeGrid;
43161
+ m_uniforms.probesSH.value = volume.texture;
43162
+ m_uniforms.probesMin.value.copy(volume.boundingBox.min);
43163
+ m_uniforms.probesMax.value.copy(volume.boundingBox.max);
43164
+ m_uniforms.probesResolution.value.copy(volume.resolution);
43165
+ }
42897
43166
  WebGLUniforms.upload(_gl, getUniformList(materialProperties), m_uniforms, textures);
42898
43167
  }
42899
43168
  if (material.isShaderMaterial && material.uniformsNeedUpdate === true) {
@@ -42906,7 +43175,7 @@ void main() {
42906
43175
  p_uniforms.setValue(_gl, "modelViewMatrix", object.modelViewMatrix);
42907
43176
  p_uniforms.setValue(_gl, "normalMatrix", object.normalMatrix);
42908
43177
  p_uniforms.setValue(_gl, "modelMatrix", object.matrixWorld);
42909
- if (material.isShaderMaterial || material.isRawShaderMaterial) {
43178
+ if (material.uniformsGroups !== void 0) {
42910
43179
  const groups = material.uniformsGroups;
42911
43180
  for (let i3 = 0, l2 = groups.length; i3 < l2; i3++) {
42912
43181
  const group = groups[i3];
@@ -43175,19 +43444,20 @@ void main() {
43175
43444
  textures.setTexture2D(dstTexture, 0);
43176
43445
  glTarget = _gl.TEXTURE_2D;
43177
43446
  }
43178
- _gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY);
43179
- _gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha);
43180
- _gl.pixelStorei(_gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment);
43181
- const currentUnpackRowLen = _gl.getParameter(_gl.UNPACK_ROW_LENGTH);
43182
- const currentUnpackImageHeight = _gl.getParameter(_gl.UNPACK_IMAGE_HEIGHT);
43183
- const currentUnpackSkipPixels = _gl.getParameter(_gl.UNPACK_SKIP_PIXELS);
43184
- const currentUnpackSkipRows = _gl.getParameter(_gl.UNPACK_SKIP_ROWS);
43185
- const currentUnpackSkipImages = _gl.getParameter(_gl.UNPACK_SKIP_IMAGES);
43186
- _gl.pixelStorei(_gl.UNPACK_ROW_LENGTH, image.width);
43187
- _gl.pixelStorei(_gl.UNPACK_IMAGE_HEIGHT, image.height);
43188
- _gl.pixelStorei(_gl.UNPACK_SKIP_PIXELS, minX);
43189
- _gl.pixelStorei(_gl.UNPACK_SKIP_ROWS, minY);
43190
- _gl.pixelStorei(_gl.UNPACK_SKIP_IMAGES, minZ);
43447
+ state2.activeTexture(_gl.TEXTURE0);
43448
+ state2.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY);
43449
+ state2.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha);
43450
+ state2.pixelStorei(_gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment);
43451
+ const currentUnpackRowLen = state2.getParameter(_gl.UNPACK_ROW_LENGTH);
43452
+ const currentUnpackImageHeight = state2.getParameter(_gl.UNPACK_IMAGE_HEIGHT);
43453
+ const currentUnpackSkipPixels = state2.getParameter(_gl.UNPACK_SKIP_PIXELS);
43454
+ const currentUnpackSkipRows = state2.getParameter(_gl.UNPACK_SKIP_ROWS);
43455
+ const currentUnpackSkipImages = state2.getParameter(_gl.UNPACK_SKIP_IMAGES);
43456
+ state2.pixelStorei(_gl.UNPACK_ROW_LENGTH, image.width);
43457
+ state2.pixelStorei(_gl.UNPACK_IMAGE_HEIGHT, image.height);
43458
+ state2.pixelStorei(_gl.UNPACK_SKIP_PIXELS, minX);
43459
+ state2.pixelStorei(_gl.UNPACK_SKIP_ROWS, minY);
43460
+ state2.pixelStorei(_gl.UNPACK_SKIP_IMAGES, minZ);
43191
43461
  const isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture;
43192
43462
  const isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture;
43193
43463
  if (srcTexture.isDepthTexture) {
@@ -43251,11 +43521,11 @@ void main() {
43251
43521
  }
43252
43522
  }
43253
43523
  }
43254
- _gl.pixelStorei(_gl.UNPACK_ROW_LENGTH, currentUnpackRowLen);
43255
- _gl.pixelStorei(_gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight);
43256
- _gl.pixelStorei(_gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels);
43257
- _gl.pixelStorei(_gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows);
43258
- _gl.pixelStorei(_gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages);
43524
+ state2.pixelStorei(_gl.UNPACK_ROW_LENGTH, currentUnpackRowLen);
43525
+ state2.pixelStorei(_gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight);
43526
+ state2.pixelStorei(_gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels);
43527
+ state2.pixelStorei(_gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows);
43528
+ state2.pixelStorei(_gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages);
43259
43529
  if (dstLevel === 0 && dstTexture.generateMipmaps) {
43260
43530
  _gl.generateMipmap(glTarget);
43261
43531
  }
@@ -43320,15 +43590,15 @@ void main() {
43320
43590
  }
43321
43591
  });
43322
43592
 
43323
- // ../../node_modules/.bun/use-sync-external-store@1.6.0+b1ab299f0a400331/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js
43593
+ // ../../node_modules/.bun/use-sync-external-store@1.6.0+3f10a4be4e334a9b/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js
43324
43594
  var require_use_sync_external_store_shim_development = __commonJS({
43325
- "../../node_modules/.bun/use-sync-external-store@1.6.0+b1ab299f0a400331/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"(exports$1) {
43595
+ "../../node_modules/.bun/use-sync-external-store@1.6.0+3f10a4be4e334a9b/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"(exports$1) {
43326
43596
  (function() {
43327
43597
  function is2(x2, y) {
43328
43598
  return x2 === y && (0 !== x2 || 1 / x2 === 1 / y) || x2 !== x2 && y !== y;
43329
43599
  }
43330
43600
  function useSyncExternalStore$2(subscribe3, getSnapshot2) {
43331
- didWarnOld18Alpha || void 0 === React97.startTransition || (didWarnOld18Alpha = true, console.error(
43601
+ didWarnOld18Alpha || void 0 === React100.startTransition || (didWarnOld18Alpha = true, console.error(
43332
43602
  "You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release."
43333
43603
  ));
43334
43604
  var value = getSnapshot2();
@@ -43338,7 +43608,7 @@ var require_use_sync_external_store_shim_development = __commonJS({
43338
43608
  "The result of getSnapshot should be cached to avoid an infinite loop"
43339
43609
  ), didWarnUncachedGetSnapshot = true);
43340
43610
  }
43341
- cachedValue = useState85({
43611
+ cachedValue = useState86({
43342
43612
  inst: { value, getSnapshot: getSnapshot2 }
43343
43613
  });
43344
43614
  var inst = cachedValue[0].inst, forceUpdate = cachedValue[1];
@@ -43376,31 +43646,31 @@ var require_use_sync_external_store_shim_development = __commonJS({
43376
43646
  return getSnapshot2();
43377
43647
  }
43378
43648
  "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
43379
- var React97 = __require("react"), objectIs = "function" === typeof Object.is ? Object.is : is2, useState85 = React97.useState, useEffect72 = React97.useEffect, useLayoutEffect7 = React97.useLayoutEffect, useDebugValue = React97.useDebugValue, didWarnOld18Alpha = false, didWarnUncachedGetSnapshot = false, shim = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2;
43380
- exports$1.useSyncExternalStore = void 0 !== React97.useSyncExternalStore ? React97.useSyncExternalStore : shim;
43649
+ var React100 = __require("react"), objectIs = "function" === typeof Object.is ? Object.is : is2, useState86 = React100.useState, useEffect72 = React100.useEffect, useLayoutEffect7 = React100.useLayoutEffect, useDebugValue = React100.useDebugValue, didWarnOld18Alpha = false, didWarnUncachedGetSnapshot = false, shim = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2;
43650
+ exports$1.useSyncExternalStore = void 0 !== React100.useSyncExternalStore ? React100.useSyncExternalStore : shim;
43381
43651
  "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
43382
43652
  })();
43383
43653
  }
43384
43654
  });
43385
43655
 
43386
- // ../../node_modules/.bun/use-sync-external-store@1.6.0+b1ab299f0a400331/node_modules/use-sync-external-store/shim/index.js
43656
+ // ../../node_modules/.bun/use-sync-external-store@1.6.0+3f10a4be4e334a9b/node_modules/use-sync-external-store/shim/index.js
43387
43657
  var require_shim = __commonJS({
43388
- "../../node_modules/.bun/use-sync-external-store@1.6.0+b1ab299f0a400331/node_modules/use-sync-external-store/shim/index.js"(exports$1, module) {
43658
+ "../../node_modules/.bun/use-sync-external-store@1.6.0+3f10a4be4e334a9b/node_modules/use-sync-external-store/shim/index.js"(exports$1, module) {
43389
43659
  {
43390
43660
  module.exports = require_use_sync_external_store_shim_development();
43391
43661
  }
43392
43662
  }
43393
43663
  });
43394
43664
 
43395
- // ../../node_modules/.bun/use-sync-external-store@1.6.0+b1ab299f0a400331/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js
43665
+ // ../../node_modules/.bun/use-sync-external-store@1.6.0+3f10a4be4e334a9b/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js
43396
43666
  var require_with_selector_development = __commonJS({
43397
- "../../node_modules/.bun/use-sync-external-store@1.6.0+b1ab299f0a400331/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js"(exports$1) {
43667
+ "../../node_modules/.bun/use-sync-external-store@1.6.0+3f10a4be4e334a9b/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js"(exports$1) {
43398
43668
  (function() {
43399
43669
  function is2(x2, y) {
43400
43670
  return x2 === y && (0 !== x2 || 1 / x2 === 1 / y) || x2 !== x2 && y !== y;
43401
43671
  }
43402
43672
  "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
43403
- var React97 = __require("react"), shim = require_shim(), objectIs = "function" === typeof Object.is ? Object.is : is2, useSyncExternalStore3 = shim.useSyncExternalStore, useRef73 = React97.useRef, useEffect72 = React97.useEffect, useMemo41 = React97.useMemo, useDebugValue = React97.useDebugValue;
43673
+ var React100 = __require("react"), shim = require_shim(), objectIs = "function" === typeof Object.is ? Object.is : is2, useSyncExternalStore3 = shim.useSyncExternalStore, useRef73 = React100.useRef, useEffect72 = React100.useEffect, useMemo41 = React100.useMemo, useDebugValue = React100.useDebugValue;
43404
43674
  exports$1.useSyncExternalStoreWithSelector = function(subscribe3, getSnapshot2, getServerSnapshot2, selector, isEqual) {
43405
43675
  var instRef = useRef73(null);
43406
43676
  if (null === instRef.current) {
@@ -43458,19 +43728,19 @@ var require_with_selector_development = __commonJS({
43458
43728
  }
43459
43729
  });
43460
43730
 
43461
- // ../../node_modules/.bun/use-sync-external-store@1.6.0+b1ab299f0a400331/node_modules/use-sync-external-store/shim/with-selector.js
43731
+ // ../../node_modules/.bun/use-sync-external-store@1.6.0+3f10a4be4e334a9b/node_modules/use-sync-external-store/shim/with-selector.js
43462
43732
  var require_with_selector = __commonJS({
43463
- "../../node_modules/.bun/use-sync-external-store@1.6.0+b1ab299f0a400331/node_modules/use-sync-external-store/shim/with-selector.js"(exports$1, module) {
43733
+ "../../node_modules/.bun/use-sync-external-store@1.6.0+3f10a4be4e334a9b/node_modules/use-sync-external-store/shim/with-selector.js"(exports$1, module) {
43464
43734
  {
43465
43735
  module.exports = require_with_selector_development();
43466
43736
  }
43467
43737
  }
43468
43738
  });
43469
43739
 
43470
- // ../../node_modules/.bun/zustand@5.0.11+10f197a4cef36846/node_modules/zustand/esm/vanilla.mjs
43740
+ // ../../node_modules/.bun/zustand@5.0.11+5e3d5174673d7dcb/node_modules/zustand/esm/vanilla.mjs
43471
43741
  var createStoreImpl, createStore;
43472
43742
  var init_vanilla = __esm({
43473
- "../../node_modules/.bun/zustand@5.0.11+10f197a4cef36846/node_modules/zustand/esm/vanilla.mjs"() {
43743
+ "../../node_modules/.bun/zustand@5.0.11+5e3d5174673d7dcb/node_modules/zustand/esm/vanilla.mjs"() {
43474
43744
  createStoreImpl = (createState) => {
43475
43745
  let state2;
43476
43746
  const listeners = /* @__PURE__ */ new Set();
@@ -43508,7 +43778,7 @@ function useStoreWithEqualityFn(api, selector = identity, equalityFn) {
43508
43778
  }
43509
43779
  var import_with_selector, useSyncExternalStoreWithSelector, identity, createWithEqualityFnImpl, createWithEqualityFn;
43510
43780
  var init_traditional = __esm({
43511
- "../../node_modules/.bun/zustand@5.0.11+10f197a4cef36846/node_modules/zustand/esm/traditional.mjs"() {
43781
+ "../../node_modules/.bun/zustand@5.0.11+5e3d5174673d7dcb/node_modules/zustand/esm/traditional.mjs"() {
43512
43782
  import_with_selector = __toESM(require_with_selector(), 1);
43513
43783
  init_vanilla();
43514
43784
  ({ useSyncExternalStoreWithSelector } = import_with_selector.default);
@@ -43523,7 +43793,7 @@ var init_traditional = __esm({
43523
43793
  }
43524
43794
  });
43525
43795
 
43526
- // ../../node_modules/.bun/suspend-react@0.1.3+b1ab299f0a400331/node_modules/suspend-react/index.js
43796
+ // ../../node_modules/.bun/suspend-react@0.1.3+3f10a4be4e334a9b/node_modules/suspend-react/index.js
43527
43797
  function shallowEqualArrays(arrA, arrB, equal = (a2, b2) => a2 === b2) {
43528
43798
  if (arrA === arrB) return true;
43529
43799
  if (!arrA || !arrB) return false;
@@ -43571,7 +43841,7 @@ function query(fn, keys2 = null, preload2 = false, config = {}) {
43571
43841
  }
43572
43842
  var isPromise, globalCache, suspend, preload, clear;
43573
43843
  var init_suspend_react = __esm({
43574
- "../../node_modules/.bun/suspend-react@0.1.3+b1ab299f0a400331/node_modules/suspend-react/index.js"() {
43844
+ "../../node_modules/.bun/suspend-react@0.1.3+3f10a4be4e334a9b/node_modules/suspend-react/index.js"() {
43575
43845
  isPromise = (promise) => typeof promise === "object" && typeof promise.then === "function";
43576
43846
  globalCache = [];
43577
43847
  suspend = (fn, keys2, config) => query(fn, keys2, false, config);
@@ -43924,7 +44194,7 @@ function x() {
43924
44194
  }
43925
44195
  var a, m, p, b;
43926
44196
  var init_dist = __esm({
43927
- "../../node_modules/.bun/its-fine@2.0.0+26a211c426f3f87c/node_modules/its-fine/dist/index.js"() {
44197
+ "../../node_modules/.bun/its-fine@2.0.0+b2e33729a97476bf/node_modules/its-fine/dist/index.js"() {
43928
44198
  a = /* @__PURE__ */ l(/* @__PURE__ */ React10__namespace.createContext(null));
43929
44199
  m = class extends React10__namespace.Component {
43930
44200
  render() {
@@ -44240,6 +44510,35 @@ function releaseInternalPointerCapture(capturedMap, obj, captures, pointerId) {
44240
44510
  }
44241
44511
  }
44242
44512
  }
44513
+ function swapInteractivity(store, object, newObject) {
44514
+ const {
44515
+ internal
44516
+ } = store.getState();
44517
+ for (let i3 = 0; i3 < internal.interaction.length; i3++) {
44518
+ if (internal.interaction[i3] === object) internal.interaction[i3] = newObject;
44519
+ }
44520
+ for (let i3 = 0; i3 < internal.initialHits.length; i3++) {
44521
+ if (internal.initialHits[i3] === object) internal.initialHits[i3] = newObject;
44522
+ }
44523
+ internal.hovered.forEach((value, key) => {
44524
+ if (value.eventObject === object || value.object === object) {
44525
+ internal.hovered.delete(key);
44526
+ const next = {
44527
+ ...value,
44528
+ eventObject: value.eventObject === object ? newObject : value.eventObject,
44529
+ object: value.object === object ? newObject : value.object
44530
+ };
44531
+ internal.hovered.set(makeId(next), next);
44532
+ }
44533
+ });
44534
+ internal.capturedMap.forEach((captures) => {
44535
+ const captureData = captures.get(object);
44536
+ if (captureData) {
44537
+ captures.delete(object);
44538
+ captures.set(newObject, captureData);
44539
+ }
44540
+ });
44541
+ }
44243
44542
  function removeInteractivity(store, object) {
44244
44543
  const {
44245
44544
  internal
@@ -50635,10 +50934,10 @@ This ensures that you're testing the behavior the user would see in the browser.
50635
50934
  if ((ye & Zn) === Jn) {
50636
50935
  var n = e2.tag;
50637
50936
  if (n === 3 || n === 1 || n === 0 || n === 11 || n === 14 || n === 15) {
50638
- if (n = G(e2) || "ReactComponent", _m !== null) {
50639
- if (_m.has(n)) return;
50640
- _m.add(n);
50641
- } else _m = /* @__PURE__ */ new Set([n]);
50937
+ if (n = G(e2) || "ReactComponent", _m2 !== null) {
50938
+ if (_m2.has(n)) return;
50939
+ _m2.add(n);
50940
+ } else _m2 = /* @__PURE__ */ new Set([n]);
50642
50941
  B(e2, function() {
50643
50942
  console.error("Can't perform a React state update on a component that hasn't mounted yet. This indicates that you have a side-effect in your render function that asynchronously tries to update the component. Move this work to useEffect instead.");
50644
50943
  });
@@ -51860,7 +52159,7 @@ Check the top-level render call using <` + i3 + ">.");
51860
52159
  var bp = Symbol.for;
51861
52160
  pm = bp("selector.component"), hm = bp("selector.has_pseudo_class"), mm = bp("selector.role"), gm = bp("selector.test_id"), ym = bp("selector.text");
51862
52161
  }
51863
- var bm = [], qb = typeof WeakMap == "function" ? WeakMap : Map, Jn = 0, Zn = 2, uo = 4, ki = 0, vp = 1, iu = 2, vm = 3, Tl = 4, Sm = 6, Ky = 5, ye = Jn, je = null, se = null, ae = 0, tr = 0, km = 1, lu = 2, Sp = 3, eb = 4, Eg = 5, kp = 6, wm = 7, Ig = 8, su = 9, Le = tr, Er = null, _l = false, Pd = false, Lg = false, Ta = 0, nn = ki, Rl = 0, El = 0, Ng = 0, rr = 0, uu = 0, wp = null, Bt = null, Pm = false, xm = 0, nb = 0, tb = 300, Pp = 1 / 0, Fg = 500, xp = null, gn = null, Il = null, zm = 0, Hg = 1, Ag = 2, rb = 3, Ll = 0, ob = 1, ab = 2, ib = 3, lb = 4, Cm = 5, Rn = 0, Nl = null, xd = null, qo = 0, jg = 0, Dg = -0, Wg = null, sb = null, ub = null, Go = zm, cb = null, Gb = 50, zp = 0, Ug = null, Bg = false, Tm = false, Jb = 50, cu = 0, Cp = null, zd = false, _m = null, db = false, fb = /* @__PURE__ */ new Set(), Zb = {}, co = null, Cd = null, pb = false;
52162
+ var bm = [], qb = typeof WeakMap == "function" ? WeakMap : Map, Jn = 0, Zn = 2, uo = 4, ki = 0, vp = 1, iu = 2, vm = 3, Tl = 4, Sm = 6, Ky = 5, ye = Jn, je = null, se = null, ae = 0, tr = 0, km = 1, lu = 2, Sp = 3, eb = 4, Eg = 5, kp = 6, wm = 7, Ig = 8, su = 9, Le = tr, Er = null, _l = false, Pd = false, Lg = false, Ta = 0, nn = ki, Rl = 0, El = 0, Ng = 0, rr = 0, uu = 0, wp = null, Bt = null, Pm = false, xm = 0, nb = 0, tb = 300, Pp = 1 / 0, Fg = 500, xp = null, gn = null, Il = null, zm = 0, Hg = 1, Ag = 2, rb = 3, Ll = 0, ob = 1, ab = 2, ib = 3, lb = 4, Cm = 5, Rn = 0, Nl = null, xd = null, qo = 0, jg = 0, Dg = -0, Wg = null, sb = null, ub = null, Go = zm, cb = null, Gb = 50, zp = 0, Ug = null, Bg = false, Tm = false, Jb = 50, cu = 0, Cp = null, zd = false, _m2 = null, db = false, fb = /* @__PURE__ */ new Set(), Zb = {}, co = null, Cd = null, pb = false;
51864
52163
  try {
51865
52164
  var o0 = Object.preventExtensions({});
51866
52165
  } catch {
@@ -52317,9 +52616,11 @@ function swapInstances() {
52317
52616
  if (parent) {
52318
52617
  var _instance$props$objec, _instance$props$args;
52319
52618
  const target = catalogue[toPascalCase(instance.type)];
52619
+ const prevObject = instance.object;
52320
52620
  instance.object = (_instance$props$objec = instance.props.object) != null ? _instance$props$objec : new target(...(_instance$props$args = instance.props.args) != null ? _instance$props$args : []);
52321
52621
  instance.object.__r3f = instance;
52322
52622
  setFiberRef(fiber, instance.object);
52623
+ swapInteractivity(findInitialRoot(instance), prevObject, instance.object);
52323
52624
  applyProps(instance.object, instance.props);
52324
52625
  if (instance.props.attach) {
52325
52626
  attach(parent, instance);
@@ -52903,8 +53204,8 @@ function createPointerEvents(store) {
52903
53204
  };
52904
53205
  }
52905
53206
  var import_scheduler, threeTypes, act2, isOrthographicCamera, isRef, isColorRepresentation, useIsomorphicLayoutEffect, ErrorBoundary, is, REACT_INTERNAL_PROPS, INDEX_REGEX, RESERVED_PROPS, MEMOIZED_PROTOTYPES, colorMaps, EVENT_REGEX, isObject3D, isRenderer, context, createStore2, memoizedLoaders, isConstructor$1, t, o2, r, e, packageData, Rm, Og, Mg, Rb, Eb, t0, r0, NoEventPriority, catalogue, PREFIX_REGEX, toPascalCase, i2, isConstructor, reconstructed, handleTextInstance, NO_CONTEXT, currentUpdatePriority, NoFlags, Update, reconciler, _roots, shallowLoose, globalEffects, globalAfterEffects, globalTailEffects, addEffect, addAfterEffect, addTail, subscribers, subscription, running, useFrameInProgress, repeat, frame, state, DOM_EVENTS;
52906
- var init_events_760a1017_esm = __esm({
52907
- "../../node_modules/.bun/@react-three+fiber@9.6.0+bae906b8c0d5d7d7/node_modules/@react-three/fiber/dist/events-760a1017.esm.js"() {
53207
+ var init_events_b389eeca_esm = __esm({
53208
+ "../../node_modules/.bun/@react-three+fiber@9.6.1+26134fee8850b5e9/node_modules/@react-three/fiber/dist/events-b389eeca.esm.js"() {
52908
53209
  init_three_module();
52909
53210
  init_traditional();
52910
53211
  init_suspend_react();
@@ -53228,7 +53529,7 @@ var init_events_760a1017_esm = __esm({
53228
53529
  e = 2;
53229
53530
  packageData = {
53230
53531
  name: "@react-three/fiber",
53231
- version: "9.6.0",
53532
+ version: "9.6.1",
53232
53533
  description: "A React renderer for Threejs",
53233
53534
  keywords: [
53234
53535
  "react",
@@ -53622,13 +53923,13 @@ function E(n) {
53622
53923
  }
53623
53924
  var k, D;
53624
53925
  var init_dist2 = __esm({
53625
- "../../node_modules/.bun/react-use-measure@2.1.7+bf16f8eded5e12ee/node_modules/react-use-measure/dist/index.js"() {
53926
+ "../../node_modules/.bun/react-use-measure@2.1.7+21ccd8898788a04d/node_modules/react-use-measure/dist/index.js"() {
53626
53927
  k = ["x", "y", "top", "bottom", "left", "right", "width", "height"];
53627
53928
  D = (n, t2) => k.every((o3) => n[o3] === t2[o3]);
53628
53929
  }
53629
53930
  });
53630
53931
 
53631
- // ../../node_modules/.bun/@react-three+fiber@9.6.0+bae906b8c0d5d7d7/node_modules/@react-three/fiber/dist/react-three-fiber.esm.js
53932
+ // ../../node_modules/.bun/@react-three+fiber@9.6.1+26134fee8850b5e9/node_modules/@react-three/fiber/dist/react-three-fiber.esm.js
53632
53933
  var react_three_fiber_esm_exports = {};
53633
53934
  __export(react_three_fiber_esm_exports, {
53634
53935
  Canvas: () => Canvas,
@@ -53797,9 +54098,9 @@ function Canvas(props) {
53797
54098
  });
53798
54099
  }
53799
54100
  var init_react_three_fiber_esm = __esm({
53800
- "../../node_modules/.bun/@react-three+fiber@9.6.0+bae906b8c0d5d7d7/node_modules/@react-three/fiber/dist/react-three-fiber.esm.js"() {
53801
- init_events_760a1017_esm();
53802
- init_events_760a1017_esm();
54101
+ "../../node_modules/.bun/@react-three+fiber@9.6.1+26134fee8850b5e9/node_modules/@react-three/fiber/dist/react-three-fiber.esm.js"() {
54102
+ init_events_b389eeca_esm();
54103
+ init_events_b389eeca_esm();
53803
54104
  init_three_module();
53804
54105
  init_dist2();
53805
54106
  init_dist();
@@ -53871,7 +54172,7 @@ function isRefObject(ref) {
53871
54172
  }
53872
54173
  var v1, v2, v3, v4, epsilon, getCameraCSSMatrix, getObjectCSSMatrix, Html;
53873
54174
  var init_Html = __esm({
53874
- "../../node_modules/.bun/@react-three+drei@10.7.7+cdb3bc7f51872c1f/node_modules/@react-three/drei/web/Html.js"() {
54175
+ "../../node_modules/.bun/@react-three+drei@10.7.7+20209eb6acc591f5/node_modules/@react-three/drei/web/Html.js"() {
53875
54176
  init_extends();
53876
54177
  init_three_module();
53877
54178
  init_react_three_fiber_esm();
@@ -54188,16 +54489,16 @@ var init_Html = __esm({
54188
54489
  }
54189
54490
  });
54190
54491
 
54191
- // ../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/_polyfill/constants.js
54492
+ // ../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/_polyfill/constants.js
54192
54493
  var version;
54193
54494
  var init_constants = __esm({
54194
- "../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/_polyfill/constants.js"() {
54495
+ "../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/_polyfill/constants.js"() {
54195
54496
  init_three_module();
54196
54497
  version = /* @__PURE__ */ (() => parseInt(REVISION.replace(/\D+/g, "")))();
54197
54498
  }
54198
54499
  });
54199
54500
 
54200
- // ../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/utils/BufferGeometryUtils.js
54501
+ // ../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/utils/BufferGeometryUtils.js
54201
54502
  function toTrianglesDrawMode(geometry, drawMode) {
54202
54503
  if (drawMode === TrianglesDrawMode) {
54203
54504
  console.warn("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.");
@@ -54257,15 +54558,15 @@ function toTrianglesDrawMode(geometry, drawMode) {
54257
54558
  }
54258
54559
  }
54259
54560
  var init_BufferGeometryUtils = __esm({
54260
- "../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/utils/BufferGeometryUtils.js"() {
54561
+ "../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/utils/BufferGeometryUtils.js"() {
54261
54562
  init_three_module();
54262
54563
  }
54263
54564
  });
54264
54565
 
54265
- // ../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/controls/EventDispatcher.js
54566
+ // ../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/controls/EventDispatcher.js
54266
54567
  var __defProp2, __defNormalProp, __publicField, EventDispatcher2;
54267
54568
  var init_EventDispatcher = __esm({
54268
- "../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/controls/EventDispatcher.js"() {
54569
+ "../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/controls/EventDispatcher.js"() {
54269
54570
  __defProp2 = Object.defineProperty;
54270
54571
  __defNormalProp = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
54271
54572
  __publicField = (obj, key, value) => {
@@ -54342,10 +54643,10 @@ var init_EventDispatcher = __esm({
54342
54643
  }
54343
54644
  });
54344
54645
 
54345
- // ../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/controls/OrbitControls.js
54646
+ // ../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/controls/OrbitControls.js
54346
54647
  var __defProp3, __defNormalProp2, __publicField2, _ray2, _plane, TILT_LIMIT, moduloWrapAround, OrbitControls;
54347
54648
  var init_OrbitControls = __esm({
54348
- "../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/controls/OrbitControls.js"() {
54649
+ "../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/controls/OrbitControls.js"() {
54349
54650
  init_three_module();
54350
54651
  init_EventDispatcher();
54351
54652
  __defProp3 = Object.defineProperty;
@@ -55181,7 +55482,7 @@ var init_OrbitControls = __esm({
55181
55482
  }
55182
55483
  });
55183
55484
 
55184
- // ../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/_polyfill/LoaderUtils.js
55485
+ // ../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/_polyfill/LoaderUtils.js
55185
55486
  function decodeText(array) {
55186
55487
  if (typeof TextDecoder !== "undefined") {
55187
55488
  return new TextDecoder().decode(array);
@@ -55197,11 +55498,11 @@ function decodeText(array) {
55197
55498
  }
55198
55499
  }
55199
55500
  var init_LoaderUtils = __esm({
55200
- "../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/_polyfill/LoaderUtils.js"() {
55501
+ "../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/_polyfill/LoaderUtils.js"() {
55201
55502
  }
55202
55503
  });
55203
55504
 
55204
- // ../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/loaders/GLTFLoader.js
55505
+ // ../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/loaders/GLTFLoader.js
55205
55506
  function GLTFRegistry() {
55206
55507
  let objects = {};
55207
55508
  return {
@@ -55447,7 +55748,7 @@ function addPrimitiveAttributes(geometry, primitiveDef, parser) {
55447
55748
  }
55448
55749
  var SRGBColorSpace2, LinearSRGBColorSpace2, sRGBEncoding, LinearEncoding, GLTFLoader, EXTENSIONS, GLTFLightsExtension, GLTFMaterialsUnlitExtension, GLTFMaterialsEmissiveStrengthExtension, GLTFMaterialsClearcoatExtension, GLTFMaterialsDispersionExtension, GLTFMaterialsIridescenceExtension, GLTFMaterialsSheenExtension, GLTFMaterialsTransmissionExtension, GLTFMaterialsVolumeExtension, GLTFMaterialsIorExtension, GLTFMaterialsSpecularExtension, GLTFMaterialsBumpExtension, GLTFMaterialsAnisotropyExtension, GLTFTextureBasisUExtension, GLTFTextureWebPExtension, GLTFTextureAVIFExtension, GLTFMeshoptCompression, GLTFMeshGpuInstancing, BINARY_EXTENSION_HEADER_MAGIC, BINARY_EXTENSION_HEADER_LENGTH, BINARY_EXTENSION_CHUNK_TYPES, GLTFBinaryExtension, GLTFDracoMeshCompressionExtension, GLTFTextureTransformExtension, GLTFMeshQuantizationExtension, GLTFCubicSplineInterpolant, _q, GLTFCubicSplineQuaternionInterpolant, WEBGL_CONSTANTS, WEBGL_COMPONENT_TYPES, WEBGL_FILTERS, WEBGL_WRAPPINGS, WEBGL_TYPE_SIZES, ATTRIBUTES, PATH_PROPERTIES, INTERPOLATION, ALPHA_MODES, _identityMatrix2, GLTFParser;
55449
55750
  var init_GLTFLoader = __esm({
55450
- "../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/loaders/GLTFLoader.js"() {
55751
+ "../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/loaders/GLTFLoader.js"() {
55451
55752
  init_three_module();
55452
55753
  init_BufferGeometryUtils();
55453
55754
  init_constants();
@@ -57829,7 +58130,7 @@ var init_GLTFLoader = __esm({
57829
58130
  }
57830
58131
  });
57831
58132
 
57832
- // ../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/loaders/DRACOLoader.js
58133
+ // ../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/loaders/DRACOLoader.js
57833
58134
  function DRACOWorker() {
57834
58135
  let decoderConfig;
57835
58136
  let decoderPending;
@@ -57957,7 +58258,7 @@ function DRACOWorker() {
57957
58258
  }
57958
58259
  var _taskCache, DRACOLoader;
57959
58260
  var init_DRACOLoader = __esm({
57960
- "../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/loaders/DRACOLoader.js"() {
58261
+ "../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/loaders/DRACOLoader.js"() {
57961
58262
  init_three_module();
57962
58263
  _taskCache = /* @__PURE__ */ new WeakMap();
57963
58264
  DRACOLoader = class extends Loader {
@@ -58174,10 +58475,10 @@ var init_DRACOLoader = __esm({
58174
58475
  }
58175
58476
  });
58176
58477
 
58177
- // ../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/libs/MeshoptDecoder.js
58478
+ // ../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/libs/MeshoptDecoder.js
58178
58479
  var generated, MeshoptDecoder;
58179
58480
  var init_MeshoptDecoder = __esm({
58180
- "../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/libs/MeshoptDecoder.js"() {
58481
+ "../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/libs/MeshoptDecoder.js"() {
58181
58482
  MeshoptDecoder = () => {
58182
58483
  if (generated)
58183
58484
  return generated;
@@ -58398,9 +58699,9 @@ var init_MeshoptDecoder = __esm({
58398
58699
  }
58399
58700
  });
58400
58701
 
58401
- // ../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/index.js
58702
+ // ../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/index.js
58402
58703
  var init_three_stdlib = __esm({
58403
- "../../node_modules/.bun/three-stdlib@2.36.1+9459c15c9e4c81b0/node_modules/three-stdlib/index.js"() {
58704
+ "../../node_modules/.bun/three-stdlib@2.36.1+7b565cd016fb14f9/node_modules/three-stdlib/index.js"() {
58404
58705
  init_OrbitControls();
58405
58706
  init_GLTFLoader();
58406
58707
  init_DRACOLoader();
@@ -58426,7 +58727,7 @@ function extensions(useDraco = true, useMeshopt = true, extendLoader) {
58426
58727
  }
58427
58728
  var dracoLoader, decoderPath, useGLTF;
58428
58729
  var init_Gltf = __esm({
58429
- "../../node_modules/.bun/@react-three+drei@10.7.7+cdb3bc7f51872c1f/node_modules/@react-three/drei/core/Gltf.js"() {
58730
+ "../../node_modules/.bun/@react-three+drei@10.7.7+20209eb6acc591f5/node_modules/@react-three/drei/core/Gltf.js"() {
58430
58731
  init_extends();
58431
58732
  init_three_stdlib();
58432
58733
  init_react_three_fiber_esm();
@@ -58442,7 +58743,7 @@ var init_Gltf = __esm({
58442
58743
  });
58443
58744
  var OrbitControls2;
58444
58745
  var init_OrbitControls2 = __esm({
58445
- "../../node_modules/.bun/@react-three+drei@10.7.7+cdb3bc7f51872c1f/node_modules/@react-three/drei/core/OrbitControls.js"() {
58746
+ "../../node_modules/.bun/@react-three+drei@10.7.7+20209eb6acc591f5/node_modules/@react-three/drei/core/OrbitControls.js"() {
58446
58747
  init_extends();
58447
58748
  init_react_three_fiber_esm();
58448
58749
  init_three_stdlib();
@@ -58520,12 +58821,12 @@ var init_OrbitControls2 = __esm({
58520
58821
  }
58521
58822
  });
58522
58823
  var init_camera_controls_module = __esm({
58523
- "../../node_modules/.bun/camera-controls@3.1.2+9459c15c9e4c81b0/node_modules/camera-controls/dist/camera-controls.module.js"() {
58824
+ "../../node_modules/.bun/camera-controls@3.1.2+7b565cd016fb14f9/node_modules/camera-controls/dist/camera-controls.module.js"() {
58524
58825
  }
58525
58826
  });
58526
58827
  var Center;
58527
58828
  var init_Center = __esm({
58528
- "../../node_modules/.bun/@react-three+drei@10.7.7+cdb3bc7f51872c1f/node_modules/@react-three/drei/core/Center.js"() {
58829
+ "../../node_modules/.bun/@react-three+drei@10.7.7+20209eb6acc591f5/node_modules/@react-three/drei/core/Center.js"() {
58529
58830
  init_extends();
58530
58831
  init_three_module();
58531
58832
  Center = /* @__PURE__ */ React10__namespace.forwardRef(function Center2({
@@ -58590,9 +58891,9 @@ var init_Center = __esm({
58590
58891
  }
58591
58892
  });
58592
58893
 
58593
- // ../../node_modules/.bun/@react-three+drei@10.7.7+cdb3bc7f51872c1f/node_modules/@react-three/drei/index.js
58894
+ // ../../node_modules/.bun/@react-three+drei@10.7.7+20209eb6acc591f5/node_modules/@react-three/drei/index.js
58594
58895
  var init_drei = __esm({
58595
- "../../node_modules/.bun/@react-three+drei@10.7.7+cdb3bc7f51872c1f/node_modules/@react-three/drei/index.js"() {
58896
+ "../../node_modules/.bun/@react-three+drei@10.7.7+20209eb6acc591f5/node_modules/@react-three/drei/index.js"() {
58596
58897
  init_Html();
58597
58898
  init_Gltf();
58598
58899
  init_OrbitControls2();
@@ -73801,6 +74102,13 @@ function hasDistinctScriptFonts(fonts) {
73801
74102
  }
73802
74103
  return Boolean(fonts.eastAsia) && fonts.eastAsia !== base || Boolean(fonts.complexScript) && fonts.complexScript !== base || Boolean(fonts.symbol) && fonts.symbol !== base;
73803
74104
  }
74105
+ function sanitizeMathMl(markup) {
74106
+ const purify = DOMPurify__default.default;
74107
+ if (typeof purify.sanitize !== "function") {
74108
+ return markup;
74109
+ }
74110
+ return purify.sanitize(markup, { USE_PROFILES: { mathMl: true, svg: true } });
74111
+ }
73804
74112
  function renderScriptAwareText(text2, needsScriptFonts, scriptFonts, baseFontFamily, keyPrefix) {
73805
74113
  if (!needsScriptFonts || !text2) {
73806
74114
  return text2;
@@ -73891,14 +74199,15 @@ function renderSegmentContent(elementId, segmentIndex, textValue, lines, needsSc
73891
74199
  }
73892
74200
  function renderEquationSegment(elementId, segmentIndex, equationXml, equationNumber) {
73893
74201
  const mathml = convertOmmlToMathMl(equationXml);
73894
- const equationContent = mathml ? /* @__PURE__ */ jsxRuntime.jsx(
74202
+ const safeMathml = mathml ? sanitizeMathMl(mathml) : "";
74203
+ const equationContent = safeMathml ? /* @__PURE__ */ jsxRuntime.jsx(
73895
74204
  "span",
73896
74205
  {
73897
74206
  className: "inline-block align-middle",
73898
74207
  style: {
73899
74208
  fontFamily: '"Cambria Math", "STIX Two Math", serif'
73900
74209
  },
73901
- dangerouslySetInnerHTML: { __html: mathml }
74210
+ dangerouslySetInnerHTML: { __html: safeMathml }
73902
74211
  }
73903
74212
  ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block px-1 py-0.5 rounded text-xs bg-gray-200/20 text-gray-400 italic", children: "Equation" });
73904
74213
  if (equationNumber) {
@@ -86255,7 +86564,7 @@ function ResizeHandle({
86255
86564
  }
86256
86565
  );
86257
86566
  }
86258
- function SlideThumbnail({
86567
+ function SlideThumbnailImpl({
86259
86568
  slide,
86260
86569
  templateElements,
86261
86570
  canvasSize
@@ -86493,6 +86802,37 @@ function ThumbnailTable({
86493
86802
  }
86494
86803
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-[10px] text-muted-foreground pointer-events-none", children: "Table" });
86495
86804
  }
86805
+ function arePropsEqual(prev, next) {
86806
+ if (prev.slide.id !== next.slide.id) {
86807
+ return false;
86808
+ }
86809
+ if (prev.slide.isDirty !== next.slide.isDirty) {
86810
+ return false;
86811
+ }
86812
+ if (prev.slide.hidden !== next.slide.hidden) {
86813
+ return false;
86814
+ }
86815
+ if (prev.slide.elements !== next.slide.elements) {
86816
+ return false;
86817
+ }
86818
+ if (prev.slide.backgroundColor !== next.slide.backgroundColor) {
86819
+ return false;
86820
+ }
86821
+ if (prev.slide.backgroundImage !== next.slide.backgroundImage) {
86822
+ return false;
86823
+ }
86824
+ if (prev.slide.backgroundGradient !== next.slide.backgroundGradient) {
86825
+ return false;
86826
+ }
86827
+ if (prev.templateElements !== next.templateElements) {
86828
+ return false;
86829
+ }
86830
+ if (prev.canvasSize.width !== next.canvasSize.width || prev.canvasSize.height !== next.canvasSize.height) {
86831
+ return false;
86832
+ }
86833
+ return true;
86834
+ }
86835
+ var SlideThumbnail = React10__namespace.default.memo(SlideThumbnailImpl, arePropsEqual);
86496
86836
  function ContextMenu({
86497
86837
  contextMenuState,
86498
86838
  mode,
@@ -90226,7 +90566,7 @@ function BendingProcessRenderer({
90226
90566
  }
90227
90567
  );
90228
90568
  }
90229
- function SmartArtRenderer({
90569
+ function SmartArtRendererImpl({
90230
90570
  element: element2,
90231
90571
  className = ""
90232
90572
  }) {
@@ -90337,6 +90677,30 @@ function renderLayout(layoutType, element2, nodes, palette, style) {
90337
90677
  }
90338
90678
  return /* @__PURE__ */ jsxRuntime.jsx(ListRenderer, { element: element2, nodes, palette, style });
90339
90679
  }
90680
+ function arePropsEqual2(prev, next) {
90681
+ if (prev.className !== next.className) {
90682
+ return false;
90683
+ }
90684
+ if (prev.element.id !== next.element.id) {
90685
+ return false;
90686
+ }
90687
+ if (prev.element.type !== next.element.type) {
90688
+ return false;
90689
+ }
90690
+ if (prev.element.width !== next.element.width || prev.element.height !== next.element.height) {
90691
+ return false;
90692
+ }
90693
+ if (prev.element.x !== next.element.x || prev.element.y !== next.element.y) {
90694
+ return false;
90695
+ }
90696
+ const prevData = prev.element.type === "smartArt" ? prev.element.smartArtData : void 0;
90697
+ const nextData = next.element.type === "smartArt" ? next.element.smartArtData : void 0;
90698
+ if (prevData !== nextData) {
90699
+ return false;
90700
+ }
90701
+ return true;
90702
+ }
90703
+ var SmartArtRenderer = React10__namespace.default.memo(SmartArtRendererImpl, arePropsEqual2);
90340
90704
  function ZoomElementRenderer({
90341
90705
  element: element2,
90342
90706
  slides,
@@ -93280,7 +93644,7 @@ function SectionBlock({
93280
93644
  )
93281
93645
  ] });
93282
93646
  }
93283
- function SlideCard({
93647
+ function SlideCardImpl({
93284
93648
  slide,
93285
93649
  index,
93286
93650
  isActive,
@@ -93334,6 +93698,49 @@ function SlideCard({
93334
93698
  }
93335
93699
  );
93336
93700
  }
93701
+ function arePropsEqual3(prev, next) {
93702
+ if (prev.slide.id !== next.slide.id) {
93703
+ return false;
93704
+ }
93705
+ if (prev.slide.isDirty !== next.slide.isDirty) {
93706
+ return false;
93707
+ }
93708
+ if (prev.slide.hidden !== next.slide.hidden) {
93709
+ return false;
93710
+ }
93711
+ if (prev.slide.elements !== next.slide.elements) {
93712
+ return false;
93713
+ }
93714
+ if (prev.index !== next.index) {
93715
+ return false;
93716
+ }
93717
+ if (prev.isActive !== next.isActive) {
93718
+ return false;
93719
+ }
93720
+ if (prev.isDragTarget !== next.isDragTarget) {
93721
+ return false;
93722
+ }
93723
+ if (prev.isSelected !== next.isSelected) {
93724
+ return false;
93725
+ }
93726
+ if (prev.selectedCount !== next.selectedCount) {
93727
+ return false;
93728
+ }
93729
+ if (prev.selectionOrder !== next.selectionOrder) {
93730
+ return false;
93731
+ }
93732
+ if (prev.canEdit !== next.canEdit) {
93733
+ return false;
93734
+ }
93735
+ if (prev.canvasSize.width !== next.canvasSize.width || prev.canvasSize.height !== next.canvasSize.height) {
93736
+ return false;
93737
+ }
93738
+ if (prev.onSlideClick !== next.onSlideClick || prev.onDoubleClick !== next.onDoubleClick || prev.onContextMenu !== next.onContextMenu || prev.onDragStart !== next.onDragStart || prev.onDragOver !== next.onDragOver || prev.onDragLeave !== next.onDragLeave || prev.onDrop !== next.onDrop) {
93739
+ return false;
93740
+ }
93741
+ return true;
93742
+ }
93743
+ var SlideCard = React10__namespace.default.memo(SlideCardImpl, arePropsEqual3);
93337
93744
  function SorterContextMenu({
93338
93745
  x: x2,
93339
93746
  y,
@@ -94127,6 +94534,14 @@ function getCurrentParagraphIndex(editorEl, segments) {
94127
94534
  }
94128
94535
  return paraIdx;
94129
94536
  }
94537
+ var CSS_VALUE_SAFE = /^[a-zA-Z0-9 _,.\-+#'%/]{1,100}$/;
94538
+ function isCssValueSafe(value) {
94539
+ if (value === void 0 || value === null) {
94540
+ return false;
94541
+ }
94542
+ const str = String(value);
94543
+ return str.length > 0 && CSS_VALUE_SAFE.test(str);
94544
+ }
94130
94545
  function deriveStyleFromElement(element2, inheritedStyle) {
94131
94546
  const style = { ...inheritedStyle };
94132
94547
  const tagName = element2.tagName.toLowerCase();
@@ -94259,17 +94674,17 @@ function segmentsToEditorHtml(segments) {
94259
94674
  if (segment.style.strikethrough) {
94260
94675
  inlineStyles.push("text-decoration:line-through");
94261
94676
  }
94262
- if (segment.style.color) {
94677
+ if (segment.style.color && isCssValueSafe(segment.style.color)) {
94263
94678
  inlineStyles.push(`color:${segment.style.color}`);
94264
94679
  }
94265
- if (segment.style.fontSize) {
94266
- inlineStyles.push(`font-size:${segment.style.fontSize}pt`);
94680
+ if (segment.style.fontSize && Number.isFinite(Number(segment.style.fontSize))) {
94681
+ inlineStyles.push(`font-size:${Number(segment.style.fontSize)}pt`);
94267
94682
  }
94268
- if (segment.style.fontFamily) {
94683
+ if (segment.style.fontFamily && isCssValueSafe(segment.style.fontFamily)) {
94269
94684
  inlineStyles.push(`font-family:${segment.style.fontFamily}`);
94270
94685
  }
94271
94686
  const text2 = escapeHtml(segment.text);
94272
- if (segment.style.hyperlink) {
94687
+ if (segment.style.hyperlink && isUrlSafe(segment.style.hyperlink)) {
94273
94688
  const href = escapeHtml(segment.style.hyperlink);
94274
94689
  return `<a href="${href}" style="color:#4a9eff;text-decoration:underline;cursor:pointer" data-hyperlink="${href}">${text2}</a>`;
94275
94690
  }
@@ -94352,7 +94767,8 @@ function renderRichNotesSegments(segments) {
94352
94767
  if (segment.style.fontFamily) {
94353
94768
  style.fontFamily = segment.style.fontFamily;
94354
94769
  }
94355
- if (segment.style.hyperlink) {
94770
+ if (segment.style.hyperlink && isUrlSafe(segment.style.hyperlink)) {
94771
+ const safeHref = segment.style.hyperlink;
94356
94772
  style.color = "#4a9eff";
94357
94773
  style.textDecoration = "underline";
94358
94774
  style.cursor = "pointer";
@@ -94360,11 +94776,11 @@ function renderRichNotesSegments(segments) {
94360
94776
  /* @__PURE__ */ jsxRuntime.jsx(
94361
94777
  "a",
94362
94778
  {
94363
- href: segment.style.hyperlink,
94779
+ href: safeHref,
94364
94780
  style,
94365
94781
  onClick: (e2) => {
94366
94782
  e2.preventDefault();
94367
- window.open(segment.style.hyperlink, "_blank");
94783
+ safeOpenUrl(safeHref);
94368
94784
  },
94369
94785
  children: segment.text
94370
94786
  },
@@ -94916,7 +95332,7 @@ function useSlideNotes({
94916
95332
  const href = target.getAttribute("data-hyperlink") || target.getAttribute("href");
94917
95333
  if (href && (e2.ctrlKey || e2.metaKey)) {
94918
95334
  e2.preventDefault();
94919
- window.open(href, "_blank");
95335
+ safeOpenUrl(href);
94920
95336
  }
94921
95337
  }, []);
94922
95338
  return {
@@ -96589,7 +97005,7 @@ function renderNotesSegments(segments) {
96589
97005
  return React10__namespace.default.createElement("span", { key: `seg-${index}`, style }, segment.text);
96590
97006
  });
96591
97007
  }
96592
- function ScaledSlidePreview({
97008
+ function ScaledSlidePreviewImpl({
96593
97009
  slide,
96594
97010
  templateElements,
96595
97011
  canvasSize,
@@ -96736,6 +97152,40 @@ function ScaledSlidePreview({
96736
97152
  }
96737
97153
  );
96738
97154
  }
97155
+ function arePropsEqual4(prev, next) {
97156
+ if (prev.slide.id !== next.slide.id) {
97157
+ return false;
97158
+ }
97159
+ if (prev.slide.isDirty !== next.slide.isDirty) {
97160
+ return false;
97161
+ }
97162
+ if (prev.slide.hidden !== next.slide.hidden) {
97163
+ return false;
97164
+ }
97165
+ if (prev.slide.elements !== next.slide.elements) {
97166
+ return false;
97167
+ }
97168
+ if (prev.slide.backgroundColor !== next.slide.backgroundColor) {
97169
+ return false;
97170
+ }
97171
+ if (prev.slide.backgroundImage !== next.slide.backgroundImage) {
97172
+ return false;
97173
+ }
97174
+ if (prev.slide.backgroundGradient !== next.slide.backgroundGradient) {
97175
+ return false;
97176
+ }
97177
+ if (prev.templateElements !== next.templateElements) {
97178
+ return false;
97179
+ }
97180
+ if (prev.canvasSize.width !== next.canvasSize.width || prev.canvasSize.height !== next.canvasSize.height) {
97181
+ return false;
97182
+ }
97183
+ if (prev.className !== next.className) {
97184
+ return false;
97185
+ }
97186
+ return true;
97187
+ }
97188
+ var ScaledSlidePreview = React10__namespace.default.memo(ScaledSlidePreviewImpl, arePropsEqual4);
96739
97189
  function PresenterView({
96740
97190
  slides,
96741
97191
  currentSlideIndex,
@@ -111039,6 +111489,13 @@ function convertOmmlToLatex(omml) {
111039
111489
  }
111040
111490
  return ommlChildrenToLatex(oMath);
111041
111491
  }
111492
+ function sanitizeMathMl2(markup) {
111493
+ const purify = DOMPurify__default.default;
111494
+ if (typeof purify.sanitize !== "function") {
111495
+ return markup;
111496
+ }
111497
+ return purify.sanitize(markup, { USE_PROFILES: { mathMl: true, svg: true } });
111498
+ }
111042
111499
  var TEMPLATES = [
111043
111500
  {
111044
111501
  label: "Fraction",
@@ -111104,7 +111561,8 @@ var TEMPLATES = [
111104
111561
  var TEMPLATE_MATHML = TEMPLATES.map((tmpl) => {
111105
111562
  try {
111106
111563
  const tmplOmml = convertLatexToOmml(tmpl.latex);
111107
- return convertOmmlToMathMl(tmplOmml);
111564
+ const raw = convertOmmlToMathMl(tmplOmml);
111565
+ return raw ? sanitizeMathMl2(raw) : "";
111108
111566
  } catch {
111109
111567
  return "";
111110
111568
  }
@@ -111116,7 +111574,7 @@ function MathMlPreview({ mathml }) {
111116
111574
  return;
111117
111575
  }
111118
111576
  if (mathml) {
111119
- containerRef.current.innerHTML = mathml;
111577
+ containerRef.current.innerHTML = sanitizeMathMl2(mathml);
111120
111578
  } else {
111121
111579
  containerRef.current.innerHTML = "";
111122
111580
  }
@@ -111144,6 +111602,7 @@ function EquationEditorDialog({
111144
111602
  return convertOmmlToLatex(existingOmml);
111145
111603
  }, [existingOmml]);
111146
111604
  const [latex, setLatex] = React10.useState(initialLatex);
111605
+ const deferredLatex = React10.useDeferredValue(latex);
111147
111606
  const textareaRef = React10.useRef(null);
111148
111607
  React10.useEffect(() => {
111149
111608
  if (isOpen) {
@@ -111152,17 +111611,17 @@ function EquationEditorDialog({
111152
111611
  }
111153
111612
  }, [isOpen, initialLatex]);
111154
111613
  const { mathml, omml } = React10.useMemo(() => {
111155
- if (!latex.trim()) {
111614
+ if (!deferredLatex.trim()) {
111156
111615
  return { mathml: "", omml: {} };
111157
111616
  }
111158
111617
  try {
111159
- const ommlObj = convertLatexToOmml(latex);
111618
+ const ommlObj = convertLatexToOmml(deferredLatex);
111160
111619
  const mathmlStr = convertOmmlToMathMl(ommlObj);
111161
111620
  return { mathml: mathmlStr, omml: ommlObj };
111162
111621
  } catch {
111163
111622
  return { mathml: "", omml: {} };
111164
111623
  }
111165
- }, [latex]);
111624
+ }, [deferredLatex]);
111166
111625
  const handleInsert = React10.useCallback(() => {
111167
111626
  if (!latex.trim()) {
111168
111627
  return;
@@ -113897,6 +114356,7 @@ function useEditorHistory(input) {
113897
114356
  const historyFutureRef = React10.useRef([]);
113898
114357
  const lastHistorySnapshotRef = React10.useRef(null);
113899
114358
  const lastHistorySerializedRef = React10.useRef("");
114359
+ const lastCheapHashRef = React10.useRef("");
113900
114360
  const isApplyingHistoryRef = React10.useRef(false);
113901
114361
  const unlockHistoryTimerRef = React10.useRef(null);
113902
114362
  const [canUndo, setCanUndo] = React10.useState(false);
@@ -114038,15 +114498,21 @@ function useEditorHistory(input) {
114038
114498
  if (hasActivePointerInteraction()) {
114039
114499
  return;
114040
114500
  }
114501
+ const cheapHash = `${slides.length}|${activeSlideIndex}|${canvasSize.width}x${canvasSize.height}|${slides.map((s) => `${s.id}:${s.elements.length}`).join("/")}`;
114502
+ if (cheapHash === lastCheapHashRef.current) {
114503
+ return;
114504
+ }
114041
114505
  const snapshot2 = buildHistorySnapshot();
114042
114506
  const serialized = JSON.stringify(snapshot2);
114043
114507
  if (serialized === lastHistorySerializedRef.current) {
114508
+ lastCheapHashRef.current = cheapHash;
114044
114509
  return;
114045
114510
  }
114046
114511
  const previousSnapshot = lastHistorySnapshotRef.current;
114047
114512
  if (!previousSnapshot) {
114048
114513
  lastHistorySnapshotRef.current = cloneHistorySnapshot(snapshot2);
114049
114514
  lastHistorySerializedRef.current = serialized;
114515
+ lastCheapHashRef.current = cheapHash;
114050
114516
  updateHistoryAvailability();
114051
114517
  return;
114052
114518
  }
@@ -114057,13 +114523,18 @@ function useEditorHistory(input) {
114057
114523
  historyFutureRef.current = [];
114058
114524
  lastHistorySnapshotRef.current = cloneHistorySnapshot(snapshot2);
114059
114525
  lastHistorySerializedRef.current = serialized;
114526
+ lastCheapHashRef.current = cheapHash;
114060
114527
  updateHistoryAvailability();
114061
114528
  }, [
114529
+ activeSlideIndex,
114062
114530
  buildHistorySnapshot,
114531
+ canvasSize.height,
114532
+ canvasSize.width,
114063
114533
  error2,
114064
114534
  hasActivePointerInteraction,
114065
114535
  loading2,
114066
114536
  pointerCommitNonce,
114537
+ slides,
114067
114538
  updateHistoryAvailability
114068
114539
  ]);
114069
114540
  return {
@@ -117775,7 +118246,8 @@ async function storeAudienceContent(content) {
117775
118246
  const tx = db.transaction(STORE_NAME2, "readwrite");
117776
118247
  const store = tx.objectStore(STORE_NAME2);
117777
118248
  const bytes = content instanceof Uint8Array ? content : new Uint8Array(content);
117778
- store.put(bytes, CONTENT_KEY);
118249
+ const record = { bytes, createdAt: Date.now() };
118250
+ store.put(record, CONTENT_KEY);
117779
118251
  tx.oncomplete = () => {
117780
118252
  db.close();
117781
118253
  resolve2();
@@ -117808,14 +118280,34 @@ async function clearAudienceContent() {
117808
118280
  var PRESENTER_CHANNEL_NAME = "pptx-viewer-presenter";
117809
118281
  var AUDIENCE_HASH = "#pptx-audience";
117810
118282
  var PRESENTER_MSG_ORIGIN = "pptx-viewer-presenter";
118283
+ var AUDIENCE_NONCE_KEY = "nonce";
118284
+ function generateSessionId() {
118285
+ if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
118286
+ return crypto.randomUUID();
118287
+ }
118288
+ return `s${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`;
118289
+ }
118290
+ function parseAudienceNonce() {
118291
+ const hash = window.location.hash;
118292
+ if (!hash.startsWith(AUDIENCE_HASH)) {
118293
+ return null;
118294
+ }
118295
+ const trailing = hash.slice(AUDIENCE_HASH.length);
118296
+ if (!trailing) {
118297
+ return null;
118298
+ }
118299
+ const params2 = new URLSearchParams(trailing.replace(/^[&;?]/, ""));
118300
+ return params2.get(AUDIENCE_NONCE_KEY);
118301
+ }
117811
118302
  function isAudienceTab() {
117812
- return window.location.hash === AUDIENCE_HASH;
118303
+ return window.location.hash.startsWith(AUDIENCE_HASH);
117813
118304
  }
117814
118305
  function usePresenterWindow(input) {
117815
118306
  const { currentSlideIndex, isPresenterMode, content } = input;
117816
118307
  const audienceWindowRef = React10.useRef(null);
117817
118308
  const channelRef = React10.useRef(null);
117818
118309
  const pollTimerRef = React10.useRef(null);
118310
+ const sessionIdRef = React10.useRef("");
117819
118311
  const getChannel2 = React10.useCallback(() => {
117820
118312
  if (!channelRef.current) {
117821
118313
  channelRef.current = new BroadcastChannel(PRESENTER_CHANNEL_NAME);
@@ -117827,10 +118319,14 @@ function usePresenterWindow(input) {
117827
118319
  }, []);
117828
118320
  const syncSlideToAudience = React10.useCallback(
117829
118321
  (slideIndex) => {
118322
+ if (!sessionIdRef.current) {
118323
+ return;
118324
+ }
117830
118325
  const msg = {
117831
118326
  origin: PRESENTER_MSG_ORIGIN,
117832
118327
  type: "presenter-slide-change",
117833
- slideIndex
118328
+ slideIndex,
118329
+ sessionId: sessionIdRef.current
117834
118330
  };
117835
118331
  try {
117836
118332
  getChannel2().postMessage(msg);
@@ -117840,13 +118336,16 @@ function usePresenterWindow(input) {
117840
118336
  [getChannel2]
117841
118337
  );
117842
118338
  const closeAudienceWindow = React10.useCallback(() => {
117843
- try {
117844
- const exitMsg = {
117845
- origin: PRESENTER_MSG_ORIGIN,
117846
- type: "presenter-exit"
117847
- };
117848
- getChannel2().postMessage(exitMsg);
117849
- } catch {
118339
+ if (sessionIdRef.current) {
118340
+ try {
118341
+ const exitMsg = {
118342
+ origin: PRESENTER_MSG_ORIGIN,
118343
+ type: "presenter-exit",
118344
+ sessionId: sessionIdRef.current
118345
+ };
118346
+ getChannel2().postMessage(exitMsg);
118347
+ } catch {
118348
+ }
117850
118349
  }
117851
118350
  const win = audienceWindowRef.current;
117852
118351
  if (win && !win.closed) {
@@ -117856,6 +118355,7 @@ function usePresenterWindow(input) {
117856
118355
  }
117857
118356
  }
117858
118357
  audienceWindowRef.current = null;
118358
+ sessionIdRef.current = "";
117859
118359
  if (pollTimerRef.current !== null) {
117860
118360
  clearInterval(pollTimerRef.current);
117861
118361
  pollTimerRef.current = null;
@@ -117866,20 +118366,53 @@ function usePresenterWindow(input) {
117866
118366
  if (isAudienceWindowOpen()) {
117867
118367
  closeAudienceWindow();
117868
118368
  }
117869
- if (content) {
117870
- void storeAudienceContent(content);
117871
- }
117872
- const url = new URL(window.location.href);
117873
- url.hash = AUDIENCE_HASH;
117874
- const win = window.open(url.toString(), "_blank");
117875
- if (!win) {
118369
+ const blankWin = window.open("about:blank", "_blank");
118370
+ if (!blankWin) {
117876
118371
  return false;
117877
118372
  }
117878
- audienceWindowRef.current = win;
118373
+ audienceWindowRef.current = blankWin;
118374
+ const sessionId = generateSessionId();
118375
+ sessionIdRef.current = sessionId;
118376
+ const audienceUrl = new URL(window.location.href);
118377
+ const params2 = new URLSearchParams();
118378
+ params2.set(AUDIENCE_NONCE_KEY, sessionId);
118379
+ audienceUrl.hash = `${AUDIENCE_HASH}&${params2.toString()}`;
118380
+ const navigateOrClose = (ok) => {
118381
+ const win = audienceWindowRef.current;
118382
+ if (!win || win.closed) {
118383
+ return;
118384
+ }
118385
+ if (!ok) {
118386
+ try {
118387
+ win.close();
118388
+ } catch {
118389
+ }
118390
+ audienceWindowRef.current = null;
118391
+ sessionIdRef.current = "";
118392
+ return;
118393
+ }
118394
+ try {
118395
+ win.location.replace(audienceUrl.toString());
118396
+ } catch {
118397
+ try {
118398
+ win.close();
118399
+ } catch {
118400
+ }
118401
+ audienceWindowRef.current = null;
118402
+ sessionIdRef.current = "";
118403
+ }
118404
+ };
118405
+ if (content) {
118406
+ void storeAudienceContent(content).then(() => navigateOrClose(true)).catch(() => navigateOrClose(false));
118407
+ } else {
118408
+ navigateOrClose(true);
118409
+ }
117879
118410
  window.setTimeout(() => syncSlideToAudience(currentSlideIndex), 1500);
117880
118411
  pollTimerRef.current = setInterval(() => {
117881
- if (win.closed) {
118412
+ const win = audienceWindowRef.current;
118413
+ if (!win || win.closed) {
117882
118414
  audienceWindowRef.current = null;
118415
+ sessionIdRef.current = "";
117883
118416
  if (pollTimerRef.current !== null) {
117884
118417
  clearInterval(pollTimerRef.current);
117885
118418
  pollTimerRef.current = null;
@@ -117907,6 +118440,13 @@ function usePresenterWindow(input) {
117907
118440
  closeAudienceWindow();
117908
118441
  }
117909
118442
  }, [isPresenterMode, closeAudienceWindow]);
118443
+ React10.useEffect(() => {
118444
+ const handleBeforeUnload = () => {
118445
+ void clearAudienceContent();
118446
+ };
118447
+ window.addEventListener("beforeunload", handleBeforeUnload);
118448
+ return () => window.removeEventListener("beforeunload", handleBeforeUnload);
118449
+ }, []);
117910
118450
  return {
117911
118451
  openAudienceWindow,
117912
118452
  closeAudienceWindow,
@@ -117944,6 +118484,7 @@ function useAudienceMode(input) {
117944
118484
  if (!isAudienceTab()) {
117945
118485
  return;
117946
118486
  }
118487
+ const expectedSessionId = parseAudienceNonce();
117947
118488
  let channel;
117948
118489
  try {
117949
118490
  channel = new BroadcastChannel(PRESENTER_CHANNEL_NAME);
@@ -117955,6 +118496,9 @@ function useAudienceMode(input) {
117955
118496
  if (!data || data.origin !== PRESENTER_MSG_ORIGIN) {
117956
118497
  return;
117957
118498
  }
118499
+ if (expectedSessionId && data.sessionId !== expectedSessionId) {
118500
+ return;
118501
+ }
117958
118502
  if (data.type === "presenter-slide-change") {
117959
118503
  onSetActiveSlideIndex(data.slideIndex);
117960
118504
  }
@@ -118888,6 +119432,12 @@ function useTouchGestures(input) {
118888
119432
  callbacksRef.current = callbacks;
118889
119433
  const scaleRef = React10.useRef(currentScale);
118890
119434
  scaleRef.current = currentScale;
119435
+ const [targetVersion, setTargetVersion] = React10.useState(0);
119436
+ const lastTargetRef = React10.useRef(null);
119437
+ if (targetRef.current !== lastTargetRef.current) {
119438
+ lastTargetRef.current = targetRef.current;
119439
+ queueMicrotask(() => setTargetVersion((v) => v + 1));
119440
+ }
118891
119441
  React10.useEffect(() => {
118892
119442
  const el = targetRef.current;
118893
119443
  if (!el || !enabled) {
@@ -118976,7 +119526,7 @@ function useTouchGestures(input) {
118976
119526
  el.removeEventListener("touchcancel", handleTouchCancel);
118977
119527
  cancelLongPress();
118978
119528
  };
118979
- }, [targetRef, enabled]);
119529
+ }, [targetRef, enabled, targetVersion]);
118980
119530
  }
118981
119531
 
118982
119532
  // src/viewer/utils/dom-helpers.ts
@@ -118997,11 +119547,31 @@ function safeConfirm(message) {
118997
119547
  return false;
118998
119548
  }
118999
119549
  }
119550
+ function sanitizeDownloadFilename(input) {
119551
+ if (typeof input !== "string" || input.trim().length === 0) {
119552
+ return "presentation.pptx";
119553
+ }
119554
+ let cleaned = input.replace(/[\x00-\x1f\x7f"\\/:*?<>|]/g, "_").replace(/\.\./g, "__").replace(/^\.+/, "").trim();
119555
+ if (cleaned.length === 0) {
119556
+ return "presentation.pptx";
119557
+ }
119558
+ if (cleaned.length > 200) {
119559
+ const dot = cleaned.lastIndexOf(".");
119560
+ if (dot > 0 && cleaned.length - dot <= 16) {
119561
+ const ext = cleaned.slice(dot);
119562
+ cleaned = cleaned.slice(0, 200 - ext.length) + ext;
119563
+ } else {
119564
+ cleaned = cleaned.slice(0, 200);
119565
+ }
119566
+ }
119567
+ return cleaned;
119568
+ }
119000
119569
  function downloadBlob(blob, filename) {
119570
+ const safeName = sanitizeDownloadFilename(filename);
119001
119571
  const url = URL.createObjectURL(blob);
119002
119572
  const a2 = document.createElement("a");
119003
119573
  a2.href = url;
119004
- a2.download = filename;
119574
+ a2.download = safeName;
119005
119575
  document.body.appendChild(a2);
119006
119576
  a2.click();
119007
119577
  setTimeout(() => {
@@ -119432,27 +120002,82 @@ function openAutosaveDb2() {
119432
120002
  req.onerror = () => reject(req.error);
119433
120003
  });
119434
120004
  }
119435
- async function saveToIndexedDb(filePath, data) {
120005
+ async function deleteOldestAutosaveEntry() {
119436
120006
  const db = await openAutosaveDb2();
119437
- return new Promise((resolve2, reject) => {
119438
- const tx = db.transaction(STORE_NAME3, "readwrite");
119439
- const store = tx.objectStore(STORE_NAME3);
119440
- store.put({
119441
- key: filePath,
119442
- data,
119443
- timestamp: Date.now(),
119444
- size: data.byteLength
119445
- });
119446
- tx.oncomplete = () => {
119447
- db.close();
119448
- resolve2(true);
119449
- };
119450
- tx.onerror = () => {
119451
- db.close();
119452
- reject(tx.error);
119453
- };
120007
+ return new Promise((resolve2) => {
120008
+ try {
120009
+ const tx = db.transaction(STORE_NAME3, "readwrite");
120010
+ const store = tx.objectStore(STORE_NAME3);
120011
+ let oldestKey = null;
120012
+ let oldestTimestamp = Infinity;
120013
+ const cursorReq = store.openCursor();
120014
+ cursorReq.onsuccess = () => {
120015
+ const cursor = cursorReq.result;
120016
+ if (cursor) {
120017
+ const value = cursor.value;
120018
+ if (typeof value.timestamp === "number" && value.timestamp < oldestTimestamp) {
120019
+ oldestTimestamp = value.timestamp;
120020
+ oldestKey = cursor.primaryKey;
120021
+ }
120022
+ cursor.continue();
120023
+ } else if (oldestKey !== null) {
120024
+ store.delete(oldestKey);
120025
+ }
120026
+ };
120027
+ tx.oncomplete = () => {
120028
+ db.close();
120029
+ resolve2(oldestKey !== null);
120030
+ };
120031
+ tx.onerror = () => {
120032
+ db.close();
120033
+ resolve2(false);
120034
+ };
120035
+ } catch {
120036
+ try {
120037
+ db.close();
120038
+ } catch {
120039
+ }
120040
+ resolve2(false);
120041
+ }
119454
120042
  });
119455
120043
  }
120044
+ function putAutosaveRecord(filePath, data) {
120045
+ return openAutosaveDb2().then(
120046
+ (db) => new Promise((resolve2, reject) => {
120047
+ const tx = db.transaction(STORE_NAME3, "readwrite");
120048
+ const store = tx.objectStore(STORE_NAME3);
120049
+ store.put({
120050
+ key: filePath,
120051
+ data,
120052
+ timestamp: Date.now(),
120053
+ size: data.byteLength
120054
+ });
120055
+ tx.oncomplete = () => {
120056
+ db.close();
120057
+ resolve2(true);
120058
+ };
120059
+ tx.onerror = () => {
120060
+ db.close();
120061
+ reject(tx.error);
120062
+ };
120063
+ })
120064
+ );
120065
+ }
120066
+ async function saveToIndexedDb(filePath, data) {
120067
+ try {
120068
+ return await putAutosaveRecord(filePath, data);
120069
+ } catch (err) {
120070
+ const errName = err instanceof Error || err instanceof DOMException ? err.name : "";
120071
+ if (errName !== "QuotaExceededError") {
120072
+ throw err;
120073
+ }
120074
+ const deleted = await deleteOldestAutosaveEntry();
120075
+ if (!deleted) {
120076
+ throw err;
120077
+ }
120078
+ return putAutosaveRecord(filePath, data);
120079
+ }
120080
+ }
119456
120081
  function useAutosave(input) {
119457
120082
  const {
119458
120083
  isDirty,
@@ -119569,6 +120194,25 @@ function collectReferencedFontFamilies(slides) {
119569
120194
  }
119570
120195
  return families;
119571
120196
  }
120197
+ var FONT_NAME_UNSAFE_CHARS = /["\\\n\r;}<>]/;
120198
+ var FONT_FORMAT_ALLOWED = /* @__PURE__ */ new Set([
120199
+ "truetype",
120200
+ "opentype",
120201
+ "woff",
120202
+ "woff2",
120203
+ "svg",
120204
+ "embedded-opentype"
120205
+ ]);
120206
+ var FONT_DATA_URL_PATTERN = /^data:font\/[a-z0-9+.-]+(?:;charset=[a-z0-9-]+)?;base64,[A-Za-z0-9+/=]+$/i;
120207
+ function isFontDataUrlSafe(url) {
120208
+ if (typeof url !== "string" || url.length === 0) {
120209
+ return false;
120210
+ }
120211
+ if (url.startsWith("blob:")) {
120212
+ return true;
120213
+ }
120214
+ return FONT_DATA_URL_PATTERN.test(url);
120215
+ }
119572
120216
  function useFontInjection({ embeddedFonts, slides }) {
119573
120217
  React10.useEffect(() => {
119574
120218
  if (!embeddedFonts.length) {
@@ -119576,17 +120220,28 @@ function useFontInjection({ embeddedFonts, slides }) {
119576
120220
  }
119577
120221
  const styleEl = document.createElement("style");
119578
120222
  styleEl.id = EMBEDDED_FONTS_STYLE_ID;
119579
- const cssRules = embeddedFonts.map((font) => {
120223
+ const cssRules = embeddedFonts.flatMap((font) => {
120224
+ if (typeof font.name !== "string" || font.name.length === 0 || FONT_NAME_UNSAFE_CHARS.test(font.name)) {
120225
+ return [];
120226
+ }
120227
+ if (!isFontDataUrlSafe(font.dataUrl)) {
120228
+ return [];
120229
+ }
120230
+ const fontFormat = font.format ?? "truetype";
120231
+ if (!FONT_FORMAT_ALLOWED.has(fontFormat)) {
120232
+ return [];
120233
+ }
119580
120234
  const fontWeight = font.bold ? "700" : "400";
119581
120235
  const fontStyleCss = font.italic ? "italic" : "normal";
119582
- const fontFormat = font.format ?? "truetype";
119583
- return `@font-face {
120236
+ return [
120237
+ `@font-face {
119584
120238
  font-family: "${font.name}";
119585
120239
  src: url("${font.dataUrl}") format("${fontFormat}");
119586
120240
  font-weight: ${fontWeight};
119587
120241
  font-style: ${fontStyleCss};
119588
120242
  font-display: swap;
119589
- }`;
120243
+ }`
120244
+ ];
119590
120245
  }).join("\n");
119591
120246
  styleEl.textContent = cssRules;
119592
120247
  document.head.appendChild(styleEl);
@@ -119615,7 +120270,7 @@ function useFontInjection({ embeddedFonts, slides }) {
119615
120270
  const linkEl = document.createElement("link");
119616
120271
  linkEl.id = GOOGLE_FONTS_LINK_ID;
119617
120272
  linkEl.rel = "stylesheet";
119618
- linkEl.href = `https://fonts.googleapis.com/css2?${googleFamilies.map((f) => `family=${GOOGLE_FONTS_AVAILABLE[f]}`).join("&")}&display=swap`;
120273
+ linkEl.href = `https://fonts.googleapis.com/css2?${googleFamilies.map((f) => `family=${encodeURIComponent(GOOGLE_FONTS_AVAILABLE[f])}`).join("&")}&display=swap`;
119619
120274
  document.head.appendChild(linkEl);
119620
120275
  return () => {
119621
120276
  const existing = document.getElementById(GOOGLE_FONTS_LINK_ID);
@@ -119631,13 +120286,18 @@ function useFontInjection({ embeddedFonts, slides }) {
119631
120286
  }
119632
120287
  const styleEl = document.createElement("style");
119633
120288
  styleEl.id = SYMBOL_FONTS_STYLE_ID;
119634
- const rules = neededSymbolFonts.map(
119635
- (font) => `@font-face {
120289
+ const rules = neededSymbolFonts.flatMap((font) => {
120290
+ if (typeof font !== "string" || FONT_NAME_UNSAFE_CHARS.test(font)) {
120291
+ return [];
120292
+ }
120293
+ return [
120294
+ `@font-face {
119636
120295
  font-family: "${font}";
119637
120296
  src: local("${font}"), local("${font} Regular");
119638
120297
  font-display: swap;
119639
120298
  }`
119640
- ).join("\n");
120299
+ ];
120300
+ }).join("\n");
119641
120301
  styleEl.textContent = rules;
119642
120302
  document.head.appendChild(styleEl);
119643
120303
  return () => {
@@ -119780,16 +120440,17 @@ function useLoadContent({
119780
120440
  `[pptx] Large file detected (${fileSizeMB.toFixed(1)} MB). Loading may use significant memory.`
119781
120441
  );
119782
120442
  }
119783
- if (handlerRef.current) {
119784
- handlerRef.current.dispose();
119785
- handlerRef.current = null;
119786
- }
120443
+ const previousHandler = handlerRef.current;
119787
120444
  const handler = new pptxViewerCore.PptxHandler();
119788
120445
  const parsed = await handler.load(buffer);
119789
120446
  if (cancelled || token !== renderTokenRef.current) {
119790
120447
  handler.dispose();
119791
120448
  return;
119792
120449
  }
120450
+ if (previousHandler) {
120451
+ previousHandler.dispose();
120452
+ }
120453
+ handlerRef.current = null;
119793
120454
  const mediaElements = [];
119794
120455
  for (const slide of parsed.slides) {
119795
120456
  collectMediaElements(slide.elements, mediaElements);
@@ -119834,6 +120495,7 @@ function useLoadContent({
119834
120495
  })
119835
120496
  );
119836
120497
  const { paths: imagePaths, refs: imageRefs } = collectImagePaths(parsed.slides);
120498
+ let nextSlides = parsed.slides;
119837
120499
  if (imagePaths.size > 0) {
119838
120500
  const resolvedMap = /* @__PURE__ */ new Map();
119839
120501
  await Promise.all(
@@ -119847,15 +120509,47 @@ function useLoadContent({
119847
120509
  }
119848
120510
  })
119849
120511
  );
120512
+ const elementPatches = /* @__PURE__ */ new Map();
119850
120513
  for (const ref of imageRefs) {
119851
120514
  const url = resolvedMap.get(ref.path);
119852
- if (url) {
119853
- ref.element[ref.field] = url;
120515
+ if (!url) {
120516
+ continue;
119854
120517
  }
120518
+ const id2 = ref.element.id;
120519
+ const existing = elementPatches.get(id2) ?? {};
120520
+ existing[ref.field] = url;
120521
+ elementPatches.set(id2, existing);
120522
+ }
120523
+ if (elementPatches.size > 0) {
120524
+ const patchElements = (elements) => {
120525
+ let mutated = false;
120526
+ const next = elements.map((el) => {
120527
+ let updated = el;
120528
+ const patch = elementPatches.get(el.id);
120529
+ if (patch) {
120530
+ updated = { ...el, ...patch };
120531
+ }
120532
+ if (updated.type === "group" && updated.children?.length) {
120533
+ const newChildren = patchElements(updated.children);
120534
+ if (newChildren !== updated.children) {
120535
+ updated = { ...updated, children: newChildren };
120536
+ }
120537
+ }
120538
+ if (updated !== el) {
120539
+ mutated = true;
120540
+ }
120541
+ return updated;
120542
+ });
120543
+ return mutated ? next : elements;
120544
+ };
120545
+ nextSlides = parsed.slides.map((s) => {
120546
+ const newElements = patchElements(s.elements);
120547
+ return newElements === s.elements ? s : { ...s, elements: newElements };
120548
+ });
119855
120549
  }
119856
120550
  }
119857
120551
  handlerRef.current = handler;
119858
- setSlides(parsed.slides);
120552
+ setSlides(nextSlides);
119859
120553
  setTemplateElementsBySlideId({});
119860
120554
  setCanvasSize({
119861
120555
  width: parsed.width ?? DEFAULT_CANVAS_WIDTH,
@@ -121029,7 +121723,19 @@ function injectFontFaces(svg, fontFaces) {
121029
121723
  if (!fontFaces.length) {
121030
121724
  return svg;
121031
121725
  }
121032
- const styleBlock = `<style type="text/css">${fontFaces.map((f) => f.css).join("\n")}</style>`;
121726
+ const safeFontFaces = fontFaces.filter((f) => {
121727
+ if (f.css.toLowerCase().includes("</style")) {
121728
+ console.warn(
121729
+ `[export-svg] Dropping @font-face entry for "${f.family}" containing "</style" \u2014 would break out of the <style> block.`
121730
+ );
121731
+ return false;
121732
+ }
121733
+ return true;
121734
+ });
121735
+ if (!safeFontFaces.length) {
121736
+ return svg;
121737
+ }
121738
+ const styleBlock = `<style type="text/css">${safeFontFaces.map((f) => f.css).join("\n")}</style>`;
121033
121739
  if (svg.includes("<defs>")) {
121034
121740
  return svg.replace("<defs>", `<defs>${styleBlock}`);
121035
121741
  }
@@ -121355,7 +122061,7 @@ function useExportHandlers(input) {
121355
122061
  activeSlideIndexForGuides,
121356
122062
  modalControls
121357
122063
  });
121358
- const handleExportPng = async () => {
122064
+ const handleExportPng = React10.useCallback(async () => {
121359
122065
  const stageEl = canvasStageRef.current;
121360
122066
  if (!stageEl) {
121361
122067
  return;
@@ -121367,8 +122073,8 @@ function useExportHandlers(input) {
121367
122073
  } catch (err) {
121368
122074
  console.error("[PowerPointViewer] PNG export failed:", err);
121369
122075
  }
121370
- };
121371
- const handleExportPdf = async () => {
122076
+ }, [canvasStageRef, activeSlideIndex, activeSlide?.backgroundColor]);
122077
+ const handleExportPdf = React10.useCallback(async () => {
121372
122078
  if (!canvasStageRef.current) {
121373
122079
  return;
121374
122080
  }
@@ -121409,8 +122115,8 @@ function useExportHandlers(input) {
121409
122115
  exportAbortRef.current = null;
121410
122116
  setExportModalOpen(false);
121411
122117
  }
121412
- };
121413
- const handleExportNotesPdf = async () => {
122118
+ }, [canvasStageRef, slides.length, setActiveSlideIndex, activeSlideIndex]);
122119
+ const handleExportNotesPdf = React10.useCallback(async () => {
121414
122120
  if (!canvasStageRef.current) {
121415
122121
  return;
121416
122122
  }
@@ -121453,8 +122159,8 @@ function useExportHandlers(input) {
121453
122159
  exportAbortRef.current = null;
121454
122160
  setExportModalOpen(false);
121455
122161
  }
121456
- };
121457
- const handleCopySlideAsImage = async () => {
122162
+ }, [canvasStageRef, slides, setActiveSlideIndex, activeSlideIndex]);
122163
+ const handleCopySlideAsImage = React10.useCallback(async () => {
121458
122164
  const stageEl = canvasStageRef.current;
121459
122165
  if (!stageEl) {
121460
122166
  return;
@@ -121466,8 +122172,8 @@ function useExportHandlers(input) {
121466
122172
  } catch (err) {
121467
122173
  console.error("[PowerPointViewer] Copy slide as image failed:", err);
121468
122174
  }
121469
- };
121470
- const handleExportVideo = async () => {
122175
+ }, [canvasStageRef, activeSlide?.backgroundColor]);
122176
+ const handleExportVideo = React10.useCallback(async () => {
121471
122177
  if (!canvasStageRef.current) {
121472
122178
  return;
121473
122179
  }
@@ -121509,8 +122215,8 @@ function useExportHandlers(input) {
121509
122215
  exportAbortRef.current = null;
121510
122216
  setExportModalOpen(false);
121511
122217
  }
121512
- };
121513
- const handleExportGif = async () => {
122218
+ }, [canvasStageRef, slides.length, setActiveSlideIndex, activeSlideIndex]);
122219
+ const handleExportGif = React10.useCallback(async () => {
121514
122220
  if (!canvasStageRef.current) {
121515
122221
  return;
121516
122222
  }
@@ -121548,7 +122254,7 @@ function useExportHandlers(input) {
121548
122254
  exportAbortRef.current = null;
121549
122255
  setExportModalOpen(false);
121550
122256
  }
121551
- };
122257
+ }, [canvasStageRef, slides.length, setActiveSlideIndex, activeSlideIndex]);
121552
122258
  const handleCancelExport = React10.useCallback(() => {
121553
122259
  exportAbortRef.current?.abort();
121554
122260
  exportAbortRef.current = null;
@@ -121574,6 +122280,15 @@ function useExportHandlers(input) {
121574
122280
  exportStatusMessage
121575
122281
  };
121576
122282
  }
122283
+ function escapeHtmlAttr(value) {
122284
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
122285
+ }
122286
+ function safeDataImageSrc(src) {
122287
+ if (typeof src !== "string" || !src.startsWith("data:image/")) {
122288
+ return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgAAIAAAUAAen63NgAAAAASUVORK5CYII=";
122289
+ }
122290
+ return escapeHtmlAttr(src);
122291
+ }
121577
122292
  function openPrintWindow(title, bodyHtml, orientation, colorFilter, frameSlides) {
121578
122293
  const printWindow = window.open("", "_blank", "noopener,noreferrer");
121579
122294
  if (!printWindow) {
@@ -121756,7 +122471,7 @@ function usePrintHandlers(input) {
121756
122471
  const slideImages = slideIndices.map((idx) => allImages[idx]).filter(Boolean);
121757
122472
  if (settings.printWhat === "slides") {
121758
122473
  const bodyHtml = slideImages.map(
121759
- (img, i3) => `<section class="page slide-page"><img class="slide-img" src="${img}" alt="Slide ${slideIndices[i3] + 1}" /></section>`
122474
+ (img, i3) => `<section class="page slide-page"><img class="slide-img" src="${safeDataImageSrc(img)}" alt="Slide ${slideIndices[i3] + 1}" /></section>`
121760
122475
  ).join("");
121761
122476
  openPrintWindow(
121762
122477
  "Slides",
@@ -121772,7 +122487,7 @@ function usePrintHandlers(input) {
121772
122487
  const idx = slideIndices[i3];
121773
122488
  const notes = slides[idx]?.notes?.trim() || "";
121774
122489
  return `<section class="page notes-page">
121775
- <img class="notes-slide" src="${img}" alt="Slide ${idx + 1}" />
122490
+ <img class="notes-slide" src="${safeDataImageSrc(img)}" alt="Slide ${idx + 1}" />
121776
122491
  <div class="notes-text">${escapeHtml2(notes)}</div>
121777
122492
  </section>`;
121778
122493
  }).join("");
@@ -121804,14 +122519,14 @@ function usePrintHandlers(input) {
121804
122519
  if (isThreePerPage) {
121805
122520
  const rows = Array.from({ length: spp }, (_, cellIndex) => {
121806
122521
  const img = pageImgs[cellIndex];
121807
- const slideCell = img ? `<div class="handout-cell"><img src="${img}" alt="Slide ${slideIndices[i3 + cellIndex] + 1}" /></div>` : `<div class="handout-cell"></div>`;
122522
+ const slideCell = img ? `<div class="handout-cell"><img src="${safeDataImageSrc(img)}" alt="Slide ${slideIndices[i3 + cellIndex] + 1}" /></div>` : `<div class="handout-cell"></div>`;
121808
122523
  return `<div class="handout-row-3">${slideCell}${buildNoteLines()}</div>`;
121809
122524
  }).join("");
121810
122525
  pages.push(`<section class="page"><div class="handout-grid-3">${rows}</div></section>`);
121811
122526
  } else {
121812
122527
  const cells = Array.from({ length: spp }, (_, cellIndex) => {
121813
122528
  const img = pageImgs[cellIndex];
121814
- return img ? `<div class="handout-cell"><img src="${img}" alt="Slide ${slideIndices[i3 + cellIndex] + 1}" /></div>` : `<div class="handout-cell"></div>`;
122529
+ return img ? `<div class="handout-cell"><img src="${safeDataImageSrc(img)}" alt="Slide ${slideIndices[i3 + cellIndex] + 1}" /></div>` : `<div class="handout-cell"></div>`;
121815
122530
  }).join("");
121816
122531
  pages.push(
121817
122532
  `<section class="page"><div class="handout-grid" style="grid-template-columns: repeat(${grid.columns}, minmax(0, 1fr)); grid-template-rows: repeat(${grid.rows}, minmax(0, 1fr));">${cells}</div></section>`
@@ -124287,7 +125002,7 @@ scheduler/cjs/scheduler.development.js:
124287
125002
  * LICENSE file in the root directory of this source tree.
124288
125003
  *)
124289
125004
 
124290
- @react-three/fiber/dist/events-760a1017.esm.js:
125005
+ @react-three/fiber/dist/events-b389eeca.esm.js:
124291
125006
  (**
124292
125007
  * @license React
124293
125008
  * react-reconciler-constants.production.js