diff --git a/contour_layer.go b/contour_layer.go index 081555f..244c7a1 100644 --- a/contour_layer.go +++ b/contour_layer.go @@ -11,10 +11,11 @@ type ContourLayer struct { maxActors uint32 actors []*Actor actorIndex uint32 + actorColor rl.Color rng *rand.Rand } -func NewContourLayer(sketch *Sketch, rng *rand.Rand, field Field) *ContourLayer { +func NewContourLayer(sketch *Sketch, rng *rand.Rand, field Field, color rl.Color) *ContourLayer { maxActors := 200000 @@ -25,15 +26,14 @@ func NewContourLayer(sketch *Sketch, rng *rand.Rand, field Field) *ContourLayer field: field, actors: actors, maxActors: uint32(maxActors), + actorColor: color, actorIndex: 0, } - //layer.AddActors(1, sketch.sourceWidth, sketch.sourceHeight) - return &layer } -func (s *ContourLayer) AddActors(n, sourceWidth, sourceHeight int32) { +func (s *ContourLayer) AddActors(color rl.Color, n, sourceWidth, sourceHeight int32) { for range n { x := s.rng.Int31() % sourceWidth y := s.rng.Int31() % sourceHeight @@ -42,7 +42,7 @@ func (s *ContourLayer) AddActors(n, sourceWidth, sourceHeight int32) { position: rl.Vector2{X: float32(x), Y: float32(y)}, field: s.field, stepSize: 1, - color: rl.NewColor(11, 35, 176, 50), + color: s.actorColor, } s.actors[s.actorIndex] = newActor s.actorIndex = (s.actorIndex + 1) % s.maxActors @@ -50,7 +50,7 @@ func (s *ContourLayer) AddActors(n, sourceWidth, sourceHeight int32) { } func (s *ContourLayer) Update(ctx *RenderCtx) { - s.AddActors(100, ctx.SourceWidth, ctx.SourceHeight) + s.AddActors(s.actorColor, 100, ctx.SourceWidth, ctx.SourceHeight) } func (s *ContourLayer) Draw(ctx *RenderCtx) { diff --git a/internal/graphics/graphics.go b/internal/graphics/graphics.go new file mode 100644 index 0000000..d2cae53 --- /dev/null +++ b/internal/graphics/graphics.go @@ -0,0 +1,62 @@ +package graphics + +import ( + "math/rand" + rl "github.com/gen2brain/raylib-go/raylib" +) + +var ( + FlourescentHues = []float32{ + 0, // hot magenta-red + 30, // neon orange + 60, // acid yellow + 120, // laser green + 180, // cyan + 210, // electric blue + 270, // ultraviolet purple + } + FlourescentColors = makeFlourescentColors() +) + +func makeFlourescentColors() []rl.Color { + fc := make([]rl.Color, len(FlourescentHues)) + for i, hue := range(FlourescentHues) { + fc[i] = rl.ColorFromHSV(hue, 1.0, 1.0) + } + return fc +} + +type ColorCycle interface { + Next() rl.Color +} + +type ArrayBackedColorCycle struct { + colors []rl.Color + index int +} + +func NewFixedColorCycle(colors []rl.Color) ArrayBackedColorCycle { + return ArrayBackedColorCycle { + colors: colors, + index: 0, + } +} + +func (c ArrayBackedColorCycle) Shuffle(seed int64) ColorCycle { + r := rand.New(rand.NewSource(seed)) + cprime := &ArrayBackedColorCycle { + colors: make([]rl.Color, len(c.colors)), + index: 0, + } + r.Shuffle(len(c.colors), func(i, j int) { + cprime.colors[i] = c.colors[j] + }) + return cprime +} + +func (c *ArrayBackedColorCycle) Next() rl.Color { + color := c.colors[c.index] + c.index = (c.index + 1) % len(c.colors) + return color +} + diff --git a/main.go b/main.go index bb430be..d8f3109 100644 --- a/main.go +++ b/main.go @@ -1,13 +1,15 @@ package main import ( - // "fmt" + "fmt" "log" "math/rand" "os" "time" "flag" + g "github.com/d2fn/sumi/internal/graphics" + gui "github.com/gen2brain/raylib-go/raygui" rl "github.com/gen2brain/raylib-go/raylib" //"github.com/ojrac/opensimplex-go" @@ -46,12 +48,16 @@ func main() { BlendModeToggleGroupActive := int32(0) + // reproducable flourescent color cycle + colorCycle := g.NewFixedColorCycle(g.FlourescentColors)//.Shuffle(0) + rl.SetTargetFPS(60) t0 := time.Now() rng := rand.New(rand.NewSource(0)) - //imageField := NewImageField("/home/d/Dropbox/art/data/david.png") - imageField := NewImageField("/home/d/Dropbox/art/data/bassrockastro/Photo Dec 24 2025, 5 58 23 PM.jpg") + imageField := NewImageField("/home/d/Dropbox/art/data/david.png") + //imageField := NewImageField("/home/d/Dropbox/art/data/bassrockastro/Photo Dec 24 2025, 5 58 23 PM.jpg") + //imageField := NewImageField("/home/d/Dropbox/art/data/bassrockastro/andromeda.jpg") //imageField := NewImageField("/home/d/Dropbox/art/data/moses_statue.jpg") field := &TranslateField { @@ -66,11 +72,24 @@ func main() { sketch := NewSketch(sourceWidth, sourceHeight) + fieldColor := colorCycle.Next() + fmt.Printf("field color = %v\n", fieldColor) + sketch.AddColorLayer("background-magenta", rl.Magenta) sketch.AddColorLayer("background-black", rl.Black) - sketch.AddLayer("field", &FieldLayer{field: field, loColor: rl.NewColor(0, 0, 0, 0), hiColor: rl.Yellow, dirty: true}) - contourLayer := NewContourLayer(&sketch, rng, field) + sketch.AddLayer("field", &FieldLayer{field: field, loColor: rl.NewColor(0, 0, 0, 0), hiColor: fieldColor, dirty: true}) + actorColor := colorCycle.Next() + + fmt.Printf("actor color = %v\n", actorColor) + + hsv := rl.ColorToHSV(actorColor); + hsv.Z *= 0.7 + actorColor = rl.ColorFromHSV(hsv.X, hsv.Y, hsv.Z) + actorColor.A = 50 + //NewColor(11, 35, 176, 50), + //r + contourLayer := NewContourLayer(&sketch, rng, field, actorColor) sketch.AddLayer("contours", contourLayer) sketch.AddLayer("sierpinski-arrowhead", sierpinskiLayer) // aurora := NewImageLayer("/home/d/Dropbox/photos/Events/2025/Aurora/Photo Nov 11 2025, 9 52 03 PM.jpg")