commit d2f0abff6ab604380dea749f5b34769a8234f5e7 Author: Crizomb <62544756+Crizomb@users.noreply.github.com> Date: Wed Sep 24 05:07:48 2025 +0200 Init, test raylib & math things diff --git a/bouncing_ball.go b/bouncing_ball.go new file mode 100644 index 0000000..fb8d62b --- /dev/null +++ b/bouncing_ball.go @@ -0,0 +1,44 @@ +package main + +import ( + rl "github.com/gen2brain/raylib-go/raylib" +) + +func main() { + screenWidth := int32(800) + screenHeight := int32(450) + + rl.InitWindow(screenWidth, screenHeight, "Bouncing Ball in Go - raylib") + defer rl.CloseWindow() + + rl.SetTargetFPS(60) + + // Ball properties + ballRadius := float32(20) + ballPos := rl.NewVector2(float32(screenWidth)/2.0, float32(screenHeight)/2.0) + ballSpeed := rl.NewVector2(4, 3) + ballColor := rl.Red + + for !rl.WindowShouldClose() { + // Update + ballPos.X += ballSpeed.X + ballPos.Y += ballSpeed.Y + + // Bounce on edges + if ballPos.X >= float32(screenWidth)-ballRadius || ballPos.X <= ballRadius { + ballSpeed.X *= -1 + } + if ballPos.Y >= float32(screenHeight)-ballRadius || ballPos.Y <= ballRadius { + ballSpeed.Y *= -1 + } + + // Draw + rl.BeginDrawing() + rl.ClearBackground(rl.RayWhite) + + rl.DrawText("Bouncing Ball Example", 10, 10, 20, rl.DarkGray) + rl.DrawCircleV(ballPos, ballRadius, ballColor) + + rl.EndDrawing() + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..468a4ae --- /dev/null +++ b/go.mod @@ -0,0 +1,10 @@ +module test_raylib + +go 1.24.7 + +require ( + github.com/ebitengine/purego v0.9.0 // indirect + github.com/gen2brain/raylib-go/raylib v0.55.1 // indirect + golang.org/x/exp v0.0.0-20250911091902-df9299821621 // indirect + golang.org/x/sys v0.36.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..4076750 --- /dev/null +++ b/go.sum @@ -0,0 +1,8 @@ +github.com/ebitengine/purego v0.9.0 h1:mh0zpKBIXDceC63hpvPuGLiJ8ZAa3DfrFTudmfi8A4k= +github.com/ebitengine/purego v0.9.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/gen2brain/raylib-go/raylib v0.55.1 h1:1rdc10WvvYjtj7qijHnV9T38/WuvlT6IIL+PaZ6cNA8= +github.com/gen2brain/raylib-go/raylib v0.55.1/go.mod h1:BaY76bZk7nw1/kVOSQObPY1v1iwVE1KHAGMfvI6oK1Q= +golang.org/x/exp v0.0.0-20250911091902-df9299821621 h1:2id6c1/gto0kaHYyrixvknJ8tUK/Qs5IsmBtrc+FtgU= +golang.org/x/exp v0.0.0-20250911091902-df9299821621/go.mod h1:TwQYMMnGpvZyc+JpB/UAuTNIsVJifOlSkrZkhcvpVUk= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= diff --git a/sdf.go b/sdf.go new file mode 100644 index 0000000..1220641 --- /dev/null +++ b/sdf.go @@ -0,0 +1,67 @@ +package main + +const EPS = 0.001 + +type SDF interface { + Distance(Vector3) float64 +} + +func Gradient(sdf SDF, p Vector3, eps float64) Vector3 { + dx := (sdf.Distance(p.Add(Vector3{X: eps})) - sdf.Distance(p.Add(Vector3{X: -eps}))) / (2 * eps) + dy := (sdf.Distance(p.Add(Vector3{Y: eps})) - sdf.Distance(p.Add(Vector3{Y: -eps}))) / (2 * eps) + dz := (sdf.Distance(p.Add(Vector3{Z: eps})) - sdf.Distance(p.Add(Vector3{Z: -eps}))) / (2 * eps) + return Vector3{X: dx, Y: dy, Z: dz} +} + +// Some transformations see https://iquilezles.org/articles/distfunctions/ + +type translatedSDF struct { + primitive SDF + translate Vector3 +} + +func (s translatedSDF) Distance(p Vector3) float64 { + return s.primitive.Distance(p.Sub(s.translate)) +} + +type rotatedSDF struct { + primitive SDF + rotVector Vector3 + angle float64 +} + +func (s rotatedSDF) Distance(p Vector3) float64 { + rotated_p := rotate(p, s.rotVector, s.angle) + return s.primitive.Distance(rotated_p) +} + +type scaledSDF struct { + primitive SDF + scale float64 +} + +func (s scaledSDF) Distance(p Vector3) float64 { + return s.primitive.Distance(p.Scale(1/s.scale)) * s.scale +} + +type infiniteRep struct { + primitive SDF + cellSize Vector3 +} + +// TODO +// func (s infiniteRep) Distance(p Vector3) float64 { +// x, y, z := p.Unpack() +// sx, sy, sz := s.cellSize.Unpack() +// } + +// Sphere + +type Sphere struct { + center Vector3 + radius float64 +} + +func (s Sphere) Distance(p Vector3) float64 { + return p.Sub(s.center).Length() +} diff --git a/vec3.go b/vec3.go new file mode 100644 index 0000000..2ed1396 --- /dev/null +++ b/vec3.go @@ -0,0 +1,71 @@ +package main + +import ( + "math" +) + +type Vector3 struct { + X, Y, Z float64 +} + +func (u Vector3) Add(v Vector3) Vector3 { + return Vector3{u.X + v.X, u.Y + v.Y, u.Z + v.Z} +} + +func (u Vector3) Neg() Vector3 { + return Vector3{-u.X, -u.Y, -u.Z} +} + +func (u Vector3) Sub(v Vector3) Vector3 { + return u.Add(v.Neg()) +} + +func (u Vector3) Scale(a float64) Vector3 { + return Vector3{a * u.X, a * u.Y, a * u.Z} +} + +func (u Vector3) Dot(v Vector3) float64 { + return u.X*v.X + u.Y*v.Y + u.Z*v.Z +} + +func (u Vector3) Cross(v Vector3) Vector3 { + return Vector3{u.Y*v.Z - u.Z*v.Y, u.Z*v.X - u.X*v.Z, u.X*v.Y - u.Y*v.X} +} + +func (u Vector3) LengthSquared() float64 { + return u.Dot(u) +} + +func (u Vector3) Length() float64 { + return math.Sqrt(u.LengthSquared()) +} + +func (u Vector3) Normalized() Vector3 { + return u.Scale(1.0 / u.Length()) +} + +func (u Vector3) Round() Vector3 { + round := math.Round + return Vector3{round(u.X), round(u.Y), round(u.Z)} +} + +// i incident, n normal. Both vector should be normalized +func Reflect(i Vector3, n Vector3) Vector3 { + y := i.Dot(n) + return i.Add(n.Scale(2 * y)) +} + +// Todo : Refract + +// Rodrigues' rotation formula. rotVector should be normalized +func rotate(u Vector3, rotVector Vector3, angle float64) Vector3 { + cos, sin := math.Cos(angle), math.Sin(angle) + vec1 := u.Scale(cos) + vec2 := rotVector.Cross(u).Scale(sin) + vec3 := rotVector.Scale(rotVector.Dot(u) * (1 - cos)) + return vec1.Add(vec2).Add(vec3) +} + +func (v Vector3) Unpack() (float64, float64, float64) { + return v.X, v.Y, v.Z +}