Skip to content

Commit 033f8a4

Browse files
committed
feat: refactor store.raycaster to be stack-based
- rename canvasProps.raycaster to canvasProps.defaultRaycaster - rename three.raycaster to three.currentRaycaster - add three.setCurrentRaycaster(raycaster): () => void - returns cleanup-function to pop the raycaster from the stack
1 parent fd7f03b commit 033f8a4

4 files changed

Lines changed: 19 additions & 11 deletions

File tree

src/create-events.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ function raycast<TNativeEvent extends MouseEvent | WheelEvent>(
9898
registry: Object3D[],
9999
event: TNativeEvent,
100100
): Intersection<Meta<Object3D>>[] {
101-
if ("update" in context.raycaster) {
102-
context.raycaster.update(event, context)
101+
if ("update" in context.currentRaycaster) {
102+
context.currentRaycaster.update(event, context)
103103
}
104104

105105
const nodeSet = new Set<Object3D>()
@@ -116,7 +116,7 @@ function raycast<TNativeEvent extends MouseEvent | WheelEvent>(
116116
stack.push(...object.children)
117117
}
118118

119-
return context.raycaster.intersectObjects(nodeSet.values().toArray(), false)
119+
return context.currentRaycaster.intersectObjects(nodeSet.values().toArray(), false)
120120
}
121121

122122
/**********************************************************************************/
@@ -169,7 +169,7 @@ function createMissableEventRegistry(
169169

170170
// Phase #2 - Raycast remaining missed objects
171171
for (const remainingObject of missedObjects) {
172-
const intersections = context.raycaster.intersectObject(remainingObject, true)
172+
const intersections = context.currentRaycaster.intersectObject(remainingObject, true)
173173

174174
// Bubble down intersections
175175
// if they haven't been visited before:

src/create-three.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,8 @@ export function createThree(canvas: HTMLCanvasElement, props: CanvasProps) {
192192
},
193193
}),
194194
)
195-
const raycaster = createMemo(() =>
195+
196+
const defaultRaycaster = createMemo(() =>
196197
augment<Raycaster | EventRaycaster>(
197198
props.raycaster instanceof Raycaster ? props.raycaster : new CursorRaycaster(),
198199
{
@@ -202,6 +203,9 @@ export function createThree(canvas: HTMLCanvasElement, props: CanvasProps) {
202203
},
203204
),
204205
)
206+
207+
const raycasterStack = new Stack<Raycaster>("raycaster")
208+
205209
const gl = createMemo(() => {
206210
const gl =
207211
props.gl instanceof WebGLRenderer
@@ -257,8 +261,11 @@ export function createThree(canvas: HTMLCanvasElement, props: CanvasProps) {
257261
get scene() {
258262
return scene()
259263
},
260-
get raycaster() {
261-
return raycaster()
264+
get currentRaycaster() {
265+
return raycasterStack.peek() || defaultRaycaster()
266+
},
267+
setCurrentRaycaster(raycaster: Raycaster) {
268+
return raycasterStack.push(raycaster)
262269
},
263270
get gl() {
264271
return gl()
@@ -308,7 +315,7 @@ export function createThree(canvas: HTMLCanvasElement, props: CanvasProps) {
308315
// Manage raycaster
309316
createRenderEffect(() => {
310317
if (!props.raycaster || props.raycaster instanceof Raycaster) return
311-
useProps(raycaster, props.raycaster)
318+
useProps(defaultRaycaster, props.raycaster)
312319
})
313320

314321
// Manage gl

src/types.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,15 @@ export interface Context {
2828
canvas: HTMLCanvasElement
2929
clock: Clock
3030
currentCamera: CameraKind
31+
currentRaycaster: Raycaster | EventRaycaster
3132
dpr: number
3233
gl: Meta<WebGLRenderer>
3334
props: CanvasProps
34-
raycaster: Meta<Raycaster | EventRaycaster>
3535
render: (delta: number) => void
3636
requestRender: () => void
37-
setCurrentCamera(camera: CameraKind): () => void
3837
scene: Meta<Scene>
38+
setCurrentCamera(camera: CameraKind): () => void
39+
setCurrentRaycaster(camera: Raycaster): () => void
3940
viewport: Viewport
4041
xr: {
4142
connect: () => void

tests/core/hooks.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ describe("hooks", () => {
2424

2525
expect(result.currentCamera instanceof THREE.Camera).toBeTruthy()
2626
expect(result.scene instanceof THREE.Scene).toBeTruthy()
27-
expect(result.raycaster instanceof THREE.Raycaster).toBeTruthy()
27+
expect(result.currentRaycaster instanceof THREE.Raycaster).toBeTruthy()
2828
// expect(result.size).toEqual({ height: 0, width: 0, top: 0, left: 0, updateStyle: false });
2929
})
3030

0 commit comments

Comments
 (0)