add gradient and random effect.
This commit is contained in:
+51
-9
@@ -3,6 +3,7 @@ package device
|
||||
import (
|
||||
"fmt"
|
||||
"git.aiterp.net/lucifer3/server/internal/color"
|
||||
"git.aiterp.net/lucifer3/server/internal/gentools"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -13,24 +14,65 @@ type State struct {
|
||||
Color *color.Color `json:"color"`
|
||||
}
|
||||
|
||||
func (d State) String() string {
|
||||
func (s State) String() string {
|
||||
parts := make([]string, 0, 4)
|
||||
if d.Power != nil {
|
||||
parts = append(parts, fmt.Sprintf("power:%t", *d.Power))
|
||||
if s.Power != nil {
|
||||
parts = append(parts, fmt.Sprintf("power:%t", *s.Power))
|
||||
}
|
||||
if d.Temperature != nil {
|
||||
parts = append(parts, fmt.Sprintf("temperature:%f", *d.Temperature))
|
||||
if s.Temperature != nil {
|
||||
parts = append(parts, fmt.Sprintf("temperature:%f", *s.Temperature))
|
||||
}
|
||||
if d.Intensity != nil {
|
||||
parts = append(parts, fmt.Sprintf("intensity:%.2f", *d.Intensity))
|
||||
if s.Intensity != nil {
|
||||
parts = append(parts, fmt.Sprintf("intensity:%.2f", *s.Intensity))
|
||||
}
|
||||
if d.Color != nil {
|
||||
parts = append(parts, fmt.Sprintf("color:%s", d.Color.String()))
|
||||
if s.Color != nil {
|
||||
parts = append(parts, fmt.Sprintf("color:%s", s.Color.String()))
|
||||
}
|
||||
|
||||
return fmt.Sprint("(", strings.Join(parts, ", "), ")")
|
||||
}
|
||||
|
||||
func (s State) Interpolate(s2 State, f float64) State {
|
||||
newState := State{}
|
||||
if s.Color != nil && s2.Color != nil {
|
||||
newState.Color = gentools.Ptr(s.Color.Interpolate(*s2.Color, f))
|
||||
} else if s.Color != nil {
|
||||
newState.Color = gentools.ShallowCopy(s.Color)
|
||||
} else if s2.Color != nil {
|
||||
newState.Color = gentools.ShallowCopy(s2.Color)
|
||||
}
|
||||
|
||||
if s.Intensity != nil && s2.Intensity != nil {
|
||||
newState.Intensity = gentools.Ptr((*s.Intensity * f) + (*s2.Intensity * (1.0 - f)))
|
||||
} else if s.Intensity != nil {
|
||||
newState.Intensity = gentools.ShallowCopy(s.Intensity)
|
||||
} else if s2.Intensity != nil {
|
||||
newState.Intensity = gentools.ShallowCopy(s2.Intensity)
|
||||
}
|
||||
|
||||
if s.Temperature != nil && s2.Temperature != nil {
|
||||
newState.Temperature = gentools.Ptr((*s.Temperature * f) + (*s2.Temperature * (1.0 - f)))
|
||||
} else if s.Temperature != nil {
|
||||
newState.Temperature = gentools.ShallowCopy(s.Temperature)
|
||||
} else if s2.Temperature != nil {
|
||||
newState.Temperature = gentools.ShallowCopy(s2.Temperature)
|
||||
}
|
||||
|
||||
if s.Power != nil && s2.Power != nil {
|
||||
if f < 0.5 {
|
||||
newState.Power = gentools.ShallowCopy(s.Power)
|
||||
} else {
|
||||
newState.Power = gentools.ShallowCopy(s2.Power)
|
||||
}
|
||||
} else if s.Power != nil {
|
||||
newState.Power = gentools.ShallowCopy(s.Power)
|
||||
} else if s2.Power != nil {
|
||||
newState.Power = gentools.ShallowCopy(s2.Power)
|
||||
}
|
||||
|
||||
return newState
|
||||
}
|
||||
|
||||
type PresenceState struct {
|
||||
Present bool `json:"present"`
|
||||
AbsenceSeconds float64 `json:"absenceSeconds,omitempty"`
|
||||
|
||||
Reference in New Issue
Block a user