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