Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/passes/N8AO.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
// https://twitter.com/N8Programs/status/1660996748485984261

import { ReactThreeFiber, applyProps, useThree } from '@react-three/fiber'
import { Ref, useLayoutEffect, useMemo } from 'react'
import { Ref, use, useLayoutEffect, useMemo } from 'react'
/* @ts-ignore */
import { N8AOPostPass } from 'n8ao'
import { groupPasses } from '../EffectComposer'
import { EffectComposerContext, groupPasses } from '../EffectComposer'
import { useDispose } from '../util'

export type N8AOProps = {
Expand Down Expand Up @@ -41,7 +41,8 @@ export function N8AO({
renderMode = 0,
ref,
}: N8AOProps) {
const { camera, scene, invalidate } = useThree()
const { camera, scene } = use(EffectComposerContext)
const invalidate = useThree((state) => state.invalidate)
const effect = useMemo(() => {
const instance = new N8AOPostPass(scene, camera)
// N8AOPostPass isn't a postprocessing Effect, so it's not mergeable via
Expand Down
26 changes: 26 additions & 0 deletions src/tests/N8AO.test.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { CopyPass, EffectComposer as EffectComposerImpl } from 'postprocessing'
import * as React from 'react'
import { PerspectiveCamera, Scene } from 'three'
import { describe, expect, it, vi } from 'vitest'
import { EffectComposer } from '../EffectComposer'
import { N8AO } from '../passes/N8AO'
Expand Down Expand Up @@ -89,4 +90,29 @@ describe('N8AO', () => {

await React.act(async () => root.render(null))
})

it("uses the EffectComposer's camera and scene props, not the canvas defaults", async () => {
const ref = React.createRef<any>()
const cameraA = new PerspectiveCamera()
const cameraB = new PerspectiveCamera()
const scene = new Scene()

const render = (camera: PerspectiveCamera) =>
root.render(
<EffectComposer camera={camera} scene={scene}>
<N8AO ref={ref} />
</EffectComposer>
)

await React.act(async () => render(cameraA))
await flush()
expect(ref.current.camera).toBe(cameraA)
expect(ref.current.scene).toBe(scene)

await React.act(async () => render(cameraB))
await flush()
expect(ref.current.camera).toBe(cameraB)

await React.act(async () => root.render(null))
})
})
Loading