import { jsx as h, jsxs as k, Fragment as B } from "react/jsx-runtime";
import { useThree as A, useFrame as S, extend as P } from "@react-three/fiber";
import { EffectComposerContext as j } from "@react-three/postprocessing";
import { RenderPass as I } from "postprocessing";
import { useRef as C, useMemo as x, useEffect as T, useImperativeHandle as _, createContext as O, useContext as E, useState as N, version as U, useCallback as G } from "react";
import { Matrix4 as R, Vector3 as b, Texture as q, Object3D as z } from "three";
import { Ellipsoid as H, DEFAULT_STBN_URL as Q, STBNLoader as V, ArrayBufferLoader as W } from "@takram/three-geospatial";
import { c as J, P as K, l as X, q as Y, n as Z, h as $, A as ee, L as te, t as re, d as ne, S as oe, s as se, u as ie, e as ae, f as ce, g as ue, v as le } from "./shared.js";
import { ScreenQuad as fe } from "@react-three/drei";
import { a as me } from "./shared2.js";
const D = /* @__PURE__ */ O({}), ve = ({
  ref: r,
  textures: e,
  ellipsoid: s = H.WGS84,
  correctAltitude: o = !0,
  ground: t = !0,
  date: i,
  children: a
}) => {
  const l = C({
    sunDirection: new b(),
    moonDirection: new b(),
    worldToECEFMatrix: new R(),
    inertialToECEFMatrix: new R(),
    overlay: null,
    shadow: null,
    shadowLength: null,
    lightingMask: null
  }), c = A(({ gl: p }) => p), u = x(
    () => typeof e == "string" ? new J().setType(c).load(e) : void 0,
    [e, c]
  );
  T(() => {
    if (u != null)
      return () => {
        for (const p of Object.values(u))
          p?.dispose();
      };
  }, [u]);
  const m = x(
    () => e == null ? new K(c) : void 0,
    [e, c]
  );
  T(() => {
    if (m != null)
      return m.update().catch((p) => {
        console.error(p);
      }), () => {
        m.dispose();
      };
  }, [m]);
  const f = m?.textures ?? (typeof e == "string" ? u : e), g = x(
    () => ({
      textures: f,
      ellipsoid: s,
      correctAltitude: o,
      ground: t,
      transientStates: l.current
    }),
    [f, s, o, t]
  ), n = x(() => {
    const { sunDirection: p, moonDirection: w, inertialToECEFMatrix: y } = l.current;
    return (M) => {
      X(M, y), Y(M, p).applyMatrix4(y), Z(M, w).applyMatrix4(
        y
      );
    };
  }, []), d = i != null && !isNaN(+i) ? +i : void 0;
  return T(() => {
    d != null && n(d);
  }, [d, n]), _(
    r,
    () => ({
      ...l.current,
      textures: f,
      updateByDate: n
    }),
    [f, n]
  ), /* @__PURE__ */ h(D.Provider, { value: g, children: a });
};
function F(r) {
  const {
    irradianceTexture: e,
    scatteringTexture: s,
    transmittanceTexture: o,
    singleMieScatteringTexture: t,
    higherOrderScatteringTexture: i,
    ellipsoid: a,
    correctAltitude: l,
    sunDirection: c,
    sunAngularRadius: u,
    ground: m,
    renderTargetCount: f,
    ...g
  } = r;
  return [
    {
      irradianceTexture: e,
      scatteringTexture: s,
      transmittanceTexture: o,
      singleMieScatteringTexture: t,
      higherOrderScatteringTexture: i,
      ellipsoid: a,
      correctAltitude: l,
      sunDirection: c,
      sunAngularRadius: u,
      ground: m,
      renderTargetCount: f
    },
    g
  ];
}
function de(r) {
  const e = x(
    () => typeof r == "string" ? new V().load(r) : void 0,
    [r]
  );
  return T(() => {
    if (e != null)
      return () => {
        e.dispose();
      };
  }, [e]), (typeof r == "string" ? e : r) ?? null;
}
const Le = ({
  ref: r,
  stbnTexture: e = Q,
  ...s
}) => {
  const { textures: o, transientStates: t, ...i } = E(D), [a, { blendFunction: l, ...c }] = F({
    ...$,
    ...i,
    ...o,
    ...s
  }), u = E(j), { normalPass: m, camera: f } = u, g = "geometryPass" in u && u.geometryPass instanceof I && "geometryTexture" in u.geometryPass && u.geometryPass.geometryTexture instanceof q ? u.geometryPass.geometryTexture : void 0, n = x(
    () => new ee(void 0, { blendFunction: l }),
    [l]
  );
  T(() => () => {
    n.dispose();
  }, [n]);
  const [d, p] = N(!1);
  S(() => {
    t != null && (n.sunDirection.copy(t.sunDirection), n.moonDirection.copy(t.moonDirection), n.worldToECEFMatrix.copy(t.worldToECEFMatrix), n.overlay = t.overlay, n.shadow = t.shadow, n.shadowLength = t.shadowLength, n.lightingMask = t.lightingMask, !d && n.shadow != null && p(!0));
  });
  const w = de(
    d ? e : void 0
  );
  return /* @__PURE__ */ h(
    "primitive",
    {
      ref: r,
      object: n,
      mainCamera: f,
      normalBuffer: g ?? m?.texture ?? null,
      ...a,
      ...c,
      stbnTexture: w,
      octEncodedNormal: g != null
    }
  );
};
function pe(r) {
  return (e) => {
    for (const s of r) L(s, e);
  };
}
function ge(r) {
  return (e) => {
    const s = [];
    for (const o of r) {
      const t = L(o, e), i = typeof t == "function";
      s.push(i ? t : () => L(o, null));
    }
    return () => {
      for (const o of s) o();
    };
  };
}
function L(r, e) {
  if (typeof r == "function")
    return r(e);
  r && (r.current = e);
}
var v = parseInt(U.split(".")[0], 10) >= 19 ? ge : pe;
const Pe = ({
  ref: r,
  ...e
}) => {
  const { transientStates: s } = E(D), o = G(
    (a) => {
      if (a != null && s != null)
        return s.lightingMask = {
          map: a.texture,
          channel: "r"
        }, () => {
          s.lightingMask = null;
        };
    },
    [s]
  ), { scene: t, camera: i } = E(j);
  return P({ LightingMaskPass: te }), /* @__PURE__ */ h(
    "lightingMaskPass",
    {
      ref: v([o, r]),
      ...e,
      args: [t, i]
    }
  );
}, Fe = ({ ref: r, ...e }) => {
  const { textures: s, transientStates: o, ...t } = E(D), [
    i,
    {
      sun: a,
      moon: l,
      moonDirection: c,
      moonAngularRadius: u,
      lunarRadianceScale: m,
      groundAlbedo: f,
      ...g
    }
  ] = F({
    ...re,
    ...t,
    ...s,
    ...e
  }), n = x(() => new ne(), []);
  return T(() => () => {
    n.dispose();
  }, [n]), S(() => {
    o != null && (n.sunDirection.copy(o.sunDirection), n.moonDirection.copy(o.moonDirection), n.worldToECEFMatrix.copy(o.worldToECEFMatrix), n.shadowLength = o.shadowLength);
  }), /* @__PURE__ */ h(fe, { ...g, ref: r, children: /* @__PURE__ */ h(
    "primitive",
    {
      object: n,
      ...i,
      sun: a,
      moon: l,
      moonDirection: c,
      moonAngularRadius: u,
      lunarRadianceScale: m,
      groundAlbedo: f
    }
  ) });
}, Re = ({
  ref: r,
  ...e
}) => {
  const { textures: s, transientStates: o, ...t } = E(D), i = C(null);
  return S(() => {
    const a = i.current;
    a != null && o != null && (a.sunDirection.copy(o.sunDirection), a.worldToECEFMatrix.copy(o.worldToECEFMatrix), a.update());
  }), P({ SkyLightProbe: oe }), /* @__PURE__ */ h(
    "skyLightProbe",
    {
      ref: v([i, r]),
      ...se,
      ...t,
      ...s,
      ...e
    }
  );
}, be = ({
  ref: r,
  data: e = me,
  ...s
}) => {
  const { textures: o, transientStates: t, ...i } = E(D), [
    a,
    { pointSize: l, intensity: c, background: u, ...m }
  ] = F({
    ...ie,
    ...i,
    ...o,
    ...s
  }), [f, g] = N(
    typeof e != "string" ? e : void 0
  );
  T(() => {
    if (typeof e == "string") {
      const y = new W();
      (async () => {
        g(await y.loadAsync(e));
      })().catch((M) => {
        console.error(M);
      });
    } else
      g(e);
  }, [e]);
  const n = x(
    () => f != null ? new ae(f) : void 0,
    [f]
  );
  T(() => () => {
    n?.dispose();
  }, [n]);
  const d = x(() => new ce(), []);
  T(() => () => {
    d.dispose();
  }, [d]);
  const p = C(null);
  S(({ camera: y }) => {
    t != null && y.isPerspectiveCamera === !0 && (d.sunDirection.copy(t.sunDirection), p.current?.setRotationFromMatrix(t.inertialToECEFMatrix), d.worldToECEFMatrix.copy(t.worldToECEFMatrix));
  });
  const w = A(({ camera: y }) => y);
  return n == null || w.isPerspectiveCamera !== !0 ? null : /* @__PURE__ */ k(
    "points",
    {
      ref: v([p, r]),
      frustumCulled: !1,
      ...m,
      children: [
        /* @__PURE__ */ h("primitive", { object: n }),
        /* @__PURE__ */ h(
          "primitive",
          {
            object: d,
            ...a,
            pointSize: l,
            intensity: c,
            background: u
          }
        )
      ]
    }
  );
}, ke = ({
  ref: r,
  position: e,
  ...s
}) => {
  const { textures: o, transientStates: t, ...i } = E(D), a = C(null);
  S(() => {
    const c = a.current;
    c != null && t != null && (c.sunDirection.copy(t.sunDirection), c.worldToECEFMatrix.copy(t.worldToECEFMatrix), c.update());
  });
  const l = x(() => new z(), []);
  return P({ SunDirectionalLight: ue }), /* @__PURE__ */ k(B, { children: [
    /* @__PURE__ */ h(
      "sunDirectionalLight",
      {
        ref: v([a, r]),
        ...le,
        ...i,
        ...o,
        ...s,
        target: l
      }
    ),
    /* @__PURE__ */ h("primitive", { object: l, position: e })
  ] });
};
export {
  Le as AerialPerspective,
  ve as Atmosphere,
  D as AtmosphereContext,
  Pe as LightingMask,
  Fe as Sky,
  Re as SkyLight,
  be as Stars,
  ke as SunLight,
  F as separateProps
};
//# sourceMappingURL=r3f.js.map
