@react-three/fiber 10.0.0-canary.b0fafc8 → 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 +363 -91
- package/dist/index.d.cts +156 -27
- package/dist/index.d.mts +156 -27
- package/dist/index.d.ts +156 -27
- package/dist/index.mjs +364 -92
- package/dist/legacy.cjs +357 -91
- package/dist/legacy.d.cts +156 -27
- package/dist/legacy.d.mts +156 -27
- package/dist/legacy.d.ts +156 -27
- package/dist/legacy.mjs +358 -92
- package/dist/webgpu/index.cjs +738 -102
- package/dist/webgpu/index.d.cts +241 -40
- package/dist/webgpu/index.d.mts +241 -40
- package/dist/webgpu/index.d.ts +241 -40
- package/dist/webgpu/index.mjs +735 -103
- package/package.json +1 -1
package/dist/legacy.cjs
CHANGED
|
@@ -169,7 +169,7 @@ function useEnvironment({
|
|
|
169
169
|
fiber.useLoader.clear(loader, multiFile ? [files] : files);
|
|
170
170
|
}
|
|
171
171
|
renderer.domElement.addEventListener("webglcontextlost", clearGainmapTexture, { once: true });
|
|
172
|
-
}, [files, renderer.domElement]);
|
|
172
|
+
}, [extension, files, loader, multiFile, renderer.domElement]);
|
|
173
173
|
const loaderResult = fiber.useLoader(
|
|
174
174
|
loader,
|
|
175
175
|
multiFile ? [files] : files,
|
|
@@ -369,7 +369,22 @@ function EnvironmentPortal({
|
|
|
369
369
|
environmentIntensity,
|
|
370
370
|
environmentRotation
|
|
371
371
|
});
|
|
372
|
-
}, [
|
|
372
|
+
}, [
|
|
373
|
+
children,
|
|
374
|
+
virtualScene,
|
|
375
|
+
fbo.texture,
|
|
376
|
+
scene,
|
|
377
|
+
defaultScene,
|
|
378
|
+
background,
|
|
379
|
+
frames,
|
|
380
|
+
gl,
|
|
381
|
+
blur,
|
|
382
|
+
backgroundBlurriness,
|
|
383
|
+
backgroundIntensity,
|
|
384
|
+
backgroundRotation,
|
|
385
|
+
environmentIntensity,
|
|
386
|
+
environmentRotation
|
|
387
|
+
]);
|
|
373
388
|
let count = 1;
|
|
374
389
|
fiber.useFrame(() => {
|
|
375
390
|
if (frames === Infinity || count < frames) {
|
|
@@ -1005,6 +1020,9 @@ function applyProps(object, props) {
|
|
|
1005
1020
|
else target.set(value);
|
|
1006
1021
|
} else {
|
|
1007
1022
|
root[key] = value;
|
|
1023
|
+
if (key.endsWith("Node") && root.isMaterial) {
|
|
1024
|
+
root.needsUpdate = true;
|
|
1025
|
+
}
|
|
1008
1026
|
if (rootState && rootState.renderer?.outputColorSpace === three.SRGBColorSpace && colorMaps.includes(key) && isTexture(value) && root[key]?.isTexture && // sRGB textures must be RGBA8 since r137 https://github.com/mrdoob/three.js/pull/23129
|
|
1009
1027
|
root[key].format === three.RGBAFormat && root[key].type === three.UnsignedByteType) {
|
|
1010
1028
|
root[key].colorSpace = rootState.textureColorSpace;
|
|
@@ -1038,38 +1056,60 @@ function applyProps(object, props) {
|
|
|
1038
1056
|
return object;
|
|
1039
1057
|
}
|
|
1040
1058
|
|
|
1059
|
+
const DEFAULT_POINTER_ID = 0;
|
|
1060
|
+
const XR_POINTER_ID_START = 1e3;
|
|
1061
|
+
function getPointerState(internal, pointerId) {
|
|
1062
|
+
let state = internal.pointerMap.get(pointerId);
|
|
1063
|
+
if (!state) {
|
|
1064
|
+
state = {
|
|
1065
|
+
hovered: /* @__PURE__ */ new Map(),
|
|
1066
|
+
captured: /* @__PURE__ */ new Map(),
|
|
1067
|
+
initialClick: [0, 0],
|
|
1068
|
+
initialHits: []
|
|
1069
|
+
};
|
|
1070
|
+
internal.pointerMap.set(pointerId, state);
|
|
1071
|
+
}
|
|
1072
|
+
return state;
|
|
1073
|
+
}
|
|
1074
|
+
function getPointerId(event) {
|
|
1075
|
+
return "pointerId" in event ? event.pointerId : DEFAULT_POINTER_ID;
|
|
1076
|
+
}
|
|
1041
1077
|
function makeId(event) {
|
|
1042
1078
|
return (event.eventObject || event.object).uuid + "/" + event.index + event.instanceId;
|
|
1043
1079
|
}
|
|
1044
|
-
function releaseInternalPointerCapture(
|
|
1045
|
-
const
|
|
1080
|
+
function releaseInternalPointerCapture(internal, obj, pointerId) {
|
|
1081
|
+
const pointerState = internal.pointerMap.get(pointerId);
|
|
1082
|
+
if (!pointerState) return;
|
|
1083
|
+
const captureData = pointerState.captured.get(obj);
|
|
1046
1084
|
if (captureData) {
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
capturedMap.delete(pointerId);
|
|
1050
|
-
captureData.target.releasePointerCapture(pointerId);
|
|
1051
|
-
}
|
|
1085
|
+
pointerState.captured.delete(obj);
|
|
1086
|
+
captureData.target.releasePointerCapture(pointerId);
|
|
1052
1087
|
}
|
|
1053
1088
|
}
|
|
1054
1089
|
function removeInteractivity(store, object) {
|
|
1055
1090
|
const { internal } = store.getState();
|
|
1056
1091
|
internal.interaction = internal.interaction.filter((o) => o !== object);
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1092
|
+
for (const [pointerId, pointerState] of internal.pointerMap) {
|
|
1093
|
+
pointerState.initialHits = pointerState.initialHits.filter((o) => o !== object);
|
|
1094
|
+
pointerState.hovered.forEach((value, key) => {
|
|
1095
|
+
if (value.eventObject === object || value.object === object) {
|
|
1096
|
+
pointerState.hovered.delete(key);
|
|
1097
|
+
}
|
|
1098
|
+
});
|
|
1099
|
+
if (pointerState.captured.has(object)) {
|
|
1100
|
+
releaseInternalPointerCapture(internal, object, pointerId);
|
|
1061
1101
|
}
|
|
1062
|
-
}
|
|
1063
|
-
internal.capturedMap.forEach((captures, pointerId) => {
|
|
1064
|
-
releaseInternalPointerCapture(internal.capturedMap, object, captures, pointerId);
|
|
1065
|
-
});
|
|
1102
|
+
}
|
|
1066
1103
|
unregisterVisibility(store, object);
|
|
1067
1104
|
}
|
|
1068
1105
|
function createEvents(store) {
|
|
1069
|
-
function calculateDistance(event) {
|
|
1106
|
+
function calculateDistance(event, pointerId) {
|
|
1070
1107
|
const { internal } = store.getState();
|
|
1071
|
-
const
|
|
1072
|
-
|
|
1108
|
+
const pointerState = internal.pointerMap.get(pointerId);
|
|
1109
|
+
if (!pointerState) return 0;
|
|
1110
|
+
const [initialX, initialY] = pointerState.initialClick;
|
|
1111
|
+
const dx = event.offsetX - initialX;
|
|
1112
|
+
const dy = event.offsetY - initialY;
|
|
1073
1113
|
return Math.round(Math.sqrt(dx * dx + dy * dy));
|
|
1074
1114
|
}
|
|
1075
1115
|
function filterPointerEvents(objects) {
|
|
@@ -1105,6 +1145,15 @@ function createEvents(store) {
|
|
|
1105
1145
|
return state2.raycaster.camera ? state2.raycaster.intersectObject(obj, true) : [];
|
|
1106
1146
|
}
|
|
1107
1147
|
let hits = eventsObjects.flatMap(handleRaycast).sort((a, b) => {
|
|
1148
|
+
const aInteractivePriority = a.object.userData?.interactivePriority;
|
|
1149
|
+
const bInteractivePriority = b.object.userData?.interactivePriority;
|
|
1150
|
+
if (aInteractivePriority !== void 0 || bInteractivePriority !== void 0) {
|
|
1151
|
+
if (aInteractivePriority !== void 0 && bInteractivePriority === void 0) return -1;
|
|
1152
|
+
if (bInteractivePriority !== void 0 && aInteractivePriority === void 0) return 1;
|
|
1153
|
+
if (aInteractivePriority !== bInteractivePriority) {
|
|
1154
|
+
return (bInteractivePriority ?? 0) - (aInteractivePriority ?? 0);
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1108
1157
|
const aState = getRootState(a.object);
|
|
1109
1158
|
const bState = getRootState(b.object);
|
|
1110
1159
|
const aPriority = aState?.events?.priority ?? 1;
|
|
@@ -1126,9 +1175,13 @@ function createEvents(store) {
|
|
|
1126
1175
|
eventObject = eventObject.parent;
|
|
1127
1176
|
}
|
|
1128
1177
|
}
|
|
1129
|
-
if ("pointerId" in event
|
|
1130
|
-
|
|
1131
|
-
|
|
1178
|
+
if ("pointerId" in event) {
|
|
1179
|
+
const pointerId = event.pointerId;
|
|
1180
|
+
const pointerState = state.internal.pointerMap.get(pointerId);
|
|
1181
|
+
if (pointerState?.captured.size) {
|
|
1182
|
+
for (const captureData of pointerState.captured.values()) {
|
|
1183
|
+
if (!duplicates.has(makeId(captureData.intersection))) intersections.push(captureData.intersection);
|
|
1184
|
+
}
|
|
1132
1185
|
}
|
|
1133
1186
|
}
|
|
1134
1187
|
return intersections;
|
|
@@ -1141,27 +1194,25 @@ function createEvents(store) {
|
|
|
1141
1194
|
if (state) {
|
|
1142
1195
|
const { raycaster, pointer, camera, internal } = state;
|
|
1143
1196
|
const unprojectedPoint = new three.Vector3(pointer.x, pointer.y, 0).unproject(camera);
|
|
1144
|
-
const hasPointerCapture = (id) =>
|
|
1197
|
+
const hasPointerCapture = (id) => {
|
|
1198
|
+
const pointerState = internal.pointerMap.get(id);
|
|
1199
|
+
return pointerState?.captured.has(hit.eventObject) ?? false;
|
|
1200
|
+
};
|
|
1145
1201
|
const setPointerCapture = (id) => {
|
|
1146
1202
|
const captureData = { intersection: hit, target: event.target };
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
} else {
|
|
1150
|
-
internal.capturedMap.set(id, /* @__PURE__ */ new Map([[hit.eventObject, captureData]]));
|
|
1151
|
-
}
|
|
1203
|
+
const pointerState = getPointerState(internal, id);
|
|
1204
|
+
pointerState.captured.set(hit.eventObject, captureData);
|
|
1152
1205
|
event.target.setPointerCapture(id);
|
|
1153
1206
|
};
|
|
1154
1207
|
const releasePointerCapture = (id) => {
|
|
1155
|
-
|
|
1156
|
-
if (captures) {
|
|
1157
|
-
releaseInternalPointerCapture(internal.capturedMap, hit.eventObject, captures, id);
|
|
1158
|
-
}
|
|
1208
|
+
releaseInternalPointerCapture(internal, hit.eventObject, id);
|
|
1159
1209
|
};
|
|
1160
1210
|
const extractEventProps = {};
|
|
1161
1211
|
for (const prop in event) {
|
|
1162
1212
|
const property = event[prop];
|
|
1163
1213
|
if (typeof property !== "function") extractEventProps[prop] = property;
|
|
1164
1214
|
}
|
|
1215
|
+
const eventPointerId = "pointerId" in event ? event.pointerId : void 0;
|
|
1165
1216
|
const raycastEvent = {
|
|
1166
1217
|
...hit,
|
|
1167
1218
|
...extractEventProps,
|
|
@@ -1172,18 +1223,19 @@ function createEvents(store) {
|
|
|
1172
1223
|
unprojectedPoint,
|
|
1173
1224
|
ray: raycaster.ray,
|
|
1174
1225
|
camera,
|
|
1226
|
+
pointerId: eventPointerId,
|
|
1175
1227
|
// Hijack stopPropagation, which just sets a flag
|
|
1176
1228
|
stopPropagation() {
|
|
1177
|
-
const
|
|
1229
|
+
const pointerState = eventPointerId !== void 0 ? internal.pointerMap.get(eventPointerId) : void 0;
|
|
1178
1230
|
if (
|
|
1179
1231
|
// ...if this pointer hasn't been captured
|
|
1180
|
-
!
|
|
1181
|
-
|
|
1232
|
+
!pointerState?.captured.size || // ... or if the hit object is capturing the pointer
|
|
1233
|
+
pointerState.captured.has(hit.eventObject)
|
|
1182
1234
|
) {
|
|
1183
1235
|
raycastEvent.stopped = localState.stopped = true;
|
|
1184
|
-
if (
|
|
1236
|
+
if (pointerState?.hovered.size && Array.from(pointerState.hovered.values()).find((i) => i.eventObject === hit.eventObject)) {
|
|
1185
1237
|
const higher = intersections.slice(0, intersections.indexOf(hit));
|
|
1186
|
-
cancelPointer([...higher, hit]);
|
|
1238
|
+
cancelPointer([...higher, hit], eventPointerId);
|
|
1187
1239
|
}
|
|
1188
1240
|
}
|
|
1189
1241
|
},
|
|
@@ -1199,15 +1251,18 @@ function createEvents(store) {
|
|
|
1199
1251
|
}
|
|
1200
1252
|
return intersections;
|
|
1201
1253
|
}
|
|
1202
|
-
function cancelPointer(intersections) {
|
|
1254
|
+
function cancelPointer(intersections, pointerId) {
|
|
1203
1255
|
const { internal } = store.getState();
|
|
1204
|
-
|
|
1256
|
+
const pid = pointerId ?? DEFAULT_POINTER_ID;
|
|
1257
|
+
const pointerState = internal.pointerMap.get(pid);
|
|
1258
|
+
if (!pointerState) return;
|
|
1259
|
+
for (const [hoveredId, hoveredObj] of pointerState.hovered) {
|
|
1205
1260
|
if (!intersections.length || !intersections.find(
|
|
1206
1261
|
(hit) => hit.object === hoveredObj.object && hit.index === hoveredObj.index && hit.instanceId === hoveredObj.instanceId
|
|
1207
1262
|
)) {
|
|
1208
1263
|
const eventObject = hoveredObj.eventObject;
|
|
1209
1264
|
const instance = eventObject.__r3f;
|
|
1210
|
-
|
|
1265
|
+
pointerState.hovered.delete(hoveredId);
|
|
1211
1266
|
if (instance?.eventCount) {
|
|
1212
1267
|
const handlers = instance.handlers;
|
|
1213
1268
|
const data = { ...hoveredObj, intersections };
|
|
@@ -1236,41 +1291,118 @@ function createEvents(store) {
|
|
|
1236
1291
|
instance?.handlers.onDropMissed?.(event);
|
|
1237
1292
|
}
|
|
1238
1293
|
}
|
|
1294
|
+
function cleanupPointer(pointerId) {
|
|
1295
|
+
const { internal } = store.getState();
|
|
1296
|
+
const pointerState = internal.pointerMap.get(pointerId);
|
|
1297
|
+
if (pointerState) {
|
|
1298
|
+
for (const [, hoveredObj] of pointerState.hovered) {
|
|
1299
|
+
const eventObject = hoveredObj.eventObject;
|
|
1300
|
+
const instance = eventObject.__r3f;
|
|
1301
|
+
if (instance?.eventCount) {
|
|
1302
|
+
const handlers = instance.handlers;
|
|
1303
|
+
const data = { ...hoveredObj, intersections: [] };
|
|
1304
|
+
handlers.onPointerOut?.(data);
|
|
1305
|
+
handlers.onPointerLeave?.(data);
|
|
1306
|
+
}
|
|
1307
|
+
}
|
|
1308
|
+
internal.pointerMap.delete(pointerId);
|
|
1309
|
+
}
|
|
1310
|
+
internal.pointerDirty.delete(pointerId);
|
|
1311
|
+
}
|
|
1312
|
+
function processDeferredPointer(event, pointerId) {
|
|
1313
|
+
const state = store.getState();
|
|
1314
|
+
const { internal } = state;
|
|
1315
|
+
if (!state.events.enabled) return;
|
|
1316
|
+
const filter = filterPointerEvents;
|
|
1317
|
+
const hits = intersect(event, filter);
|
|
1318
|
+
cancelPointer(hits, pointerId);
|
|
1319
|
+
function onIntersect(data) {
|
|
1320
|
+
const eventObject = data.eventObject;
|
|
1321
|
+
const instance = eventObject.__r3f;
|
|
1322
|
+
if (!instance?.eventCount) return;
|
|
1323
|
+
const handlers = instance.handlers;
|
|
1324
|
+
if (handlers.onPointerOver || handlers.onPointerEnter || handlers.onPointerOut || handlers.onPointerLeave) {
|
|
1325
|
+
const id = makeId(data);
|
|
1326
|
+
const pointerState = getPointerState(internal, pointerId);
|
|
1327
|
+
const hoveredItem = pointerState.hovered.get(id);
|
|
1328
|
+
if (!hoveredItem) {
|
|
1329
|
+
pointerState.hovered.set(id, data);
|
|
1330
|
+
handlers.onPointerOver?.(data);
|
|
1331
|
+
handlers.onPointerEnter?.(data);
|
|
1332
|
+
} else if (hoveredItem.stopped) {
|
|
1333
|
+
data.stopPropagation();
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
handlers.onPointerMove?.(data);
|
|
1337
|
+
}
|
|
1338
|
+
handleIntersects(hits, event, 0, onIntersect);
|
|
1339
|
+
}
|
|
1239
1340
|
function handlePointer(name) {
|
|
1240
1341
|
switch (name) {
|
|
1241
1342
|
case "onPointerLeave":
|
|
1242
|
-
case "onPointerCancel":
|
|
1243
1343
|
case "onDragLeave":
|
|
1244
1344
|
return () => cancelPointer([]);
|
|
1345
|
+
// Global cancel of these events
|
|
1346
|
+
case "onPointerCancel":
|
|
1347
|
+
return (event) => {
|
|
1348
|
+
const pointerId = getPointerId(event);
|
|
1349
|
+
cleanupPointer(pointerId);
|
|
1350
|
+
};
|
|
1245
1351
|
case "onLostPointerCapture":
|
|
1246
1352
|
return (event) => {
|
|
1247
1353
|
const { internal } = store.getState();
|
|
1248
|
-
|
|
1354
|
+
const pointerId = getPointerId(event);
|
|
1355
|
+
const pointerState = internal.pointerMap.get(pointerId);
|
|
1356
|
+
if (pointerState?.captured.size) {
|
|
1249
1357
|
requestAnimationFrame(() => {
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1358
|
+
const pointerState2 = internal.pointerMap.get(pointerId);
|
|
1359
|
+
if (pointerState2?.captured.size) {
|
|
1360
|
+
pointerState2.captured.clear();
|
|
1253
1361
|
}
|
|
1362
|
+
cancelPointer([], pointerId);
|
|
1254
1363
|
});
|
|
1255
1364
|
}
|
|
1256
1365
|
};
|
|
1257
1366
|
}
|
|
1258
1367
|
return function handleEvent(event) {
|
|
1259
1368
|
const state = store.getState();
|
|
1260
|
-
const { onPointerMissed, onDragOverMissed, onDropMissed, internal } = state;
|
|
1369
|
+
const { onPointerMissed, onDragOverMissed, onDropMissed, internal, events } = state;
|
|
1370
|
+
const pointerId = getPointerId(event);
|
|
1261
1371
|
internal.lastEvent.current = event;
|
|
1262
|
-
if (!
|
|
1372
|
+
if (!events.enabled) return;
|
|
1263
1373
|
const isPointerMove = name === "onPointerMove";
|
|
1264
1374
|
const isDragOver = name === "onDragOver";
|
|
1265
1375
|
const isDrop = name === "onDrop";
|
|
1266
1376
|
const isClickEvent = name === "onClick" || name === "onContextMenu" || name === "onDoubleClick";
|
|
1377
|
+
const isPointerDown = name === "onPointerDown";
|
|
1378
|
+
const isPointerUp = name === "onPointerUp";
|
|
1379
|
+
const isWheel = name === "onWheel";
|
|
1380
|
+
const canDeferRaycasts = events.frameTimedRaycasts && state.frameloop === "always";
|
|
1381
|
+
if (isPointerMove && canDeferRaycasts) {
|
|
1382
|
+
events.compute?.(event, state);
|
|
1383
|
+
internal.pointerDirty.set(pointerId, event);
|
|
1384
|
+
return;
|
|
1385
|
+
}
|
|
1386
|
+
if (isWheel && canDeferRaycasts && !events.alwaysFireOnScroll) {
|
|
1387
|
+
events.compute?.(event, state);
|
|
1388
|
+
internal.pointerDirty.set(pointerId, event);
|
|
1389
|
+
return;
|
|
1390
|
+
}
|
|
1391
|
+
if ((isClickEvent || isPointerDown || isPointerUp) && internal.pointerDirty.has(pointerId)) {
|
|
1392
|
+
const deferredEvent = internal.pointerDirty.get(pointerId);
|
|
1393
|
+
internal.pointerDirty.delete(pointerId);
|
|
1394
|
+
processDeferredPointer(deferredEvent, pointerId);
|
|
1395
|
+
}
|
|
1267
1396
|
const filter = isPointerMove || isDragOver || isDrop ? filterPointerEvents : void 0;
|
|
1268
1397
|
const hits = intersect(event, filter);
|
|
1269
|
-
const delta = isClickEvent ? calculateDistance(event) : 0;
|
|
1270
|
-
if (
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1398
|
+
const delta = isClickEvent ? calculateDistance(event, pointerId) : 0;
|
|
1399
|
+
if (isPointerDown) {
|
|
1400
|
+
const pointerState2 = getPointerState(internal, pointerId);
|
|
1401
|
+
pointerState2.initialClick = [event.offsetX, event.offsetY];
|
|
1402
|
+
pointerState2.initialHits = hits.map((hit) => hit.eventObject);
|
|
1403
|
+
}
|
|
1404
|
+
const pointerState = internal.pointerMap.get(pointerId);
|
|
1405
|
+
const initialHits = pointerState?.initialHits ?? [];
|
|
1274
1406
|
if (isClickEvent && !hits.length) {
|
|
1275
1407
|
if (delta <= 2) {
|
|
1276
1408
|
pointerMissed(event, internal.interaction);
|
|
@@ -1285,7 +1417,9 @@ function createEvents(store) {
|
|
|
1285
1417
|
dropMissed(event, internal.interaction);
|
|
1286
1418
|
if (onDropMissed) onDropMissed(event);
|
|
1287
1419
|
}
|
|
1288
|
-
if (isPointerMove || isDragOver)
|
|
1420
|
+
if (isPointerMove || isDragOver) {
|
|
1421
|
+
cancelPointer(hits, pointerId);
|
|
1422
|
+
}
|
|
1289
1423
|
function onIntersect(data) {
|
|
1290
1424
|
const eventObject = data.eventObject;
|
|
1291
1425
|
const instance = eventObject.__r3f;
|
|
@@ -1294,9 +1428,10 @@ function createEvents(store) {
|
|
|
1294
1428
|
if (isPointerMove) {
|
|
1295
1429
|
if (handlers.onPointerOver || handlers.onPointerEnter || handlers.onPointerOut || handlers.onPointerLeave) {
|
|
1296
1430
|
const id = makeId(data);
|
|
1297
|
-
const
|
|
1431
|
+
const pointerState2 = getPointerState(internal, pointerId);
|
|
1432
|
+
const hoveredItem = pointerState2.hovered.get(id);
|
|
1298
1433
|
if (!hoveredItem) {
|
|
1299
|
-
|
|
1434
|
+
pointerState2.hovered.set(id, data);
|
|
1300
1435
|
handlers.onPointerOver?.(data);
|
|
1301
1436
|
handlers.onPointerEnter?.(data);
|
|
1302
1437
|
} else if (hoveredItem.stopped) {
|
|
@@ -1306,9 +1441,10 @@ function createEvents(store) {
|
|
|
1306
1441
|
handlers.onPointerMove?.(data);
|
|
1307
1442
|
} else if (isDragOver) {
|
|
1308
1443
|
const id = makeId(data);
|
|
1309
|
-
const
|
|
1444
|
+
const pointerState2 = getPointerState(internal, pointerId);
|
|
1445
|
+
const hoveredItem = pointerState2.hovered.get(id);
|
|
1310
1446
|
if (!hoveredItem) {
|
|
1311
|
-
|
|
1447
|
+
pointerState2.hovered.set(id, data);
|
|
1312
1448
|
handlers.onDragOverEnter?.(data);
|
|
1313
1449
|
} else if (hoveredItem.stopped) {
|
|
1314
1450
|
data.stopPropagation();
|
|
@@ -1319,18 +1455,18 @@ function createEvents(store) {
|
|
|
1319
1455
|
} else {
|
|
1320
1456
|
const handler = handlers[name];
|
|
1321
1457
|
if (handler) {
|
|
1322
|
-
if (!isClickEvent ||
|
|
1458
|
+
if (!isClickEvent || initialHits.includes(eventObject)) {
|
|
1323
1459
|
pointerMissed(
|
|
1324
1460
|
event,
|
|
1325
|
-
internal.interaction.filter((object) => !
|
|
1461
|
+
internal.interaction.filter((object) => !initialHits.includes(object))
|
|
1326
1462
|
);
|
|
1327
1463
|
handler(data);
|
|
1328
1464
|
}
|
|
1329
1465
|
} else {
|
|
1330
|
-
if (isClickEvent &&
|
|
1466
|
+
if (isClickEvent && initialHits.includes(eventObject)) {
|
|
1331
1467
|
pointerMissed(
|
|
1332
1468
|
event,
|
|
1333
|
-
internal.interaction.filter((object) => !
|
|
1469
|
+
internal.interaction.filter((object) => !initialHits.includes(object))
|
|
1334
1470
|
);
|
|
1335
1471
|
}
|
|
1336
1472
|
}
|
|
@@ -1339,7 +1475,15 @@ function createEvents(store) {
|
|
|
1339
1475
|
handleIntersects(hits, event, delta, onIntersect);
|
|
1340
1476
|
};
|
|
1341
1477
|
}
|
|
1342
|
-
|
|
1478
|
+
function flushDeferredPointers() {
|
|
1479
|
+
const { internal, events } = store.getState();
|
|
1480
|
+
if (!events.frameTimedRaycasts) return;
|
|
1481
|
+
for (const [pointerId, event] of internal.pointerDirty) {
|
|
1482
|
+
processDeferredPointer(event, pointerId);
|
|
1483
|
+
}
|
|
1484
|
+
internal.pointerDirty.clear();
|
|
1485
|
+
}
|
|
1486
|
+
return { handlePointer, flushDeferredPointers, processDeferredPointer };
|
|
1343
1487
|
}
|
|
1344
1488
|
const DOM_EVENTS = {
|
|
1345
1489
|
onClick: ["click", false],
|
|
@@ -1358,10 +1502,15 @@ const DOM_EVENTS = {
|
|
|
1358
1502
|
onLostPointerCapture: ["lostpointercapture", true]
|
|
1359
1503
|
};
|
|
1360
1504
|
function createPointerEvents(store) {
|
|
1361
|
-
const { handlePointer } = createEvents(store);
|
|
1505
|
+
const { handlePointer, flushDeferredPointers, processDeferredPointer } = createEvents(store);
|
|
1506
|
+
let nextXRPointerId = XR_POINTER_ID_START;
|
|
1507
|
+
const xrPointers = /* @__PURE__ */ new Map();
|
|
1362
1508
|
return {
|
|
1363
1509
|
priority: 1,
|
|
1364
1510
|
enabled: true,
|
|
1511
|
+
frameTimedRaycasts: true,
|
|
1512
|
+
alwaysFireOnScroll: true,
|
|
1513
|
+
updateOnFrame: false,
|
|
1365
1514
|
compute(event, state) {
|
|
1366
1515
|
state.pointer.set(event.offsetX / state.size.width * 2 - 1, -(event.offsetY / state.size.height) * 2 + 1);
|
|
1367
1516
|
state.raycaster.setFromCamera(state.pointer, state.camera);
|
|
@@ -1371,11 +1520,33 @@ function createPointerEvents(store) {
|
|
|
1371
1520
|
(acc, key) => ({ ...acc, [key]: handlePointer(key) }),
|
|
1372
1521
|
{}
|
|
1373
1522
|
),
|
|
1374
|
-
update: () => {
|
|
1523
|
+
update: (pointerId) => {
|
|
1524
|
+
const { events, internal } = store.getState();
|
|
1525
|
+
if (!events.handlers) return;
|
|
1526
|
+
if (pointerId !== void 0) {
|
|
1527
|
+
const event = internal.pointerDirty.get(pointerId);
|
|
1528
|
+
if (event) {
|
|
1529
|
+
internal.pointerDirty.delete(pointerId);
|
|
1530
|
+
processDeferredPointer(event, pointerId);
|
|
1531
|
+
} else if (internal.lastEvent?.current) {
|
|
1532
|
+
processDeferredPointer(internal.lastEvent.current, pointerId);
|
|
1533
|
+
}
|
|
1534
|
+
} else {
|
|
1535
|
+
flushDeferredPointers();
|
|
1536
|
+
if (internal.lastEvent?.current) {
|
|
1537
|
+
events.handlers.onPointerMove(internal.lastEvent.current);
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
},
|
|
1541
|
+
flush: () => {
|
|
1375
1542
|
const { events, internal } = store.getState();
|
|
1376
|
-
|
|
1543
|
+
flushDeferredPointers();
|
|
1544
|
+
if (events.updateOnFrame && internal.lastEvent?.current && events.handlers) {
|
|
1545
|
+
events.handlers.onPointerMove(internal.lastEvent.current);
|
|
1546
|
+
}
|
|
1377
1547
|
},
|
|
1378
1548
|
connect: (target) => {
|
|
1549
|
+
if (!target) return;
|
|
1379
1550
|
const { set, events } = store.getState();
|
|
1380
1551
|
events.disconnect?.();
|
|
1381
1552
|
set((state) => ({ events: { ...state.events, connected: target } }));
|
|
@@ -1399,6 +1570,32 @@ function createPointerEvents(store) {
|
|
|
1399
1570
|
}
|
|
1400
1571
|
set((state) => ({ events: { ...state.events, connected: void 0 } }));
|
|
1401
1572
|
}
|
|
1573
|
+
},
|
|
1574
|
+
registerPointer: (config) => {
|
|
1575
|
+
const pointerId = nextXRPointerId++;
|
|
1576
|
+
xrPointers.set(pointerId, config);
|
|
1577
|
+
const { internal } = store.getState();
|
|
1578
|
+
getPointerState(internal, pointerId);
|
|
1579
|
+
return pointerId;
|
|
1580
|
+
},
|
|
1581
|
+
unregisterPointer: (pointerId) => {
|
|
1582
|
+
xrPointers.delete(pointerId);
|
|
1583
|
+
const { internal } = store.getState();
|
|
1584
|
+
const pointerState = internal.pointerMap.get(pointerId);
|
|
1585
|
+
if (pointerState) {
|
|
1586
|
+
for (const [, hoveredObj] of pointerState.hovered) {
|
|
1587
|
+
const eventObject = hoveredObj.eventObject;
|
|
1588
|
+
const instance = eventObject.__r3f;
|
|
1589
|
+
if (instance?.eventCount) {
|
|
1590
|
+
const handlers = instance.handlers;
|
|
1591
|
+
const data = { ...hoveredObj, intersections: [] };
|
|
1592
|
+
handlers.onPointerOut?.(data);
|
|
1593
|
+
handlers.onPointerLeave?.(data);
|
|
1594
|
+
}
|
|
1595
|
+
}
|
|
1596
|
+
internal.pointerMap.delete(pointerId);
|
|
1597
|
+
}
|
|
1598
|
+
internal.pointerDirty.delete(pointerId);
|
|
1402
1599
|
}
|
|
1403
1600
|
};
|
|
1404
1601
|
}
|
|
@@ -1712,7 +1909,7 @@ function shouldRun(job, now) {
|
|
|
1712
1909
|
const minInterval = 1e3 / job.fps;
|
|
1713
1910
|
const lastRun = job.lastRun ?? 0;
|
|
1714
1911
|
const elapsed = now - lastRun;
|
|
1715
|
-
if (elapsed < minInterval) return false;
|
|
1912
|
+
if (elapsed < minInterval - 1) return false;
|
|
1716
1913
|
if (job.drop) {
|
|
1717
1914
|
job.lastRun = now;
|
|
1718
1915
|
} else {
|
|
@@ -2529,7 +2726,14 @@ const createStore = (invalidate, advance) => {
|
|
|
2529
2726
|
frustum: new three.Frustum(),
|
|
2530
2727
|
autoUpdateFrustum: true,
|
|
2531
2728
|
raycaster: null,
|
|
2532
|
-
events: {
|
|
2729
|
+
events: {
|
|
2730
|
+
priority: 1,
|
|
2731
|
+
enabled: true,
|
|
2732
|
+
connected: false,
|
|
2733
|
+
frameTimedRaycasts: true,
|
|
2734
|
+
alwaysFireOnScroll: true,
|
|
2735
|
+
updateOnFrame: false
|
|
2736
|
+
},
|
|
2533
2737
|
scene: null,
|
|
2534
2738
|
rootScene: null,
|
|
2535
2739
|
xr: null,
|
|
@@ -2620,11 +2824,13 @@ const createStore = (invalidate, advance) => {
|
|
|
2620
2824
|
},
|
|
2621
2825
|
setError: (error) => set(() => ({ error })),
|
|
2622
2826
|
error: null,
|
|
2623
|
-
//* TSL State (managed via hooks: useUniforms, useNodes, useTextures,
|
|
2827
|
+
//* TSL State (managed via hooks: useUniforms, useNodes, useBuffers, useGPUStorage, useTextures, useRenderPipeline) ==============================
|
|
2624
2828
|
uniforms: {},
|
|
2625
2829
|
nodes: {},
|
|
2830
|
+
buffers: {},
|
|
2831
|
+
gpuStorage: {},
|
|
2626
2832
|
textures: /* @__PURE__ */ new Map(),
|
|
2627
|
-
|
|
2833
|
+
renderPipeline: null,
|
|
2628
2834
|
passes: {},
|
|
2629
2835
|
_hmrVersion: 0,
|
|
2630
2836
|
_sizeImperative: false,
|
|
@@ -2633,12 +2839,16 @@ const createStore = (invalidate, advance) => {
|
|
|
2633
2839
|
internal: {
|
|
2634
2840
|
// Events
|
|
2635
2841
|
interaction: [],
|
|
2636
|
-
hovered: /* @__PURE__ */ new Map(),
|
|
2637
2842
|
subscribers: [],
|
|
2843
|
+
// Per-pointer state (new unified structure)
|
|
2844
|
+
pointerMap: /* @__PURE__ */ new Map(),
|
|
2845
|
+
pointerDirty: /* @__PURE__ */ new Map(),
|
|
2846
|
+
lastEvent: React__namespace.createRef(),
|
|
2847
|
+
// Deprecated but kept for backwards compatibility
|
|
2848
|
+
hovered: /* @__PURE__ */ new Map(),
|
|
2638
2849
|
initialClick: [0, 0],
|
|
2639
2850
|
initialHits: [],
|
|
2640
2851
|
capturedMap: /* @__PURE__ */ new Map(),
|
|
2641
|
-
lastEvent: React__namespace.createRef(),
|
|
2642
2852
|
// Visibility tracking (onFramed, onOccluded, onVisible)
|
|
2643
2853
|
visibilityRegistry: /* @__PURE__ */ new Map(),
|
|
2644
2854
|
// Occlusion system (WebGPU only)
|
|
@@ -2726,14 +2936,16 @@ const createStore = (invalidate, advance) => {
|
|
|
2726
2936
|
oldSize = size;
|
|
2727
2937
|
oldDpr = viewport.dpr;
|
|
2728
2938
|
updateCamera(camera, size);
|
|
2729
|
-
if (canvasTarget) {
|
|
2939
|
+
if (internal.isSecondary && canvasTarget) {
|
|
2730
2940
|
if (viewport.dpr > 0) canvasTarget.setPixelRatio(viewport.dpr);
|
|
2731
|
-
|
|
2732
|
-
canvasTarget.setSize(size.width, size.height, updateStyle);
|
|
2941
|
+
canvasTarget.setSize(size.width, size.height, false);
|
|
2733
2942
|
} else {
|
|
2734
2943
|
if (viewport.dpr > 0) actualRenderer.setPixelRatio(viewport.dpr);
|
|
2735
|
-
|
|
2736
|
-
|
|
2944
|
+
actualRenderer.setSize(size.width, size.height, false);
|
|
2945
|
+
if (canvasTarget) {
|
|
2946
|
+
if (viewport.dpr > 0) canvasTarget.setPixelRatio(viewport.dpr);
|
|
2947
|
+
canvasTarget.setSize(size.width, size.height, false);
|
|
2948
|
+
}
|
|
2737
2949
|
}
|
|
2738
2950
|
}
|
|
2739
2951
|
if (camera !== oldCamera) {
|
|
@@ -15018,7 +15230,6 @@ function createRoot(canvas) {
|
|
|
15018
15230
|
events,
|
|
15019
15231
|
onCreated: onCreatedCallback,
|
|
15020
15232
|
shadows = false,
|
|
15021
|
-
textureColorSpace = three.SRGBColorSpace,
|
|
15022
15233
|
orthographic = false,
|
|
15023
15234
|
frameloop = "always",
|
|
15024
15235
|
dpr = [1, 2],
|
|
@@ -15033,6 +15244,7 @@ function createRoot(canvas) {
|
|
|
15033
15244
|
_sizeProps,
|
|
15034
15245
|
forceEven
|
|
15035
15246
|
} = props;
|
|
15247
|
+
const textureColorSpace = is.obj(glConfig) && !is.fun(glConfig) && !isRenderer(glConfig) && glConfig.textureColorSpace || is.obj(rendererConfig) && !is.fun(rendererConfig) && !isRenderer(rendererConfig) && rendererConfig.textureColorSpace || three.SRGBColorSpace;
|
|
15036
15248
|
const state = store.getState();
|
|
15037
15249
|
const defaultGLProps = {
|
|
15038
15250
|
canvas,
|
|
@@ -15156,7 +15368,7 @@ function createRoot(canvas) {
|
|
|
15156
15368
|
lastConfiguredProps.performance = performance;
|
|
15157
15369
|
}
|
|
15158
15370
|
if (!state.xr) {
|
|
15159
|
-
const handleXRFrame = (timestamp,
|
|
15371
|
+
const handleXRFrame = (timestamp, _frame) => {
|
|
15160
15372
|
const state2 = store.getState();
|
|
15161
15373
|
if (state2.frameloop === "never") return;
|
|
15162
15374
|
advance(timestamp);
|
|
@@ -15192,15 +15404,22 @@ function createRoot(canvas) {
|
|
|
15192
15404
|
const oldType = renderer.shadowMap.type;
|
|
15193
15405
|
renderer.shadowMap.enabled = !!shadows;
|
|
15194
15406
|
if (is.boo(shadows)) {
|
|
15195
|
-
renderer.shadowMap.type = three.
|
|
15407
|
+
renderer.shadowMap.type = three.PCFShadowMap;
|
|
15196
15408
|
} else if (is.str(shadows)) {
|
|
15409
|
+
if (shadows === "soft") {
|
|
15410
|
+
notifyDepreciated({
|
|
15411
|
+
heading: 'shadows="soft" is deprecated',
|
|
15412
|
+
body: "Three has depreciated soft and improved basic PCFShadows, we converted for you.",
|
|
15413
|
+
link: "https://github.com/mrdoob/three.js/wiki/Migration-Guide?utm_source=chatgpt.com#181--182"
|
|
15414
|
+
});
|
|
15415
|
+
}
|
|
15197
15416
|
const types = {
|
|
15198
15417
|
basic: three.BasicShadowMap,
|
|
15199
15418
|
percentage: three.PCFShadowMap,
|
|
15200
|
-
soft: three.
|
|
15419
|
+
soft: three.PCFShadowMap,
|
|
15201
15420
|
variance: three.VSMShadowMap
|
|
15202
15421
|
};
|
|
15203
|
-
renderer.shadowMap.type = types[shadows] ?? three.
|
|
15422
|
+
renderer.shadowMap.type = types[shadows] ?? three.PCFShadowMap;
|
|
15204
15423
|
} else if (is.obj(shadows)) {
|
|
15205
15424
|
Object.assign(renderer.shadowMap, shadows);
|
|
15206
15425
|
}
|
|
@@ -15216,13 +15435,24 @@ function createRoot(canvas) {
|
|
|
15216
15435
|
if (state.textureColorSpace !== textureColorSpace) state.set(() => ({ textureColorSpace }));
|
|
15217
15436
|
lastConfiguredProps.textureColorSpace = textureColorSpace;
|
|
15218
15437
|
}
|
|
15438
|
+
const r3fProps = ["textureColorSpace"];
|
|
15439
|
+
const constructorOnlyProps = ["samples", "antialias", "alpha", "canvas", "powerPreference"];
|
|
15440
|
+
const nonApplyProps = [...r3fProps, ...constructorOnlyProps];
|
|
15219
15441
|
if (glConfig && !is.fun(glConfig) && !isRenderer(glConfig) && !is.equ(glConfig, renderer, shallowLoose)) {
|
|
15220
|
-
|
|
15442
|
+
const glProps = {};
|
|
15443
|
+
for (const key in glConfig) {
|
|
15444
|
+
if (!nonApplyProps.includes(key)) glProps[key] = glConfig[key];
|
|
15445
|
+
}
|
|
15446
|
+
applyProps(renderer, glProps);
|
|
15221
15447
|
}
|
|
15222
15448
|
if (rendererConfig && !is.fun(rendererConfig) && !isRenderer(rendererConfig) && state.renderer) {
|
|
15223
15449
|
const currentRenderer = state.renderer;
|
|
15224
15450
|
if (!is.equ(rendererConfig, currentRenderer, shallowLoose)) {
|
|
15225
|
-
|
|
15451
|
+
const rendererProps = {};
|
|
15452
|
+
for (const key in rendererConfig) {
|
|
15453
|
+
if (!nonApplyProps.includes(key)) rendererProps[key] = rendererConfig[key];
|
|
15454
|
+
}
|
|
15455
|
+
applyProps(currentRenderer, rendererProps);
|
|
15226
15456
|
}
|
|
15227
15457
|
}
|
|
15228
15458
|
const scheduler = getScheduler();
|
|
@@ -15248,6 +15478,18 @@ function createRoot(canvas) {
|
|
|
15248
15478
|
system: true
|
|
15249
15479
|
}
|
|
15250
15480
|
);
|
|
15481
|
+
const unregisterEventsFlush = scheduler.register(
|
|
15482
|
+
() => {
|
|
15483
|
+
const state2 = store.getState();
|
|
15484
|
+
state2.events.flush?.();
|
|
15485
|
+
},
|
|
15486
|
+
{
|
|
15487
|
+
id: `${newRootId}_events`,
|
|
15488
|
+
rootId: newRootId,
|
|
15489
|
+
phase: "input",
|
|
15490
|
+
system: true
|
|
15491
|
+
}
|
|
15492
|
+
);
|
|
15251
15493
|
const unregisterFrustum = scheduler.register(
|
|
15252
15494
|
() => {
|
|
15253
15495
|
const state2 = store.getState();
|
|
@@ -15282,7 +15524,7 @@ function createRoot(canvas) {
|
|
|
15282
15524
|
const userHandlesRender = scheduler.hasUserJobsInPhase("render", newRootId);
|
|
15283
15525
|
if (userHandlesRender || state2.internal.priority) return;
|
|
15284
15526
|
try {
|
|
15285
|
-
if (state2.
|
|
15527
|
+
if (state2.renderPipeline?.render) state2.renderPipeline.render();
|
|
15286
15528
|
else if (renderer2?.render) renderer2.render(state2.scene, state2.camera);
|
|
15287
15529
|
} catch (error) {
|
|
15288
15530
|
state2.setError(error instanceof Error ? error : new Error(String(error)));
|
|
@@ -15307,6 +15549,7 @@ function createRoot(canvas) {
|
|
|
15307
15549
|
unregisterRoot: () => {
|
|
15308
15550
|
unregisterRoot();
|
|
15309
15551
|
unregisterCanvasTarget();
|
|
15552
|
+
unregisterEventsFlush();
|
|
15310
15553
|
unregisterFrustum();
|
|
15311
15554
|
unregisterVisibility();
|
|
15312
15555
|
unregisterRender();
|
|
@@ -15472,9 +15715,13 @@ function PortalInner({ state = {}, children, container }) {
|
|
|
15472
15715
|
const store = traditional.createWithEqualityFn((set, get) => ({ ...rest, set, get }));
|
|
15473
15716
|
const onMutate = (prev) => store.setState((state2) => inject.current(prev, state2));
|
|
15474
15717
|
onMutate(previousRoot.getState());
|
|
15475
|
-
previousRoot.subscribe(onMutate);
|
|
15476
15718
|
return store;
|
|
15477
15719
|
}, [previousRoot, container]);
|
|
15720
|
+
useIsomorphicLayoutEffect(() => {
|
|
15721
|
+
const onMutate = (prev) => usePortalStore.setState((state2) => inject.current(prev, state2));
|
|
15722
|
+
const unsubscribe = previousRoot.subscribe(onMutate);
|
|
15723
|
+
return unsubscribe;
|
|
15724
|
+
}, [previousRoot, usePortalStore]);
|
|
15478
15725
|
return (
|
|
15479
15726
|
// @ts-ignore, reconciler types are not maintained
|
|
15480
15727
|
/* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: reconciler.createPortal(
|
|
@@ -15519,8 +15766,18 @@ function CanvasImpl({
|
|
|
15519
15766
|
forceEven,
|
|
15520
15767
|
...props
|
|
15521
15768
|
}) {
|
|
15522
|
-
const
|
|
15523
|
-
|
|
15769
|
+
const isRendererConfig = typeof rendererProp === "object" && rendererProp !== null && !("render" in rendererProp) && ("primaryCanvas" in rendererProp || "scheduler" in rendererProp);
|
|
15770
|
+
let primaryCanvas;
|
|
15771
|
+
let scheduler;
|
|
15772
|
+
let renderer;
|
|
15773
|
+
if (isRendererConfig) {
|
|
15774
|
+
const { primaryCanvas: pc, scheduler: sc, ...rest } = rendererProp;
|
|
15775
|
+
primaryCanvas = pc;
|
|
15776
|
+
scheduler = sc;
|
|
15777
|
+
renderer = Object.keys(rest).length > 0 ? rest : rendererProp;
|
|
15778
|
+
} else {
|
|
15779
|
+
renderer = rendererProp;
|
|
15780
|
+
}
|
|
15524
15781
|
React__namespace.useMemo(() => extend(THREE), []);
|
|
15525
15782
|
const Bridge = useBridge();
|
|
15526
15783
|
const backgroundProps = React__namespace.useMemo(() => {
|
|
@@ -15695,6 +15952,7 @@ function CanvasImpl({
|
|
|
15695
15952
|
queueMicrotask(() => {
|
|
15696
15953
|
const rootEntry = _roots.get(canvas);
|
|
15697
15954
|
if (rootEntry?.store) {
|
|
15955
|
+
console.log("[R3F] HMR detected \u2014 rebuilding nodes/uniforms");
|
|
15698
15956
|
rootEntry.store.setState((state) => ({
|
|
15699
15957
|
nodes: {},
|
|
15700
15958
|
uniforms: {},
|
|
@@ -15706,8 +15964,7 @@ function CanvasImpl({
|
|
|
15706
15964
|
if (typeof ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('legacy.cjs', document.baseURI).href)) }) !== "undefined" && undefined) {
|
|
15707
15965
|
const hot = undefined;
|
|
15708
15966
|
hot.on("vite:afterUpdate", handleHMR);
|
|
15709
|
-
return () => hot.
|
|
15710
|
-
});
|
|
15967
|
+
return () => hot.off?.("vite:afterUpdate", handleHMR);
|
|
15711
15968
|
}
|
|
15712
15969
|
if (typeof module !== "undefined" && module.hot) {
|
|
15713
15970
|
const hot = module.hot;
|
|
@@ -15730,7 +15987,16 @@ function CanvasImpl({
|
|
|
15730
15987
|
...style
|
|
15731
15988
|
},
|
|
15732
15989
|
...props,
|
|
15733
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, className: "r3f-canvas-container", style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15990
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, className: "r3f-canvas-container", style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15991
|
+
"canvas",
|
|
15992
|
+
{
|
|
15993
|
+
ref: canvasRef,
|
|
15994
|
+
id,
|
|
15995
|
+
className: "r3f-canvas",
|
|
15996
|
+
style: { display: "block", width: "100%", height: "100%" },
|
|
15997
|
+
children: fallback
|
|
15998
|
+
}
|
|
15999
|
+
) })
|
|
15734
16000
|
}
|
|
15735
16001
|
);
|
|
15736
16002
|
}
|