react-native-filament
Version:
A real-time physically based 3D rendering engine for React Native
47 lines (39 loc) • 1.2 kB
text/typescript
import { useFilamentContext } from './useFilamentContext'
import { FilamentBuffer } from '../native/FilamentBuffer'
import { useWorkletEffect } from './useWorkletEffect'
export type SkyboxBaseOptions = {
showSun?: boolean
envIntensity?: number
}
export type SkyboxOptions = SkyboxBaseOptions &
(
| {
color: string
}
| {
texture: FilamentBuffer
}
)
/**
* Creates and sets the skybox for the scene depending on the options provided.
* If `null` is passed, the skybox will be removed.
*/
export function useSkybox(options?: SkyboxOptions | null) {
const { engine } = useFilamentContext()
const hasOptions = options != null
const { showSun, envIntensity } = options ?? {}
const texture = hasOptions && 'texture' in options ? options.texture : undefined
const color = hasOptions && 'color' in options ? options.color : undefined
useWorkletEffect(() => {
'worklet'
if (!hasOptions) {
engine.clearSkybox()
return
}
if (texture) {
engine.createAndSetSkyboxByTexture(texture, showSun, envIntensity)
} else if (color) {
engine.createAndSetSkyboxByColor(color, showSun, envIntensity)
}
})
}