Skip to content

v0.4.0

Choose a tag to compare

@CodyJasonBennett CodyJasonBennett released this 04 Jun 08:23
· 93 commits to main since this release

What's Changed

Size prop

Adds a size render prop to mirror R3F's API for sizing, this is handled by the <Canvas /> component. This can be subscribed to via useOGL:

const size = useOGL(state => state.size)
console.log(size.width, size.height)

WebXR support

Adds support for WebXR rendering via an XRManager:

XRManager {
  session: XRSession | null
  setSession(session: XRSession | null): void
  connect(session: XRSession): void
  disconnect(): void
}

//

const renderer = useOGL(state => state.renderer)
const xr = useOGL(state => state.xr)

useEffect(() => {
  let mounted = true

  (async () => {
    const session = await navigator.xr.requestSession('immersive-vr', {
      optionalFeatures: ['local-floor', 'bounded-floor', 'hand-tracking'],
    })
    session.updateRenderState({ baseLayer: new XRWebGLLayer(session, renderer.gl) })

    if (!mounted) return session.end()
    else xr.connect(session)
  })()

  return () => {
    mounted = false
    xr.disconnect()
  }
}, [renderer, xr])

This will augment useFrame subscriptions to access an XRFrame while in a session:

useFrame((state: RootState, time: number, frame?: XRFrame) => {
  // ...
})

Full Changelog: v0.3.7...v0.4.0