Init, test raylib & math things
This commit is contained in:
commit
d2f0abff6a
5 changed files with 200 additions and 0 deletions
44
bouncing_ball.go
Normal file
44
bouncing_ball.go
Normal 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
10
go.mod
Normal 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
8
go.sum
Normal 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
67
sdf.go
Normal 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
71
vec3.go
Normal 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
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue