@react-three/fiber 10.0.0-canary.aecbafb → 10.0.0-canary.c3fa45d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -160,7 +160,7 @@ function useEnvironment({
160
160
  fiber.useLoader.clear(loader, multiFile ? [files] : files);
161
161
  }
162
162
  renderer.domElement.addEventListener("webglcontextlost", clearGainmapTexture, { once: true });
163
- }, [files, renderer.domElement]);
163
+ }, [extension, files, loader, multiFile, renderer.domElement]);
164
164
  const loaderResult = fiber.useLoader(
165
165
  loader,
166
166
  multiFile ? [files] : files,
@@ -360,7 +360,22 @@ function EnvironmentPortal({
360
360
  environmentIntensity,
361
361
  environmentRotation
362
362
  });
363
- }, [children, virtualScene, fbo.texture, scene, defaultScene, background, frames, gl]);
363
+ }, [
364
+ children,
365
+ virtualScene,
366
+ fbo.texture,
367
+ scene,
368
+ defaultScene,
369
+ background,
370
+ frames,
371
+ gl,
372
+ blur,
373
+ backgroundBlurriness,
374
+ backgroundIntensity,
375
+ backgroundRotation,
376
+ environmentIntensity,
377
+ environmentRotation
378
+ ]);
364
379
  let count = 1;
365
380
  fiber.useFrame(() => {
366
381
  if (frames === Infinity || count < frames) {
@@ -1287,7 +1302,7 @@ function createEvents(store) {
1287
1302
  }
1288
1303
  function processDeferredPointer(event, pointerId) {
1289
1304
  const state = store.getState();
1290
- const { onPointerMissed, onDragOverMissed, internal } = state;
1305
+ const { internal } = state;
1291
1306
  if (!state.events.enabled) return;
1292
1307
  const filter = filterPointerEvents;
1293
1308
  const hits = intersect(event, filter);
@@ -1522,6 +1537,7 @@ function createPointerEvents(store) {
1522
1537
  }
1523
1538
  },
1524
1539
  connect: (target) => {
1540
+ if (!target) return;
1525
1541
  const { set, events } = store.getState();
1526
1542
  events.disconnect?.();
1527
1543
  set((state) => ({ events: { ...state.events, connected: target } }));
@@ -1884,7 +1900,7 @@ function shouldRun(job, now) {
1884
1900
  const minInterval = 1e3 / job.fps;
1885
1901
  const lastRun = job.lastRun ?? 0;
1886
1902
  const elapsed = now - lastRun;
1887
- if (elapsed < minInterval) return false;
1903
+ if (elapsed < minInterval - 1) return false;
1888
1904
  if (job.drop) {
1889
1905
  job.lastRun = now;
1890
1906
  } else {
@@ -2911,14 +2927,16 @@ const createStore = (invalidate, advance) => {
2911
2927
  oldSize = size;
2912
2928
  oldDpr = viewport.dpr;
2913
2929
  updateCamera(camera, size);
2914
- if (canvasTarget) {
2930
+ if (internal.isSecondary && canvasTarget) {
2915
2931
  if (viewport.dpr > 0) canvasTarget.setPixelRatio(viewport.dpr);
2916
- const updateStyle = typeof HTMLCanvasElement !== "undefined" && canvasTarget.domElement instanceof HTMLCanvasElement;
2917
- canvasTarget.setSize(size.width, size.height, updateStyle);
2932
+ canvasTarget.setSize(size.width, size.height, false);
2918
2933
  } else {
2919
2934
  if (viewport.dpr > 0) actualRenderer.setPixelRatio(viewport.dpr);
2920
- const updateStyle = typeof HTMLCanvasElement !== "undefined" && actualRenderer.domElement instanceof HTMLCanvasElement;
2921
- actualRenderer.setSize(size.width, size.height, updateStyle);
2935
+ actualRenderer.setSize(size.width, size.height, false);
2936
+ if (canvasTarget) {
2937
+ if (viewport.dpr > 0) canvasTarget.setPixelRatio(viewport.dpr);
2938
+ canvasTarget.setSize(size.width, size.height, false);
2939
+ }
2922
2940
  }
2923
2941
  }
2924
2942
  if (camera !== oldCamera) {
@@ -15205,7 +15223,6 @@ function createRoot(canvas) {
15205
15223
  events,
15206
15224
  onCreated: onCreatedCallback,
15207
15225
  shadows = false,
15208
- textureColorSpace = webgpu.SRGBColorSpace,
15209
15226
  orthographic = false,
15210
15227
  frameloop = "always",
15211
15228
  dpr = [1, 2],
@@ -15220,6 +15237,7 @@ function createRoot(canvas) {
15220
15237
  _sizeProps,
15221
15238
  forceEven
15222
15239
  } = props;
15240
+ const textureColorSpace = is.obj(glConfig) && !is.fun(glConfig) && !isRenderer(glConfig) && glConfig.textureColorSpace || is.obj(rendererConfig) && !is.fun(rendererConfig) && !isRenderer(rendererConfig) && rendererConfig.textureColorSpace || webgpu.SRGBColorSpace;
15223
15241
  const state = store.getState();
15224
15242
  const defaultGLProps = {
15225
15243
  canvas,
@@ -15390,7 +15408,7 @@ function createRoot(canvas) {
15390
15408
  lastConfiguredProps.performance = performance;
15391
15409
  }
15392
15410
  if (!state.xr) {
15393
- const handleXRFrame = (timestamp, frame) => {
15411
+ const handleXRFrame = (timestamp, _frame) => {
15394
15412
  const state2 = store.getState();
15395
15413
  if (state2.frameloop === "never") return;
15396
15414
  advance(timestamp);
@@ -15426,15 +15444,22 @@ function createRoot(canvas) {
15426
15444
  const oldType = renderer.shadowMap.type;
15427
15445
  renderer.shadowMap.enabled = !!shadows;
15428
15446
  if (is.boo(shadows)) {
15429
- renderer.shadowMap.type = webgpu.PCFSoftShadowMap;
15447
+ renderer.shadowMap.type = webgpu.PCFShadowMap;
15430
15448
  } else if (is.str(shadows)) {
15449
+ if (shadows === "soft") {
15450
+ notifyDepreciated({
15451
+ heading: 'shadows="soft" is deprecated',
15452
+ body: "Three has depreciated soft and improved basic PCFShadows, we converted for you.",
15453
+ link: "https://github.com/mrdoob/three.js/wiki/Migration-Guide?utm_source=chatgpt.com#181--182"
15454
+ });
15455
+ }
15431
15456
  const types = {
15432
15457
  basic: webgpu.BasicShadowMap,
15433
15458
  percentage: webgpu.PCFShadowMap,
15434
- soft: webgpu.PCFSoftShadowMap,
15459
+ soft: webgpu.PCFShadowMap,
15435
15460
  variance: webgpu.VSMShadowMap
15436
15461
  };
15437
- renderer.shadowMap.type = types[shadows] ?? webgpu.PCFSoftShadowMap;
15462
+ renderer.shadowMap.type = types[shadows] ?? webgpu.PCFShadowMap;
15438
15463
  } else if (is.obj(shadows)) {
15439
15464
  Object.assign(renderer.shadowMap, shadows);
15440
15465
  }
@@ -15450,13 +15475,24 @@ function createRoot(canvas) {
15450
15475
  if (state.textureColorSpace !== textureColorSpace) state.set(() => ({ textureColorSpace }));
15451
15476
  lastConfiguredProps.textureColorSpace = textureColorSpace;
15452
15477
  }
15478
+ const r3fProps = ["textureColorSpace"];
15479
+ const constructorOnlyProps = ["samples", "antialias", "alpha", "canvas", "powerPreference"];
15480
+ const nonApplyProps = [...r3fProps, ...constructorOnlyProps];
15453
15481
  if (glConfig && !is.fun(glConfig) && !isRenderer(glConfig) && !is.equ(glConfig, renderer, shallowLoose)) {
15454
- applyProps(renderer, glConfig);
15482
+ const glProps = {};
15483
+ for (const key in glConfig) {
15484
+ if (!nonApplyProps.includes(key)) glProps[key] = glConfig[key];
15485
+ }
15486
+ applyProps(renderer, glProps);
15455
15487
  }
15456
15488
  if (rendererConfig && !is.fun(rendererConfig) && !isRenderer(rendererConfig) && state.renderer) {
15457
15489
  const currentRenderer = state.renderer;
15458
15490
  if (!is.equ(rendererConfig, currentRenderer, shallowLoose)) {
15459
- applyProps(currentRenderer, rendererConfig);
15491
+ const rendererProps = {};
15492
+ for (const key in rendererConfig) {
15493
+ if (!nonApplyProps.includes(key)) rendererProps[key] = rendererConfig[key];
15494
+ }
15495
+ applyProps(currentRenderer, rendererProps);
15460
15496
  }
15461
15497
  }
15462
15498
  const scheduler = getScheduler();
@@ -15770,8 +15806,18 @@ function CanvasImpl({
15770
15806
  forceEven,
15771
15807
  ...props
15772
15808
  }) {
15773
- const { primaryCanvas, scheduler, ...rendererConfig } = typeof rendererProp === "object" && rendererProp !== null && !("render" in rendererProp) && ("primaryCanvas" in rendererProp || "scheduler" in rendererProp) ? rendererProp : { primaryCanvas: void 0, scheduler: void 0 };
15774
- const renderer = Object.keys(rendererConfig).length > 0 ? rendererConfig : rendererProp;
15809
+ const isRendererConfig = typeof rendererProp === "object" && rendererProp !== null && !("render" in rendererProp) && ("primaryCanvas" in rendererProp || "scheduler" in rendererProp);
15810
+ let primaryCanvas;
15811
+ let scheduler;
15812
+ let renderer;
15813
+ if (isRendererConfig) {
15814
+ const { primaryCanvas: pc, scheduler: sc, ...rest } = rendererProp;
15815
+ primaryCanvas = pc;
15816
+ scheduler = sc;
15817
+ renderer = Object.keys(rest).length > 0 ? rest : rendererProp;
15818
+ } else {
15819
+ renderer = rendererProp;
15820
+ }
15775
15821
  React__namespace.useMemo(() => extend(THREE), []);
15776
15822
  const Bridge = useBridge();
15777
15823
  const backgroundProps = React__namespace.useMemo(() => {
@@ -15981,7 +16027,16 @@ function CanvasImpl({
15981
16027
  ...style
15982
16028
  },
15983
16029
  ...props,
15984
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, className: "r3f-canvas-container", style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ jsxRuntime.jsx("canvas", { ref: canvasRef, id, className: "r3f-canvas", style: { display: "block" }, children: fallback }) })
16030
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, className: "r3f-canvas-container", style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ jsxRuntime.jsx(
16031
+ "canvas",
16032
+ {
16033
+ ref: canvasRef,
16034
+ id,
16035
+ className: "r3f-canvas",
16036
+ style: { display: "block", width: "100%", height: "100%" },
16037
+ children: fallback
16038
+ }
16039
+ ) })
15985
16040
  }
15986
16041
  );
15987
16042
  }
package/dist/index.d.cts CHANGED
@@ -855,6 +855,20 @@ interface Renderer {
855
855
  render: (scene: THREE$1.Scene, camera: THREE$1.Camera) => any
856
856
  }
857
857
 
858
+ //* Color Management Config ==============================
859
+
860
+ /**
861
+ * Color management configuration shared by both WebGL and WebGPU renderers.
862
+ */
863
+ interface ColorManagementConfig {
864
+ /**
865
+ * Color space assigned to 8-bit input textures (color maps).
866
+ * Defaults to sRGB. Most textures are authored in sRGB.
867
+ * @default THREE.SRGBColorSpace
868
+ */
869
+ textureColorSpace?: THREE$1.ColorSpace
870
+ }
871
+
858
872
  //* WebGL Renderer Props ==============================
859
873
 
860
874
  type DefaultGLProps = Omit<THREE$1.WebGLRendererParameters, 'canvas'> & {
@@ -865,7 +879,7 @@ type GLProps =
865
879
  | Renderer
866
880
  | ((defaultProps: DefaultGLProps) => Renderer)
867
881
  | ((defaultProps: DefaultGLProps) => Promise<Renderer>)
868
- | Partial<Properties<THREE$1.WebGLRenderer> | THREE$1.WebGLRendererParameters>
882
+ | (Partial<Properties<THREE$1.WebGLRenderer> | THREE$1.WebGLRendererParameters> & ColorManagementConfig)
869
883
 
870
884
  //* WebGPU Renderer Props ==============================
871
885
 
@@ -891,9 +905,9 @@ interface CanvasSchedulerConfig {
891
905
  }
892
906
 
893
907
  /**
894
- * Extended renderer configuration for multi-canvas support.
908
+ * Extended renderer configuration for multi-canvas support and color management.
895
909
  */
896
- interface RendererConfigExtended {
910
+ interface RendererConfigExtended extends ColorManagementConfig {
897
911
  /** Share renderer from another canvas (WebGPU only) */
898
912
  primaryCanvas?: string
899
913
  /** Canvas-level scheduler options */
@@ -958,8 +972,6 @@ interface RenderProps<TCanvas extends HTMLCanvasElement | OffscreenCanvas$1> {
958
972
  * @see https://threejs.org/docs/#api/en/renderers/WebGLRenderer.shadowMap
959
973
  */
960
974
  shadows?: boolean | 'basic' | 'percentage' | 'soft' | 'variance' | Partial<THREE$1.WebGLShadowMap>
961
- /** Color space assigned to 8-bit input textures (color maps). Defaults to sRGB. Most textures are authored in sRGB. */
962
- textureColorSpace?: THREE$1.ColorSpace
963
975
  /** Creates an orthographic camera */
964
976
  orthographic?: boolean
965
977
  /**
@@ -1212,7 +1224,7 @@ interface CanvasProps
1212
1224
  */
1213
1225
  resize?: Options
1214
1226
  /** The target where events are being subscribed to, default: the div that wraps canvas */
1215
- eventSource?: HTMLElement | React$1.RefObject<HTMLElement>
1227
+ eventSource?: HTMLElement | React$1.RefObject<HTMLElement | null>
1216
1228
  /** The event prefix that is cast into canvas pointer x/y events, default: "offset" */
1217
1229
  eventPrefix?: 'offset' | 'client' | 'page' | 'layer' | 'screen'
1218
1230
  /** Enable/disable automatic HMR refresh for TSL nodes and uniforms, default: true in dev */
@@ -4367,4 +4379,4 @@ declare function isOnce(value: unknown): value is {
4367
4379
  declare function Canvas(props: CanvasProps): react_jsx_runtime.JSX.Element;
4368
4380
 
4369
4381
  export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Scheduler, Texture, _roots, act, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getScheduler, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
4370
- export type { Act, AddPhaseOptions, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameControls, FrameNextCallback, FrameNextControls, FrameNextState, FrameState, FrameTimingState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootOptions, RootState, RootStore, SchedulerApi, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureEntry, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseFrameNextOptions, UseFrameOptions, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
4382
+ export type { Act, AddPhaseOptions, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ColorManagementConfig, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameControls, FrameNextCallback, FrameNextControls, FrameNextState, FrameState, FrameTimingState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootOptions, RootState, RootStore, SchedulerApi, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureEntry, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseFrameNextOptions, UseFrameOptions, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
package/dist/index.d.mts CHANGED
@@ -855,6 +855,20 @@ interface Renderer {
855
855
  render: (scene: THREE$1.Scene, camera: THREE$1.Camera) => any
856
856
  }
857
857
 
858
+ //* Color Management Config ==============================
859
+
860
+ /**
861
+ * Color management configuration shared by both WebGL and WebGPU renderers.
862
+ */
863
+ interface ColorManagementConfig {
864
+ /**
865
+ * Color space assigned to 8-bit input textures (color maps).
866
+ * Defaults to sRGB. Most textures are authored in sRGB.
867
+ * @default THREE.SRGBColorSpace
868
+ */
869
+ textureColorSpace?: THREE$1.ColorSpace
870
+ }
871
+
858
872
  //* WebGL Renderer Props ==============================
859
873
 
860
874
  type DefaultGLProps = Omit<THREE$1.WebGLRendererParameters, 'canvas'> & {
@@ -865,7 +879,7 @@ type GLProps =
865
879
  | Renderer
866
880
  | ((defaultProps: DefaultGLProps) => Renderer)
867
881
  | ((defaultProps: DefaultGLProps) => Promise<Renderer>)
868
- | Partial<Properties<THREE$1.WebGLRenderer> | THREE$1.WebGLRendererParameters>
882
+ | (Partial<Properties<THREE$1.WebGLRenderer> | THREE$1.WebGLRendererParameters> & ColorManagementConfig)
869
883
 
870
884
  //* WebGPU Renderer Props ==============================
871
885
 
@@ -891,9 +905,9 @@ interface CanvasSchedulerConfig {
891
905
  }
892
906
 
893
907
  /**
894
- * Extended renderer configuration for multi-canvas support.
908
+ * Extended renderer configuration for multi-canvas support and color management.
895
909
  */
896
- interface RendererConfigExtended {
910
+ interface RendererConfigExtended extends ColorManagementConfig {
897
911
  /** Share renderer from another canvas (WebGPU only) */
898
912
  primaryCanvas?: string
899
913
  /** Canvas-level scheduler options */
@@ -958,8 +972,6 @@ interface RenderProps<TCanvas extends HTMLCanvasElement | OffscreenCanvas$1> {
958
972
  * @see https://threejs.org/docs/#api/en/renderers/WebGLRenderer.shadowMap
959
973
  */
960
974
  shadows?: boolean | 'basic' | 'percentage' | 'soft' | 'variance' | Partial<THREE$1.WebGLShadowMap>
961
- /** Color space assigned to 8-bit input textures (color maps). Defaults to sRGB. Most textures are authored in sRGB. */
962
- textureColorSpace?: THREE$1.ColorSpace
963
975
  /** Creates an orthographic camera */
964
976
  orthographic?: boolean
965
977
  /**
@@ -1212,7 +1224,7 @@ interface CanvasProps
1212
1224
  */
1213
1225
  resize?: Options
1214
1226
  /** The target where events are being subscribed to, default: the div that wraps canvas */
1215
- eventSource?: HTMLElement | React$1.RefObject<HTMLElement>
1227
+ eventSource?: HTMLElement | React$1.RefObject<HTMLElement | null>
1216
1228
  /** The event prefix that is cast into canvas pointer x/y events, default: "offset" */
1217
1229
  eventPrefix?: 'offset' | 'client' | 'page' | 'layer' | 'screen'
1218
1230
  /** Enable/disable automatic HMR refresh for TSL nodes and uniforms, default: true in dev */
@@ -4367,4 +4379,4 @@ declare function isOnce(value: unknown): value is {
4367
4379
  declare function Canvas(props: CanvasProps): react_jsx_runtime.JSX.Element;
4368
4380
 
4369
4381
  export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Scheduler, Texture, _roots, act, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getScheduler, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
4370
- export type { Act, AddPhaseOptions, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameControls, FrameNextCallback, FrameNextControls, FrameNextState, FrameState, FrameTimingState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootOptions, RootState, RootStore, SchedulerApi, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureEntry, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseFrameNextOptions, UseFrameOptions, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
4382
+ export type { Act, AddPhaseOptions, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ColorManagementConfig, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameControls, FrameNextCallback, FrameNextControls, FrameNextState, FrameState, FrameTimingState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootOptions, RootState, RootStore, SchedulerApi, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureEntry, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseFrameNextOptions, UseFrameOptions, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
package/dist/index.d.ts CHANGED
@@ -855,6 +855,20 @@ interface Renderer {
855
855
  render: (scene: THREE$1.Scene, camera: THREE$1.Camera) => any
856
856
  }
857
857
 
858
+ //* Color Management Config ==============================
859
+
860
+ /**
861
+ * Color management configuration shared by both WebGL and WebGPU renderers.
862
+ */
863
+ interface ColorManagementConfig {
864
+ /**
865
+ * Color space assigned to 8-bit input textures (color maps).
866
+ * Defaults to sRGB. Most textures are authored in sRGB.
867
+ * @default THREE.SRGBColorSpace
868
+ */
869
+ textureColorSpace?: THREE$1.ColorSpace
870
+ }
871
+
858
872
  //* WebGL Renderer Props ==============================
859
873
 
860
874
  type DefaultGLProps = Omit<THREE$1.WebGLRendererParameters, 'canvas'> & {
@@ -865,7 +879,7 @@ type GLProps =
865
879
  | Renderer
866
880
  | ((defaultProps: DefaultGLProps) => Renderer)
867
881
  | ((defaultProps: DefaultGLProps) => Promise<Renderer>)
868
- | Partial<Properties<THREE$1.WebGLRenderer> | THREE$1.WebGLRendererParameters>
882
+ | (Partial<Properties<THREE$1.WebGLRenderer> | THREE$1.WebGLRendererParameters> & ColorManagementConfig)
869
883
 
870
884
  //* WebGPU Renderer Props ==============================
871
885
 
@@ -891,9 +905,9 @@ interface CanvasSchedulerConfig {
891
905
  }
892
906
 
893
907
  /**
894
- * Extended renderer configuration for multi-canvas support.
908
+ * Extended renderer configuration for multi-canvas support and color management.
895
909
  */
896
- interface RendererConfigExtended {
910
+ interface RendererConfigExtended extends ColorManagementConfig {
897
911
  /** Share renderer from another canvas (WebGPU only) */
898
912
  primaryCanvas?: string
899
913
  /** Canvas-level scheduler options */
@@ -958,8 +972,6 @@ interface RenderProps<TCanvas extends HTMLCanvasElement | OffscreenCanvas$1> {
958
972
  * @see https://threejs.org/docs/#api/en/renderers/WebGLRenderer.shadowMap
959
973
  */
960
974
  shadows?: boolean | 'basic' | 'percentage' | 'soft' | 'variance' | Partial<THREE$1.WebGLShadowMap>
961
- /** Color space assigned to 8-bit input textures (color maps). Defaults to sRGB. Most textures are authored in sRGB. */
962
- textureColorSpace?: THREE$1.ColorSpace
963
975
  /** Creates an orthographic camera */
964
976
  orthographic?: boolean
965
977
  /**
@@ -1212,7 +1224,7 @@ interface CanvasProps
1212
1224
  */
1213
1225
  resize?: Options
1214
1226
  /** The target where events are being subscribed to, default: the div that wraps canvas */
1215
- eventSource?: HTMLElement | React$1.RefObject<HTMLElement>
1227
+ eventSource?: HTMLElement | React$1.RefObject<HTMLElement | null>
1216
1228
  /** The event prefix that is cast into canvas pointer x/y events, default: "offset" */
1217
1229
  eventPrefix?: 'offset' | 'client' | 'page' | 'layer' | 'screen'
1218
1230
  /** Enable/disable automatic HMR refresh for TSL nodes and uniforms, default: true in dev */
@@ -4367,4 +4379,4 @@ declare function isOnce(value: unknown): value is {
4367
4379
  declare function Canvas(props: CanvasProps): react_jsx_runtime.JSX.Element;
4368
4380
 
4369
4381
  export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, three_d as ReactThreeFiber, Scheduler, Texture, _roots, act, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, context, createEvents, createPointerEvents, createPortal, createRoot, createStore, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getScheduler, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, reconciler, registerPrimary, removeInteractivity, resolve, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useEnvironment, useFrame, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useMutableCallback, useRenderTarget, useStore, useTexture, useTextures, useThree, waitForPrimary };
4370
- export type { Act, AddPhaseOptions, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameControls, FrameNextCallback, FrameNextControls, FrameNextState, FrameState, FrameTimingState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootOptions, RootState, RootStore, SchedulerApi, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureEntry, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseFrameNextOptions, UseFrameOptions, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
4382
+ export type { Act, AddPhaseOptions, Args, ArgsProp, AttachFnType, AttachType, BackgroundConfig, BackgroundProp, BaseRendererProps, Bridge, BufferLike, BufferRecord, BufferStore, Camera, CameraProps, CanvasProps, CanvasSchedulerConfig, Catalogue, Color, ColorManagementConfig, ComputeFunction, ConstructorRepresentation, DefaultGLProps, DefaultRendererProps, Disposable, DomEvent, Dpr, ElementProps, EnvironmentLoaderProps, EnvironmentProps, EquConfig, Euler, EventHandlers, EventManager, EventProps, Events, Extensions, FiberRoot, FilterFunction, FrameCallback, FrameControls, FrameNextCallback, FrameNextControls, FrameNextState, FrameState, FrameTimingState, Frameloop, GLProps, GLTFLike, GeometryProps, GeometryTransformProps, GlobalEffectType, GlobalRenderCallback, HostConfig, InferLoadResult, InjectState, InputLike, Instance, InstanceProps, InternalState, Intersection, IntersectionEvent, IsAllOptional, IsOptional, Layers, LegacyInternalState, LegacyRenderer, LegacyRootState, LoaderInstance, LoaderLike, LoaderResult, MappedTextureType, MathProps, MathRepresentation, MathType, MathTypes, Matrix3, Matrix4, Mutable, MutableOrReadonlyParameters, NodeProps, NonFunctionKeys, ObjectMap, OffscreenCanvas$1 as OffscreenCanvas, Overwrite, Performance, PointerCaptureTarget, PointerState, PresetsType, PrimaryCanvasEntry, Properties, Quaternion, R3FRenderer, RaycastableRepresentation, ReactProps, ReconcilerRoot, RenderCallback, RenderProps, RenderTargetOptions, Renderer, RendererConfigExtended, RendererFactory, RendererProps, Root, RootOptions, RootState, RootStore, SchedulerApi, SetBlock, Size, StorageLike, StorageRecord, StorageStore, Subscription, TSLNodeInput, TextureEntry, ThreeCamera, ThreeElement, ThreeElements, ThreeElementsImpl, ThreeEvent, ThreeExports, ThreeToJSXElements, UnblockProps, UseFrameNextOptions, UseFrameOptions, UseTextureOptions, UseTexturesReturn, Vector2, Vector3, Vector4, VectorRepresentation, Viewport, VisibilityEntry, WebGLDefaultProps, WebGLProps, WebGLShadowConfig, XRManager, XRPointerConfig };
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as webgpu from 'three/webgpu';
2
- import { RenderTarget, CubeReflectionMapping, EquirectangularReflectionMapping, CubeTextureLoader, Scene, WebGLCubeRenderTarget, HalfFloatType, Color, Frustum, Matrix4, Group, BoxGeometry, MeshBasicNodeMaterial, Mesh, Node, NodeUpdateType, Layers, SRGBColorSpace, RGBAFormat, UnsignedByteType, Vector3, Vector2, TextureLoader, Texture as Texture$1, CanvasTarget, Raycaster, OrthographicCamera, PerspectiveCamera, PCFSoftShadowMap, VSMShadowMap, PCFShadowMap, BasicShadowMap, ACESFilmicToneMapping, WebGPURenderer } from 'three/webgpu';
2
+ import { RenderTarget, CubeReflectionMapping, EquirectangularReflectionMapping, CubeTextureLoader, Scene, WebGLCubeRenderTarget, HalfFloatType, Color, Frustum, Matrix4, Group, BoxGeometry, MeshBasicNodeMaterial, Mesh, Node, NodeUpdateType, Layers, SRGBColorSpace, RGBAFormat, UnsignedByteType, Vector3, Vector2, TextureLoader, Texture as Texture$1, CanvasTarget, Raycaster, OrthographicCamera, PerspectiveCamera, PCFShadowMap, VSMShadowMap, BasicShadowMap, ACESFilmicToneMapping, WebGPURenderer } from 'three/webgpu';
3
3
  import { WebGLRenderTarget, WebGLRenderer } from 'three';
4
4
  import { Inspector } from 'three/addons/inspector/Inspector.js';
5
5
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
@@ -139,7 +139,7 @@ function useEnvironment({
139
139
  useLoader$1.clear(loader, multiFile ? [files] : files);
140
140
  }
141
141
  renderer.domElement.addEventListener("webglcontextlost", clearGainmapTexture, { once: true });
142
- }, [files, renderer.domElement]);
142
+ }, [extension, files, loader, multiFile, renderer.domElement]);
143
143
  const loaderResult = useLoader$1(
144
144
  loader,
145
145
  multiFile ? [files] : files,
@@ -339,7 +339,22 @@ function EnvironmentPortal({
339
339
  environmentIntensity,
340
340
  environmentRotation
341
341
  });
342
- }, [children, virtualScene, fbo.texture, scene, defaultScene, background, frames, gl]);
342
+ }, [
343
+ children,
344
+ virtualScene,
345
+ fbo.texture,
346
+ scene,
347
+ defaultScene,
348
+ background,
349
+ frames,
350
+ gl,
351
+ blur,
352
+ backgroundBlurriness,
353
+ backgroundIntensity,
354
+ backgroundRotation,
355
+ environmentIntensity,
356
+ environmentRotation
357
+ ]);
343
358
  let count = 1;
344
359
  useFrame$1(() => {
345
360
  if (frames === Infinity || count < frames) {
@@ -1266,7 +1281,7 @@ function createEvents(store) {
1266
1281
  }
1267
1282
  function processDeferredPointer(event, pointerId) {
1268
1283
  const state = store.getState();
1269
- const { onPointerMissed, onDragOverMissed, internal } = state;
1284
+ const { internal } = state;
1270
1285
  if (!state.events.enabled) return;
1271
1286
  const filter = filterPointerEvents;
1272
1287
  const hits = intersect(event, filter);
@@ -1501,6 +1516,7 @@ function createPointerEvents(store) {
1501
1516
  }
1502
1517
  },
1503
1518
  connect: (target) => {
1519
+ if (!target) return;
1504
1520
  const { set, events } = store.getState();
1505
1521
  events.disconnect?.();
1506
1522
  set((state) => ({ events: { ...state.events, connected: target } }));
@@ -1863,7 +1879,7 @@ function shouldRun(job, now) {
1863
1879
  const minInterval = 1e3 / job.fps;
1864
1880
  const lastRun = job.lastRun ?? 0;
1865
1881
  const elapsed = now - lastRun;
1866
- if (elapsed < minInterval) return false;
1882
+ if (elapsed < minInterval - 1) return false;
1867
1883
  if (job.drop) {
1868
1884
  job.lastRun = now;
1869
1885
  } else {
@@ -2890,14 +2906,16 @@ const createStore = (invalidate, advance) => {
2890
2906
  oldSize = size;
2891
2907
  oldDpr = viewport.dpr;
2892
2908
  updateCamera(camera, size);
2893
- if (canvasTarget) {
2909
+ if (internal.isSecondary && canvasTarget) {
2894
2910
  if (viewport.dpr > 0) canvasTarget.setPixelRatio(viewport.dpr);
2895
- const updateStyle = typeof HTMLCanvasElement !== "undefined" && canvasTarget.domElement instanceof HTMLCanvasElement;
2896
- canvasTarget.setSize(size.width, size.height, updateStyle);
2911
+ canvasTarget.setSize(size.width, size.height, false);
2897
2912
  } else {
2898
2913
  if (viewport.dpr > 0) actualRenderer.setPixelRatio(viewport.dpr);
2899
- const updateStyle = typeof HTMLCanvasElement !== "undefined" && actualRenderer.domElement instanceof HTMLCanvasElement;
2900
- actualRenderer.setSize(size.width, size.height, updateStyle);
2914
+ actualRenderer.setSize(size.width, size.height, false);
2915
+ if (canvasTarget) {
2916
+ if (viewport.dpr > 0) canvasTarget.setPixelRatio(viewport.dpr);
2917
+ canvasTarget.setSize(size.width, size.height, false);
2918
+ }
2901
2919
  }
2902
2920
  }
2903
2921
  if (camera !== oldCamera) {
@@ -15184,7 +15202,6 @@ function createRoot(canvas) {
15184
15202
  events,
15185
15203
  onCreated: onCreatedCallback,
15186
15204
  shadows = false,
15187
- textureColorSpace = SRGBColorSpace,
15188
15205
  orthographic = false,
15189
15206
  frameloop = "always",
15190
15207
  dpr = [1, 2],
@@ -15199,6 +15216,7 @@ function createRoot(canvas) {
15199
15216
  _sizeProps,
15200
15217
  forceEven
15201
15218
  } = props;
15219
+ const textureColorSpace = is.obj(glConfig) && !is.fun(glConfig) && !isRenderer(glConfig) && glConfig.textureColorSpace || is.obj(rendererConfig) && !is.fun(rendererConfig) && !isRenderer(rendererConfig) && rendererConfig.textureColorSpace || SRGBColorSpace;
15202
15220
  const state = store.getState();
15203
15221
  const defaultGLProps = {
15204
15222
  canvas,
@@ -15369,7 +15387,7 @@ function createRoot(canvas) {
15369
15387
  lastConfiguredProps.performance = performance;
15370
15388
  }
15371
15389
  if (!state.xr) {
15372
- const handleXRFrame = (timestamp, frame) => {
15390
+ const handleXRFrame = (timestamp, _frame) => {
15373
15391
  const state2 = store.getState();
15374
15392
  if (state2.frameloop === "never") return;
15375
15393
  advance(timestamp);
@@ -15405,15 +15423,22 @@ function createRoot(canvas) {
15405
15423
  const oldType = renderer.shadowMap.type;
15406
15424
  renderer.shadowMap.enabled = !!shadows;
15407
15425
  if (is.boo(shadows)) {
15408
- renderer.shadowMap.type = PCFSoftShadowMap;
15426
+ renderer.shadowMap.type = PCFShadowMap;
15409
15427
  } else if (is.str(shadows)) {
15428
+ if (shadows === "soft") {
15429
+ notifyDepreciated({
15430
+ heading: 'shadows="soft" is deprecated',
15431
+ body: "Three has depreciated soft and improved basic PCFShadows, we converted for you.",
15432
+ link: "https://github.com/mrdoob/three.js/wiki/Migration-Guide?utm_source=chatgpt.com#181--182"
15433
+ });
15434
+ }
15410
15435
  const types = {
15411
15436
  basic: BasicShadowMap,
15412
15437
  percentage: PCFShadowMap,
15413
- soft: PCFSoftShadowMap,
15438
+ soft: PCFShadowMap,
15414
15439
  variance: VSMShadowMap
15415
15440
  };
15416
- renderer.shadowMap.type = types[shadows] ?? PCFSoftShadowMap;
15441
+ renderer.shadowMap.type = types[shadows] ?? PCFShadowMap;
15417
15442
  } else if (is.obj(shadows)) {
15418
15443
  Object.assign(renderer.shadowMap, shadows);
15419
15444
  }
@@ -15429,13 +15454,24 @@ function createRoot(canvas) {
15429
15454
  if (state.textureColorSpace !== textureColorSpace) state.set(() => ({ textureColorSpace }));
15430
15455
  lastConfiguredProps.textureColorSpace = textureColorSpace;
15431
15456
  }
15457
+ const r3fProps = ["textureColorSpace"];
15458
+ const constructorOnlyProps = ["samples", "antialias", "alpha", "canvas", "powerPreference"];
15459
+ const nonApplyProps = [...r3fProps, ...constructorOnlyProps];
15432
15460
  if (glConfig && !is.fun(glConfig) && !isRenderer(glConfig) && !is.equ(glConfig, renderer, shallowLoose)) {
15433
- applyProps(renderer, glConfig);
15461
+ const glProps = {};
15462
+ for (const key in glConfig) {
15463
+ if (!nonApplyProps.includes(key)) glProps[key] = glConfig[key];
15464
+ }
15465
+ applyProps(renderer, glProps);
15434
15466
  }
15435
15467
  if (rendererConfig && !is.fun(rendererConfig) && !isRenderer(rendererConfig) && state.renderer) {
15436
15468
  const currentRenderer = state.renderer;
15437
15469
  if (!is.equ(rendererConfig, currentRenderer, shallowLoose)) {
15438
- applyProps(currentRenderer, rendererConfig);
15470
+ const rendererProps = {};
15471
+ for (const key in rendererConfig) {
15472
+ if (!nonApplyProps.includes(key)) rendererProps[key] = rendererConfig[key];
15473
+ }
15474
+ applyProps(currentRenderer, rendererProps);
15439
15475
  }
15440
15476
  }
15441
15477
  const scheduler = getScheduler();
@@ -15749,8 +15785,18 @@ function CanvasImpl({
15749
15785
  forceEven,
15750
15786
  ...props
15751
15787
  }) {
15752
- const { primaryCanvas, scheduler, ...rendererConfig } = typeof rendererProp === "object" && rendererProp !== null && !("render" in rendererProp) && ("primaryCanvas" in rendererProp || "scheduler" in rendererProp) ? rendererProp : { primaryCanvas: void 0, scheduler: void 0 };
15753
- const renderer = Object.keys(rendererConfig).length > 0 ? rendererConfig : rendererProp;
15788
+ const isRendererConfig = typeof rendererProp === "object" && rendererProp !== null && !("render" in rendererProp) && ("primaryCanvas" in rendererProp || "scheduler" in rendererProp);
15789
+ let primaryCanvas;
15790
+ let scheduler;
15791
+ let renderer;
15792
+ if (isRendererConfig) {
15793
+ const { primaryCanvas: pc, scheduler: sc, ...rest } = rendererProp;
15794
+ primaryCanvas = pc;
15795
+ scheduler = sc;
15796
+ renderer = Object.keys(rest).length > 0 ? rest : rendererProp;
15797
+ } else {
15798
+ renderer = rendererProp;
15799
+ }
15754
15800
  React.useMemo(() => extend(THREE), []);
15755
15801
  const Bridge = useBridge();
15756
15802
  const backgroundProps = React.useMemo(() => {
@@ -15960,7 +16006,16 @@ function CanvasImpl({
15960
16006
  ...style
15961
16007
  },
15962
16008
  ...props,
15963
- children: /* @__PURE__ */ jsx("div", { ref: containerRef, className: "r3f-canvas-container", style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ jsx("canvas", { ref: canvasRef, id, className: "r3f-canvas", style: { display: "block" }, children: fallback }) })
16009
+ children: /* @__PURE__ */ jsx("div", { ref: containerRef, className: "r3f-canvas-container", style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ jsx(
16010
+ "canvas",
16011
+ {
16012
+ ref: canvasRef,
16013
+ id,
16014
+ className: "r3f-canvas",
16015
+ style: { display: "block", width: "100%", height: "100%" },
16016
+ children: fallback
16017
+ }
16018
+ ) })
15964
16019
  }
15965
16020
  );
15966
16021
  }