Init, test raylib & math things

This commit is contained in:
Crizomb 2025-09-24 05:07:48 +02:00
commit d2f0abff6a
5 changed files with 200 additions and 0 deletions

44
bouncing_ball.go Normal file
View file

@ -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()
}
}

10
go.mod Normal file
View file

@ -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
)

8
go.sum Normal file
View file

@ -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=

67
sdf.go Normal file
View file

@ -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()
}

71
vec3.go Normal file
View file

@ -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
}