zworld/engine/object/light/point.go
2024-01-14 22:56:06 +08:00

90 lines
2.0 KiB
Go

package light
import (
"zworld/engine/object"
"zworld/engine/render/uniform"
"zworld/engine/renderapi/color"
"zworld/plugins/math/vec4"
)
type PointArgs struct {
Color color.T
Range float32
Intensity float32
}
type Point struct {
object.Component
Color object.Property[color.T]
Range object.Property[float32]
Intensity object.Property[float32]
Falloff object.Property[float32]
}
var _ T = &Point{}
func init() {
object.Register[*Point](DeserializePoint)
}
func NewPoint(args PointArgs) *Point {
return object.NewComponent(&Point{
Color: object.NewProperty(args.Color),
Range: object.NewProperty(args.Range),
Intensity: object.NewProperty(args.Intensity),
Falloff: object.NewProperty(float32(2)),
})
}
func (lit *Point) Name() string { return "PointLight" }
func (lit *Point) Type() Type { return TypePoint }
func (lit *Point) CastShadows() bool { return false }
func (lit *Point) LightData(shadowmaps ShadowmapStore) uniform.Light {
return uniform.Light{
Type: uint32(TypePoint),
Position: vec4.Extend(lit.Transform().WorldPosition(), 0),
Color: lit.Color.Get(),
Intensity: lit.Intensity.Get(),
Range: lit.Range.Get(),
Falloff: lit.Falloff.Get(),
}
}
func (lit *Point) Shadowmaps() int {
return 0
}
func (lit *Point) ShadowProjection(mapIndex int) uniform.Camera {
panic("todo")
}
type PointState struct {
object.ComponentState
PointArgs
}
func (lit *Point) Serialize(enc object.Encoder) error {
return enc.Encode(PointState{
// send help
ComponentState: object.NewComponentState(lit.Component),
PointArgs: PointArgs{
Color: lit.Color.Get(),
Intensity: lit.Intensity.Get(),
Range: lit.Range.Get(),
},
})
}
func DeserializePoint(dec object.Decoder) (object.Component, error) {
var state PointState
if err := dec.Decode(&state); err != nil {
return nil, err
}
obj := NewPoint(state.PointArgs)
obj.Component = state.ComponentState.New()
return obj, nil
}