zworld/engine/render/pass/light_buffer.go
2024-01-14 22:56:06 +08:00

51 lines
1.2 KiB
Go

package pass
import (
"unsafe"
"zworld/engine/object/light"
"zworld/engine/render/uniform"
"zworld/engine/renderapi/color"
"zworld/engine/renderapi/descriptor"
"zworld/engine/renderapi/texture"
)
type ShadowmapLookupFn func(light.T, int) texture.T
type LightBuffer struct {
buffer []uniform.Light
settings uniform.LightSettings
}
func NewLightBuffer(capacity int) *LightBuffer {
return &LightBuffer{
buffer: make([]uniform.Light, 1, capacity+1),
// default lighting settings
settings: uniform.LightSettings{
AmbientColor: color.White,
AmbientIntensity: 0.4,
ShadowBias: 0.005,
ShadowSampleRadius: 1,
ShadowSamples: 1,
NormalOffset: 0.1,
},
}
}
func (b *LightBuffer) Flush(desc *descriptor.Storage[uniform.Light]) {
// settings is stored in the first element of the buffer
// it excludes the first element containing the light settings
b.settings.Count = int32(len(b.buffer) - 1)
b.buffer[0] = *(*uniform.Light)(unsafe.Pointer(&b.settings))
desc.SetRange(0, b.buffer)
}
func (b *LightBuffer) Reset() {
b.buffer = b.buffer[:1]
}
func (b *LightBuffer) Store(light uniform.Light) {
b.buffer = append(b.buffer, light)
}