90 lines
2.0 KiB
Go
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
|
||
|
|
}
|