/
gradientParticle.go
51 lines (40 loc) · 1.36 KB
/
gradientParticle.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package particle
import (
"image"
"image/color"
"image/draw"
"github.com/oakmound/oak/render"
)
// A GradientParticle has a gradient from one color to another
type GradientParticle struct {
ColorParticle
startColor2 color.Color
endColor2 color.Color
}
// Draw redirects to DrawOffset
func (gp *GradientParticle) Draw(buff draw.Image) {
gp.DrawOffset(buff, 0, 0)
}
// DrawOffset redirects to DrawOffsetGen
func (gp *GradientParticle) DrawOffset(buff draw.Image, xOff, yOff float64) {
gp.DrawOffsetGen(gp.GetBaseParticle().Src.Generator, buff, xOff, yOff)
}
// DrawOffsetGen draws a particle with it's generator's variables
func (gp *GradientParticle) DrawOffsetGen(generator Generator, buff draw.Image, xOff, yOff float64) {
gen := generator.(*GradientGenerator)
progress := gp.Life / gp.totalLife
c1 := render.GradientColorAt(gp.startColor, gp.endColor, progress)
c2 := render.GradientColorAt(gp.startColor2, gp.endColor2, progress)
img := image.NewRGBA64(image.Rect(0, 0, gp.size, gp.size))
for i := 0; i < gp.size; i++ {
for j := 0; j < gp.size; j++ {
if gen.Shape.In(i, j, gp.size) {
progress := gen.ProgressFunction(i, j, gp.size, gp.size)
c := render.GradientColorAt(c1, c2, progress)
img.SetRGBA64(i, j, c)
}
}
}
halfSize := float64(gp.size / 2)
render.ShinyDraw(buff, img, int((xOff+gp.X())-halfSize), int((yOff+gp.Y())-halfSize))
}