initial working sketch in go on raylib
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
vendor/
|
||||||
61
flake.lock
generated
Normal file
61
flake.lock
generated
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731533236,
|
||||||
|
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1765363881,
|
||||||
|
"narHash": "sha256-3C3xWn8/2Zzr7sxVBmpc1H1QfxjNfta5IMFe3O9ZEPw=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "d2b1213bf5ec5e62d96b003ab4b5cbc42abfc0d0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-25.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
100
flake.nix
Normal file
100
flake.nix
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
{
|
||||||
|
description = "Go + raylib-go sketch project";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{
|
||||||
|
self,
|
||||||
|
nixpkgs,
|
||||||
|
flake-utils,
|
||||||
|
}:
|
||||||
|
flake-utils.lib.eachDefaultSystem (
|
||||||
|
system:
|
||||||
|
let
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
|
||||||
|
# Your Go module name (optional; buildGoModule can infer from go.mod)
|
||||||
|
pname = "sumi";
|
||||||
|
version = "0.1.0";
|
||||||
|
|
||||||
|
# Common native deps for raylib + windowing/audio.
|
||||||
|
# raylib itself in nixpkgs already brings many deps, but being explicit
|
||||||
|
# here makes devShell + builds more predictable.
|
||||||
|
nativeDeps = with pkgs; [
|
||||||
|
pkg-config
|
||||||
|
];
|
||||||
|
|
||||||
|
raylibDeps = with pkgs; [
|
||||||
|
raylib
|
||||||
|
|
||||||
|
# X11 stack (works under XWayland too)
|
||||||
|
xorg.libX11
|
||||||
|
xorg.libXcursor
|
||||||
|
xorg.libXi
|
||||||
|
xorg.libXinerama
|
||||||
|
xorg.libXrandr
|
||||||
|
|
||||||
|
# Wayland stack (raylib/glfw can use this depending on build/options)
|
||||||
|
wayland
|
||||||
|
libxkbcommon
|
||||||
|
|
||||||
|
# GL + audio
|
||||||
|
mesa
|
||||||
|
alsa-lib
|
||||||
|
pulseaudio
|
||||||
|
];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
packages.default = pkgs.buildGoModule {
|
||||||
|
inherit pname version;
|
||||||
|
|
||||||
|
src = self;
|
||||||
|
|
||||||
|
# raylib-go uses CGO to link against libraylib
|
||||||
|
env.CGO_ENABLED = 1;
|
||||||
|
|
||||||
|
# GOFLAGS = [ "-mod=mod" ];
|
||||||
|
# proxyVendor = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = nativeDeps;
|
||||||
|
buildInputs = raylibDeps;
|
||||||
|
|
||||||
|
# If your main package isn’t at repo root, set this (examples):
|
||||||
|
# subPackages = [ "./cmd/sketch" ];
|
||||||
|
|
||||||
|
# First build will fail with a message containing the correct hash.
|
||||||
|
vendorHash = "sha256-pcNGzxHripkn9lX2R9O29nYvR+hWLxIev4KJmEhQwC8=";
|
||||||
|
|
||||||
|
# Optional: strip for smaller binaries
|
||||||
|
ldflags = [
|
||||||
|
"-s"
|
||||||
|
"-w"
|
||||||
|
];
|
||||||
|
|
||||||
|
doCheck = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
devShells.default = pkgs.mkShell {
|
||||||
|
# Tools you want while hacking
|
||||||
|
packages = with pkgs; [
|
||||||
|
go
|
||||||
|
gopls
|
||||||
|
delve
|
||||||
|
gotools
|
||||||
|
];
|
||||||
|
|
||||||
|
nativeBuildInputs = nativeDeps;
|
||||||
|
buildInputs = raylibDeps;
|
||||||
|
|
||||||
|
# Helps CGO find headers/libs
|
||||||
|
shellHook = ''
|
||||||
|
export CGO_ENABLED=1
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
14
go.mod
Normal file
14
go.mod
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
module github.com/d2fn/sumi
|
||||||
|
|
||||||
|
go 1.22
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/gen2brain/raylib-go/raylib v0.55.1
|
||||||
|
github.com/ojrac/opensimplex-go v1.0.2
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/ebitengine/purego v0.7.1 // indirect
|
||||||
|
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
|
||||||
|
golang.org/x/sys v0.20.0 // indirect
|
||||||
|
)
|
||||||
10
go.sum
Normal file
10
go.sum
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
github.com/ebitengine/purego v0.7.1 h1:6/55d26lG3o9VCZX8lping+bZcmShseiqlh2bnUDiPA=
|
||||||
|
github.com/ebitengine/purego v0.7.1/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
|
||||||
|
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=
|
||||||
|
github.com/ojrac/opensimplex-go v1.0.2 h1:l4vs0D+JCakcu5OV0kJ99oEaWJfggSc9jiLpxaWvSzs=
|
||||||
|
github.com/ojrac/opensimplex-go v1.0.2/go.mod h1:NwbXFFbXcdGgIFdiA7/REME+7n/lOf1TuEbLiZYOWnM=
|
||||||
|
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM=
|
||||||
|
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
|
||||||
|
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
|
||||||
|
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
108
main.go
Normal file
108
main.go
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/gen2brain/raylib-go/raylib"
|
||||||
|
"github.com/ojrac/opensimplex-go"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
const (
|
||||||
|
screenWidth = 2200
|
||||||
|
screenHeight = 1200
|
||||||
|
)
|
||||||
|
|
||||||
|
rl.InitWindow(screenWidth, screenHeight, "sumi sierpinski arrow")
|
||||||
|
|
||||||
|
var camera rl.Camera2D
|
||||||
|
camera.Zoom = 1.0
|
||||||
|
|
||||||
|
rl.SetTargetFPS(60)
|
||||||
|
|
||||||
|
angles := make([]float32, 1000)
|
||||||
|
noise := opensimplex.NewNormalized(0)
|
||||||
|
for i := range len(angles) {
|
||||||
|
angles[i] = float32(noise.Eval2(float64(i)*0.0001, 0.00)) * 2 - 1
|
||||||
|
fmt.Printf("angles[%d] = %.2f\n", i, angles[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
frameNum := 0
|
||||||
|
|
||||||
|
for !rl.WindowShouldClose() {
|
||||||
|
|
||||||
|
frameNum++
|
||||||
|
|
||||||
|
if rl.IsMouseButtonDown(rl.MouseRightButton) {
|
||||||
|
delta := rl.GetMouseDelta()
|
||||||
|
delta = rl.Vector2Scale(delta, -1.0/camera.Zoom)
|
||||||
|
camera.Target = rl.Vector2Add(camera.Target, delta)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Zoom based on mouse wheel
|
||||||
|
wheel := rl.GetMouseWheelMove()
|
||||||
|
if wheel != 0 {
|
||||||
|
// Get the world point that is under the mouse
|
||||||
|
mouseWorldPos := rl.GetScreenToWorld2D(rl.GetMousePosition(), camera)
|
||||||
|
|
||||||
|
// Set the offset to where the mouse is
|
||||||
|
camera.Offset = rl.GetMousePosition()
|
||||||
|
|
||||||
|
// Set the target to match, so that the camera maps the world space point
|
||||||
|
// under the cursor to the screen space point under the cursor at any zoom
|
||||||
|
camera.Target = mouseWorldPos
|
||||||
|
|
||||||
|
// Zoom increment
|
||||||
|
const zoomIncrement float32 = 0.125
|
||||||
|
|
||||||
|
camera.Zoom += (wheel * zoomIncrement)
|
||||||
|
if camera.Zoom < zoomIncrement {
|
||||||
|
camera.Zoom = zoomIncrement
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rl.BeginDrawing()
|
||||||
|
rl.ClearBackground(rl.RayWhite)
|
||||||
|
|
||||||
|
rl.BeginMode2D(camera)
|
||||||
|
|
||||||
|
rl.PushMatrix()
|
||||||
|
rl.Translatef(screenWidth/2, screenHeight/2, 0);
|
||||||
|
|
||||||
|
// initial transform by halfway again through angle array
|
||||||
|
|
||||||
|
angleIndex := frameNum%len(angles)
|
||||||
|
angle := angles[angleIndex]
|
||||||
|
|
||||||
|
initAngle := angles[(angleIndex + len(angles)/2)%len(angles)]
|
||||||
|
rl.Rotatef(250*initAngle, 0, 0, 1)
|
||||||
|
rl.Translatef(100*initAngle, 100*initAngle, 0)
|
||||||
|
|
||||||
|
for range 1000 {
|
||||||
|
rl.DrawLine(0, 0, 10, 0, rl.Black)
|
||||||
|
rl.Translatef(10, 0, 0)
|
||||||
|
rl.Rotatef(angle, 0, 0, 1)
|
||||||
|
angleIndex++
|
||||||
|
angleIndex = angleIndex%len(angles)
|
||||||
|
angle += angles[angleIndex]
|
||||||
|
}
|
||||||
|
rl.PopMatrix()
|
||||||
|
|
||||||
|
/*
|
||||||
|
rl.PushMatrix()
|
||||||
|
rl.Translatef(0, 25*50, 0)
|
||||||
|
rl.Rotatef(90, 1, 0, 0)
|
||||||
|
rl.DrawGrid(100, 50)
|
||||||
|
rl.PopMatrix()
|
||||||
|
*/
|
||||||
|
|
||||||
|
rl.EndMode2D()
|
||||||
|
|
||||||
|
rl.DrawText("Mouse right button drag to move, mouse wheel to zoom", 10, 10, 20, rl.White)
|
||||||
|
|
||||||
|
rl.EndDrawing()
|
||||||
|
}
|
||||||
|
|
||||||
|
rl.CloseWindow()
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user