Compare commits

..

No commits in common. "master" and "2.0-dev" have entirely different histories.

580 changed files with 255086 additions and 341527 deletions

23
.appveyor.yml Normal file
View file

@ -0,0 +1,23 @@
version: "{build}"
clone_depth: 1
clone_folder: c:\gopath\src\github.com\gen2brain\raylib-go
environment:
GOPATH: c:\gopath
MSYS_PATH: c:\msys64
CGO_ENABLED: 1
CGO_CFLAGS: -g -O2 -Ic:\msys64\mingw32\include
GOARCH: 386
CC: i686-w64-mingw32-gcc
install:
- echo %GOPATH%
- echo %MSYS_PATH%
- set PATH=%GOPATH%\bin;c:\go\bin;%MSYS_PATH%\usr\bin;%MSYS_PATH%\mingw32\bin;%PATH%
- go version
- go env
build_script:
- bash -lc "cd /c/gopath/src/github.com/gen2brain/raylib-go && go get -t ./... && make"

4
.gitignore vendored
View file

@ -1,4 +0,0 @@
# IDE folders
.idea
.vsc
.vs

17
.travis.yml Normal file
View file

@ -0,0 +1,17 @@
language: go
os:
- linux
#- osx
go:
- 1.9.x
before_install:
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then
sudo apt-get update -y;
sudo apt-get install libasound2-dev libxi-dev libxinerama-dev libxcursor-dev libxxf86vm-dev libxrandr-dev -y;
fi
install:
- go get -t ./...

11
Makefile Normal file
View file

@ -0,0 +1,11 @@
PACKAGES= raylib raygui raymath easings physics rres
GO?= go
all: packages
packages:
@for pkg in ${PACKAGES}; do \
echo "Building package github.com/gen2brain/raylib-go/$$pkg..."; \
${GO} build github.com/gen2brain/raylib-go/$$pkg || exit 1; \
done

110
README.md
View file

@ -1,134 +1,88 @@
![logo](https://git.terah.dev/UnrealXR/raylib-go/raw/branch/master/assets/raylib-go_256x256.png) ![logo](https://goo.gl/XlIcXz)
## raylib-go ## raylib-go
[![Build Status](https://git.terah.dev/UnrealXR/raylib-go/actions/workflows/build.yml/badge.svg)](https://git.terah.dev/UnrealXR/raylib-go/actions) [![TravisCI Build Status](https://travis-ci.org/gen2brain/raylib-go.svg?branch=master)](https://travis-ci.org/gen2brain/raylib-go)
[![GoDoc](https://godoc.org/git.terah.dev/UnrealXR/raylib-go/raylib?status.svg)](https://godoc.org/git.terah.dev/UnrealXR/raylib-go/raylib) [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/qv2iggrqtgl7xhr0?svg=true)](https://ci.appveyor.com/project/gen2brain/raylib-go)
[![Go Report Card](https://goreportcard.com/badge/git.terah.dev/UnrealXR/raylib-go/raylib)](https://goreportcard.com/report/git.terah.dev/UnrealXR/raylib-go/raylib) [![GoDoc](https://godoc.org/github.com/gen2brain/raylib-go/raylib?status.svg)](https://godoc.org/github.com/gen2brain/raylib-go/raylib)
[![Examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://git.terah.dev/UnrealXR/raylib-go/src/branch/master/examples) [![Go Report Card](https://goreportcard.com/badge/github.com/gen2brain/raylib-go)](https://goreportcard.com/report/github.com/gen2brain/raylib-go)
[![Examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/gen2brain/raylib-go/tree/master/examples)
Golang bindings for [raylib](http://www.raylib.com/), a simple and easy-to-use library to enjoy videogames programming. Golang bindings for [raylib](http://www.raylib.com/), a simple and easy-to-use library to learn videogames programming.
This is a fork of [gen2brain's `raylib-go` bindings](https://github.com/gen2brain/raylib-go) to add [DRM leasing](https://wayland.app/protocols/drm-lease-v1) support. ![screenshot](https://goo.gl/q6DAoy)
raylib C source code is included and compiled together with bindings. Note that the first build can take a few minutes.
It is also possible to use raylib-go without cgo (Windows only; see requirements below).
### Requirements ### Requirements
* [GLFW](http://www.glfw.org/) is included as part of the Go package, but you need to make sure you have dependencies installed, see below.
##### Ubuntu ##### Ubuntu
apt-get install libgl1-mesa-dev libxi-dev libxcursor-dev libxrandr-dev libxinerama-dev libwayland-dev libxkbcommon-dev apt-get install libgl1-mesa-dev libxi-dev libxinerama-dev libxcursor-dev libxxf86vm-dev libxrandr-dev
##### Fedora ##### Fedora
dnf install mesa-libGL-devel libXi-devel libXcursor-devel libXrandr-devel libXinerama-devel wayland-devel libxkbcommon-devel dnf install mesa-libGL-devel libXi-devel libXcursor-devel libXrandr-devel libXinerama-devel
##### macOS ##### macOS
On macOS, you need Xcode or Command Line Tools for Xcode (if you have `brew` installed, you already have this). On macOS you need Xcode or Command Line Tools for Xcode.
##### Windows ##### Windows
###### cgo
On Windows you need C compiler, like [Mingw-w64](https://mingw-w64.org) or [TDM-GCC](http://tdm-gcc.tdragon.net/). On Windows you need C compiler, like [Mingw-w64](https://mingw-w64.org) or [TDM-GCC](http://tdm-gcc.tdragon.net/).
You can also build binary in [MSYS2](https://msys2.github.io/) shell. You can also build binary in [MSYS2](https://msys2.github.io/) shell.
To remove console window, build with `-ldflags "-H=windowsgui"`.
###### purego (without cgo, i.e. CGO_ENABLED=0)
Download the raylib.dll from the assets on the [releases page](https://github.com/raysan5/raylib/releases). It is contained in the `raylib-*_win64_msvc*.zip`.
Put the raylib.dll into the root folder of your project or copy it into `C:\Windows\System32` for a system-wide installation.
It is also possible to build the DLL yourself. You can find more info at [raylib's wiki](https://github.com/raysan5/raylib/wiki/Working-on-Windows).
##### Android ##### Android
[Android example](https://git.terah.dev/UnrealXR/raylib-go/tree/master/examples/others/android/example). [Android example](https://github.com/gen2brain/raylib-go/tree/master/examples/others/android/example).
##### Wasm ##### Raspberry Pi
For web bindings, refer to [Raylib-Go-Wasm](https://github.com/BrownNPC/Raylib-Go-Wasm); it should be largely compatible with this repository.
[RPi example](https://github.com/gen2brain/raylib-go/tree/master/examples/others/rpi/basic_window).
### Installation ### Installation
go get -v -u git.terah.dev/UnrealXR/raylib-go/raylib go get -v -u github.com/gen2brain/raylib-go/raylib
### Build tags ### Build tags
* `drm` - build for Linux native [DRM](https://en.wikipedia.org/wiki/Direct_Rendering_Manager) mode, including Raspberry Pi 4 and other devices (PLATFORM_DRM)
* `drm_disable_input` - disables keyboard input capabilities for the DRM backend. Requires the `drm` build tag as a prerequisite
* `drm_leasing` - enables Wayland DRM leasing capabilties. Requires the `drm` build tag as a prerequisite
* `sdl` - build for [SDL](https://github.com/libsdl-org/SDL) backend (PLATFORM_DESKTOP_SDL)
* `sdl3` - build for [SDL3](https://github.com/libsdl-org/SDL) backend (PLATFORM_DESKTOP_SDL3)
* `rgfw` - build for [RGFW](https://github.com/ColleagueRiley/RGFW) backend (PLATFORM_DESKTOP_RGFW)
* `noaudio` - disables audio functions * `noaudio` - disables audio functions
* `opengl43` - uses OpenGL 4.3 backend
* `opengl21` - uses OpenGL 2.1 backend (default is 3.3 on desktop) * `opengl21` - uses OpenGL 2.1 backend (default is 3.3 on desktop)
* `opengl11` - uses OpenGL 1.1 backend (pseudo OpenGL 1.1 style) * `opengl11` - uses OpenGL 1.1 backend (pseudo OpenGL 1.1 style)
* `es2` - uses OpenGL ES 2.0 backend (can be used to link against [Google's ANGLE](https://github.com/google/angle)) * `wayland` - builds against Wayland libraries
* `es3` - experimental support for OpenGL ES 3.0
* `x11` - force X11 compatibility mode on Wayland (PLATFORM_DESKTOP/GLFW)
* `wayland` - force Wayland only mode (PLATFORM_DESKTOP/GLFW)
### Documentation ### Documentation
Documentation on [GoDoc](https://godoc.org/git.terah.dev/UnrealXR/raylib-go/raylib). Also check raylib [cheatsheet](http://www.raylib.com/cheatsheet/cheatsheet.html). If you have problems or need assistance there is an active community in the #raylib-go channel of the [Raylib Discord Server](https://discord.gg/raylib) that can help. Documentation on [GoDoc](https://godoc.org/github.com/gen2brain/raylib-go/raylib). Also check raylib [cheatsheet](http://www.raylib.com/cheatsheet/cheatsheet.html).
### Example ### Example
```go ```go
package main package main
import rl "git.terah.dev/UnrealXR/raylib-go/raylib" import "github.com/gen2brain/raylib-go/raylib"
func main() { func main() {
rl.InitWindow(800, 450, "raylib [core] example - basic window") raylib.InitWindow(800, 450, "raylib [core] example - basic window")
defer rl.CloseWindow()
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.DrawText("Congrats! You created your first window!", 190, 200, 20, rl.LightGray)
rl.EndDrawing() raylib.DrawText("Congrats! You created your first window!", 190, 200, 20, raylib.LightGray)
raylib.EndDrawing()
} }
raylib.CloseWindow()
} }
``` ```
Check more [examples](https://git.terah.dev/UnrealXR/raylib-go/tree/master/examples) organized by raylib modules. Check more [examples](https://github.com/gen2brain/raylib-go/tree/master/examples) organized by raylib modules.
### Cross-compile (Linux)
To cross-compile for Windows install [MinGW](https://www.mingw-w64.org/) toolchain.
```
$ CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc GOOS=windows GOARCH=amd64 go build -ldflags "-s -w"
$ file basic_window.exe
basic_window.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows, 11 sections
$ CGO_ENABLED=1 CC=i686-w64-mingw32-gcc GOOS=windows GOARCH=386 go build -ldflags "-s -w"
$ file basic_window.exe
basic_window.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows, 9 sections
```
To cross-compile for macOS install [OSXCross](https://github.com/tpoechtrager/osxcross) toolchain.
```
$ CGO_ENABLED=1 CC=x86_64-apple-darwin21.1-clang GOOS=darwin GOARCH=amd64 go build -ldflags "-linkmode external -s -w '-extldflags=-mmacosx-version-min=10.15'"
$ file basic_window
basic_window: Mach-O 64-bit x86_64 executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL>
$ CGO_ENABLED=1 CC=aarch64-apple-darwin21.1-clang GOOS=darwin GOARCH=arm64 go build -ldflags "-linkmode external -s -w '-extldflags=-mmacosx-version-min=12.0.0'"
$ file basic_window
basic_window: Mach-O 64-bit arm64 executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|PIE>
```
### License ### License
raylib-go is licensed under an unmodified zlib/libpng license. View [LICENSE](https://git.terah.dev/UnrealXR/raylib-go/blob/master/LICENSE). raylib-go is licensed under an unmodified zlib/libpng license. View [LICENSE](https://github.com/gen2brain/raylib-go/blob/master/LICENSE).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

View file

@ -1,7 +1,7 @@
## easings [![GoDoc](https://godoc.org/git.terah.dev/UnrealXR/raylib-go/easings?status.svg)](https://godoc.org/git.terah.dev/UnrealXR/raylib-go/easings) ## easings [![GoDoc](https://godoc.org/github.com/gen2brain/raylib-go/easings?status.svg)](https://godoc.org/github.com/gen2brain/raylib-go/easings)
Useful easing functions for values animation. Useful easing functions for values animation.
A port of Robert Penner's [easing equations](http://robertpenner.com/easing/). A port of Robert Penner's [easing equations](http://robertpenner.com/easing/).
![Demo](../examples/easings/easings/easings.gif) ![screenshot](https://goo.gl/crzRrH)

View file

@ -10,25 +10,21 @@ import (
// Linear Easing functions // Linear Easing functions
// LinearNone easing // LinearNone easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func LinearNone(t, b, c, d float32) float32 { func LinearNone(t, b, c, d float32) float32 {
return c*t/d + b return c*t/d + b
} }
// LinearIn easing // LinearIn easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func LinearIn(t, b, c, d float32) float32 { func LinearIn(t, b, c, d float32) float32 {
return c*t/d + b return c*t/d + b
} }
// LinearOut easing // LinearOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func LinearOut(t, b, c, d float32) float32 { func LinearOut(t, b, c, d float32) float32 {
return c*t/d + b return c*t/d + b
} }
// LinearInOut easing // LinearInOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func LinearInOut(t, b, c, d float32) float32 { func LinearInOut(t, b, c, d float32) float32 {
return c*t/d + b return c*t/d + b
} }
@ -36,19 +32,16 @@ func LinearInOut(t, b, c, d float32) float32 {
// Sine Easing functions // Sine Easing functions
// SineIn easing // SineIn easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func SineIn(t, b, c, d float32) float32 { func SineIn(t, b, c, d float32) float32 {
return -c*float32(math.Cos(float64(t/d)*(math.Pi/2))) + c + b return -c*float32(math.Cos(float64(t/d)*(math.Pi/2))) + c + b
} }
// SineOut easing // SineOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func SineOut(t, b, c, d float32) float32 { func SineOut(t, b, c, d float32) float32 {
return c*float32(math.Sin(float64(t/d)*(math.Pi/2))) + b return c*float32(math.Sin(float64(t/d)*(math.Pi/2))) + b
} }
// SineInOut easing // SineInOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func SineInOut(t, b, c, d float32) float32 { func SineInOut(t, b, c, d float32) float32 {
return -c/2*(float32(math.Cos(math.Pi*float64(t/d)))-1) + b return -c/2*(float32(math.Cos(math.Pi*float64(t/d)))-1) + b
} }
@ -56,20 +49,17 @@ func SineInOut(t, b, c, d float32) float32 {
// Circular Easing functions // Circular Easing functions
// CircIn easing // CircIn easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func CircIn(t, b, c, d float32) float32 { func CircIn(t, b, c, d float32) float32 {
t = t / d t = t / d
return -c*(float32(math.Sqrt(float64(1-t*t)))-1) + b return -c*(float32(math.Sqrt(float64(1-t*t)))-1) + b
} }
// CircOut easing // CircOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func CircOut(t, b, c, d float32) float32 { func CircOut(t, b, c, d float32) float32 {
return c*float32(math.Sqrt(1-float64((t/d-1)*t))) + b return c*float32(math.Sqrt(1-float64((t/d-1)*t))) + b
} }
// CircInOut easing // CircInOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func CircInOut(t, b, c, d float32) float32 { func CircInOut(t, b, c, d float32) float32 {
t = t / d * 2 t = t / d * 2
@ -84,21 +74,18 @@ func CircInOut(t, b, c, d float32) float32 {
// Cubic Easing functions // Cubic Easing functions
// CubicIn easing // CubicIn easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func CubicIn(t, b, c, d float32) float32 { func CubicIn(t, b, c, d float32) float32 {
t = t / d t = t / d
return c*t*t*t + b return c*t*t*t + b
} }
// CubicOut easing // CubicOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func CubicOut(t, b, c, d float32) float32 { func CubicOut(t, b, c, d float32) float32 {
t = t/d - 1 t = t/d - 1
return c*(t*t*t+1) + b return c*(t*t*t+1) + b
} }
// CubicInOut easing // CubicInOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func CubicInOut(t, b, c, d float32) float32 { func CubicInOut(t, b, c, d float32) float32 {
t = t / d * 2 t = t / d * 2
if t < 1 { if t < 1 {
@ -112,21 +99,18 @@ func CubicInOut(t, b, c, d float32) float32 {
// Quadratic Easing functions // Quadratic Easing functions
// QuadIn easing // QuadIn easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func QuadIn(t, b, c, d float32) float32 { func QuadIn(t, b, c, d float32) float32 {
t = t / d t = t / d
return c*t*t + b return c*t*t + b
} }
// QuadOut easing // QuadOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func QuadOut(t, b, c, d float32) float32 { func QuadOut(t, b, c, d float32) float32 {
t = t / d t = t / d
return (-c*t*(t-2) + b) return (-c*t*(t-2) + b)
} }
// QuadInOut easing // QuadInOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func QuadInOut(t, b, c, d float32) float32 { func QuadInOut(t, b, c, d float32) float32 {
t = t / d * 2 t = t / d * 2
if t < 1 { if t < 1 {
@ -139,7 +123,6 @@ func QuadInOut(t, b, c, d float32) float32 {
// Exponential Easing functions // Exponential Easing functions
// ExpoIn easing // ExpoIn easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func ExpoIn(t, b, c, d float32) float32 { func ExpoIn(t, b, c, d float32) float32 {
if t == 0 { if t == 0 {
return b return b
@ -149,7 +132,6 @@ func ExpoIn(t, b, c, d float32) float32 {
} }
// ExpoOut easing // ExpoOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func ExpoOut(t, b, c, d float32) float32 { func ExpoOut(t, b, c, d float32) float32 {
if t == d { if t == d {
return (b + c) return (b + c)
@ -159,7 +141,6 @@ func ExpoOut(t, b, c, d float32) float32 {
} }
// ExpoInOut easing // ExpoInOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func ExpoInOut(t, b, c, d float32) float32 { func ExpoInOut(t, b, c, d float32) float32 {
if t == 0 { if t == 0 {
return b return b
@ -181,7 +162,6 @@ func ExpoInOut(t, b, c, d float32) float32 {
// Back Easing functions // Back Easing functions
// BackIn easing // BackIn easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func BackIn(t, b, c, d float32) float32 { func BackIn(t, b, c, d float32) float32 {
s := float32(1.70158) s := float32(1.70158)
t = t / d t = t / d
@ -189,7 +169,6 @@ func BackIn(t, b, c, d float32) float32 {
} }
// BackOut easing // BackOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func BackOut(t, b, c, d float32) float32 { func BackOut(t, b, c, d float32) float32 {
s := float32(1.70158) s := float32(1.70158)
t = t/d - 1 t = t/d - 1
@ -197,7 +176,6 @@ func BackOut(t, b, c, d float32) float32 {
} }
// BackInOut easing // BackInOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func BackInOut(t, b, c, d float32) float32 { func BackInOut(t, b, c, d float32) float32 {
s := float32(1.70158) s := float32(1.70158)
s = s * 1.525 s = s * 1.525
@ -214,13 +192,11 @@ func BackInOut(t, b, c, d float32) float32 {
// Bounce Easing functions // Bounce Easing functions
// BounceIn easing // BounceIn easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func BounceIn(t, b, c, d float32) float32 { func BounceIn(t, b, c, d float32) float32 {
return (c - BounceOut(d-t, 0, c, d) + b) return (c - BounceOut(d-t, 0, c, d) + b)
} }
// BounceOut easing // BounceOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func BounceOut(t, b, c, d float32) float32 { func BounceOut(t, b, c, d float32) float32 {
t = t / d t = t / d
if t < (1 / 2.75) { if t < (1 / 2.75) {
@ -238,7 +214,6 @@ func BounceOut(t, b, c, d float32) float32 {
} }
// BounceInOut easing // BounceInOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func BounceInOut(t, b, c, d float32) float32 { func BounceInOut(t, b, c, d float32) float32 {
if t < d/2 { if t < d/2 {
return BounceIn(t*2, 0, c, d)*0.5 + b return BounceIn(t*2, 0, c, d)*0.5 + b
@ -250,7 +225,6 @@ func BounceInOut(t, b, c, d float32) float32 {
// Elastic Easing functions // Elastic Easing functions
// ElasticIn easing // ElasticIn easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func ElasticIn(t, b, c, d float32) float32 { func ElasticIn(t, b, c, d float32) float32 {
if t == 0 { if t == 0 {
return b return b
@ -271,7 +245,6 @@ func ElasticIn(t, b, c, d float32) float32 {
} }
// ElasticOut easing // ElasticOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func ElasticOut(t, b, c, d float32) float32 { func ElasticOut(t, b, c, d float32) float32 {
if t == 0 { if t == 0 {
return b return b
@ -291,7 +264,6 @@ func ElasticOut(t, b, c, d float32) float32 {
} }
// ElasticInOut easing // ElasticInOut easing
// t: current time, b: begInnIng value, c: change In value, d: duration
func ElasticInOut(t, b, c, d float32) float32 { func ElasticInOut(t, b, c, d float32) float32 {
if t == 0 { if t == 0 {
return b return b

View file

@ -1,3 +0,0 @@
module git.terah.dev/UnrealXR/raylib-go/easings
go 1.21

View file

@ -1,155 +0,0 @@
/*******************************************************************************************
*
* raylib [audio] example - Mixed audio processing
*
* Example originally created with raylib 4.2, last time updated with raylib 4.2
*
* Example contributed by hkc (@hatkidchan) and reviewed by Ramon Santamaria (@raysan5)
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2023 hkc (@hatkidchan)
*
********************************************************************************************/
package main
import (
"fmt"
"math"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
)
var exponent float32 = 1.0 // Audio exponentiation value
var averageVolume [400]float32 // Average volume history
func main() {
rl.InitWindow(screenWidth, screenHeight, "raylib [audio] example - processing mixed output")
rl.InitAudioDevice() // Initialize audio device
rl.AttachAudioMixedProcessor(ProcessAudio)
music := rl.LoadMusicStream("country.mp3")
sound := rl.LoadSound("coin.wav")
rl.PlayMusicStream(music)
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
// Main game loop
for !rl.WindowShouldClose() { // Detect window close button or ESC key
rl.UpdateMusicStream(music) // Update music buffer with new stream data
// Modify processing variables
if rl.IsKeyPressed(rl.KeyLeft) {
exponent -= 0.05
}
if rl.IsKeyPressed(rl.KeyRight) {
exponent += 0.05
}
if rl.IsKeyPressed(rl.KeyDown) {
exponent -= 0.25
}
if rl.IsKeyPressed(rl.KeyUp) {
exponent += 0.25
}
// Make sure that exponent stays between 0.5 and 3
exponent = clamp(exponent, 0.5, 3)
if rl.IsKeyPressed(rl.KeySpace) {
rl.PlaySound(sound)
}
// Draw
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.DrawText("MUSIC SHOULD BE PLAYING!", 255, 150, 20, rl.LightGray)
rl.DrawText(fmt.Sprintf("EXPONENT = %.2f", exponent), 215, 180, 20, rl.LightGray)
rl.DrawRectangle(199, 199, 402, 34, rl.LightGray)
for i := int32(0); i < 400; i++ {
rl.DrawLine(201+i, 232-int32(averageVolume[i]*32), 201+i, 232, rl.Maroon)
}
rl.DrawRectangleLines(199, 199, 402, 34, rl.Gray)
rl.DrawText("PRESS SPACE TO PLAY OTHER SOUND", 200, 250, 20, rl.LightGray)
rl.DrawText("USE LEFT AND RIGHT ARROWS TO ALTER DISTORTION", 140, 280, 20, rl.LightGray)
rl.EndDrawing()
}
// De-Initialization
rl.UnloadMusicStream(music) // Unload music stream buffers from RAM
rl.DetachAudioMixedProcessor(ProcessAudio) // Disconnect audio processor
rl.CloseAudioDevice() // Close audio device (music streaming is automatically stopped)
rl.CloseWindow() // Close window and OpenGL context
}
// ProcessAudio is the audio processing function
func ProcessAudio(buffer []float32, frames int) {
var average float32 // Temporary average volume
maxFrame := frames / 2
// Each frame has 2 samples (left and right),
// so we should loop `frames / 2` times
for frame := 0; frame < maxFrame; frame++ {
left := &buffer[frame*2+0] // Left channel
right := &buffer[frame*2+1] // Right channel
// Modify left and right channel samples with exponent
*left = pow(abs(*left), exponent) * sgn(*left)
*right = pow(abs(*right), exponent) * sgn(*right)
// Accumulating average volume
average += abs(*left) / float32(maxFrame)
average += abs(*right) / float32(maxFrame)
}
// Shift average volume history buffer to the left
for i := 0; i < 399; i++ {
averageVolume[i] = averageVolume[i+1]
}
// Add the new average value
averageVolume[399] = average
}
// Helper functions to make the code shorter
// (using less type conversions)
// (Golang: Please make the `math` package generic! This is ridiculous :-)
func abs(value float32) float32 {
return float32(math.Abs(float64(value)))
}
func pow(value, exponent float32) float32 {
return float32(math.Pow(float64(value), float64(exponent)))
}
func sgn(value float32) float32 {
if value < 0 {
return -1
} else if value > 0 {
return 1
}
return 0
}
func clamp(value, min, max float32) float32 {
if value < min {
return min
}
if value > max {
return max
}
return value
}

View file

@ -1,33 +1,33 @@
package main package main
import ( import (
"git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
const maxCircles = 64 const maxCircles = 64
type circleWave struct { type circleWave struct {
Position rl.Vector2 Position raylib.Vector2
Radius float32 Radius float32
Alpha float32 Alpha float32
Speed float32 Speed float32
Color rl.Color Color raylib.Color
} }
func main() { func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.SetConfigFlags(rl.FlagMsaa4xHint) // NOTE: Try to enable MSAA 4X raylib.SetConfigFlags(raylib.FlagMsaa4xHint) // NOTE: Try to enable MSAA 4X
rl.InitWindow(screenWidth, screenHeight, "raylib [audio] example - module playing (streaming)") raylib.InitWindow(screenWidth, screenHeight, "raylib [audio] example - module playing (streaming)")
rl.InitAudioDevice() raylib.InitAudioDevice()
colors := []rl.Color{ colors := []raylib.Color{
rl.Orange, rl.Red, rl.Gold, rl.Lime, rl.Blue, raylib.Orange, raylib.Red, raylib.Gold, raylib.Lime, raylib.Blue,
rl.Violet, rl.Brown, rl.LightGray, rl.Pink, raylib.Violet, raylib.Brown, raylib.LightGray, raylib.Pink,
rl.Yellow, rl.Green, rl.SkyBlue, rl.Purple, rl.Beige, raylib.Yellow, raylib.Green, raylib.SkyBlue, raylib.Purple, raylib.Beige,
} }
circles := make([]circleWave, maxCircles) circles := make([]circleWave, maxCircles)
@ -36,47 +36,47 @@ func main() {
c := circleWave{} c := circleWave{}
c.Alpha = 0 c.Alpha = 0
c.Radius = float32(rl.GetRandomValue(10, 40)) c.Radius = float32(raylib.GetRandomValue(10, 40))
x := rl.GetRandomValue(int32(c.Radius), screenWidth-int32(c.Radius)) x := raylib.GetRandomValue(int32(c.Radius), screenWidth-int32(c.Radius))
y := rl.GetRandomValue(int32(c.Radius), screenHeight-int32(c.Radius)) y := raylib.GetRandomValue(int32(c.Radius), screenHeight-int32(c.Radius))
c.Position = rl.NewVector2(float32(x), float32(y)) c.Position = raylib.NewVector2(float32(x), float32(y))
c.Speed = float32(rl.GetRandomValue(1, 100)) / 20000.0 c.Speed = float32(raylib.GetRandomValue(1, 100)) / 20000.0
c.Color = colors[rl.GetRandomValue(0, int32(len(colors)-1))] c.Color = colors[raylib.GetRandomValue(0, int32(len(colors)-1))]
circles[i] = c circles[i] = c
} }
xm := rl.LoadMusicStream("mini1111.xm") xm := raylib.LoadMusicStream("mini1111.xm")
rl.PlayMusicStream(xm) raylib.PlayMusicStream(xm)
pause := false pause := false
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
rl.UpdateMusicStream(xm) // Update music buffer with new stream data raylib.UpdateMusicStream(xm) // Update music buffer with new stream data
// Restart music playing (stop and play) // Restart music playing (stop and play)
if rl.IsKeyPressed(rl.KeySpace) { if raylib.IsKeyPressed(raylib.KeySpace) {
rl.StopMusicStream(xm) raylib.StopMusicStream(xm)
rl.PlayMusicStream(xm) raylib.PlayMusicStream(xm)
} }
// Pause/Resume music playing // Pause/Resume music playing
if rl.IsKeyPressed(rl.KeyP) { if raylib.IsKeyPressed(raylib.KeyP) {
pause = !pause pause = !pause
if pause { if pause {
rl.PauseMusicStream(xm) raylib.PauseMusicStream(xm)
} else { } else {
rl.ResumeMusicStream(xm) raylib.ResumeMusicStream(xm)
} }
} }
// Get timePlayed scaled to bar dimensions // Get timePlayed scaled to bar dimensions
timePlayed := int32(rl.GetMusicTimePlayed(xm)/rl.GetMusicTimeLength(xm)*float32(screenWidth-40)) * 2 timePlayed := int32(raylib.GetMusicTimePlayed(xm)/raylib.GetMusicTimeLength(xm)*float32(screenWidth-40)) * 2
// Color circles animation // Color circles animation
for i := maxCircles - 1; (i >= 0) && !pause; i-- { for i := maxCircles - 1; (i >= 0) && !pause; i-- {
@ -89,33 +89,33 @@ func main() {
if circles[i].Alpha <= 0.0 { if circles[i].Alpha <= 0.0 {
circles[i].Alpha = 0.0 circles[i].Alpha = 0.0
circles[i].Radius = float32(rl.GetRandomValue(10, 40)) circles[i].Radius = float32(raylib.GetRandomValue(10, 40))
circles[i].Position.X = float32(rl.GetRandomValue(int32(circles[i].Radius), screenWidth-int32(circles[i].Radius))) circles[i].Position.X = float32(raylib.GetRandomValue(int32(circles[i].Radius), screenWidth-int32(circles[i].Radius)))
circles[i].Position.Y = float32(rl.GetRandomValue(int32(circles[i].Radius), screenHeight-int32(circles[i].Radius))) circles[i].Position.Y = float32(raylib.GetRandomValue(int32(circles[i].Radius), screenHeight-int32(circles[i].Radius)))
circles[i].Color = colors[rl.GetRandomValue(0, 13)] circles[i].Color = colors[raylib.GetRandomValue(0, 13)]
circles[i].Speed = float32(rl.GetRandomValue(1, 100)) / 20000.0 circles[i].Speed = float32(raylib.GetRandomValue(1, 100)) / 20000.0
} }
} }
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
for i := maxCircles - 1; i >= 0; i-- { for i := maxCircles - 1; i >= 0; i-- {
rl.DrawCircleV(circles[i].Position, float32(circles[i].Radius), rl.Fade(circles[i].Color, circles[i].Alpha)) raylib.DrawCircleV(circles[i].Position, float32(circles[i].Radius), raylib.Fade(circles[i].Color, circles[i].Alpha))
} }
// Draw time bar // Draw time bar
rl.DrawRectangle(20, screenHeight-20-12, screenWidth-40, 12, rl.LightGray) raylib.DrawRectangle(20, screenHeight-20-12, screenWidth-40, 12, raylib.LightGray)
rl.DrawRectangle(20, screenHeight-20-12, timePlayed, 12, rl.Maroon) raylib.DrawRectangle(20, screenHeight-20-12, timePlayed, 12, raylib.Maroon)
rl.DrawRectangleLines(20, screenHeight-20-12, screenWidth-40, 12, rl.Gray) raylib.DrawRectangleLines(20, screenHeight-20-12, screenWidth-40, 12, raylib.Gray)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.UnloadMusicStream(xm) raylib.UnloadMusicStream(xm)
rl.CloseAudioDevice() raylib.CloseAudioDevice()
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,56 +1,60 @@
package main package main
func main() { import (
rl.InitWindow(800, 450, "raylib [audio] example - music playing (streaming)") "github.com/gen2brain/raylib-go/raylib"
rl.InitAudioDevice() )
music := rl.LoadMusicStream("guitar_noodling.ogg") func main() {
raylib.InitWindow(800, 450, "raylib [audio] example - music playing (streaming)")
raylib.InitAudioDevice()
music := raylib.LoadMusicStream("guitar_noodling.ogg")
pause := false pause := false
rl.PlayMusicStream(music) raylib.PlayMusicStream(music)
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
rl.UpdateMusicStream(music) // Update music buffer with new stream data raylib.UpdateMusicStream(music) // Update music buffer with new stream data
// Restart music playing (stop and play) // Restart music playing (stop and play)
if rl.IsKeyPressed(rl.KeySpace) { if raylib.IsKeyPressed(raylib.KeySpace) {
rl.StopMusicStream(music) raylib.StopMusicStream(music)
rl.PlayMusicStream(music) raylib.PlayMusicStream(music)
} }
// Pause/Resume music playing // Pause/Resume music playing
if rl.IsKeyPressed(rl.KeyP) { if raylib.IsKeyPressed(raylib.KeyP) {
pause = !pause pause = !pause
if pause { if pause {
rl.PauseMusicStream(music) raylib.PauseMusicStream(music)
} else { } else {
rl.ResumeMusicStream(music) raylib.ResumeMusicStream(music)
} }
} }
// Get timePlayed scaled to bar dimensions (400 pixels) // Get timePlayed scaled to bar dimensions (400 pixels)
timePlayed := rl.GetMusicTimePlayed(music) / rl.GetMusicTimeLength(music) * 100 * 4 timePlayed := raylib.GetMusicTimePlayed(music) / raylib.GetMusicTimeLength(music) * 100 * 4
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.DrawText("MUSIC SHOULD BE PLAYING!", 255, 150, 20, rl.LightGray) raylib.DrawText("MUSIC SHOULD BE PLAYING!", 255, 150, 20, raylib.LightGray)
rl.DrawRectangle(200, 200, 400, 12, rl.LightGray) raylib.DrawRectangle(200, 200, 400, 12, raylib.LightGray)
rl.DrawRectangle(200, 200, int32(timePlayed), 12, rl.Maroon) raylib.DrawRectangle(200, 200, int32(timePlayed), 12, raylib.Maroon)
rl.DrawRectangleLines(200, 200, 400, 12, rl.Gray) raylib.DrawRectangleLines(200, 200, 400, 12, raylib.Gray)
rl.DrawText("PRESS SPACE TO RESTART MUSIC", 215, 250, 20, rl.LightGray) raylib.DrawText("PRESS SPACE TO RESTART MUSIC", 215, 250, 20, raylib.LightGray)
rl.DrawText("PRESS P TO PAUSE/RESUME MUSIC", 208, 280, 20, rl.LightGray) raylib.DrawText("PRESS P TO PAUSE/RESUME MUSIC", 208, 280, 20, raylib.LightGray)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.UnloadMusicStream(music) // Unload music stream buffers from RAM raylib.UnloadMusicStream(music) // Unload music stream buffers from RAM
rl.CloseAudioDevice() // Close audio device (music streaming is automatically stopped) raylib.CloseAudioDevice() // Close audio device (music streaming is automatically stopped)
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,79 +1,81 @@
package main package main
import ( import (
"fmt"
"math" "math"
"time"
rl "git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
const ( const (
nSamples = 44000 * 10 maxSamples = 22050
sampleRate = 6000 maxSamplesPerUpdate = 4096
bufferSize = nSamples
frequency = 440
targetFPS = 240
) )
func main() { func main() {
rl.InitWindow(800, 450, "raylib [audio] example - raw audio streaming") raylib.InitWindow(800, 450, "raylib [audio] example - raw audio streaming")
position := rl.NewVector2(0, 0)
rl.SetAudioStreamBufferSizeDefault(bufferSize) raylib.InitAudioDevice()
rl.InitAudioDevice() // Init raw audio stream (sample rate: 22050, sample size: 32bit-float, channels: 1-mono)
stream := raylib.InitAudioStream(22050, 32, 1)
// Init raw audio stream (sample rate: <nSamples>, sample size: 32bit-float, channels: 1-mono) //// Fill audio stream with some samples (sine wave)
stream := rl.LoadAudioStream(nSamples, 32, 1) data := make([]float32, maxSamples)
//// Create sine wave to play for i := 0; i < maxSamples; i++ {
data := make([]float32, nSamples) data[i] = float32(math.Sin(float64((2*raylib.Pi*float32(i))/2) * raylib.Deg2rad))
for i := 0; i < nSamples; i++ {
t := float32(i) / float32(nSamples)
data[i] = float32(math.Sin(float64((2 * rl.Pi * frequency * t))))
} }
// NOTE: The buffer can only be updated when it has been processed. Time between buffer processing and next load and causes clipping // NOTE: The generated MAX_SAMPLES do not fit to close a perfect loop
rl.PlayAudioStream(stream) // for that reason, there is a clip everytime audio stream is looped
raylib.PlayAudioStream(stream)
startTime := time.Now() totalSamples := int32(maxSamples)
rl.SetTargetFPS(targetFPS) samplesLeft := int32(totalSamples)
for !rl.WindowShouldClose() { position := raylib.NewVector2(0, 0)
// Refill audio stream if buffer is processed
if rl.IsAudioStreamProcessed(stream) {
elapsedTime := time.Since(startTime).Seconds()
currentSampleIndex := int(math.Mod(elapsedTime*float64(sampleRate), float64(nSamples)))
nextSampleIndex := currentSampleIndex + bufferSize
if nextSampleIndex > nSamples { raylib.SetTargetFPS(30)
nextSampleIndex = bufferSize - (nSamples - currentSampleIndex)
rl.UpdateAudioStream(stream, append(data[currentSampleIndex:], data[:nextSampleIndex]...)) for !raylib.WindowShouldClose() {
// Refill audio stream if required
if raylib.IsAudioBufferProcessed(stream) {
numSamples := int32(0)
if samplesLeft >= maxSamplesPerUpdate {
numSamples = maxSamplesPerUpdate
} else { } else {
rl.UpdateAudioStream(stream, data[currentSampleIndex:nextSampleIndex]) numSamples = samplesLeft
}
raylib.UpdateAudioStream(stream, data[totalSamples-samplesLeft:], numSamples)
samplesLeft -= numSamples
// Reset samples feeding (loop audio)
if samplesLeft <= 0 {
samplesLeft = totalSamples
} }
} }
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.DrawText(fmt.Sprintf("%d Hz SINE WAVE SHOULD BE PLAYING!", frequency), 200, 140, 20, rl.LightGray) raylib.ClearBackground(raylib.RayWhite)
raylib.DrawText("SINE WAVE SHOULD BE PLAYING!", 240, 140, 20, raylib.LightGray)
// NOTE: Draw a part of the sine wave (only screen width) // NOTE: Draw a part of the sine wave (only screen width)
for i := 0; i < int(rl.GetScreenWidth()); i++ { for i := 0; i < int(raylib.GetScreenWidth()); i++ {
position.X = float32(i) position.X = float32(i)
position.Y = 250 + 10*data[i*nSamples/int(20*rl.GetScreenWidth())] position.Y = 250 + 50*data[i]
rl.DrawPixelV(position, rl.Red) raylib.DrawPixelV(position, raylib.Red)
} }
rl.EndDrawing() raylib.EndDrawing()
} }
rl.UnloadAudioStream(stream) // Close raw audio stream and delete buffers from RAM raylib.CloseAudioStream(stream) // Close raw audio stream and delete buffers from RAM
rl.CloseAudioDevice() // Close audio device (music streaming is automatically stopped) raylib.CloseAudioDevice() // Close audio device (music streaming is automatically stopped)
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,41 +1,41 @@
package main package main
import ( import (
"git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
func main() { func main() {
rl.InitWindow(800, 450, "raylib [audio] example - sound loading and playing") raylib.InitWindow(800, 450, "raylib [audio] example - sound loading and playing")
rl.InitAudioDevice() raylib.InitAudioDevice()
fxWav := rl.LoadSound("weird.wav") fxWav := raylib.LoadSound("weird.wav")
fxOgg := rl.LoadSound("tanatana.ogg") fxOgg := raylib.LoadSound("tanatana.ogg")
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
if rl.IsKeyPressed(rl.KeySpace) { if raylib.IsKeyPressed(raylib.KeySpace) {
rl.PlaySound(fxWav) raylib.PlaySound(fxWav)
} }
if rl.IsKeyPressed(rl.KeyEnter) { if raylib.IsKeyPressed(raylib.KeyEnter) {
rl.PlaySound(fxOgg) raylib.PlaySound(fxOgg)
} }
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.DrawText("Press SPACE to PLAY the WAV sound!", 200, 180, 20, rl.LightGray) raylib.DrawText("Press SPACE to PLAY the WAV sound!", 200, 180, 20, raylib.LightGray)
rl.DrawText("Press ENTER to PLAY the OGG sound!", 200, 220, 20, rl.LightGray) raylib.DrawText("Press ENTER to PLAY the OGG sound!", 200, 220, 20, raylib.LightGray)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.UnloadSound(fxWav) raylib.UnloadSound(fxWav)
rl.UnloadSound(fxOgg) raylib.UnloadSound(fxOgg)
rl.CloseAudioDevice() raylib.CloseAudioDevice()
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,65 +0,0 @@
/*******************************************************************************************
*
* raylib [audio] example - Playing sound multiple times
*
* Example originally created with raylib 4.6
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2023 Jeffery Myers (@JeffM2501)
*
********************************************************************************************/
package main
import rl "git.terah.dev/UnrealXR/raylib-go/raylib"
const (
screenWidth = 800
screenHeight = 450
maxSounds = 10
)
var soundArray [maxSounds]rl.Sound
var currentSound int32
func main() {
rl.InitWindow(screenWidth, screenHeight, "raylib [audio] example - playing sound multiple times")
// Initialize audio device
rl.InitAudioDevice()
// Load WAV audio file into the first slot as the 'source' sound
// this sound owns the sample data
soundArray[0] = rl.LoadSound("sound.wav")
for i := 1; i < maxSounds; i++ {
// Load an alias of the sound into slots 1-9.
// These do not own the sound data, but can be played
soundArray[i] = rl.LoadSoundAlias(soundArray[0])
}
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
for !rl.WindowShouldClose() { // Detect window close button or ESC key
if rl.IsKeyPressed(rl.KeySpace) {
rl.PlaySound(soundArray[currentSound]) // play the next open sound slot
currentSound++ // increment the sound slot
if currentSound >= maxSounds { // if the sound slot is out of bounds, go back to 0
currentSound = 0
}
// Note: a better way would be to look at the list for the first sound that is not playing and use that slot
}
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.DrawText("Press SPACE to PLAY a WAV sound!", 200, 180, 20, rl.LightGray)
rl.EndDrawing()
}
rl.UnloadSound(soundArray[0]) // Unload source sound data
rl.CloseAudioDevice() // Close audio device
rl.CloseWindow() // Close window and OpenGL context
}

Binary file not shown.

View file

@ -1,7 +1,7 @@
package main package main
import ( import (
"git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
var ( var (
@ -12,52 +12,54 @@ func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera") raylib.InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera")
player := rl.NewRectangle(400, 280, 40, 40) player := raylib.NewRectangle(400, 280, 40, 40)
buildings := make([]rl.Rectangle, maxBuildings) buildings := make([]raylib.Rectangle, maxBuildings)
buildColors := make([]rl.Color, maxBuildings) buildColors := make([]raylib.Color, maxBuildings)
spacing := float32(0) spacing := float32(0)
for i := 0; i < maxBuildings; i++ { for i := 0; i < maxBuildings; i++ {
r := rl.Rectangle{} r := raylib.Rectangle{}
r.Width = float32(rl.GetRandomValue(50, 200)) r.Width = float32(raylib.GetRandomValue(50, 200))
r.Height = float32(rl.GetRandomValue(100, 800)) r.Height = float32(raylib.GetRandomValue(100, 800))
r.Y = float32(screenHeight) - 130 - r.Height r.Y = float32(screenHeight) - 130 - r.Height
r.X = -6000 + spacing r.X = -6000 + spacing
spacing += r.Width spacing += r.Width
c := rl.NewColor(byte(rl.GetRandomValue(200, 240)), byte(rl.GetRandomValue(200, 240)), byte(rl.GetRandomValue(200, 250)), byte(255)) c := raylib.NewColor(byte(raylib.GetRandomValue(200, 240)), byte(raylib.GetRandomValue(200, 240)), byte(raylib.GetRandomValue(200, 250)), byte(255))
buildings[i] = r buildings[i] = r
buildColors[i] = c buildColors[i] = c
} }
camera := rl.Camera2D{} camera := raylib.Camera2D{}
camera.Target = rl.NewVector2(float32(player.X+20), float32(player.Y+20)) camera.Target = raylib.NewVector2(float32(player.X+20), float32(player.Y+20))
camera.Offset = rl.NewVector2(float32(screenWidth/2), float32(screenHeight/2)) camera.Offset = raylib.NewVector2(0, 0)
camera.Rotation = 0.0 camera.Rotation = 0.0
camera.Zoom = 1.0 camera.Zoom = 1.0
rl.SetTargetFPS(60) raylib.SetTargetFPS(30)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
if rl.IsKeyDown(rl.KeyRight) { if raylib.IsKeyDown(raylib.KeyRight) {
player.X += 2 // Player movement player.X += 2 // Player movement
} else if rl.IsKeyDown(rl.KeyLeft) { camera.Offset.X -= 2 // Camera displacement with player movement
} else if raylib.IsKeyDown(raylib.KeyLeft) {
player.X -= 2 // Player movement player.X -= 2 // Player movement
camera.Offset.X += 2 // Camera displacement with player movement
} }
// Camera target follows player // Camera target follows player
camera.Target = rl.NewVector2(float32(player.X+20), float32(player.Y+20)) camera.Target = raylib.NewVector2(float32(player.X+20), float32(player.Y+20))
// Camera rotation controls // Camera rotation controls
if rl.IsKeyDown(rl.KeyA) { if raylib.IsKeyDown(raylib.KeyA) {
camera.Rotation-- camera.Rotation--
} else if rl.IsKeyDown(rl.KeyS) { } else if raylib.IsKeyDown(raylib.KeyS) {
camera.Rotation++ camera.Rotation++
} }
@ -69,7 +71,7 @@ func main() {
} }
// Camera zoom controls // Camera zoom controls
camera.Zoom += float32(rl.GetMouseWheelMove()) * 0.05 camera.Zoom += float32(raylib.GetMouseWheelMove()) * 0.05
if camera.Zoom > 3.0 { if camera.Zoom > 3.0 {
camera.Zoom = 3.0 camera.Zoom = 3.0
@ -78,48 +80,48 @@ func main() {
} }
// Camera reset (zoom and rotation) // Camera reset (zoom and rotation)
if rl.IsKeyPressed(rl.KeyR) { if raylib.IsKeyPressed(raylib.KeyR) {
camera.Zoom = 1.0 camera.Zoom = 1.0
camera.Rotation = 0.0 camera.Rotation = 0.0
} }
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.BeginMode2D(camera) raylib.BeginMode2D(camera)
rl.DrawRectangle(-6000, 320, 13000, 8000, rl.DarkGray) raylib.DrawRectangle(-6000, 320, 13000, 8000, raylib.DarkGray)
for i := 0; i < maxBuildings; i++ { for i := 0; i < maxBuildings; i++ {
rl.DrawRectangleRec(buildings[i], buildColors[i]) raylib.DrawRectangleRec(buildings[i], buildColors[i])
} }
rl.DrawRectangleRec(player, rl.Red) raylib.DrawRectangleRec(player, raylib.Red)
rl.DrawRectangle(int32(camera.Target.X), -500, 1, screenHeight*4, rl.Green) raylib.DrawRectangle(int32(camera.Target.X), -500, 1, screenHeight*4, raylib.Green)
rl.DrawRectangle(-500, int32(camera.Target.Y), screenWidth*4, 1, rl.Green) raylib.DrawRectangle(-500, int32(camera.Target.Y), screenWidth*4, 1, raylib.Green)
rl.EndMode2D() raylib.EndMode2D()
rl.DrawText("SCREEN AREA", 640, 10, 20, rl.Red) raylib.DrawText("SCREEN AREA", 640, 10, 20, raylib.Red)
rl.DrawRectangle(0, 0, screenWidth, 5, rl.Red) raylib.DrawRectangle(0, 0, screenWidth, 5, raylib.Red)
rl.DrawRectangle(0, 5, 5, screenHeight-10, rl.Red) raylib.DrawRectangle(0, 5, 5, screenHeight-10, raylib.Red)
rl.DrawRectangle(screenWidth-5, 5, 5, screenHeight-10, rl.Red) raylib.DrawRectangle(screenWidth-5, 5, 5, screenHeight-10, raylib.Red)
rl.DrawRectangle(0, screenHeight-5, screenWidth, 5, rl.Red) raylib.DrawRectangle(0, screenHeight-5, screenWidth, 5, raylib.Red)
rl.DrawRectangle(10, 10, 250, 113, rl.Fade(rl.SkyBlue, 0.5)) raylib.DrawRectangle(10, 10, 250, 113, raylib.Fade(raylib.SkyBlue, 0.5))
rl.DrawRectangleLines(10, 10, 250, 113, rl.Blue) raylib.DrawRectangleLines(10, 10, 250, 113, raylib.Blue)
rl.DrawText("Free 2d camera controls:", 20, 20, 10, rl.Black) raylib.DrawText("Free 2d camera controls:", 20, 20, 10, raylib.Black)
rl.DrawText("- Right/Left to move Offset", 40, 40, 10, rl.DarkGray) raylib.DrawText("- Right/Left to move Offset", 40, 40, 10, raylib.DarkGray)
rl.DrawText("- Mouse Wheel to Zoom in-out", 40, 60, 10, rl.DarkGray) raylib.DrawText("- Mouse Wheel to Zoom in-out", 40, 60, 10, raylib.DarkGray)
rl.DrawText("- A / S to Rotate", 40, 80, 10, rl.DarkGray) raylib.DrawText("- A / S to Rotate", 40, 80, 10, raylib.DarkGray)
rl.DrawText("- R to reset Zoom and Rotation", 40, 100, 10, rl.DarkGray) raylib.DrawText("- R to reset Zoom and Rotation", 40, 100, 10, raylib.DarkGray)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,101 +0,0 @@
package main
/*******************************************************************************************
*
* raylib [core] example - 2d camera mouse zoom
*
* Example originally created with raylib 4.2, last time updated with raylib 4.2
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2022 Jeffery Myers (@JeffM2501)
*
********************************************************************************************/
// ------------------------------------------------------------------------------------
// Program main entry point
// ------------------------------------------------------------------------------------
func main() {
// Initialization
//--------------------------------------------------------------------------------------
const (
screenWidth = 800
screenHeight = 450
)
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera mouse zoom")
var camera rl.Camera2D
camera.Zoom = 1.0
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
// Main game loop
for !rl.WindowShouldClose() { // Detect window close button or ESC key
// Update
//----------------------------------------------------------------------------------
// Translate based on mouse right click
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
}
}
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
rl.BeginDrawing()
rl.ClearBackground(rl.Black)
rl.BeginMode2D(camera)
// Draw the 3d grid, rotated 90 degrees and centered around 0,0
// just so we have something in the XY plane
rl.PushMatrix()
rl.Translatef(0, 25*50, 0)
rl.Rotatef(90, 1, 0, 0)
rl.DrawGrid(100, 50)
rl.PopMatrix()
// Draw a reference circle
rl.DrawCircle(100, 100, 50, rl.Yellow)
rl.EndMode2D()
rl.DrawText("Mouse right button drag to move, mouse wheel to zoom", 10, 10, 20, rl.White)
rl.EndDrawing()
//----------------------------------------------------------------------------------
}
// De-Initialization
//--------------------------------------------------------------------------------------
rl.CloseWindow() // Close window and OpenGL context
//--------------------------------------------------------------------------------------
}

View file

@ -1,261 +0,0 @@
package main
import rl "git.terah.dev/UnrealXR/raylib-go/raylib"
const (
screenWidth = 800
screenHeight = 450
gravity = 400
playerJumpSpeed = 350.0
playerHORSpeed = 200.0
)
type Player struct {
position rl.Vector2
speed float32
canJump bool
}
type EnvironmentItem struct {
rect rl.Rectangle
blocking bool
color rl.Color
}
type cameraUpdater func(*rl.Camera2D, *Player, []EnvironmentItem, float32)
// These 3 variables are used only for camera 4,
// but they need to be declared on module level
// for camera 4 to work (static in C)
var eveningOut = false
var evenOutSpeed float32 = 700
var evenOutTarget float32 = 0
func main() {
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera platformer")
player := Player{
position: rl.NewVector2(400, 280),
speed: 0,
canJump: false,
}
envItems := []EnvironmentItem{
{rect: rl.Rectangle{Width: 1000, Height: 400}, blocking: false, color: rl.LightGray},
{rect: rl.Rectangle{Y: 400, Width: 1000, Height: 200}, blocking: true, color: rl.Gray},
{rect: rl.Rectangle{X: 300, Y: 200, Width: 400, Height: 10}, blocking: true, color: rl.Gray},
{rect: rl.Rectangle{X: 250, Y: 300, Width: 100, Height: 10}, blocking: true, color: rl.Gray},
{rect: rl.Rectangle{X: 650, Y: 300, Width: 100, Height: 10}, blocking: true, color: rl.Gray},
}
camera := rl.Camera2D{
Offset: rl.Vector2{X: screenWidth / 2, Y: screenHeight / 2},
Target: player.position,
Rotation: 0,
Zoom: 1,
}
cameraUpdaters := []cameraUpdater{
updateCameraCenter,
updateCameraCenterInsideMap,
updateCameraCenterSmoothFollow,
updateCameraEvenOutOnLanding,
updateCameraPlayerBoundsPush,
}
cameraDescriptions := []string{
"1. Follow player center",
"2. Follow player center, but clamp to map edges",
"3. Follow player center; smoothed",
"4. Follow player center horizontally; update player center vertically after landing",
"5. Player push camera on getting too close to screen edge",
}
cameraOption := 0
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
deltaTime := rl.GetFrameTime()
updatePlayer(&player, envItems, deltaTime)
camera.Zoom += rl.GetMouseWheelMove() * 0.05
camera.Zoom = clamp(camera.Zoom, 0.25, 3)
if rl.IsKeyPressed(rl.KeyC) {
cameraOption = (cameraOption + 1) % len(cameraUpdaters)
}
// Call update camera function by its pointer
cameraUpdaters[cameraOption](&camera, &player, envItems, deltaTime)
// Draw
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.BeginMode2D(camera)
for _, item := range envItems {
rl.DrawRectangleRec(item.rect, item.color)
}
playerRect := rl.Rectangle{
X: player.position.X - 20,
Y: player.position.Y - 40,
Width: 40,
Height: 40,
}
rl.DrawRectangleRec(playerRect, rl.Red)
rl.DrawCircleV(player.position, 5, rl.Gold)
rl.EndMode2D()
rl.DrawText("Controls:", 20, 20, 10, rl.Black)
rl.DrawText(" - Right/Left to move", 40, 40, 10, rl.DarkGray)
rl.DrawText(" - Space to jump", 40, 60, 10, rl.DarkGray)
rl.DrawText(" - Mouse Wheel to Zoom in-out, R to reset zoom", 40, 80, 10, rl.DarkGray)
rl.DrawText(" - C to change camera mode", 20, 100, 10, rl.Black)
rl.DrawText("Current Camera Mode:", 20, 120, 10, rl.DarkGray)
rl.DrawText(cameraDescriptions[cameraOption], 40, 140, 10, rl.DarkGray)
rl.EndDrawing()
}
rl.CloseWindow()
}
func updatePlayer(player *Player, envItems []EnvironmentItem, delta float32) {
if rl.IsKeyDown(rl.KeyLeft) {
player.position.X -= playerHORSpeed * delta
}
if rl.IsKeyDown(rl.KeyRight) {
player.position.X += playerHORSpeed * delta
}
if rl.IsKeyDown(rl.KeySpace) && player.canJump {
player.speed = -playerJumpSpeed
player.canJump = false
}
hitObstacle := false
for _, item := range envItems {
if item.blocking &&
item.rect.X <= player.position.X && item.rect.X+item.rect.Width >= player.position.X &&
item.rect.Y >= player.position.Y && item.rect.Y <= player.position.Y+player.speed*delta {
hitObstacle = true
player.speed = 0
player.position.Y = item.rect.Y
break
}
}
if !hitObstacle {
player.position.Y += player.speed * delta
player.speed += gravity * delta
player.canJump = false
} else {
player.canJump = true
}
}
func updateCameraCenter(camera *rl.Camera2D, player *Player, _ []EnvironmentItem, _ float32) {
camera.Offset = rl.Vector2{X: screenWidth / 2, Y: screenHeight / 2}
camera.Target = player.position
}
func updateCameraCenterInsideMap(camera *rl.Camera2D, player *Player, envItems []EnvironmentItem, _ float32) {
camera.Offset = rl.Vector2{X: screenWidth / 2, Y: screenHeight / 2}
camera.Target = player.position
var minX, minY, maxX, maxY float32 = 1000, 1000, -1000, -10000
for _, item := range envItems {
minX = min(item.rect.X, minX)
maxX = max(item.rect.X+item.rect.Width, maxX)
minY = min(item.rect.Y, minY)
maxY = max(item.rect.Y+item.rect.Height, maxY)
}
maxV := rl.GetWorldToScreen2D(rl.Vector2{X: maxX, Y: maxY}, *camera)
minV := rl.GetWorldToScreen2D(rl.Vector2{X: minX, Y: minY}, *camera)
if maxV.X < screenWidth {
camera.Offset.X = screenWidth - (maxV.X - screenWidth/2)
}
if maxV.Y < screenHeight {
camera.Offset.Y = screenHeight - (maxV.Y - screenHeight/2)
}
if minV.X > 0 {
camera.Offset.X = screenWidth/2 - minV.X
}
if minV.Y > 0 {
camera.Offset.Y = screenHeight/2 - minV.Y
}
}
func updateCameraCenterSmoothFollow(camera *rl.Camera2D, player *Player, _ []EnvironmentItem, delta float32) {
var minSpeed, minEffectLength, fractionSpeed float32 = 30.0, 10.0, 0.8
camera.Offset = rl.Vector2{X: screenWidth / 2, Y: screenHeight / 2}
diff := rl.Vector2Subtract(player.position, camera.Target)
length := rl.Vector2Length(diff)
if length > minEffectLength {
speed := max(fractionSpeed*length, minSpeed)
camera.Target = rl.Vector2Add(camera.Target, rl.Vector2Scale(diff, speed*delta/length))
}
}
func updateCameraEvenOutOnLanding(camera *rl.Camera2D, player *Player, _ []EnvironmentItem, delta float32) {
camera.Offset = rl.Vector2{X: screenWidth / 2, Y: screenHeight / 2}
camera.Target.X = player.position.X
if eveningOut {
if evenOutTarget > camera.Target.Y {
camera.Target.Y += evenOutSpeed * delta
if camera.Target.Y > evenOutTarget {
camera.Target.Y = evenOutTarget
eveningOut = false
}
} else {
camera.Target.Y -= evenOutSpeed * delta
if camera.Target.Y < evenOutTarget {
camera.Target.Y = evenOutTarget
eveningOut = false
}
}
} else {
if player.canJump && player.speed == 0 && player.position.Y != camera.Target.Y {
eveningOut = true
evenOutTarget = player.position.Y
}
}
}
func updateCameraPlayerBoundsPush(camera *rl.Camera2D, player *Player, _ []EnvironmentItem, _ float32) {
bbox := rl.Vector2{X: 0.2, Y: 0.2}
bboxWorldMin := rl.GetScreenToWorld2D(rl.Vector2{X: (1 - bbox.X) * 0.5 * screenWidth, Y: (1 - bbox.Y) * 0.5 * screenHeight}, *camera)
bboxWorldMax := rl.GetScreenToWorld2D(rl.Vector2{X: (1 + bbox.X) * 0.5 * screenWidth, Y: (1 + bbox.Y) * 0.5 * screenHeight}, *camera)
camera.Offset = rl.Vector2{X: (1 - bbox.X) * 0.5 * screenWidth, Y: (1 - bbox.Y) * 0.5 * screenHeight}
if player.position.X < bboxWorldMin.X {
camera.Target.X = player.position.X
}
if player.position.Y < bboxWorldMin.Y {
camera.Target.Y = player.position.Y
}
if player.position.X > bboxWorldMax.X {
camera.Target.X = bboxWorldMin.X + (player.position.X - bboxWorldMax.X)
}
if player.position.Y > bboxWorldMax.Y {
camera.Target.Y = bboxWorldMin.Y + (player.position.Y - bboxWorldMax.Y)
}
}
func clamp(zoom float32, min float32, max float32) float32 {
if zoom < min {
return min
}
if zoom > max {
return max
}
return zoom
}

View file

@ -1,128 +0,0 @@
package main
import (
"fmt"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
var (
screenW = int32(800)
screenH = int32(440)
playerSize = float32(40)
cam1, cam2 rl.Camera2D
)
func main() {
rl.InitWindow(screenW, screenH, "raylib [core] example - 2d camera split screen")
player1 := rl.NewRectangle(200, 200, playerSize, playerSize)
player2 := rl.NewRectangle(250, 200, playerSize, playerSize)
cam1.Target = rl.NewVector2(player1.X, player1.Y)
cam1.Offset = rl.NewVector2(200, 200)
cam1.Rotation = 0
cam1.Zoom = 1
cam2 = cam1
cam2.Target = rl.NewVector2(player2.X, player2.Y)
screenCam1 := rl.LoadRenderTexture(screenW/2, screenH)
screenCam2 := rl.LoadRenderTexture(screenW/2, screenH)
splitScreenRec := rl.NewRectangle(0, 0, float32(screenCam1.Texture.Width), -float32(screenCam1.Texture.Height))
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
if rl.IsKeyDown(rl.KeyS) {
player1.Y += 3
} else if rl.IsKeyDown(rl.KeyW) {
player1.Y -= 3
}
if rl.IsKeyDown(rl.KeyD) {
player1.X += 3
} else if rl.IsKeyDown(rl.KeyA) {
player1.X -= 3
}
if rl.IsKeyDown(rl.KeyUp) {
player2.Y -= 3
} else if rl.IsKeyDown(rl.KeyDown) {
player2.Y += 3
}
if rl.IsKeyDown(rl.KeyRight) {
player2.X += 3
} else if rl.IsKeyDown(rl.KeyLeft) {
player2.X -= 3
}
cam1.Target = rl.NewVector2(player1.X, player1.Y)
cam2.Target = rl.NewVector2(player2.X, player2.Y)
rl.BeginTextureMode(screenCam1)
rl.ClearBackground(rl.RayWhite)
rl.BeginMode2D(cam1)
for i := 0; i < int(screenW/int32(playerSize))+1; i++ {
rl.DrawLineV(rl.NewVector2(playerSize*float32(i), 0), rl.NewVector2(playerSize*float32(i), float32(screenH)), rl.LightGray)
}
for i := 0; i < int(screenH/int32(playerSize))+1; i++ {
rl.DrawLineV(rl.NewVector2(0, playerSize*float32(i)), rl.NewVector2(float32(screenW), playerSize*float32(i)), rl.LightGray)
}
for i := 0; i < int(screenW/int32(playerSize)); i++ {
for j := 0; j < int(screenH/int32(playerSize)); j++ {
rl.DrawText("["+fmt.Sprint(i)+","+fmt.Sprint(j)+"]", 10+int32(playerSize*float32(i)), 15+int32(playerSize*float32(j)), 10, rl.LightGray)
}
}
rl.DrawRectangleRec(player1, rl.Red)
rl.DrawRectangleRec(player2, rl.Blue)
rl.EndMode2D()
rl.DrawRectangle(0, 0, screenW/2, 30, rl.Fade(rl.RayWhite, 0.6))
rl.DrawText("PLAYER 1 WASD KEYS", 10, 10, 10, rl.Maroon)
rl.EndTextureMode()
rl.BeginTextureMode(screenCam2)
rl.ClearBackground(rl.RayWhite)
rl.BeginMode2D(cam2)
for i := 0; i < int(screenW/int32(playerSize))+1; i++ {
rl.DrawLineV(rl.NewVector2(playerSize*float32(i), 0), rl.NewVector2(playerSize*float32(i), float32(screenH)), rl.LightGray)
}
for i := 0; i < int(screenH/int32(playerSize))+1; i++ {
rl.DrawLineV(rl.NewVector2(0, playerSize*float32(i)), rl.NewVector2(float32(screenW), playerSize*float32(i)), rl.LightGray)
}
for i := 0; i < int(screenW/int32(playerSize)); i++ {
for j := 0; j < int(screenH/int32(playerSize)); j++ {
rl.DrawText("["+fmt.Sprint(i)+","+fmt.Sprint(j)+"]", 10+int32(playerSize*float32(i)), 15+int32(playerSize*float32(j)), 10, rl.LightGray)
}
}
rl.DrawRectangleRec(player1, rl.Red)
rl.DrawRectangleRec(player2, rl.Blue)
rl.EndMode2D()
rl.DrawRectangle(0, 0, screenW/2, 30, rl.Fade(rl.RayWhite, 0.6))
rl.DrawText("PLAYER 2 ARROW KEYS", 10, 10, 10, rl.Maroon)
rl.EndTextureMode()
rl.BeginDrawing()
rl.ClearBackground(rl.Black)
rl.DrawTextureRec(screenCam1.Texture, splitScreenRec, rl.NewVector2(0, 0), rl.White)
rl.DrawTextureRec(screenCam2.Texture, splitScreenRec, rl.NewVector2(float32(screenW/2), 0), rl.White)
rl.DrawRectangle((screenW/2)-2, 0, 4, screenH, rl.LightGray)
rl.EndDrawing()
}
rl.UnloadRenderTexture(screenCam1)
rl.UnloadRenderTexture(screenCam2)
rl.CloseWindow()
}

View file

@ -1,216 +0,0 @@
package main
import (
"os"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const colorCount = 23
func main() {
const screenWidth, screenHeight int32 = 800, 450
rl.InitWindow(screenWidth, screenHeight, "raypaint")
// Colors to choose from
var colors = [colorCount]rl.Color{
rl.RayWhite, rl.Yellow, rl.Gold, rl.Orange, rl.Pink, rl.Red, rl.Maroon, rl.Green, rl.Lime, rl.DarkGreen,
rl.SkyBlue, rl.Blue, rl.DarkBlue, rl.Purple, rl.Violet, rl.DarkPurple, rl.Beige, rl.Brown, rl.DarkBrown,
rl.LightGray, rl.Gray, rl.DarkGray, rl.Black,
}
// Define colorsRecs data (for every rectangle)
var colorRecs = [colorCount]rl.Rectangle{}
for i := 0; i < colorCount; i++ {
colorRecs[i].X = float32(10 + 30*i + 2*i)
colorRecs[i].Y = 10
colorRecs[i].Width = 30
colorRecs[i].Height = 30
}
colorSelected := 0
colorSelectedPrev := colorSelected
colorMouseHover := 0
brushSize := 20
var btnSaveRec = rl.Rectangle{750, 10, 40, 30}
btnSaveMouseHover := false
showSaveMessage := false
saveMessageCounter := 0
checkSaveHover := func() rl.Color {
if btnSaveMouseHover {
return rl.Red
}
return rl.Black
}
// Create a RenderTexture2D to use as a canvas
var target rl.RenderTexture2D = rl.LoadRenderTexture(screenWidth, screenHeight)
// Clear render texture before entering the game loop
rl.BeginTextureMode(target)
rl.ClearBackground(colors[0])
rl.EndTextureMode()
rl.SetTargetFPS(120)
// Main game loop
for !rl.WindowShouldClose() {
mousePos := rl.GetMousePosition()
// Move between colors with keys
if rl.IsKeyPressed(rl.KeyRight) {
colorSelected++
} else if rl.IsKeyPressed(rl.KeyLeft) {
colorSelected--
}
if colorSelected >= colorCount {
colorSelected = colorCount - 1
} else if colorSelected < 0 {
colorSelected = 0
}
// Choose color with mouse
for i := 0; i < colorCount; i++ {
if rl.CheckCollisionPointRec(mousePos, colorRecs[i]) {
colorMouseHover = i
break
} else {
colorMouseHover = -1
}
}
if colorMouseHover >= 0 && rl.IsMouseButtonPressed(rl.MouseLeftButton) {
colorSelected = colorMouseHover
colorSelectedPrev = colorSelected
}
// Change brush size
brushSize += int(rl.GetMouseWheelMove() * 5)
if brushSize < 2 {
brushSize = 2
}
if brushSize > 50 {
brushSize = 50
}
if rl.IsKeyPressed(rl.KeyC) {
// Clear render texture to clear color
rl.BeginTextureMode(target)
rl.ClearBackground(colors[0])
rl.EndTextureMode()
}
if rl.IsMouseButtonDown(rl.MouseLeftButton) || rl.GetGestureDetected() == rl.GestureDrag {
// Clear render texture to clear color
rl.BeginTextureMode(target)
if mousePos.Y > 50 {
rl.DrawCircle(int32(mousePos.X), int32(mousePos.Y), float32(brushSize), colors[colorSelected])
}
rl.EndTextureMode()
}
if rl.IsMouseButtonDown(rl.MouseRightButton) {
colorSelected = 0
// Erase circle from render texture
rl.BeginTextureMode(target)
if mousePos.Y > 50 {
rl.DrawCircle(int32(mousePos.X), int32(mousePos.Y), float32(brushSize), colors[0])
}
rl.EndTextureMode()
} else {
colorSelected = colorSelectedPrev
}
if rl.CheckCollisionPointRec(mousePos, btnSaveRec) {
btnSaveMouseHover = true
} else {
btnSaveMouseHover = false
}
if btnSaveMouseHover && rl.IsMouseButtonReleased(rl.MouseLeftButton) || rl.IsKeyPressed(rl.KeyS) {
image := rl.LoadImageFromTexture(target.Texture)
rl.ImageFlipVertical(*&image)
rl.ExportImage(*image, "export.png")
rl.UnloadImage(image)
showSaveMessage = true
}
if showSaveMessage {
// On saving, show a full screen message for 2 seconds
saveMessageCounter++
if saveMessageCounter > 240 {
showSaveMessage = false
saveMessageCounter = 0
}
}
// Draw
//----------------------------------------------------------------------------------
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
// NOTE: Render texture must be y-flipped due to default OpenGL coordinates (left-bottom)
rl.DrawTextureRec(target.Texture, rl.Rectangle{0, 0, float32(target.Texture.Width), float32(-target.Texture.Height)}, rl.Vector2{0, 0}, rl.White)
if mousePos.Y > 50 {
if rl.IsMouseButtonDown(rl.MouseRightButton) {
rl.DrawCircleLines(int32(mousePos.X), int32(mousePos.Y), float32(brushSize), rl.Gray)
} else {
rl.DrawCircle(rl.GetMouseX(), rl.GetMouseY(), float32(brushSize), colors[colorSelected])
}
}
// Draw top panel
rl.DrawRectangle(0, 0, int32(rl.GetScreenWidth()), 50, rl.RayWhite)
rl.DrawLine(0, 50, int32(rl.GetScreenWidth()), 50, rl.LightGray)
// Draw color selection rectangles
for i := 0; i < colorCount; i++ {
rl.DrawRectangleRec(colorRecs[i], colors[i])
}
rl.DrawRectangleLines(10, 10, 30, 30, rl.LightGray)
if colorMouseHover >= 0 {
rl.DrawRectangleRec(colorRecs[colorMouseHover], rl.Fade(rl.White, 0.0))
}
rl.DrawRectangleLinesEx(rl.Rectangle{
colorRecs[colorSelected].X - 2, colorRecs[colorSelected].Y - 2, colorRecs[colorSelected].Width + 4, colorRecs[colorSelected].Height + 4,
}, 2, rl.Black)
// Draw save image button
rl.DrawRectangleLinesEx(btnSaveRec, 2, checkSaveHover())
rl.DrawText("SAVE!", 755, 20, 10, checkSaveHover())
if showSaveMessage {
rl.DrawRectangle(0, 0, int32(rl.GetScreenWidth()), int32(rl.GetScreenHeight()), rl.Fade(rl.RayWhite, 0.8))
rl.DrawRectangle(0, 150, int32(rl.GetScreenWidth()), 80, rl.Black)
rl.DrawText("IMAGE SAVED: export.png", 150, 180, 20, rl.RayWhite)
}
rl.EndDrawing()
}
// De-Initialization
//--------------------------------------------------------------------------------------
rl.UnloadRenderTexture(target)
rl.CloseWindow()
os.Exit(0)
}

View file

@ -1,194 +1,69 @@
package main package main
import ( import (
"fmt" "github.com/gen2brain/raylib-go/raylib"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
const ( const (
maxColumns = 20 maxColumns = 20
screenWidth = 800
screenHeight = 450
False = 0
True = 1
) )
var camModes = map[rl.CameraMode]string{
rl.CameraFree: "FREE",
rl.CameraOrbital: "ORBITAL",
rl.CameraFirstPerson: "FIRST PERSON",
rl.CameraThirdPerson: "THIRD PERSON",
}
var camProjections = map[rl.CameraProjection]string{
rl.CameraPerspective: "PERSPECTIVE",
rl.CameraOrthographic: "ORTHOGRAPHIC",
}
func main() { func main() {
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera first person") raylib.InitWindow(800, 450, "raylib [core] example - 3d camera first person")
// Define the camera to look into our 3d world (position, target, up vector) camera := raylib.Camera3D{}
camera := rl.Camera3D{} camera.Position = raylib.NewVector3(4.0, 2.0, 4.0)
camera.Position = rl.NewVector3(0.0, 2.0, 4.0) // Camera position camera.Target = raylib.NewVector3(0.0, 1.8, 0.0)
camera.Target = rl.NewVector3(0.0, 2.0, 0.0) // Camera looking at point camera.Up = raylib.NewVector3(0.0, 1.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) // Camera up vector (rotation towards target) camera.Fovy = 60.0
camera.Fovy = 60.0 // Camera field-of-view Y camera.Type = raylib.CameraPerspective
camera.Projection = rl.CameraPerspective // Camera projection type
cameraMode := rl.CameraFirstPerson
// Generates some random columns // Generates some random columns
heights := make([]float32, maxColumns) heights := make([]float32, maxColumns)
positions := make([]rl.Vector3, maxColumns) positions := make([]raylib.Vector3, maxColumns)
colors := make([]rl.Color, maxColumns) colors := make([]raylib.Color, maxColumns)
for i := 0; i < maxColumns; i++ { for i := 0; i < maxColumns; i++ {
heights[i] = rndF(1, 12) heights[i] = float32(raylib.GetRandomValue(1, 12))
positions[i] = rl.NewVector3(rndF(-15, 15), heights[i]/2, rndF(-15, 15)) positions[i] = raylib.NewVector3(float32(raylib.GetRandomValue(-15, 15)), heights[i]/2, float32(raylib.GetRandomValue(-15, 15)))
colors[i] = rl.NewColor(rndU(20, 255), rndU(10, 55), 30, 255) colors[i] = raylib.NewColor(uint8(raylib.GetRandomValue(20, 255)), uint8(raylib.GetRandomValue(10, 55)), 30, 255)
} }
rl.DisableCursor() // Limit cursor to relative movement inside the window raylib.SetCameraMode(camera, raylib.CameraFirstPerson) // Set a first person camera mode
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
// Main game loop raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { // Detect window close button or ESC key
// Switch camera mode
if rl.IsKeyPressed(rl.KeyOne) {
cameraMode = rl.CameraFree
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) // Reset roll
}
if rl.IsKeyPressed(rl.KeyTwo) {
cameraMode = rl.CameraFirstPerson
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) // Reset roll
}
if rl.IsKeyPressed(rl.KeyThree) {
cameraMode = rl.CameraThirdPerson
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) // Reset roll
}
if rl.IsKeyPressed(rl.KeyFour) {
cameraMode = rl.CameraOrbital
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) // Reset roll
}
// Switch camera projection for !raylib.WindowShouldClose() {
if rl.IsKeyPressed(rl.KeyP) { raylib.UpdateCamera(&camera) // Update camera
cameraMode = rl.CameraThirdPerson
if camera.Projection == rl.CameraPerspective {
// Create isometric view
// Note: The target distance is related to the render distance in the orthographic projection
camera.Position = rl.NewVector3(0.0, 2.0, -100.0)
camera.Target = rl.NewVector3(0.0, 2.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0)
camera.Projection = rl.CameraOrthographic
camera.Fovy = 20.0 // near plane width in CAMERA_ORTHOGRAPHIC
rl.CameraYaw(&camera, -135*rl.Deg2rad, True)
rl.CameraPitch(&camera, -45*rl.Deg2rad, True, True, False)
} else if camera.Projection == rl.CameraOrthographic {
// Reset to default view
camera.Position = rl.NewVector3(0.0, 2.0, 10.0)
camera.Target = rl.NewVector3(0.0, 2.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0)
camera.Projection = rl.CameraPerspective
camera.Fovy = 60.0
}
}
// Update camera computes movement internally depending on the camera mode. raylib.BeginDrawing()
// Some default standard keyboard/mouse inputs are hardcoded to simplify use.
// For advance camera controls, it's recommended to compute camera movement manually.
rl.UpdateCamera(&camera, cameraMode) // Update camera
/* raylib.ClearBackground(raylib.RayWhite)
// Camera PRO usage example (EXPERIMENTAL)
// This new camera function allows custom movement/rotation values to be directly provided
// as input parameters, with this approach, rcamera module is internally independent of raylib inputs
UpdateCameraPro(&camera,
(Vector3){
(IsKeyDown(KEY_W) || IsKeyDown(KEY_UP))*0.1f - // Move forward-backward
(IsKeyDown(KEY_S) || IsKeyDown(KEY_DOWN))*0.1f,
(IsKeyDown(KEY_D) || IsKeyDown(KEY_RIGHT))*0.1f - // Move right-left
(IsKeyDown(KEY_A) || IsKeyDown(KEY_LEFT))*0.1f,
0.0f // Move up-down
},
(Vector3){
GetMouseDelta().x*0.05f, // Rotation: yaw
GetMouseDelta().y*0.05f, // Rotation: pitch
0.0f // Rotation: roll
},
GetMouseWheelMove()*2.0f); // Move to target (zoom)
*/
rl.BeginDrawing() raylib.BeginMode3D(camera)
rl.ClearBackground(rl.RayWhite) raylib.DrawPlane(raylib.NewVector3(0.0, 0.0, 0.0), raylib.NewVector2(32.0, 32.0), raylib.LightGray) // Draw ground
raylib.DrawCube(raylib.NewVector3(-16.0, 2.5, 0.0), 1.0, 5.0, 32.0, raylib.Blue) // Draw a blue wall
rl.BeginMode3D(camera) raylib.DrawCube(raylib.NewVector3(16.0, 2.5, 0.0), 1.0, 5.0, 32.0, raylib.Lime) // Draw a green wall
raylib.DrawCube(raylib.NewVector3(0.0, 2.5, 16.0), 32.0, 5.0, 1.0, raylib.Gold) // Draw a yellow wall
rl.DrawPlane(rl.NewVector3(0.0, 0.0, 0.0), rl.NewVector2(32.0, 32.0), rl.LightGray) // Draw ground
rl.DrawCube(rl.NewVector3(-16.0, 2.5, 0.0), 1.0, 5.0, 32.0, rl.Blue) // Draw a blue wall
rl.DrawCube(rl.NewVector3(16.0, 2.5, 0.0), 1.0, 5.0, 32.0, rl.Lime) // Draw a green wall
rl.DrawCube(rl.NewVector3(0.0, 2.5, 16.0), 32.0, 5.0, 1.0, rl.Gold) // Draw a yellow wall
// Draw some cubes around // Draw some cubes around
for i := 0; i < maxColumns; i++ { for i := 0; i < maxColumns; i++ {
rl.DrawCube(positions[i], 2.0, heights[i], 2.0, colors[i]) raylib.DrawCube(positions[i], 2.0, heights[i], 2.0, colors[i])
rl.DrawCubeWires(positions[i], 2.0, heights[i], 2.0, rl.Maroon) raylib.DrawCubeWires(positions[i], 2.0, heights[i], 2.0, raylib.Maroon)
} }
// Draw player cube raylib.EndMode3D()
if cameraMode == rl.CameraThirdPerson {
rl.DrawCube(camera.Target, 0.5, 0.5, 0.5, rl.Purple) raylib.DrawRectangle(10, 10, 220, 70, raylib.Fade(raylib.SkyBlue, 0.5))
rl.DrawCubeWires(camera.Target, 0.5, 0.5, 0.5, rl.DarkPurple) raylib.DrawRectangleLines(10, 10, 220, 70, raylib.Blue)
raylib.DrawText("First person camera default controls:", 20, 20, 10, raylib.Black)
raylib.DrawText("- Move with keys: W, A, S, D", 40, 40, 10, raylib.DarkGray)
raylib.DrawText("- Mouse move to look around", 40, 60, 10, raylib.DarkGray)
raylib.EndDrawing()
} }
rl.EndMode3D() raylib.CloseWindow()
// Draw info boxes
rl.DrawRectangle(5, 5, 330, 100, rl.Fade(rl.SkyBlue, 0.5))
rl.DrawRectangleLines(5, 5, 330, 100, rl.Blue)
rl.DrawText("Camera controls:", 15, 15, 10, rl.Black)
rl.DrawText("- Move keys: W, A, S, D, Space, Left-Ctrl", 15, 30, 10, rl.Black)
rl.DrawText("- Look around: arrow keys or mouse", 15, 45, 10, rl.Black)
rl.DrawText("- Camera mode keys: 1,2,3,4", 15, 60, 10, rl.Black)
rl.DrawText("- Zoom keys: num-plus, num-minus or mouse scroll", 15, 75, 10, rl.Black)
rl.DrawText("- Camera projection key: P", 15, 90, 10, rl.Black)
rl.DrawRectangle(600, 5, 195, 100, rl.Fade(rl.SkyBlue, 0.5))
rl.DrawRectangleLines(600, 5, 195, 100, rl.Blue)
rl.DrawText("Camera status:", 610, 15, 10, rl.Black)
rl.DrawText(s2T("Mode:", camModes[cameraMode]), 610, 30, 10, rl.Black)
rl.DrawText(s2T("Projection:", camProjections[camera.Projection]), 610, 45, 10, rl.Black)
rl.DrawText(s2T("Position:", v2T(camera.Position)), 610, 60, 10, rl.Black)
rl.DrawText(s2T("Target:", v2T(camera.Target)), 610, 75, 10, rl.Black)
rl.DrawText(s2T("Up:", v2T(camera.Up)), 610, 90, 10, rl.Black)
rl.EndDrawing()
}
rl.CloseWindow()
}
// rndU generates a random uint8 value between min and max
func rndU(min, max int32) uint8 {
return uint8(rl.GetRandomValue(min, max))
}
// rndF generates a random float32 value between min and max
func rndF(min, max int32) float32 {
return float32(rl.GetRandomValue(min, max))
}
// s2t generates a Status item string from a name and value
func s2T(name, value string) string {
return fmt.Sprintf(" - %s %s", name, value)
}
// v2T generates a string from a rl.Vector3
func v2T(v rl.Vector3) string {
return fmt.Sprintf("%6.3f, %6.3f, %6.3f", v.X, v.Y, v.Z)
} }

View file

@ -1,53 +1,57 @@
package main package main
import ( import (
rl "git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
func main() { func main() {
rl.InitWindow(800, 450, "raylib [core] example - 3d camera free") raylib.InitWindow(800, 450, "raylib [core] example - 3d camera free")
camera := rl.Camera3D{} camera := raylib.Camera3D{}
camera.Position = rl.NewVector3(10.0, 10.0, 10.0) camera.Position = raylib.NewVector3(10.0, 10.0, 10.0)
camera.Target = rl.NewVector3(0.0, 0.0, 0.0) camera.Target = raylib.NewVector3(0.0, 0.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) camera.Up = raylib.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0 camera.Fovy = 45.0
camera.Projection = rl.CameraPerspective camera.Type = raylib.CameraPerspective
cubePosition := rl.NewVector3(0.0, 0.0, 0.0) cubePosition := raylib.NewVector3(0.0, 0.0, 0.0)
rl.SetTargetFPS(60) raylib.SetCameraMode(camera, raylib.CameraFree) // Set a free camera mode
for !rl.WindowShouldClose() { raylib.SetTargetFPS(60)
rl.UpdateCamera(&camera, rl.CameraFree) // Update camera with free camera mode
if rl.IsKeyDown(rl.KeyZ) { for !raylib.WindowShouldClose() {
camera.Target = rl.NewVector3(0.0, 0.0, 0.0) raylib.UpdateCamera(&camera) // Update camera
if raylib.IsKeyDown(raylib.KeyZ) {
camera.Target = raylib.NewVector3(0.0, 0.0, 0.0)
} }
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.BeginMode3D(camera) raylib.BeginMode3D(camera)
rl.DrawCube(cubePosition, 2.0, 2.0, 2.0, rl.Red) raylib.DrawCube(cubePosition, 2.0, 2.0, 2.0, raylib.Red)
rl.DrawCubeWires(cubePosition, 2.0, 2.0, 2.0, rl.Maroon) raylib.DrawCubeWires(cubePosition, 2.0, 2.0, 2.0, raylib.Maroon)
rl.DrawGrid(10, 1.0) raylib.DrawGrid(10, 1.0)
rl.EndMode3D() raylib.EndMode3D()
rl.DrawRectangle(10, 10, 320, 133, rl.Fade(rl.SkyBlue, 0.5)) raylib.DrawRectangle(10, 10, 320, 133, raylib.Fade(raylib.SkyBlue, 0.5))
rl.DrawRectangleLines(10, 10, 320, 133, rl.Blue) raylib.DrawRectangleLines(10, 10, 320, 133, raylib.Blue)
rl.DrawText("Free camera default controls:", 20, 20, 10, rl.Black) raylib.DrawText("Free camera default controls:", 20, 20, 10, raylib.Black)
rl.DrawText("- Mouse Wheel to Zoom in-out", 40, 40, 10, rl.DarkGray) raylib.DrawText("- Mouse Wheel to Zoom in-out", 40, 40, 10, raylib.DarkGray)
rl.DrawText("- Mouse Wheel Pressed to Pan", 40, 60, 10, rl.DarkGray) raylib.DrawText("- Mouse Wheel Pressed to Pan", 40, 60, 10, raylib.DarkGray)
rl.DrawText("- Z to zoom to (0, 0, 0)", 40, 120, 10, rl.DarkGray) raylib.DrawText("- Alt + Mouse Wheel Pressed to Rotate", 40, 80, 10, raylib.DarkGray)
raylib.DrawText("- Alt + Ctrl + Mouse Wheel Pressed for Smooth Zoom", 40, 100, 10, raylib.DarkGray)
raylib.DrawText("- Z to zoom to (0, 0, 0)", 40, 120, 10, raylib.DarkGray)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,127 +0,0 @@
package main
import (
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
var (
screenW = int32(800)
screenH = int32(450)
cam1, cam2 rl.Camera3D
)
func main() {
rl.InitWindow(screenW, screenH, "raylib [core] example - 3d camera split screen")
// Setup player 1 camera and screen
cam1.Fovy = 45
cam1.Up.Y = 1
cam1.Target.Y = 1
cam1.Position.Z = -3
cam1.Position.Y = 1
// Setup player two camera and screen
cam2.Fovy = 45
cam2.Up.Y = 1
cam2.Target.Y = 3
cam2.Position.X = -3
cam2.Position.Y = 3
screenCam1 := rl.LoadRenderTexture(screenW/2, screenH)
screenCam2 := rl.LoadRenderTexture(screenW/2, screenH)
splitScreenRec := rl.NewRectangle(0, 0, float32(screenCam1.Texture.Width), -float32(screenCam1.Texture.Height))
count := float32(5)
spacing := float32(4)
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
// If anyone moves this frame, how far will they move based on the time
// since the last frame this moves things at 10 world units per second,
// regardless of the actual FPS
frameOffset := 10 * rl.GetFrameTime()
// Move Player1 forward and backwards (no turning)
if rl.IsKeyDown(rl.KeyW) {
cam1.Position.Z += frameOffset
cam1.Target.Z += frameOffset
} else if rl.IsKeyDown(rl.KeyS) {
cam1.Position.Z -= frameOffset
cam1.Target.Z -= frameOffset
}
// Move Player2 forward and backwards (no turning)
if rl.IsKeyDown(rl.KeyUp) {
cam2.Position.X += frameOffset
cam2.Target.X += frameOffset
} else if rl.IsKeyDown(rl.KeyDown) {
cam2.Position.X -= frameOffset
cam2.Target.X -= frameOffset
}
// Draw Player1 view to the render texture
rl.BeginTextureMode(screenCam1)
rl.ClearBackground(rl.SkyBlue)
rl.BeginMode3D(cam1)
rl.DrawPlane(rl.Vector3Zero(), rl.NewVector2(50, 50), rl.Beige)
for x := -count * spacing; x <= count*spacing; x += spacing {
for z := -count * spacing; z <= count*spacing; z += spacing {
rl.DrawCube(rl.NewVector3(x-0.5, 1.5, z), 1, 1, 1, rl.Lime)
rl.DrawCube(rl.NewVector3(x-0.5, 0.5, z), 0.25, 1, 0.25, rl.Brown)
}
}
rl.DrawCube(cam1.Position, 1, 1, 1, rl.Red)
rl.DrawCube(cam2.Position, 1, 1, 1, rl.Blue)
rl.EndMode3D()
rl.DrawRectangle(0, 0, screenW/2, 40, rl.Fade(rl.RayWhite, 0.8))
rl.DrawText("PLAYER1: W/S to move", 10, 10, 20, rl.Maroon)
rl.EndTextureMode()
// Draw Player2 view to the render texture
rl.BeginTextureMode(screenCam2)
rl.ClearBackground(rl.SkyBlue)
rl.BeginMode3D(cam2)
rl.DrawPlane(rl.Vector3Zero(), rl.NewVector2(50, 50), rl.Beige)
for x := -count * spacing; x <= count*spacing; x += spacing {
for z := -count * spacing; z <= count*spacing; z += spacing {
rl.DrawCube(rl.NewVector3(x, 1.5, z), 1, 1, 1, rl.Lime)
rl.DrawCube(rl.NewVector3(x, 0.5, z), 0.25, 1, 0.25, rl.Brown)
}
}
rl.DrawCube(cam1.Position, 1, 1, 1, rl.Red)
rl.DrawCube(cam2.Position, 1, 1, 1, rl.Blue)
rl.EndMode3D()
rl.DrawRectangle(0, 0, screenW/2, 40, rl.Fade(rl.RayWhite, 0.8))
rl.DrawText("PLAYER2: UP/DOWN to move", 10, 10, 20, rl.Maroon)
rl.EndTextureMode()
// Draw both views render textures to the screen side by side
rl.BeginDrawing()
rl.ClearBackground(rl.Black)
rl.DrawTextureRec(screenCam1.Texture, splitScreenRec, rl.NewVector2(0, 0), rl.White)
rl.DrawTextureRec(screenCam2.Texture, splitScreenRec, rl.NewVector2(float32(screenW/2), 0), rl.White)
rl.DrawRectangle((screenW/2)-2, 0, 4, screenH, rl.LightGray)
rl.EndDrawing()
}
rl.UnloadRenderTexture(screenCam1)
rl.UnloadRenderTexture(screenCam2)
rl.CloseWindow()
}

View file

@ -1,43 +1,43 @@
package main package main
import ( import (
"git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
func main() { func main() {
rl.InitWindow(800, 450, "raylib [core] example - 3d mode") raylib.InitWindow(800, 450, "raylib [core] example - 3d mode")
camera := rl.Camera3D{} camera := raylib.Camera3D{}
camera.Position = rl.NewVector3(0.0, 10.0, 10.0) camera.Position = raylib.NewVector3(0.0, 10.0, 10.0)
camera.Target = rl.NewVector3(0.0, 0.0, 0.0) camera.Target = raylib.NewVector3(0.0, 0.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) camera.Up = raylib.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0 camera.Fovy = 45.0
camera.Projection = rl.CameraPerspective camera.Type = raylib.CameraPerspective
cubePosition := rl.NewVector3(0.0, 0.0, 0.0) cubePosition := raylib.NewVector3(0.0, 0.0, 0.0)
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.BeginMode3D(camera) raylib.BeginMode3D(camera)
rl.DrawCube(cubePosition, 2.0, 2.0, 2.0, rl.Red) raylib.DrawCube(cubePosition, 2.0, 2.0, 2.0, raylib.Red)
rl.DrawCubeWires(cubePosition, 2.0, 2.0, 2.0, rl.Maroon) raylib.DrawCubeWires(cubePosition, 2.0, 2.0, 2.0, raylib.Maroon)
rl.DrawGrid(10, 1.0) raylib.DrawGrid(10, 1.0)
rl.EndMode3D() raylib.EndMode3D()
rl.DrawText("Welcome to the third dimension!", 10, 40, 20, rl.DarkGray) raylib.DrawText("Welcome to the third dimension!", 10, 40, 20, raylib.DarkGray)
rl.DrawFPS(10, 10) raylib.DrawFPS(10, 10)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,78 +1,78 @@
package main package main
import ( import (
rl "git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
func main() { func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d picking") raylib.InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d picking")
camera := rl.Camera3D{} camera := raylib.Camera3D{}
camera.Position = rl.NewVector3(10.0, 10.0, 10.0) camera.Position = raylib.NewVector3(10.0, 10.0, 10.0)
camera.Target = rl.NewVector3(0.0, 0.0, 0.0) camera.Target = raylib.NewVector3(0.0, 0.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) camera.Up = raylib.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0 camera.Fovy = 45.0
camera.Projection = rl.CameraPerspective camera.Type = raylib.CameraPerspective
cubePosition := rl.NewVector3(0.0, 1.0, 0.0) cubePosition := raylib.NewVector3(0.0, 1.0, 0.0)
cubeSize := rl.NewVector3(2.0, 2.0, 2.0) cubeSize := raylib.NewVector3(2.0, 2.0, 2.0)
var ray rl.Ray var ray raylib.Ray
var collision rl.RayCollision
rl.SetTargetFPS(60) collision := false
for !rl.WindowShouldClose() { raylib.SetCameraMode(camera, raylib.CameraFree) // Set a free camera mode
rl.UpdateCamera(&camera, rl.CameraFree) // Update camera with free camera mode
if rl.IsMouseButtonPressed(rl.MouseLeftButton) { raylib.SetTargetFPS(60)
if !collision.Hit {
ray = rl.GetMouseRay(rl.GetMousePosition(), camera) for !raylib.WindowShouldClose() {
raylib.UpdateCamera(&camera) // Update camera
if raylib.IsMouseButtonPressed(raylib.MouseLeftButton) {
// NOTE: This function is NOT WORKING properly!
ray = raylib.GetMouseRay(raylib.GetMousePosition(), camera)
// Check collision between ray and box // Check collision between ray and box
min := rl.NewVector3(cubePosition.X-cubeSize.X/2, cubePosition.Y-cubeSize.Y/2, cubePosition.Z-cubeSize.Z/2) min := raylib.NewVector3(cubePosition.X-cubeSize.X/2, cubePosition.Y-cubeSize.Y/2, cubePosition.Z-cubeSize.Z/2)
max := rl.NewVector3(cubePosition.X+cubeSize.X/2, cubePosition.Y+cubeSize.Y/2, cubePosition.Z+cubeSize.Z/2) max := raylib.NewVector3(cubePosition.X+cubeSize.X/2, cubePosition.Y+cubeSize.Y/2, cubePosition.Z+cubeSize.Z/2)
collision = rl.GetRayCollisionBox(ray, rl.NewBoundingBox(min, max)) collision = raylib.CheckCollisionRayBox(ray, raylib.NewBoundingBox(min, max))
}
raylib.BeginDrawing()
raylib.ClearBackground(raylib.RayWhite)
raylib.BeginMode3D(camera)
if collision {
raylib.DrawCube(cubePosition, cubeSize.X, cubeSize.Y, cubeSize.Z, raylib.Red)
raylib.DrawCubeWires(cubePosition, cubeSize.X, cubeSize.Y, cubeSize.Z, raylib.Maroon)
raylib.DrawCubeWires(cubePosition, cubeSize.X+0.2, cubeSize.Y+0.2, cubeSize.Z+0.2, raylib.Green)
} else { } else {
collision.Hit = false raylib.DrawCube(cubePosition, cubeSize.X, cubeSize.Y, cubeSize.Z, raylib.Gray)
} raylib.DrawCubeWires(cubePosition, cubeSize.X, cubeSize.Y, cubeSize.Z, raylib.DarkGray)
} }
rl.BeginDrawing() raylib.DrawRay(ray, raylib.Maroon)
rl.ClearBackground(rl.RayWhite) raylib.DrawGrid(10, 1.0)
rl.BeginMode3D(camera) raylib.EndMode3D()
if collision.Hit { raylib.DrawText("Try selecting the box with mouse!", 240, 10, 20, raylib.DarkGray)
rl.DrawCube(cubePosition, cubeSize.X, cubeSize.Y, cubeSize.Z, rl.Red)
rl.DrawCubeWires(cubePosition, cubeSize.X, cubeSize.Y, cubeSize.Z, rl.Maroon)
rl.DrawCubeWires(cubePosition, cubeSize.X+0.2, cubeSize.Y+0.2, cubeSize.Z+0.2, rl.Green) if collision {
} else { raylib.DrawText("BOX SELECTED", (screenWidth-raylib.MeasureText("BOX SELECTED", 30))/2, int32(float32(screenHeight)*0.1), 30, raylib.Green)
rl.DrawCube(cubePosition, cubeSize.X, cubeSize.Y, cubeSize.Z, rl.Gray)
rl.DrawCubeWires(cubePosition, cubeSize.X, cubeSize.Y, cubeSize.Z, rl.DarkGray)
} }
rl.DrawRay(ray, rl.Maroon) raylib.DrawFPS(10, 10)
rl.DrawGrid(10, 1.0) raylib.EndDrawing()
rl.EndMode3D()
rl.DrawText("Try selecting the box with mouse!", 240, 10, 20, rl.DarkGray)
if collision.Hit {
rl.DrawText("BOX SELECTED", (screenWidth-rl.MeasureText("BOX SELECTED", 30))/2, int32(float32(screenHeight)*0.1), 30, rl.Green)
} }
rl.DrawFPS(10, 10) raylib.CloseWindow()
rl.EndDrawing()
}
rl.CloseWindow()
} }

View file

@ -1,22 +1,22 @@
package main package main
import "git.terah.dev/UnrealXR/raylib-go/raylib" import "github.com/gen2brain/raylib-go/raylib"
func main() { func main() {
rl.SetConfigFlags(rl.FlagVsyncHint) raylib.SetConfigFlags(raylib.FlagVsyncHint)
rl.InitWindow(800, 450, "raylib [core] example - basic window") raylib.InitWindow(800, 450, "raylib [core] example - basic window")
//rl.SetTargetFPS(60) //raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.DrawText("Congrats! You created your first window!", 190, 200, 20, rl.LightGray) raylib.DrawText("Congrats! You created your first window!", 190, 200, 20, raylib.LightGray)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,106 +0,0 @@
package main
import (
"fmt"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const screenW = int32(1280)
const screenH = int32(720)
type gameScreen int
const (
LOGO = iota
TITLE
GAMEPLAY
ENDING
)
func main() {
rl.InitWindow(screenW, screenH, "raylib [core] example - basic screen manager")
var currentScreen gameScreen
currentScreen = LOGO
frames := 0
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
switch currentScreen {
case LOGO:
frames++
if frames > 240 {
currentScreen = TITLE
}
case TITLE:
if rl.IsKeyPressed(rl.KeyEnter) {
currentScreen = GAMEPLAY
}
case GAMEPLAY:
if rl.IsKeyPressed(rl.KeyEnter) {
currentScreen = ENDING
}
case ENDING:
if rl.IsKeyPressed(rl.KeyEnter) {
currentScreen = LOGO
frames = 0
}
}
rl.BeginDrawing()
rl.ClearBackground(rl.Black)
rec := rl.NewRectangle(0, 0, float32(screenW), float32(screenH))
switch currentScreen {
case LOGO:
txt := "YOUR LOGO GOES HERE"
txtlen := rl.MeasureText(txt, 50)
rl.DrawText(txt, screenW/2-txtlen/2-3, screenH/2-50+3, 50, rl.Magenta)
rl.DrawText(txt, screenW/2-txtlen/2-1, screenH/2-50+1, 50, rl.Black)
rl.DrawText(txt, screenW/2-txtlen/2, screenH/2-50, 50, rl.White)
txt = "this message disappears in " + fmt.Sprint(240-frames) + " frames"
txtlen = rl.MeasureText(txt, 30)
rl.DrawText(txt, screenW/2-txtlen/2-3, screenH/2+3, 30, rl.Magenta)
rl.DrawText(txt, screenW/2-txtlen/2-1, screenH/2+1, 30, rl.Black)
rl.DrawText(txt, screenW/2-txtlen/2, screenH/2, 30, rl.White)
case TITLE:
rl.DrawRectangleRec(rec, rl.DarkGreen)
txt := "AN AMAZING TITLE GOES HERE"
txtlen := rl.MeasureText(txt, 50)
rl.DrawText(txt, screenW/2-txtlen/2-2, screenH/2-50+2, 50, rl.Black)
rl.DrawText(txt, screenW/2-txtlen/2, screenH/2-50, 50, rl.White)
txt = "press enter to move to next screen"
txtlen = rl.MeasureText(txt, 30)
rl.DrawText(txt, screenW/2-txtlen/2-2, screenH/2+2, 30, rl.Black)
rl.DrawText(txt, screenW/2-txtlen/2, screenH/2, 30, rl.White)
case GAMEPLAY:
rl.DrawRectangleRec(rec, rl.DarkPurple)
txt := "FUN GAMEPLAY GOES HERE"
txtlen := rl.MeasureText(txt, 50)
rl.DrawText(txt, screenW/2-txtlen/2-2, screenH/2-50+2, 50, rl.Black)
rl.DrawText(txt, screenW/2-txtlen/2, screenH/2-50, 50, rl.White)
txt = "press enter to move to next screen"
txtlen = rl.MeasureText(txt, 30)
rl.DrawText(txt, screenW/2-txtlen/2-2, screenH/2+2, 30, rl.Black)
rl.DrawText(txt, screenW/2-txtlen/2, screenH/2, 30, rl.White)
case ENDING:
rl.DrawRectangleRec(rec, rl.DarkBlue)
txt := "A DRAMATIC ENDING GOES HERE"
txtlen := rl.MeasureText(txt, 50)
rl.DrawText(txt, screenW/2-txtlen/2-2, screenH/2-50+2, 50, rl.Black)
rl.DrawText(txt, screenW/2-txtlen/2, screenH/2-50, 50, rl.White)
txt = "press enter to move to next screen"
txtlen = rl.MeasureText(txt, 30)
rl.DrawText(txt, screenW/2-txtlen/2-2, screenH/2+2, 30, rl.Black)
rl.DrawText(txt, screenW/2-txtlen/2, screenH/2, 30, rl.White)
}
rl.EndDrawing()
}
rl.CloseWindow()
}

View file

@ -1,19 +1,23 @@
package main package main
func main() { import (
rl.InitWindow(800, 450, "raylib [core] example - color selection (collision detection)") "github.com/gen2brain/raylib-go/raylib"
)
colors := [21]rl.Color{ func main() {
rl.DarkGray, rl.Maroon, rl.Orange, rl.DarkGreen, rl.DarkBlue, rl.DarkPurple, raylib.InitWindow(800, 450, "raylib [core] example - color selection (collision detection)")
rl.DarkBrown, rl.Gray, rl.Red, rl.Gold, rl.Lime, rl.Blue, rl.Violet, rl.Brown,
rl.LightGray, rl.Pink, rl.Yellow, rl.Green, rl.SkyBlue, rl.Purple, rl.Beige, colors := [21]raylib.Color{
raylib.DarkGray, raylib.Maroon, raylib.Orange, raylib.DarkGreen, raylib.DarkBlue, raylib.DarkPurple,
raylib.DarkBrown, raylib.Gray, raylib.Red, raylib.Gold, raylib.Lime, raylib.Blue, raylib.Violet, raylib.Brown,
raylib.LightGray, raylib.Pink, raylib.Yellow, raylib.Green, raylib.SkyBlue, raylib.Purple, raylib.Beige,
} }
colorsRecs := make([]rl.Rectangle, 21) // Rectangles array colorsRecs := make([]raylib.Rectangle, 21) // Rectangles array
// Fills colorsRecs data (for every rectangle) // Fills colorsRecs data (for every rectangle)
for i := 0; i < 21; i++ { for i := 0; i < 21; i++ {
r := rl.Rectangle{} r := raylib.Rectangle{}
r.X = float32(20 + 100*(i%7) + 10*(i%7)) r.X = float32(20 + 100*(i%7) + 10*(i%7))
r.Y = float32(60 + 100*(i/7) + 10*(i/7)) r.Y = float32(60 + 100*(i/7) + 10*(i/7))
r.Width = 100 r.Width = 100
@ -24,18 +28,18 @@ func main() {
selected := make([]bool, 21) // Selected rectangles indicator selected := make([]bool, 21) // Selected rectangles indicator
mousePoint := rl.Vector2{} mousePoint := raylib.Vector2{}
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
mousePoint = rl.GetMousePosition() mousePoint = raylib.GetMousePosition()
for i := 0; i < 21; i++ { // Iterate along all the rectangles for i := 0; i < 21; i++ { // Iterate along all the rectangles
if rl.CheckCollisionPointRec(mousePoint, colorsRecs[i]) { if raylib.CheckCollisionPointRec(mousePoint, colorsRecs[i]) {
colors[i].A = 120 colors[i].A = 120
if rl.IsMouseButtonPressed(rl.MouseLeftButton) { if raylib.IsMouseButtonPressed(raylib.MouseLeftButton) {
selected[i] = !selected[i] selected[i] = !selected[i]
} }
} else { } else {
@ -43,24 +47,24 @@ func main() {
} }
} }
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
for i := 0; i < 21; i++ { // Draw all rectangles for i := 0; i < 21; i++ { // Draw all rectangles
rl.DrawRectangleRec(colorsRecs[i], colors[i]) raylib.DrawRectangleRec(colorsRecs[i], colors[i])
// Draw four rectangles around selected rectangle // Draw four rectangles around selected rectangle
if selected[i] { if selected[i] {
rl.DrawRectangle(int32(colorsRecs[i].X), int32(colorsRecs[i].Y), 100, 10, rl.RayWhite) // Square top rectangle raylib.DrawRectangle(int32(colorsRecs[i].X), int32(colorsRecs[i].Y), 100, 10, raylib.RayWhite) // Square top rectangle
rl.DrawRectangle(int32(colorsRecs[i].X), int32(colorsRecs[i].Y), 10, 100, rl.RayWhite) // Square left rectangle raylib.DrawRectangle(int32(colorsRecs[i].X), int32(colorsRecs[i].Y), 10, 100, raylib.RayWhite) // Square left rectangle
rl.DrawRectangle(int32(colorsRecs[i].X+90), int32(colorsRecs[i].Y), 10, 100, rl.RayWhite) // Square right rectangle raylib.DrawRectangle(int32(colorsRecs[i].X+90), int32(colorsRecs[i].Y), 10, 100, raylib.RayWhite) // Square right rectangle
rl.DrawRectangle(int32(colorsRecs[i].X), int32(colorsRecs[i].Y)+90, 100, 10, rl.RayWhite) // Square bottom rectangle raylib.DrawRectangle(int32(colorsRecs[i].X), int32(colorsRecs[i].Y)+90, 100, 10, raylib.RayWhite) // Square bottom rectangle
} }
} }
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,144 +0,0 @@
package main
import (
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
/*******************************************************************************************
*
* raylib [core] example - split screen
*
* Example originally created with raylib 3.7, last time updated with raylib 4.0
*
* Example contributed by Jeffery Myers (@JeffM2501) and reviewed by Ramon Santamaria (@raysan5)
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2021-2022 Jeffery Myers (@JeffM2501)
*
********************************************************************************************/
var cameraPlayer1 rl.Camera
var cameraPlayer2 rl.Camera
// Scene drawing
func DrawScene() {
count := float32(5.0)
spacing := float32(4.0)
// Grid of cube trees on a plane to make a "world"
rl.DrawPlane(rl.Vector3{0, 0, 0}, rl.Vector2{50, 50}, rl.Beige) // Simple world plane
for x := -float32(count * spacing); x <= count*spacing; x += spacing {
for z := -float32(count * spacing); z <= count*spacing; z += spacing {
rl.DrawCube(rl.Vector3{x, 1.5, z}, 1, 1, 1, rl.Lime)
rl.DrawCube(rl.Vector3{x, 0.5, z}, 0.25, 1, 0.25, rl.Brown)
}
}
// Draw a cube at each player's position
rl.DrawCube(cameraPlayer1.Position, 1, 1, 1, rl.Red)
rl.DrawCube(cameraPlayer2.Position, 1, 1, 1, rl.Blue)
}
// ------------------------------------------------------------------------------------
// Program main entry point
// ------------------------------------------------------------------------------------
func main() {
// Initialization
//--------------------------------------------------------------------------------------
const (
screenWidth = 800
screenHeight = 450
)
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - split screen")
// Setup player 1 camera and screen
cameraPlayer1.Fovy = 45.0
cameraPlayer1.Up.Y = 1.0
cameraPlayer1.Target.Y = 1.0
cameraPlayer1.Position.Z = -3.0
cameraPlayer1.Position.Y = 1.0
screenPlayer1 := rl.LoadRenderTexture(screenWidth/2, screenHeight)
// Setup player two camera and screen
cameraPlayer2.Fovy = 45.0
cameraPlayer2.Up.Y = 1.0
cameraPlayer2.Target.Y = 3.0
cameraPlayer2.Position.X = -3.0
cameraPlayer2.Position.Y = 3.0
screenPlayer2 := rl.LoadRenderTexture(screenWidth/2, screenHeight)
// Build a flipped rectangle the size of the split view to use for drawing later
splitScreenRect := rl.Rectangle{0.0, 0.0, float32(screenPlayer1.Texture.Width), float32(-screenPlayer1.Texture.Height)}
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
// Main game loop
for !rl.WindowShouldClose() { // Detect window close button or ESC key
// Update
//----------------------------------------------------------------------------------
// If anyone moves this frame, how far will they move based on the time since the last frame
// this moves thigns at 10 world units per second, regardless of the actual FPS
offsetThisFrame := 10.0 * rl.GetFrameTime()
// Move Player1 forward and backwards (no turning)
if rl.IsKeyDown(rl.KeyW) {
cameraPlayer1.Position.Z += offsetThisFrame
cameraPlayer1.Target.Z += offsetThisFrame
} else if rl.IsKeyDown(rl.KeyS) {
cameraPlayer1.Position.Z -= offsetThisFrame
cameraPlayer1.Target.Z -= offsetThisFrame
}
// Move Player2 forward and backwards (no turning)
if rl.IsKeyDown(rl.KeyUp) {
cameraPlayer2.Position.X += offsetThisFrame
cameraPlayer2.Target.X += offsetThisFrame
} else if rl.IsKeyDown(rl.KeyDown) {
cameraPlayer2.Position.X -= offsetThisFrame
cameraPlayer2.Target.X -= offsetThisFrame
}
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
// Draw Player1 view to the render texture
rl.BeginTextureMode(screenPlayer1)
rl.ClearBackground(rl.SkyBlue)
rl.BeginMode3D(cameraPlayer1)
DrawScene()
rl.EndMode3D()
rl.DrawText("PLAYER1 W/S to move", 10, 10, 20, rl.Red)
rl.EndTextureMode()
// Draw Player2 view to the render texture
rl.BeginTextureMode(screenPlayer2)
rl.ClearBackground(rl.SkyBlue)
rl.BeginMode3D(cameraPlayer2)
DrawScene()
rl.EndMode3D()
rl.DrawText("PLAYER2 UP/DOWN to move", 10, 10, 20, rl.Blue)
rl.EndTextureMode()
// Draw both views render textures to the screen side by side
rl.BeginDrawing()
rl.ClearBackground(rl.Black)
rl.DrawTextureRec(screenPlayer1.Texture, splitScreenRect, rl.Vector2{0, 0}, rl.White)
rl.DrawTextureRec(screenPlayer2.Texture, splitScreenRect, rl.Vector2{screenWidth / 2.0, 0}, rl.White)
rl.EndDrawing()
}
// De-Initialization
//--------------------------------------------------------------------------------------
rl.UnloadRenderTexture(screenPlayer1) // Unload render texture
rl.UnloadRenderTexture(screenPlayer2) // Unload render texture
rl.CloseWindow() // Close window and OpenGL context
//--------------------------------------------------------------------------------------
}

View file

@ -1,131 +0,0 @@
package main
/*******************************************************************************************
*
* raylib [core] example - custom frame control
*
* NOTE: WARNING: This is an example for advanced users willing to have full control over
* the frame processes. By default, EndDrawing() calls the following processes:
* 1. Draw remaining batch data: rlDrawRenderBatchActive()
* 2. SwapScreenBuffer()
* 3. Frame time control: WaitTime()
* 4. PollInputEvents()
*
* To avoid steps 2, 3 and 4, flag SUPPORT_CUSTOM_FRAME_CONTROL can be enabled in
* config.h (it requires recompiling raylib). This way those steps are up to the user.
*
* Note that enabling this flag invalidates some functions:
* - GetFrameTime()
* - SetTargetFPS()
* - GetFPS()
*
* Example originally created with raylib 4.0, last time updated with raylib 4.0
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2021-2024 Ramon Santamaria (@raysan5)
*
********************************************************************************************/
import (
"fmt"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
)
func main() {
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - Custom Frame Control")
previousTime := rl.GetTime()
currentTime := 0.0
updateDrawTime := 0.0
waitTime := 0.0
deltaTime := 0.0
timeCounter := 0.0
position := 0.0
pause := false
targetFPS := 60
for !rl.WindowShouldClose() {
rl.PollInputEvents() // Poll input events (SUPPORT_CUSTOM_FRAME_CONTROL)
if rl.IsKeyPressed(rl.KeySpace) {
pause = !pause
}
if rl.IsKeyPressed(rl.KeyUp) {
targetFPS += 20
} else if rl.IsKeyPressed(rl.KeyDown) {
targetFPS -= 20
}
if targetFPS < 0 {
targetFPS = 0
}
if !pause {
position += 200 * deltaTime // We move at 200 pixels per second
if position >= float64(rl.GetScreenWidth()) {
position = 0
}
timeCounter += deltaTime // We count time (seconds)
}
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
for i := 0; i < rl.GetScreenWidth()/200; i++ {
rl.DrawRectangle(200*int32(i), 0, 1, int32(rl.GetScreenHeight()), rl.SkyBlue)
}
rl.DrawCircle(int32(position), int32(rl.GetScreenHeight()/2-25), 50, rl.Red)
msg := fmt.Sprintf("%03.0f ms", timeCounter*1000)
rl.DrawText(msg, int32(position-40), int32(rl.GetScreenHeight()/2-100), 20, rl.Maroon)
msg = fmt.Sprintf("PosX: %03.0f", position)
rl.DrawText(msg, int32(position-50), int32(rl.GetScreenHeight()/2+40), 20, rl.Black)
msg = "Circle is moving at a constant 200 pixels/sec,\nindependently of the frame rate."
rl.DrawText(msg, 10, 10, 20, rl.DarkGray)
msg = "PRESS SPACE to PAUSE MOVEMENT"
rl.DrawText(msg, 10, int32(rl.GetScreenHeight()-60), 20, rl.Gray)
msg = "PRESS UP | DOWN to CHANGE TARGET FPS"
rl.DrawText(msg, 10, int32(rl.GetScreenHeight()-30), 20, rl.Gray)
msg = fmt.Sprintf("TARGET FPS: %d", targetFPS)
rl.DrawText(msg, int32(rl.GetScreenWidth()-220), 10, 20, rl.Lime)
msg = fmt.Sprintf("CURRENT FPS: %d", int(1/deltaTime))
rl.DrawText(msg, int32(rl.GetScreenWidth()-220), 40, 20, rl.Lime)
rl.EndDrawing()
// NOTE: In case raylib is configured to SUPPORT_CUSTOM_FRAME_CONTROL,
// Events polling, screen buffer swap and frame time control must be managed by the user
rl.SwapScreenBuffer() // We want a fixed frame rate
currentTime = rl.GetTime()
updateDrawTime = currentTime - previousTime
if targetFPS > 0 { // We want a fixed frame rate
waitTime = (1 / float64(targetFPS)) - updateDrawTime
if waitTime > 0 {
rl.WaitTime(waitTime)
currentTime = rl.GetTime()
deltaTime = currentTime - previousTime
}
} else {
deltaTime = updateDrawTime
}
previousTime = currentTime
}
rl.CloseWindow()
}

View file

@ -1,49 +0,0 @@
package main
import (
"fmt"
"time"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
)
func main() {
// Set custom logger
rl.SetTraceLogCallback(customLog)
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - Custom Logging")
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.DrawText("Check the console output to see the custom logger in action!", 60, 200, 20, rl.LightGray)
rl.EndDrawing()
}
rl.CloseWindow()
}
// Custom logging function
func customLog(msgType int, text string) {
now := time.Now()
switch rl.TraceLogLevel(msgType) {
case rl.LogInfo:
fmt.Println("[INFO] : ", now, text)
case rl.LogError:
fmt.Println("[ERROR] : ", now, text)
case rl.LogWarning:
fmt.Println("[WARNING] : ", now, text)
case rl.LogDebug:
fmt.Println("[DEBUG] : ", now, text)
default:
fmt.Println("[UNKNOWN] : ", now, text)
}
}

View file

@ -1,47 +1,50 @@
package main package main
import (
"github.com/gen2brain/raylib-go/raylib"
)
func main() { func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - drop files") raylib.InitWindow(screenWidth, screenHeight, "raylib [core] example - drop files")
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
var count int count := int32(0)
var droppedFiles []string var droppedFiles []string
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
if rl.IsFileDropped() { if raylib.IsFileDropped() {
droppedFiles = rl.LoadDroppedFiles() droppedFiles = raylib.GetDroppedFiles(&count)
count = len(droppedFiles)
} }
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
if count == 0 { if count == 0 {
rl.DrawText("Drop your files to this window!", 100, 40, 20, rl.DarkGray) raylib.DrawText("Drop your files to this window!", 100, 40, 20, raylib.DarkGray)
} else { } else {
rl.DrawText("Dropped files:", 100, 40, 20, rl.DarkGray) raylib.DrawText("Dropped files:", 100, 40, 20, raylib.DarkGray)
for i := 0; i < count; i++ { for i := int32(0); i < count; i++ {
if i%2 == 0 { if i%2 == 0 {
rl.DrawRectangle(0, int32(85+40*i), screenWidth, 40, rl.Fade(rl.LightGray, 0.5)) raylib.DrawRectangle(0, int32(85+40*i), screenWidth, 40, raylib.Fade(raylib.LightGray, 0.5))
} else { } else {
rl.DrawRectangle(0, int32(85+40*i), screenWidth, 40, rl.Fade(rl.LightGray, 0.3)) raylib.DrawRectangle(0, int32(85+40*i), screenWidth, 40, raylib.Fade(raylib.LightGray, 0.3))
} }
rl.DrawText(droppedFiles[i], 120, int32(100+i*40), 10, rl.Gray) raylib.DrawText(droppedFiles[i], 120, int32(100), 10, raylib.Gray)
} }
rl.DrawText("Drop new files...", 100, int32(150+count*40), 20, rl.DarkGray) raylib.DrawText("Drop new files...", 100, int32(150), 20, raylib.DarkGray)
} }
rl.EndDrawing() raylib.EndDrawing()
} }
rl.UnloadDroppedFiles() raylib.ClearDroppedFiles()
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,5 +1,9 @@
package main package main
import (
"github.com/gen2brain/raylib-go/raylib"
)
var ( var (
maxGestureStrings int = 20 maxGestureStrings int = 20
) )
@ -8,47 +12,47 @@ func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - gestures detection") raylib.InitWindow(screenWidth, screenHeight, "raylib [core] example - gestures detection")
touchPosition := rl.NewVector2(0, 0) touchPosition := raylib.NewVector2(0, 0)
touchArea := rl.NewRectangle(220, 10, float32(screenWidth)-230, float32(screenHeight)-20) touchArea := raylib.NewRectangle(220, 10, float32(screenWidth)-230, float32(screenHeight)-20)
gestureStrings := make([]string, 0) gestureStrings := make([]string, 0)
currentGesture := rl.GestureNone currentGesture := raylib.GestureNone
lastGesture := rl.GestureNone lastGesture := raylib.GestureNone
//rl.SetGesturesEnabled(uint32(rl.GestureHold | rl.GestureDrag)) // Enable only some gestures to be detected //raylib.SetGesturesEnabled(uint32(raylib.GestureHold | raylib.GestureDrag)) // Enable only some gestures to be detected
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
lastGesture = currentGesture lastGesture = currentGesture
currentGesture = rl.GetGestureDetected() currentGesture = raylib.GetGestureDetected()
touchPosition = rl.GetTouchPosition(0) touchPosition = raylib.GetTouchPosition(0)
if rl.CheckCollisionPointRec(touchPosition, touchArea) && currentGesture != rl.GestureNone { if raylib.CheckCollisionPointRec(touchPosition, touchArea) && currentGesture != raylib.GestureNone {
if currentGesture != lastGesture { if currentGesture != lastGesture {
switch currentGesture { switch currentGesture {
case rl.GestureTap: case raylib.GestureTap:
gestureStrings = append(gestureStrings, "GESTURE TAP") gestureStrings = append(gestureStrings, "GESTURE TAP")
case rl.GestureDoubletap: case raylib.GestureDoubletap:
gestureStrings = append(gestureStrings, "GESTURE DOUBLETAP") gestureStrings = append(gestureStrings, "GESTURE DOUBLETAP")
case rl.GestureHold: case raylib.GestureHold:
gestureStrings = append(gestureStrings, "GESTURE HOLD") gestureStrings = append(gestureStrings, "GESTURE HOLD")
case rl.GestureDrag: case raylib.GestureDrag:
gestureStrings = append(gestureStrings, "GESTURE DRAG") gestureStrings = append(gestureStrings, "GESTURE DRAG")
case rl.GestureSwipeRight: case raylib.GestureSwipeRight:
gestureStrings = append(gestureStrings, "GESTURE SWIPE RIGHT") gestureStrings = append(gestureStrings, "GESTURE SWIPE RIGHT")
case rl.GestureSwipeLeft: case raylib.GestureSwipeLeft:
gestureStrings = append(gestureStrings, "GESTURE SWIPE LEFT") gestureStrings = append(gestureStrings, "GESTURE SWIPE LEFT")
case rl.GestureSwipeUp: case raylib.GestureSwipeUp:
gestureStrings = append(gestureStrings, "GESTURE SWIPE UP") gestureStrings = append(gestureStrings, "GESTURE SWIPE UP")
case rl.GestureSwipeDown: case raylib.GestureSwipeDown:
gestureStrings = append(gestureStrings, "GESTURE SWIPE DOWN") gestureStrings = append(gestureStrings, "GESTURE SWIPE DOWN")
case rl.GesturePinchIn: case raylib.GesturePinchIn:
gestureStrings = append(gestureStrings, "GESTURE PINCH IN") gestureStrings = append(gestureStrings, "GESTURE PINCH IN")
case rl.GesturePinchOut: case raylib.GesturePinchOut:
gestureStrings = append(gestureStrings, "GESTURE PINCH OUT") gestureStrings = append(gestureStrings, "GESTURE PINCH OUT")
} }
@ -58,38 +62,38 @@ func main() {
} }
} }
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.DrawRectangleRec(touchArea, rl.Gray) raylib.DrawRectangleRec(touchArea, raylib.Gray)
rl.DrawRectangle(225, 15, screenWidth-240, screenHeight-30, rl.RayWhite) raylib.DrawRectangle(225, 15, screenWidth-240, screenHeight-30, raylib.RayWhite)
rl.DrawText("GESTURES TEST AREA", screenWidth-270, screenHeight-40, 20, rl.Fade(rl.Gray, 0.5)) raylib.DrawText("GESTURES TEST AREA", screenWidth-270, screenHeight-40, 20, raylib.Fade(raylib.Gray, 0.5))
for i := 0; i < len(gestureStrings); i++ { for i := 0; i < len(gestureStrings); i++ {
if i%2 == 0 { if i%2 == 0 {
rl.DrawRectangle(10, int32(30+20*i), 200, 20, rl.Fade(rl.LightGray, 0.5)) raylib.DrawRectangle(10, int32(30+20*i), 200, 20, raylib.Fade(raylib.LightGray, 0.5))
} else { } else {
rl.DrawRectangle(10, int32(30+20*i), 200, 20, rl.Fade(rl.LightGray, 0.3)) raylib.DrawRectangle(10, int32(30+20*i), 200, 20, raylib.Fade(raylib.LightGray, 0.3))
} }
if i < len(gestureStrings)-1 { if i < len(gestureStrings)-1 {
rl.DrawText(gestureStrings[i], 35, int32(36+20*i), 10, rl.DarkGray) raylib.DrawText(gestureStrings[i], 35, int32(36+20*i), 10, raylib.DarkGray)
} else { } else {
rl.DrawText(gestureStrings[i], 35, int32(36+20*i), 10, rl.Maroon) raylib.DrawText(gestureStrings[i], 35, int32(36+20*i), 10, raylib.Maroon)
} }
} }
rl.DrawRectangleLines(10, 29, 200, screenHeight-50, rl.Gray) raylib.DrawRectangleLines(10, 29, 200, screenHeight-50, raylib.Gray)
rl.DrawText("DETECTED GESTURES", 50, 15, 10, rl.Gray) raylib.DrawText("DETECTED GESTURES", 50, 15, 10, raylib.Gray)
if currentGesture != rl.GestureNone { if currentGesture != raylib.GestureNone {
rl.DrawCircleV(touchPosition, 30, rl.Maroon) raylib.DrawCircleV(touchPosition, 30, raylib.Maroon)
} }
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -3,7 +3,7 @@ package main
import ( import (
"fmt" "fmt"
rl "git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
const ( const (
@ -12,192 +12,190 @@ const (
) )
func main() { func main() {
rl.SetConfigFlags(rl.FlagMsaa4xHint) // Set MSAA 4X hint before windows creation raylib.SetConfigFlags(raylib.FlagMsaa4xHint) // Set MSAA 4X hint before windows creation
rl.InitWindow(800, 450, "raylib [core] example - gamepad input") raylib.InitWindow(800, 450, "raylib [core] example - gamepad input")
texPs3Pad := rl.LoadTexture("ps3.png") texPs3Pad := raylib.LoadTexture("ps3.png")
texXboxPad := rl.LoadTexture("xbox.png") texXboxPad := raylib.LoadTexture("xbox.png")
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
var gamepad int32 = 0 // which gamepad to display for !raylib.WindowShouldClose() {
raylib.BeginDrawing()
for !rl.WindowShouldClose() { raylib.ClearBackground(raylib.RayWhite)
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite) if raylib.IsGamepadAvailable(raylib.GamepadPlayer1) {
raylib.DrawText(fmt.Sprintf("GP1: %s", raylib.GetGamepadName(raylib.GamepadPlayer1)), 10, 10, 10, raylib.Black)
if rl.IsGamepadAvailable(gamepad) { if raylib.IsGamepadName(raylib.GamepadPlayer1, xbox360NameID) {
rl.DrawText(fmt.Sprintf("GP1: %s", rl.GetGamepadName(gamepad)), 10, 10, 10, rl.Black) raylib.DrawTexture(texXboxPad, 0, 0, raylib.DarkGray)
if rl.GetGamepadName(gamepad) == xbox360NameID {
rl.DrawTexture(texXboxPad, 0, 0, rl.DarkGray)
// Draw buttons: xbox home // Draw buttons: xbox home
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonMiddle) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonHome) {
rl.DrawCircle(394, 89, 19, rl.Red) raylib.DrawCircle(394, 89, 19, raylib.Red)
} }
// Draw buttons: basic // Draw buttons: basic
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonMiddleRight) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonStart) {
rl.DrawCircle(436, 150, 9, rl.Red) raylib.DrawCircle(436, 150, 9, raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonMiddleLeft) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonSelect) {
rl.DrawCircle(352, 150, 9, rl.Red) raylib.DrawCircle(352, 150, 9, raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonRightFaceLeft) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonX) {
rl.DrawCircle(501, 151, 15, rl.Blue) raylib.DrawCircle(501, 151, 15, raylib.Blue)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonRightFaceDown) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonA) {
rl.DrawCircle(536, 187, 15, rl.Lime) raylib.DrawCircle(536, 187, 15, raylib.Lime)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonRightFaceRight) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonB) {
rl.DrawCircle(572, 151, 15, rl.Maroon) raylib.DrawCircle(572, 151, 15, raylib.Maroon)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonRightFaceUp) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonY) {
rl.DrawCircle(536, 115, 15, rl.Gold) raylib.DrawCircle(536, 115, 15, raylib.Gold)
} }
// Draw buttons: d-pad // Draw buttons: d-pad
rl.DrawRectangle(317, 202, 19, 71, rl.Black) raylib.DrawRectangle(317, 202, 19, 71, raylib.Black)
rl.DrawRectangle(293, 228, 69, 19, rl.Black) raylib.DrawRectangle(293, 228, 69, 19, raylib.Black)
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonLeftFaceUp) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonUp) {
rl.DrawRectangle(317, 202, 19, 26, rl.Red) raylib.DrawRectangle(317, 202, 19, 26, raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonLeftFaceDown) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonDown) {
rl.DrawRectangle(317, 202+45, 19, 26, rl.Red) raylib.DrawRectangle(317, 202+45, 19, 26, raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonLeftFaceLeft) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonLeft) {
rl.DrawRectangle(292, 228, 25, 19, rl.Red) raylib.DrawRectangle(292, 228, 25, 19, raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonLeftFaceRight) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonRight) {
rl.DrawRectangle(292+44, 228, 26, 19, rl.Red) raylib.DrawRectangle(292+44, 228, 26, 19, raylib.Red)
} }
// Draw buttons: left-right back // Draw buttons: left-right back
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonLeftTrigger1) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonLb) {
rl.DrawCircle(259, 61, 20, rl.Red) raylib.DrawCircle(259, 61, 20, raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonRightTrigger1) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadXboxButtonRb) {
rl.DrawCircle(536, 61, 20, rl.Red) raylib.DrawCircle(536, 61, 20, raylib.Red)
} }
// Draw axis: left joystick // Draw axis: left joystick
rl.DrawCircle(259, 152, 39, rl.Black) raylib.DrawCircle(259, 152, 39, raylib.Black)
rl.DrawCircle(259, 152, 34, rl.LightGray) raylib.DrawCircle(259, 152, 34, raylib.LightGray)
rl.DrawCircle(int32(259+(rl.GetGamepadAxisMovement(gamepad, rl.GamepadAxisLeftX)*20)), raylib.DrawCircle(int32(259+(raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, raylib.GamepadXboxAxisLeftX)*20)),
int32(152-(rl.GetGamepadAxisMovement(gamepad, rl.GamepadAxisLeftY)*20)), 25, rl.Black) int32(152-(raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, raylib.GamepadXboxAxisLeftY)*20)), 25, raylib.Black)
// Draw axis: right joystick // Draw axis: right joystick
rl.DrawCircle(461, 237, 38, rl.Black) raylib.DrawCircle(461, 237, 38, raylib.Black)
rl.DrawCircle(461, 237, 33, rl.LightGray) raylib.DrawCircle(461, 237, 33, raylib.LightGray)
rl.DrawCircle(int32(461+(rl.GetGamepadAxisMovement(gamepad, rl.GamepadAxisRightX)*20)), raylib.DrawCircle(int32(461+(raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, raylib.GamepadXboxAxisRightX)*20)),
int32(237-(rl.GetGamepadAxisMovement(gamepad, rl.GamepadAxisRightY)*20)), 25, rl.Black) int32(237-(raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, raylib.GamepadXboxAxisRightY)*20)), 25, raylib.Black)
// Draw axis: left-right triggers // Draw axis: left-right triggers
rl.DrawRectangle(170, 30, 15, 70, rl.Gray) raylib.DrawRectangle(170, 30, 15, 70, raylib.Gray)
rl.DrawRectangle(604, 30, 15, 70, rl.Gray) raylib.DrawRectangle(604, 30, 15, 70, raylib.Gray)
rl.DrawRectangle(170, 30, 15, int32(((1.0+rl.GetGamepadAxisMovement(gamepad, rl.GamepadAxisLeftTrigger))/2.0)*70), rl.Red) raylib.DrawRectangle(170, 30, 15, int32(((1.0+raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, raylib.GamepadXboxAxisLt))/2.0)*70), raylib.Red)
rl.DrawRectangle(604, 30, 15, int32(((1.0+rl.GetGamepadAxisMovement(gamepad, rl.GamepadAxisRightTrigger))/2.0)*70), rl.Red) raylib.DrawRectangle(604, 30, 15, int32(((1.0+raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, raylib.GamepadXboxAxisRt))/2.0)*70), raylib.Red)
} else if rl.GetGamepadName(gamepad) == ps3NameID { } else if raylib.IsGamepadName(raylib.GamepadPlayer1, ps3NameID) {
rl.DrawTexture(texPs3Pad, 0, 0, rl.DarkGray) raylib.DrawTexture(texPs3Pad, 0, 0, raylib.DarkGray)
// Draw buttons: ps // Draw buttons: ps
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonMiddle) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonPs) {
rl.DrawCircle(396, 222, 13, rl.Red) raylib.DrawCircle(396, 222, 13, raylib.Red)
} }
// Draw buttons: basic // Draw buttons: basic
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonMiddleLeft) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonSelect) {
rl.DrawRectangle(328, 170, 32, 13, rl.Red) raylib.DrawRectangle(328, 170, 32, 13, raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonMiddleRight) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonStart) {
rl.DrawTriangle(rl.NewVector2(436, 168), rl.NewVector2(436, 185), rl.NewVector2(464, 177), rl.Red) raylib.DrawTriangle(raylib.NewVector2(436, 168), raylib.NewVector2(436, 185), raylib.NewVector2(464, 177), raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonRightFaceUp) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonTriangle) {
rl.DrawCircle(557, 144, 13, rl.Lime) raylib.DrawCircle(557, 144, 13, raylib.Lime)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonRightFaceRight) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonCircle) {
rl.DrawCircle(586, 173, 13, rl.Red) raylib.DrawCircle(586, 173, 13, raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonRightFaceDown) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonCross) {
rl.DrawCircle(557, 203, 13, rl.Violet) raylib.DrawCircle(557, 203, 13, raylib.Violet)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonRightFaceLeft) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonSquare) {
rl.DrawCircle(527, 173, 13, rl.Pink) raylib.DrawCircle(527, 173, 13, raylib.Pink)
} }
// Draw buttons: d-pad // Draw buttons: d-pad
rl.DrawRectangle(225, 132, 24, 84, rl.Black) raylib.DrawRectangle(225, 132, 24, 84, raylib.Black)
rl.DrawRectangle(195, 161, 84, 25, rl.Black) raylib.DrawRectangle(195, 161, 84, 25, raylib.Black)
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonLeftFaceUp) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonUp) {
rl.DrawRectangle(225, 132, 24, 29, rl.Red) raylib.DrawRectangle(225, 132, 24, 29, raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonLeftFaceDown) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonDown) {
rl.DrawRectangle(225, 132+54, 24, 30, rl.Red) raylib.DrawRectangle(225, 132+54, 24, 30, raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonLeftFaceLeft) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonLeft) {
rl.DrawRectangle(195, 161, 30, 25, rl.Red) raylib.DrawRectangle(195, 161, 30, 25, raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonLeftFaceRight) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonRight) {
rl.DrawRectangle(195+54, 161, 30, 25, rl.Red) raylib.DrawRectangle(195+54, 161, 30, 25, raylib.Red)
} }
// Draw buttons: left-right back buttons // Draw buttons: left-right back buttons
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonLeftTrigger1) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonL1) {
rl.DrawCircle(239, 82, 20, rl.Red) raylib.DrawCircle(239, 82, 20, raylib.Red)
} }
if rl.IsGamepadButtonDown(gamepad, rl.GamepadButtonRightTrigger1) { if raylib.IsGamepadButtonDown(raylib.GamepadPlayer1, raylib.GamepadPs3ButtonR1) {
rl.DrawCircle(557, 82, 20, rl.Red) raylib.DrawCircle(557, 82, 20, raylib.Red)
} }
// Draw axis: left joystick // Draw axis: left joystick
rl.DrawCircle(319, 255, 35, rl.Black) raylib.DrawCircle(319, 255, 35, raylib.Black)
rl.DrawCircle(319, 255, 31, rl.LightGray) raylib.DrawCircle(319, 255, 31, raylib.LightGray)
rl.DrawCircle(int32(319+(rl.GetGamepadAxisMovement(gamepad, rl.GamepadAxisLeftX)*20)), raylib.DrawCircle(int32(319+(raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, raylib.GamepadPs3AxisLeftX)*20)),
int32(255+(rl.GetGamepadAxisMovement(gamepad, rl.GamepadAxisLeftY)*20)), 25, rl.Black) int32(255+(raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, raylib.GamepadPs3AxisLeftY)*20)), 25, raylib.Black)
// Draw axis: right joystick // Draw axis: right joystick
rl.DrawCircle(475, 255, 35, rl.Black) raylib.DrawCircle(475, 255, 35, raylib.Black)
rl.DrawCircle(475, 255, 31, rl.LightGray) raylib.DrawCircle(475, 255, 31, raylib.LightGray)
rl.DrawCircle(int32(475+(rl.GetGamepadAxisMovement(gamepad, rl.GamepadAxisRightX)*20)), raylib.DrawCircle(int32(475+(raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, raylib.GamepadPs3AxisRightX)*20)),
int32(255+(rl.GetGamepadAxisMovement(gamepad, rl.GamepadAxisRightY)*20)), 25, rl.Black) int32(255+(raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, raylib.GamepadPs3AxisRightY)*20)), 25, raylib.Black)
// Draw axis: left-right triggers // Draw axis: left-right triggers
rl.DrawRectangle(169, 48, 15, 70, rl.Gray) raylib.DrawRectangle(169, 48, 15, 70, raylib.Gray)
rl.DrawRectangle(611, 48, 15, 70, rl.Gray) raylib.DrawRectangle(611, 48, 15, 70, raylib.Gray)
rl.DrawRectangle(169, 48, 15, int32(((1.0-rl.GetGamepadAxisMovement(gamepad, rl.GamepadAxisLeftTrigger))/2.0)*70), rl.Red) raylib.DrawRectangle(169, 48, 15, int32(((1.0-raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, raylib.GamepadPs3AxisL2))/2.0)*70), raylib.Red)
rl.DrawRectangle(611, 48, 15, int32(((1.0-rl.GetGamepadAxisMovement(gamepad, rl.GamepadAxisRightTrigger))/2.0)*70), rl.Red) raylib.DrawRectangle(611, 48, 15, int32(((1.0-raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, raylib.GamepadPs3AxisR2))/2.0)*70), raylib.Red)
} else { } else {
rl.DrawText("- GENERIC GAMEPAD -", 280, 180, 20, rl.Gray) raylib.DrawText("- GENERIC GAMEPAD -", 280, 180, 20, raylib.Gray)
// TODO: Draw generic gamepad // TODO: Draw generic gamepad
} }
rl.DrawText(fmt.Sprintf("DETECTED AXIS [%d]:", rl.GetGamepadAxisCount(gamepad)), 10, 50, 10, rl.Maroon) raylib.DrawText(fmt.Sprintf("DETECTED AXIS [%d]:", raylib.GetGamepadAxisCount(raylib.GamepadPlayer1)), 10, 50, 10, raylib.Maroon)
for i := int32(0); i < rl.GetGamepadAxisCount(gamepad); i++ { for i := int32(0); i < raylib.GetGamepadAxisCount(raylib.GamepadPlayer1); i++ {
rl.DrawText(fmt.Sprintf("AXIS %d: %.02f", i, rl.GetGamepadAxisMovement(gamepad, i)), 20, 70+20*i, 10, rl.DarkGray) raylib.DrawText(fmt.Sprintf("AXIS %d: %.02f", i, raylib.GetGamepadAxisMovement(raylib.GamepadPlayer1, i)), 20, 70+20*i, 10, raylib.DarkGray)
} }
if rl.GetGamepadButtonPressed() != -1 { if raylib.GetGamepadButtonPressed() != -1 {
rl.DrawText(fmt.Sprintf("DETECTED BUTTON: %d", rl.GetGamepadButtonPressed()), 10, 430, 10, rl.Red) raylib.DrawText(fmt.Sprintf("DETECTED BUTTON: %d", raylib.GetGamepadButtonPressed()), 10, 430, 10, raylib.Red)
} else { } else {
rl.DrawText("DETECTED BUTTON: NONE", 10, 430, 10, rl.Gray) raylib.DrawText("DETECTED BUTTON: NONE", 10, 430, 10, raylib.Gray)
} }
} else { } else {
rl.DrawText("GP1: NOT DETECTED", 10, 10, 10, rl.Gray) raylib.DrawText("GP1: NOT DETECTED", 10, 10, 10, raylib.Gray)
rl.DrawTexture(texXboxPad, 0, 0, rl.LightGray) raylib.DrawTexture(texXboxPad, 0, 0, raylib.LightGray)
} }
rl.EndDrawing() raylib.EndDrawing()
} }
rl.UnloadTexture(texPs3Pad) raylib.UnloadTexture(texPs3Pad)
rl.UnloadTexture(texXboxPad) raylib.UnloadTexture(texXboxPad)
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,37 +1,41 @@
package main package main
import (
"github.com/gen2brain/raylib-go/raylib"
)
func main() { func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - keyboard input") raylib.InitWindow(screenWidth, screenHeight, "raylib [core] example - keyboard input")
ballPosition := rl.NewVector2(float32(screenWidth)/2, float32(screenHeight)/2) ballPosition := raylib.NewVector2(float32(screenWidth)/2, float32(screenHeight)/2)
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
if rl.IsKeyDown(rl.KeyRight) { if raylib.IsKeyDown(raylib.KeyRight) {
ballPosition.X += 0.8 ballPosition.X += 0.8
} }
if rl.IsKeyDown(rl.KeyLeft) { if raylib.IsKeyDown(raylib.KeyLeft) {
ballPosition.X -= 0.8 ballPosition.X -= 0.8
} }
if rl.IsKeyDown(rl.KeyUp) { if raylib.IsKeyDown(raylib.KeyUp) {
ballPosition.Y -= 0.8 ballPosition.Y -= 0.8
} }
if rl.IsKeyDown(rl.KeyDown) { if raylib.IsKeyDown(raylib.KeyDown) {
ballPosition.Y += 0.8 ballPosition.Y += 0.8
} }
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.DrawText("move the ball with arrow keys", 10, 10, 20, rl.DarkGray) raylib.DrawText("move the ball with arrow keys", 10, 10, 20, raylib.DarkGray)
rl.DrawCircleV(ballPosition, 50, rl.Maroon) raylib.DrawCircleV(ballPosition, 50, raylib.Maroon)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,35 +1,35 @@
package main package main
import ( import (
"git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
func main() { func main() {
rl.InitWindow(800, 450, "raylib [core] example - mouse input") raylib.InitWindow(800, 450, "raylib [core] example - mouse input")
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
ballColor := rl.DarkBlue ballColor := raylib.DarkBlue
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
ballPosition := rl.GetMousePosition() ballPosition := raylib.GetMousePosition()
if rl.IsMouseButtonPressed(rl.MouseLeftButton) { if raylib.IsMouseButtonPressed(raylib.MouseLeftButton) {
ballColor = rl.Maroon ballColor = raylib.Maroon
} else if rl.IsMouseButtonPressed(rl.MouseMiddleButton) { } else if raylib.IsMouseButtonPressed(raylib.MouseMiddleButton) {
ballColor = rl.Lime ballColor = raylib.Lime
} else if rl.IsMouseButtonPressed(rl.MouseRightButton) { } else if raylib.IsMouseButtonPressed(raylib.MouseRightButton) {
ballColor = rl.DarkBlue ballColor = raylib.DarkBlue
} }
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.DrawCircleV(ballPosition, 40, ballColor) raylib.DrawCircleV(ballPosition, 40, ballColor)
rl.DrawText("move ball with mouse and click mouse button to change color", 10, 10, 20, rl.DarkGray) raylib.DrawText("move ball with mouse and click mouse button to change color", 10, 10, 20, raylib.DarkGray)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -3,34 +3,34 @@ package main
import ( import (
"fmt" "fmt"
rl "git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
func main() { func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - mouse wheel") raylib.InitWindow(screenWidth, screenHeight, "raylib [core] example - mouse wheel")
boxPositionY := screenHeight/2 - 40 boxPositionY := screenHeight/2 - 40
scrollSpeed := int32(4) // Scrolling speed in pixels scrollSpeed := int32(4) // Scrolling speed in pixels
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
boxPositionY -= int32(rl.GetMouseWheelMove()) * scrollSpeed boxPositionY -= raylib.GetMouseWheelMove() * scrollSpeed
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.DrawRectangle(screenWidth/2-40, boxPositionY, 80, 80, rl.Maroon) raylib.DrawRectangle(screenWidth/2-40, boxPositionY, 80, 80, raylib.Maroon)
rl.DrawText("Use mouse wheel to move the square up and down!", 10, 10, 20, rl.Gray) raylib.DrawText("Use mouse wheel to move the cube up and down!", 10, 10, 20, raylib.Gray)
rl.DrawText(fmt.Sprintf("Box position Y: %d", boxPositionY), 10, 40, 20, rl.LightGray) raylib.DrawText(fmt.Sprintf("Box position Y: %d", boxPositionY), 10, 40, 20, raylib.LightGray)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -3,36 +3,36 @@ package main
import ( import (
"fmt" "fmt"
"git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
func main() { func main() {
rl.InitWindow(800, 450, "raylib [core] example - generate random values") raylib.InitWindow(800, 450, "raylib [core] example - generate random values")
framesCounter := 0 // Variable used to count frames framesCounter := 0 // Variable used to count frames
randValue := rl.GetRandomValue(-8, 5) // Get a random integer number between -8 and 5 (both included) randValue := raylib.GetRandomValue(-8, 5) // Get a random integer number between -8 and 5 (both included)
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
framesCounter++ framesCounter++
// Every two seconds (120 frames) a new random value is generated // Every two seconds (120 frames) a new random value is generated
if ((framesCounter / 120) % 2) == 1 { if ((framesCounter / 120) % 2) == 1 {
randValue = rl.GetRandomValue(-8, 5) randValue = raylib.GetRandomValue(-8, 5)
framesCounter = 0 framesCounter = 0
} }
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.DrawText("Every 2 seconds a new random value is generated:", 130, 100, 20, rl.Maroon) raylib.DrawText("Every 2 seconds a new random value is generated:", 130, 100, 20, raylib.Maroon)
rl.DrawText(fmt.Sprintf("%d", randValue), 360, 180, 80, rl.LightGray) raylib.DrawText(fmt.Sprintf("%d", randValue), 360, 180, 80, raylib.LightGray)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,52 +0,0 @@
package main
import (
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
var (
screenW = int32(800)
screenH = int32(450)
)
func main() {
rl.InitWindow(screenW, screenH, "raylib [core] example - scissor test")
scissorArea := rl.NewRectangle(0, 0, 300, 300)
scissorMode := true
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
if rl.IsKeyPressed(rl.KeyS) {
scissorMode = !scissorMode
}
scissorArea.X = float32(rl.GetMouseX())
scissorArea.Y = float32(rl.GetMouseY())
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
if scissorMode {
rl.BeginScissorMode(scissorArea.ToInt32().X, scissorArea.ToInt32().Y, scissorArea.ToInt32().Width, scissorArea.ToInt32().Height)
}
rl.DrawRectangle(0, 0, screenW, screenH, rl.Red)
rl.DrawText("MOVE MOUSE TO REVEAL TEXT", 190, 200, 20, rl.Black)
if scissorMode {
rl.EndScissorMode()
}
rl.DrawRectangleLinesEx(scissorArea, 1, rl.Black)
rl.DrawText("S KEY TO TOGGLE MODE", 10, 10, 20, rl.Black)
rl.EndDrawing()
}
rl.CloseWindow()
}

View file

@ -1,85 +0,0 @@
package main
import (
"fmt"
"math"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const screenW = int32(1280)
const screenH = int32(720)
const virtualScreenW = screenW / 5
const virtualScreenH = screenH / 5
const virtualRatio = float32(screenW) / float32(virtualScreenW)
func main() {
rl.InitWindow(screenW, screenH, "raylib [core] example - smooth pixel-perfect camera")
worldSpaceCam := rl.Camera2D{}
worldSpaceCam.Zoom = 1
screenSpaceCam := rl.Camera2D{}
screenSpaceCam.Zoom = 1
target := rl.LoadRenderTexture(virtualScreenW, virtualScreenH)
rec1 := rl.NewRectangle(120, 60, 80, 40)
rec2 := rl.NewRectangle(130, 70, 90, 30)
rec3 := rl.NewRectangle(140, 80, 65, 45)
sourceRec := rl.NewRectangle(0, 0, float32(target.Texture.Width), -float32(target.Texture.Height))
destRec := rl.NewRectangle(-virtualRatio, -virtualRatio, float32(screenW)+(virtualRatio*2), float32(screenH)+(virtualRatio*2))
origin := rl.NewVector2(0, 0)
rotation, camX, camY := float32(0), float32(0), float32(0)
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
rotation += 60 * rl.GetFrameTime()
camX = float32(math.Sin(rl.GetTime()) * 50)
camY = float32(math.Cos(rl.GetTime()) * 30)
screenSpaceCam.Target = rl.NewVector2(camX, camY)
worldSpaceCam.Target.X = screenSpaceCam.Target.X
screenSpaceCam.Target.X -= worldSpaceCam.Target.X
screenSpaceCam.Target.X *= virtualRatio
worldSpaceCam.Target.Y = screenSpaceCam.Target.Y
screenSpaceCam.Target.Y -= worldSpaceCam.Target.Y
screenSpaceCam.Target.Y *= virtualRatio
rl.BeginTextureMode(target)
rl.ClearBackground(rl.RayWhite)
rl.BeginMode2D(worldSpaceCam)
rl.DrawRectanglePro(rec1, origin, rotation, rl.Black)
rl.DrawRectanglePro(rec2, origin, -rotation, rl.Red)
rl.DrawRectanglePro(rec3, origin, rotation+45, rl.Blue)
rl.EndMode2D()
rl.EndTextureMode()
rl.BeginDrawing()
rl.ClearBackground(rl.Red)
rl.BeginMode2D(screenSpaceCam)
rl.DrawTexturePro(target.Texture, sourceRec, destRec, origin, 0, rl.White)
rl.EndMode2D()
rl.DrawText("screen res "+fmt.Sprint(screenW)+"x"+fmt.Sprint(screenH), 10, 10, 20, rl.Black)
rl.DrawText("world res "+fmt.Sprint(virtualScreenW)+"x"+fmt.Sprint(virtualScreenH), 10, 30, 20, rl.Black)
rl.DrawFPS(screenW-100, 10)
rl.EndDrawing()
}
rl.UnloadRenderTexture(target)
rl.CloseWindow()
}

View file

@ -1,127 +1,58 @@
/*******************************************************************************************
*
* raylib [core] example - Storage save/load values
*
* Example originally created with raylib 1.4, last time updated with raylib 4.2
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2015-2024 Ramon Santamaria (@raysan5)
*
********************************************************************************************/
package main package main
import ( import (
"encoding/binary"
"fmt" "fmt"
"os"
rl "git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
const ( const (
screenWidth = 800 storageScore = 0
screenHeight = 450 storageHiscore = 1
storageDataFile = "storage.data"
// NOTE: Storage positions must start with 0, directly related to file memory layout
storagePositionScore = 0
storagePositionHiscore = 1
) )
func main() { func main() {
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - storage save/load values") raylib.InitWindow(800, 450, "raylib [core] example - storage save/load values")
var score int32 score := int32(0)
var hiscore int32 hiscore := int32(0)
var framesCounter int32
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second framesCounter := 0
// Main game loop raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { // Detect window close button or ESC key
// Update for !raylib.WindowShouldClose() {
if rl.IsKeyPressed(rl.KeyR) { if raylib.IsKeyPressed(raylib.KeyR) {
score = rl.GetRandomValue(1000, 2000) score = raylib.GetRandomValue(1000, 2000)
hiscore = rl.GetRandomValue(2000, 4000) hiscore = raylib.GetRandomValue(2000, 4000)
} }
if rl.IsKeyPressed(rl.KeyEnter) { if raylib.IsKeyPressed(raylib.KeyEnter) {
_ = SaveStorageValue(storagePositionScore, score) raylib.StorageSaveValue(storageScore, score)
_ = SaveStorageValue(storagePositionHiscore, hiscore) raylib.StorageSaveValue(storageHiscore, hiscore)
} else if rl.IsKeyPressed(rl.KeySpace) { } else if raylib.IsKeyPressed(raylib.KeySpace) {
// NOTE: If requested position could not be found, value 0 is returned // NOTE: If requested position could not be found, value 0 is returned
score, _ = LoadStorageValue(storagePositionScore) score = raylib.StorageLoadValue(storageScore)
hiscore, _ = LoadStorageValue(storagePositionHiscore) hiscore = raylib.StorageLoadValue(storageHiscore)
} }
framesCounter++ framesCounter++
// Draw raylib.BeginDrawing()
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.DrawText(fmt.Sprintf("SCORE: %d", score), 280, 130, 40, rl.Maroon) raylib.ClearBackground(raylib.RayWhite)
rl.DrawText(fmt.Sprintf("HI-SCORE: %d", hiscore), 210, 200, 50, rl.Black)
rl.DrawText(fmt.Sprintf("frames: %d", framesCounter), 10, 10, 20, rl.Lime) raylib.DrawText(fmt.Sprintf("SCORE: %d", score), 280, 130, 40, raylib.Maroon)
raylib.DrawText(fmt.Sprintf("HI-SCORE: %d", hiscore), 210, 200, 50, raylib.Black)
rl.DrawText("Press R to generate random numbers", 220, 40, 20, rl.LightGray) raylib.DrawText(fmt.Sprintf("frames: %d", framesCounter), 10, 10, 20, raylib.Lime)
rl.DrawText("Press ENTER to SAVE values", 250, 310, 20, rl.LightGray)
rl.DrawText("Press SPACE to LOAD values", 252, 350, 20, rl.LightGray)
rl.EndDrawing() raylib.DrawText("Press R to generate random numbers", 220, 40, 20, raylib.LightGray)
raylib.DrawText("Press ENTER to SAVE values", 250, 310, 20, raylib.LightGray)
raylib.DrawText("Press SPACE to LOAD values", 252, 350, 20, raylib.LightGray)
raylib.EndDrawing()
} }
// De-Initialization raylib.CloseWindow()
rl.CloseWindow() // Close window and OpenGL context
}
// SaveStorageValue saves an integer value to storage file (to defined position)
// NOTE: Storage positions is directly related to file memory layout (4 bytes each integer)
func SaveStorageValue(position uint32, value int32) error {
// Load the file data
fileData, err := os.ReadFile(storageDataFile)
if err != nil && !os.IsNotExist(err) {
return fmt.Errorf("failed to load file: %v", err)
}
dataSize := len(fileData)
requiredSize := int((position + 1) * 4) // Each int32 is 4 bytes
newFileData := make([]byte, requiredSize)
// Copy existing file data to newFileData
if dataSize > 0 {
copy(newFileData, fileData)
}
// Update the value at the specified position
binary.LittleEndian.PutUint32(newFileData[position*4:], uint32(value))
// Save the updated data back to the file
err = os.WriteFile(storageDataFile, newFileData, 0644)
if err != nil {
return fmt.Errorf("failed to save file: %v", err)
}
return nil
}
// LoadStorageValue loads an integer value from storage file (from defined position)
// NOTE: If requested position could not be found, value 0 is returned
func LoadStorageValue(position uint32) (int32, error) {
// Load the file data
fileData, err := os.ReadFile(storageDataFile)
if err != nil {
return 0, fmt.Errorf("failed to load file: %v", err)
}
dataSize := len(fileData)
if dataSize < int((position+1)*4) {
return 0, fmt.Errorf("position out of bounds")
}
// Read the value at the specified position
value := int32(binary.LittleEndian.Uint32(fileData[position*4:]))
return value, nil
} }

View file

@ -1,52 +0,0 @@
#version 100
precision mediump float;
// Input vertex attributes (from vertex shader)
varying vec2 fragTexCoord;
varying vec4 fragColor;
// Input uniform values
uniform sampler2D texture0;
uniform vec4 colDiffuse;
// NOTE: Add here your custom variables
uniform vec2 leftLensCenter;
uniform vec2 rightLensCenter;
uniform vec2 leftScreenCenter;
uniform vec2 rightScreenCenter;
uniform vec2 scale;
uniform vec2 scaleIn;
uniform vec4 deviceWarpParam;
uniform vec4 chromaAbParam;
void main()
{
// Compute lens distortion
vec2 lensCenter = fragTexCoord.x < 0.5? leftLensCenter : rightLensCenter;
vec2 screenCenter = fragTexCoord.x < 0.5? leftScreenCenter : rightScreenCenter;
vec2 theta = (fragTexCoord - lensCenter)*scaleIn;
float rSq = theta.x*theta.x + theta.y*theta.y;
vec2 theta1 = theta*(deviceWarpParam.x + deviceWarpParam.y*rSq + deviceWarpParam.z*rSq*rSq + deviceWarpParam.w*rSq*rSq*rSq);
vec2 thetaBlue = theta1*(chromaAbParam.z + chromaAbParam.w*rSq);
vec2 tcBlue = lensCenter + scale*thetaBlue;
if (any(bvec2(clamp(tcBlue, screenCenter - vec2(0.25, 0.5), screenCenter + vec2(0.25, 0.5)) - tcBlue)))
{
// Set black fragment for everything outside the lens border
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
}
else
{
// Compute color chroma aberration
float blue = texture2D(texture0, tcBlue).b;
vec2 tcGreen = lensCenter + scale*theta1;
float green = texture2D(texture0, tcGreen).g;
vec2 thetaRed = theta1*(chromaAbParam.x + chromaAbParam.y*rSq);
vec2 tcRed = lensCenter + scale*thetaRed;
float red = texture2D(texture0, tcRed).r;
gl_FragColor = vec4(red, green, blue, 1.0);
}
}

View file

@ -1,53 +0,0 @@
#version 330
// Input vertex attributes (from vertex shader)
in vec2 fragTexCoord;
in vec4 fragColor;
// Input uniform values
uniform sampler2D texture0;
uniform vec4 colDiffuse;
// Output fragment color
out vec4 finalColor;
// NOTE: Add here your custom variables
uniform vec2 leftLensCenter = vec2(0.288, 0.5);
uniform vec2 rightLensCenter = vec2(0.712, 0.5);
uniform vec2 leftScreenCenter = vec2(0.25, 0.5);
uniform vec2 rightScreenCenter = vec2(0.75, 0.5);
uniform vec2 scale = vec2(0.25, 0.45);
uniform vec2 scaleIn = vec2(4, 2.2222);
uniform vec4 deviceWarpParam = vec4(1, 0.22, 0.24, 0);
uniform vec4 chromaAbParam = vec4(0.996, -0.004, 1.014, 0.0);
void main()
{
// Compute lens distortion
vec2 lensCenter = fragTexCoord.x < 0.5? leftLensCenter : rightLensCenter;
vec2 screenCenter = fragTexCoord.x < 0.5? leftScreenCenter : rightScreenCenter;
vec2 theta = (fragTexCoord - lensCenter)*scaleIn;
float rSq = theta.x*theta.x + theta.y*theta.y;
vec2 theta1 = theta*(deviceWarpParam.x + deviceWarpParam.y*rSq + deviceWarpParam.z*rSq*rSq + deviceWarpParam.w*rSq*rSq*rSq);
vec2 thetaBlue = theta1*(chromaAbParam.z + chromaAbParam.w*rSq);
vec2 tcBlue = lensCenter + scale*thetaBlue;
if (any(bvec2(clamp(tcBlue, screenCenter - vec2(0.25, 0.5), screenCenter + vec2(0.25, 0.5)) - tcBlue)))
{
// Set black fragment for everything outside the lens border
finalColor = vec4(0.0, 0.0, 0.0, 1.0);
}
else
{
// Compute color chroma aberration
float blue = texture(texture0, tcBlue).b;
vec2 tcGreen = lensCenter + scale*theta1;
float green = texture(texture0, tcGreen).g;
vec2 thetaRed = theta1*(chromaAbParam.x + chromaAbParam.y*rSq);
vec2 tcRed = lensCenter + scale*thetaRed;
float red = texture(texture0, tcRed).r;
finalColor = vec4(red, green, blue, 1.0);
}
}

View file

@ -1,137 +1,58 @@
/*******************************************************************************************
*
* raylib [core] example - VR Simulator (Oculus Rift CV1 parameters)
*
* Example originally created with raylib 2.5, last time updated with raylib 4.0
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2017-2024 Ramon Santamaria (@raysan5)
*
********************************************************************************************/
package main package main
import ( import (
"fmt" "github.com/gen2brain/raylib-go/raylib"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
glslVersion = 330 // Desktop
// glslVersion = 100 // Android, web
) )
func main() { func main() {
screenWidth := int32(1080)
screenHeight := int32(600)
// NOTE: screenWidth/screenHeight should match VR device aspect ratio // NOTE: screenWidth/screenHeight should match VR device aspect ratio
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - vr simulator")
// VR device parameters definition raylib.InitWindow(screenWidth, screenHeight, "raylib [core] example - vr simulator")
device := rl.VrDeviceInfo{
// Oculus Rift CV1 parameters for simulator
HResolution: 2160, // Horizontal resolution in pixels
VResolution: 1200, // Vertical resolution in pixels
HScreenSize: 0.133793, // Horizontal size in meters
VScreenSize: 0.0669, // Vertical size in meters
EyeToScreenDistance: 0.041, // Distance between eye and display in meters
LensSeparationDistance: 0.07, // Lens separation distance in meters
InterpupillaryDistance: 0.07, // IPD (distance between pupils) in meters
// NOTE: CV1 uses fresnel-hybrid-asymmetric lenses with specific compute shaders // NOTE: default device (simulator)
// Following parameters are just an approximation to CV1 distortion stereo rendering raylib.InitVrSimulator(raylib.GetVrDeviceInfo(raylib.HmdOculusRiftCv1)) // Init VR device (Oculus Rift CV1)
// Lens distortion constant parameters camera := raylib.Camera{}
LensDistortionValues: [4]float32{1.0, 0.22, 0.24, 0.0}, camera.Position = raylib.NewVector3(5.0, 2.0, 5.0) // Camera position
// Chromatic aberration correction parameters camera.Target = raylib.NewVector3(0.0, 2.0, 0.0) // Camera looking at point
ChromaAbCorrection: [4]float32{0.996, -0.004, 1.014, 0.0}, camera.Up = raylib.NewVector3(0.0, 1.0, 0.0) // Camera up vector (rotation towards target)
camera.Fovy = 60.0 // Camera field-of-view Y
cubePosition := raylib.NewVector3(0.0, 0.0, 0.0)
raylib.SetCameraMode(camera, raylib.CameraFirstPerson) // Set first person camera mode
raylib.SetTargetFPS(90)
for !raylib.WindowShouldClose() {
raylib.UpdateCamera(&camera) // Update camera (simulator mode)
raylib.BeginDrawing()
raylib.ClearBackground(raylib.RayWhite)
raylib.BeginVrDrawing()
raylib.BeginMode3D(camera)
raylib.DrawCube(cubePosition, 2.0, 2.0, 2.0, raylib.Red)
raylib.DrawCubeWires(cubePosition, 2.0, 2.0, 2.0, raylib.Maroon)
raylib.DrawGrid(40, 1.0)
raylib.EndMode3D()
raylib.EndVrDrawing()
raylib.DrawFPS(10, 10)
raylib.EndDrawing()
} }
// Load VR stereo config for VR device parameters (Oculus Rift CV1 parameters) raylib.CloseVrSimulator() // Close VR simulator
config := rl.LoadVrStereoConfig(device)
// Distortion shader (uses device lens distortion and chroma) raylib.CloseWindow()
fileName := fmt.Sprintf("distortion%d.fs", glslVersion)
distortion := rl.LoadShader("", fileName)
// Update distortion shader with lens and distortion-scale parameters
rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "leftLensCenter"),
config.LeftLensCenter[:], rl.ShaderUniformVec2)
rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "rightLensCenter"),
config.RightLensCenter[:], rl.ShaderUniformVec2)
rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "leftScreenCenter"),
config.LeftScreenCenter[:], rl.ShaderUniformVec2)
rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "rightScreenCenter"),
config.RightScreenCenter[:], rl.ShaderUniformVec2)
rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "scale"),
config.Scale[:], rl.ShaderUniformVec2)
rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "scaleIn"),
config.ScaleIn[:], rl.ShaderUniformVec2)
rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "deviceWarpParam"),
device.LensDistortionValues[:], rl.ShaderUniformVec4)
rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "chromaAbParam"),
device.ChromaAbCorrection[:], rl.ShaderUniformVec4)
// Initialize frame buffer for stereo rendering
// NOTE: Screen size should match HMD aspect ratio
target := rl.LoadRenderTexture(device.HResolution, device.VResolution)
// The target's height is flipped (in the source Rectangle), due to OpenGL reasons
sourceRec := rl.Rectangle{Width: float32(target.Texture.Width), Height: float32(-target.Texture.Height)}
destRec := rl.Rectangle{Width: float32(rl.GetScreenWidth()), Height: float32(rl.GetScreenHeight())}
// Define the camera to look into our 3d world
camera := rl.Camera{
Position: rl.Vector3{X: 5, Y: 2, Z: 5},
Target: rl.Vector3{Y: 2},
Up: rl.Vector3{Y: 1},
Fovy: 60.0,
Projection: rl.CameraPerspective,
}
cubePosition := rl.Vector3{}
rl.DisableCursor() // Limit cursor to relative movement inside the window
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
// Main game loop
for !rl.WindowShouldClose() { // Detect window close button or ESC key
// Update
rl.UpdateCamera(&camera, rl.CameraFirstPerson)
// Draw texture
rl.BeginTextureMode(target)
rl.ClearBackground(rl.RayWhite)
rl.BeginVrStereoMode(config)
rl.BeginMode3D(camera)
rl.DrawCube(cubePosition, 2.0, 2.0, 2.0, rl.Red)
rl.DrawCubeWires(cubePosition, 2.0, 2.0, 2.0, rl.Maroon)
rl.DrawGrid(40, 1.0)
rl.EndMode3D()
rl.EndVrStereoMode()
rl.EndTextureMode()
// Draw
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.BeginShaderMode(distortion)
rl.DrawTexturePro(target.Texture, sourceRec, destRec, rl.Vector2{}, 0.0, rl.White)
rl.EndShaderMode()
rl.DrawFPS(10, 10)
rl.EndDrawing()
}
// De-Initialization
rl.UnloadVrStereoConfig(config) // Unload stereo config
rl.UnloadRenderTexture(target) // Unload stereo render fbo
rl.UnloadShader(distortion) // Unload distortion shader
rl.CloseWindow() // Close window and OpenGL context
} }

View file

@ -1,260 +0,0 @@
/*******************************************************************************************
*
* raylib [core] example - window flags
*
* Example originally created with raylib 3.5, last time updated with raylib 3.5
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2020-2024 Ramon Santamaria (@raysan5)
*
********************************************************************************************/
package main
import (
"fmt"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
)
// Possible window flags
/*
FLAG_VSYNC_HINT
FLAG_FULLSCREEN_MODE -> not working properly -> wrong scaling!
FLAG_WINDOW_RESIZABLE
FLAG_WINDOW_UNDECORATED
FLAG_WINDOW_TRANSPARENT
FLAG_WINDOW_HIDDEN
FLAG_WINDOW_MINIMIZED -> Not supported on window creation
FLAG_WINDOW_MAXIMIZED -> Not supported on window creation
FLAG_WINDOW_UNFOCUSED
FLAG_WINDOW_TOPMOST
FLAG_WINDOW_HIGHDPI -> errors after minimize-resize, fb size is recalculated
FLAG_WINDOW_ALWAYS_RUN
FLAG_MSAA_4X_HINT
*/
func main() {
// Set configuration flags for window creation
//SetConfigFlags(FLAG_VSYNC_HINT | FLAG_MSAA_4X_HINT | FLAG_WINDOW_HIGHDPI);
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - Window Flags")
ballPosition := rl.Vector2{X: float32(rl.GetScreenWidth()) / 2.0, Y: float32(rl.GetScreenHeight()) / 2.0}
ballSpeed := rl.Vector2{X: 5.0, Y: 4.0}
ballRadius := float32(20.0)
framesCounter := 0
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
for !rl.WindowShouldClose() { // Detect window close button or ESC key
if rl.IsKeyPressed(rl.KeyF) {
rl.ToggleFullscreen() // modifies window size when scaling!
}
if rl.IsKeyPressed(rl.KeyR) {
if rl.IsWindowState(rl.FlagWindowResizable) {
rl.ClearWindowState(rl.FlagWindowResizable)
} else {
rl.SetWindowState(rl.FlagWindowResizable)
}
}
if rl.IsKeyPressed(rl.KeyD) {
if rl.IsWindowState(rl.FlagWindowUndecorated) {
rl.ClearWindowState(rl.FlagWindowUndecorated)
} else {
rl.SetWindowState(rl.FlagWindowUndecorated)
}
}
if rl.IsKeyPressed(rl.KeyH) {
if !rl.IsWindowState(rl.FlagWindowHidden) {
rl.SetWindowState(rl.FlagWindowHidden)
}
framesCounter = 0
}
if rl.IsWindowState(rl.FlagWindowHidden) {
framesCounter++
if framesCounter >= 240 {
rl.ClearWindowState(rl.FlagWindowHidden) // Show window after 3 seconds
}
}
if rl.IsKeyPressed(rl.KeyN) {
if !rl.IsWindowState(rl.FlagWindowMinimized) {
rl.MinimizeWindow()
}
framesCounter = 0
}
if rl.IsWindowState(rl.FlagWindowMinimized) {
framesCounter++
if framesCounter >= 240 {
rl.RestoreWindow() // Restore window after 3 seconds
}
}
if rl.IsKeyPressed(rl.KeyM) {
// NOTE: Requires FLAG_WINDOW_RESIZABLE enabled!
if rl.IsWindowState(rl.FlagWindowMaximized) {
rl.RestoreWindow()
} else {
rl.MaximizeWindow()
}
}
if rl.IsKeyPressed(rl.KeyU) {
if rl.IsWindowState(rl.FlagWindowUnfocused) {
rl.ClearWindowState(rl.FlagWindowUnfocused)
} else {
rl.SetWindowState(rl.FlagWindowUnfocused)
}
}
if rl.IsKeyPressed(rl.KeyT) {
if rl.IsWindowState(rl.FlagWindowTopmost) {
rl.ClearWindowState(rl.FlagWindowTopmost)
} else {
rl.SetWindowState(rl.FlagWindowTopmost)
}
}
if rl.IsKeyPressed(rl.KeyA) {
if rl.IsWindowState(rl.FlagWindowAlwaysRun) {
rl.ClearWindowState(rl.FlagWindowAlwaysRun)
} else {
rl.SetWindowState(rl.FlagWindowAlwaysRun)
}
}
if rl.IsKeyPressed(rl.KeyV) {
if rl.IsWindowState(rl.FlagVsyncHint) {
rl.ClearWindowState(rl.FlagVsyncHint)
} else {
rl.SetWindowState(rl.FlagVsyncHint)
}
}
// Bouncing ball logic
ballPosition.X += ballSpeed.X
ballPosition.Y += ballSpeed.Y
if (ballPosition.X >= (float32(rl.GetScreenWidth()) - ballRadius)) || (ballPosition.X <= ballRadius) {
ballSpeed.X *= -1.0
}
if (ballPosition.Y >= (float32(rl.GetScreenHeight()) - ballRadius)) || (ballPosition.Y <= ballRadius) {
ballSpeed.Y *= -1.0
}
rl.BeginDrawing()
if rl.IsWindowState(rl.FlagWindowTransparent) {
rl.ClearBackground(rl.Blank)
} else {
rl.ClearBackground(rl.White)
}
rl.DrawCircleV(ballPosition, ballRadius, rl.Maroon)
rl.DrawRectangleLinesEx(
rl.Rectangle{
Width: float32(rl.GetScreenWidth()),
Height: float32(rl.GetScreenHeight()),
},
4, rl.White,
)
rl.DrawCircleV(rl.GetMousePosition(), 10, rl.DarkBlue)
rl.DrawFPS(10, 10)
rl.DrawText(
fmt.Sprintf("Screen Size: [%d, %d]", rl.GetScreenWidth(), rl.GetScreenHeight()),
10,
40,
10,
rl.Green,
)
// Draw window state info
rl.DrawText("Following flags can be set after window creation:", 10, 60, 10, rl.Gray)
if rl.IsWindowState(rl.FlagFullscreenMode) {
rl.DrawText("[F] FLAG_FULLSCREEN_MODE: on", 10, 80, 10, rl.Lime)
} else {
rl.DrawText("[F] FLAG_FULLSCREEN_MODE: off", 10, 80, 10, rl.Maroon)
}
if rl.IsWindowState(rl.FlagWindowResizable) {
rl.DrawText("[R] FLAG_WINDOW_RESIZABLE: on", 10, 100, 10, rl.Lime)
} else {
rl.DrawText("[R] FLAG_WINDOW_RESIZABLE: off", 10, 100, 10, rl.Maroon)
}
if rl.IsWindowState(rl.FlagWindowUndecorated) {
rl.DrawText("[D] FLAG_WINDOW_UNDECORATED: on", 10, 120, 10, rl.Lime)
} else {
rl.DrawText("[D] FLAG_WINDOW_UNDECORATED: off", 10, 120, 10, rl.Maroon)
}
if rl.IsWindowState(rl.FlagWindowHidden) {
rl.DrawText("[H] FLAG_WINDOW_HIDDEN: on", 10, 140, 10, rl.Lime)
} else {
rl.DrawText("[H] FLAG_WINDOW_HIDDEN: off", 10, 140, 10, rl.Maroon)
}
if rl.IsWindowState(rl.FlagWindowMinimized) {
rl.DrawText("[N] FLAG_WINDOW_MINIMIZED: on", 10, 160, 10, rl.Lime)
} else {
rl.DrawText("[N] FLAG_WINDOW_MINIMIZED: off", 10, 160, 10, rl.Maroon)
}
if rl.IsWindowState(rl.FlagWindowMaximized) {
rl.DrawText("[M] FLAG_WINDOW_MAXIMIZED: on", 10, 180, 10, rl.Lime)
} else {
rl.DrawText("[M] FLAG_WINDOW_MAXIMIZED: off", 10, 180, 10, rl.Maroon)
}
if rl.IsWindowState(rl.FlagWindowUnfocused) {
rl.DrawText("[G] FLAG_WINDOW_UNFOCUSED: on", 10, 200, 10, rl.Lime)
} else {
rl.DrawText("[U] FLAG_WINDOW_UNFOCUSED: off", 10, 200, 10, rl.Maroon)
}
if rl.IsWindowState(rl.FlagWindowTopmost) {
rl.DrawText("[T] FLAG_WINDOW_TOPMOST: on", 10, 220, 10, rl.Lime)
} else {
rl.DrawText("[T] FLAG_WINDOW_TOPMOST: off", 10, 220, 10, rl.Maroon)
}
if rl.IsWindowState(rl.FlagWindowAlwaysRun) {
rl.DrawText("[A] FLAG_WINDOW_ALWAYS_RUN: on", 10, 240, 10, rl.Lime)
} else {
rl.DrawText("[A] FLAG_WINDOW_ALWAYS_RUN: off", 10, 240, 10, rl.Maroon)
}
if rl.IsWindowState(rl.FlagVsyncHint) {
rl.DrawText("[V] FLAG_VSYNC_HINT: on", 10, 260, 10,
rl.Lime)
} else {
rl.DrawText("[V] FLAG_VSYNC_HINT: off", 10, 260, 10, rl.Maroon)
}
rl.DrawText("Following flags can only be set before window creation:", 10, 300, 10, rl.Gray)
if rl.IsWindowState(rl.FlagWindowHighdpi) {
rl.DrawText("FLAG_WINDOW_HIGHDPI: on", 10, 320, 10, rl.Lime)
} else {
rl.DrawText("FLAG_WINDOW_HIGHDPI: off", 10, 320, 10, rl.Maroon)
}
if rl.IsWindowState(rl.FlagWindowTransparent) {
rl.DrawText("FLAG_WINDOW_TRANSPARENT: on", 10, 340, 10, rl.Lime)
} else {
rl.DrawText("FLAG_WINDOW_TRANSPARENT: off", 10, 340, 10, rl.Maroon)
}
if rl.IsWindowState(rl.FlagMsaa4xHint) {
rl.DrawText("FLAG_MSAA_4X_HINT: on", 10, 360, 10, rl.Lime)
} else {
rl.DrawText("FLAG_MSAA_4X_HINT: off", 10, 360, 10, rl.Maroon)
}
rl.EndDrawing()
}
rl.CloseWindow()
}

View file

@ -1,115 +0,0 @@
package main
import (
"fmt"
"image/color"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
)
func main() {
// Enable config flags for resizable window and vertical synchro
rl.SetConfigFlags(rl.FlagWindowResizable | rl.FlagVsyncHint)
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - Window Scale Letterbox")
rl.SetWindowMinSize(320, 240)
gameScreenWidth, gameScreenHeight := int32(640), int32(480)
// Render texture initialization, used to hold the rendering result so we can easily resize it
target := rl.LoadRenderTexture(gameScreenWidth, gameScreenHeight)
rl.SetTextureFilter(target.Texture, rl.FilterBilinear) // Texture scale filter to use
colors := getRandomColors()
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
for !rl.WindowShouldClose() { // Detect window close button or ESC key
// Compute required frame buffer scaling
scale := min(float32(rl.GetScreenWidth())/float32(gameScreenWidth),
float32(rl.GetScreenHeight())/float32(gameScreenHeight))
if rl.IsKeyPressed(rl.KeySpace) {
// Recalculate random colors for the bars
colors = getRandomColors()
}
// Update virtual mouse (clamped mouse value behind game screen)
mouse := rl.GetMousePosition()
virtualMouse := rl.Vector2{
X: (mouse.X - (float32(rl.GetScreenWidth())-(float32(gameScreenWidth)*scale))*0.5) / scale,
Y: (mouse.Y - (float32(rl.GetScreenHeight())-(float32(gameScreenHeight)*scale))*0.5) / scale,
}
virtualMouse = rl.Vector2Clamp(
virtualMouse,
rl.Vector2{},
rl.Vector2{X: float32(gameScreenWidth), Y: float32(gameScreenHeight)},
)
// Apply the same transformation as the virtual mouse to the real mouse (i.e. to work with raygui)
//rl.SetMouseOffset(
// int(-(float32(rl.GetScreenWidth())-(float32(gameScreenWidth)*scale))*0.5),
// int(-(float32(rl.GetScreenHeight())-(float32(gameScreenHeight)*scale))*0.5),
//)
//rl.SetMouseScale(1/scale, 1/scale)
// Draw everything in the render texture, note this will not be rendered on screen, yet
rl.BeginTextureMode(target)
rl.ClearBackground(rl.White)
for i := int32(0); i < 10; i++ {
rl.DrawRectangle(0, (gameScreenHeight/10)*i, gameScreenWidth, gameScreenHeight/10, colors[i])
}
text := "If executed inside a window,\nyou can resize the window,\nand see the screen scaling!"
rl.DrawText(text, 10, 25, 20, rl.White)
text = fmt.Sprintf("Default Mouse: [%.0f , %.0f]", mouse.X, mouse.Y)
rl.DrawText(text, 350, 25, 20, rl.Green)
text = fmt.Sprintf("Virtual Mouse: [%.0f , %.0f]", virtualMouse.X, virtualMouse.Y)
rl.DrawText(text, 350, 55, 20, rl.Yellow)
rl.EndTextureMode()
rl.BeginDrawing()
rl.ClearBackground(rl.Black)
// Draw render texture to screen, properly scaled
rl.DrawTexturePro(
target.Texture,
rl.Rectangle{Width: float32(target.Texture.Width), Height: float32(-target.Texture.Height)},
rl.Rectangle{
X: (float32(rl.GetScreenWidth()) - float32(gameScreenWidth)*scale) * 0.5,
Y: (float32(rl.GetScreenHeight()) - float32(gameScreenHeight)*scale) * 0.5,
Width: float32(gameScreenWidth) * scale,
Height: float32(gameScreenHeight) * scale,
},
rl.Vector2{X: 0, Y: 0}, 0, rl.White,
)
rl.EndDrawing()
}
rl.UnloadRenderTexture(target)
rl.CloseWindow() // Close window and OpenGL context
}
func getRandomColors() []color.RGBA {
var colors []color.RGBA
for i := 0; i < 10; i++ {
randomColor := color.RGBA{
R: rndUint8(100, 250),
G: rndUint8(50, 150),
B: rndUint8(10, 100),
A: 255,
}
colors = append(colors, randomColor)
}
return colors
}
func rndUint8(min, max int32) uint8 {
return uint8(rl.GetRandomValue(min, max))
}

View file

@ -1,47 +0,0 @@
package main
import rl "git.terah.dev/UnrealXR/raylib-go/raylib"
const (
screenWidth = 850
screenHeight = 480
)
func main() {
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - window should close")
rl.SetExitKey(rl.KeyNull) // Disable KEY_ESCAPE to close window, X-button still works
exitWindowRequested := false // Flag to request window to exit
exitWindow := false // Flag to set window to exit
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
for !exitWindow {
if rl.WindowShouldClose() || rl.IsMouseButtonPressed(rl.KeyEscape) {
exitWindowRequested = true
}
if exitWindowRequested {
if rl.IsKeyPressed(rl.KeyY) {
exitWindow = true
} else if rl.IsKeyPressed(rl.KeyN) {
exitWindowRequested = false
}
}
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
if exitWindowRequested {
rl.DrawRectangle(0, 100, screenWidth, 200, rl.Black)
rl.DrawText("Are you sure you want to exit the program? [Y/N]", 40, 180, 30, rl.White)
} else {
rl.DrawText("Try to close the window to get confirmation message!", 120, 200, 20, rl.LightGray)
}
rl.EndDrawing()
}
rl.CloseWindow() // Close window and OpenGL context
}

View file

@ -1,50 +1,52 @@
package main package main
import ( import (
rl "git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
func main() { func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera free") raylib.InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera free")
camera := rl.Camera{} camera := raylib.Camera{}
camera.Position = rl.NewVector3(10.0, 10.0, 10.0) // Camera position camera.Position = raylib.NewVector3(10.0, 10.0, 10.0) // Camera position
camera.Target = rl.NewVector3(0.0, 0.0, 0.0) // Camera looking at point camera.Target = raylib.NewVector3(0.0, 0.0, 0.0) // Camera looking at point
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) // Camera up vector (rotation towards target) camera.Up = raylib.NewVector3(0.0, 1.0, 0.0) // Camera up vector (rotation towards target)
camera.Fovy = 45.0 // Camera field-of-view Y camera.Fovy = 45.0 // Camera field-of-view Y
cubePosition := rl.NewVector3(0.0, 0.0, 0.0) cubePosition := raylib.NewVector3(0.0, 0.0, 0.0)
cubeScreenPosition := rl.Vector2{} cubeScreenPosition := raylib.Vector2{}
rl.SetTargetFPS(60) raylib.SetCameraMode(camera, raylib.CameraFree) // Set a free camera mode
for !rl.WindowShouldClose() { raylib.SetTargetFPS(60)
rl.UpdateCamera(&camera, rl.CameraFree) // Update camera with free camera mode
for !raylib.WindowShouldClose() {
raylib.UpdateCamera(&camera) // Update camera
// Calculate cube screen space position (with a little offset to be in top) // Calculate cube screen space position (with a little offset to be in top)
cubeScreenPosition = rl.GetWorldToScreen(rl.NewVector3(cubePosition.X, cubePosition.Y+2.5, cubePosition.Z), camera) cubeScreenPosition = raylib.GetWorldToScreen(raylib.NewVector3(cubePosition.X, cubePosition.Y+2.5, cubePosition.Z), camera)
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.BeginMode3D(camera) raylib.BeginMode3D(camera)
rl.DrawCube(cubePosition, 2.0, 2.0, 2.0, rl.Red) raylib.DrawCube(cubePosition, 2.0, 2.0, 2.0, raylib.Red)
rl.DrawCubeWires(cubePosition, 2.0, 2.0, 2.0, rl.Maroon) raylib.DrawCubeWires(cubePosition, 2.0, 2.0, 2.0, raylib.Maroon)
rl.DrawGrid(10, 1.0) raylib.DrawGrid(10, 1.0)
rl.EndMode3D() raylib.EndMode3D()
rl.DrawText("Enemy: 100 / 100", int32(cubeScreenPosition.X)-rl.MeasureText("Enemy: 100 / 100", 20)/2, int32(cubeScreenPosition.Y), 20, rl.Black) raylib.DrawText("Enemy: 100 / 100", int32(cubeScreenPosition.X)-raylib.MeasureText("Enemy: 100 / 100", 20)/2, int32(cubeScreenPosition.Y), 20, raylib.Black)
rl.DrawText("Text is always on top of the cube", (screenWidth-rl.MeasureText("Text is always on top of the cube", 20))/2, 25, 20, rl.Gray) raylib.DrawText("Text is always on top of the cube", (screenWidth-raylib.MeasureText("Text is always on top of the cube", 20))/2, 25, 20, raylib.Gray)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 244 KiB

View file

@ -1,19 +1,17 @@
package main package main
import ( import (
"strings" "github.com/gen2brain/raylib-go/easings"
"github.com/gen2brain/raylib-go/raygui"
"git.terah.dev/UnrealXR/raylib-go/easings" "github.com/gen2brain/raylib-go/raylib"
"git.terah.dev/UnrealXR/raylib-go/raygui"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.SetConfigFlags(rl.FlagVsyncHint) raylib.SetConfigFlags(raylib.FlagVsyncHint)
rl.InitWindow(screenWidth, screenHeight, "raylib [easings] example - easings") raylib.InitWindow(screenWidth, screenHeight, "raylib [easings] example - easings")
currentTime := 0 currentTime := 0
duration := float32(60) duration := float32(60)
@ -21,18 +19,18 @@ func main() {
finalPositionX := startPositionX * 3 finalPositionX := startPositionX * 3
currentPositionX := startPositionX currentPositionX := startPositionX
ballPosition := rl.NewVector2(startPositionX, float32(screenHeight)/2) ballPosition := raylib.NewVector2(startPositionX, float32(screenHeight)/2)
comboActive := int32(0) comboActive := 0
comboLastActive := int32(0) comboLastActive := 0
easingTypes := []string{"SineIn", "SineOut", "SineInOut", "BounceIn", "BounceOut", "BounceInOut", "BackIn", "BackOut", "BackInOut"} easingTypes := []string{"SineIn", "SineOut", "SineInOut", "BounceIn", "BounceOut", "BounceInOut", "BackIn", "BackOut", "BackInOut"}
ease := easingTypes[comboActive] ease := easingTypes[comboActive]
//rl.SetTargetFPS(60) //raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
if rl.IsKeyDown(rl.KeyR) { if raylib.IsKeyDown(raylib.KeyR) {
currentTime = 0 currentTime = 0
currentPositionX = startPositionX currentPositionX = startPositionX
ballPosition.X = currentPositionX ballPosition.X = currentPositionX
@ -73,18 +71,18 @@ func main() {
currentTime++ currentTime++
} }
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
raygui.Label(rl.NewRectangle(20, 20, 200, 20), "Easing Type:") raygui.Label(raylib.NewRectangle(20, 20, 200, 20), "Easing Type:")
comboActive = raygui.ComboBox(rl.NewRectangle(20, 40, 200, 20), strings.Join(easingTypes, ";"), comboActive) comboActive = raygui.ComboBox(raylib.NewRectangle(20, 40, 200, 20), easingTypes, comboActive)
raygui.Label(rl.NewRectangle(20, 80, 200, 20), "Press R to reset") raygui.Label(raylib.NewRectangle(20, 80, 200, 20), "Press R to reset")
rl.DrawCircleV(ballPosition, 50, rl.Maroon) raylib.DrawCircleV(ballPosition, 50, raylib.Maroon)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,277 +0,0 @@
package main
/*******************************************************************************************
*
* raylib - sample game: arkanoid
*
* Sample game Marc Palau and Ramon Santamaria
*
* This game has been created using raylib v1.3 (www.raylib.com)
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
*
* Copyright (c) 2015 Ramon Santamaria (@raysan5)
*
* Ported to raylib-go by Nehpe (@nehpe), July 2019
*
********************************************************************************************/
import (
"math"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
PLAYER_MAX_LIFE = 5
LINES_OF_BRICKS = 5
BRICKS_PER_LINE = 20
)
type Player struct {
position rl.Vector2
size rl.Vector2
life int
}
type Ball struct {
position rl.Vector2
speed rl.Vector2
radius float32
active bool
}
type Brick struct {
position rl.Vector2
active bool
}
const (
screenWidth = 800
screenHeight = 450
)
type Game struct {
gameOver bool
pause bool
player Player
ball Ball
brick [LINES_OF_BRICKS][BRICKS_PER_LINE]Brick
brickSize rl.Vector2
}
func main() {
rl.InitWindow(screenWidth, screenHeight, "sample game: arkanoid")
// Init game
game := NewGame()
game.gameOver = true
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
game.Update()
game.Draw()
}
rl.CloseWindow()
}
// For android
func init() {
rl.SetCallbackFunc(main)
}
// NewGame - Create a new game instance
func NewGame() (g Game) {
g.Init()
return
}
// Init - initialize game
func (g *Game) Init() {
g.brickSize = rl.Vector2{float32(rl.GetScreenWidth() / BRICKS_PER_LINE), 40}
// Initialize player
g.player.position = rl.Vector2{float32(screenWidth / 2), float32(screenHeight * 7 / 8)}
g.player.size = rl.Vector2{float32(screenWidth / 10), 20}
g.player.life = PLAYER_MAX_LIFE
// Initialize ball
g.ball.position = rl.Vector2{float32(screenWidth / 2), float32(screenHeight*7/8 - 30)}
g.ball.speed = rl.Vector2{0, 0}
g.ball.radius = 7
g.ball.active = false
initialDownPosition := int(50)
for i := 0; i < LINES_OF_BRICKS; i++ {
for j := 0; j < BRICKS_PER_LINE; j++ {
g.brick[i][j].position = rl.Vector2{float32(j)*g.brickSize.X + g.brickSize.X/2, float32(i)*g.brickSize.Y + float32(initialDownPosition)}
g.brick[i][j].active = true
}
}
}
// Update - update game state
func (g *Game) Update() {
if !g.gameOver {
if rl.IsKeyPressed(rl.KeyP) {
g.pause = !g.pause
}
if !g.pause {
if rl.IsKeyDown(rl.KeyLeft) || rl.IsKeyDown(rl.KeyA) {
g.player.position.X -= 5
}
if (g.player.position.X - g.player.size.X/2) <= 0 {
g.player.position.X = g.player.size.X / 2
}
if rl.IsKeyDown(rl.KeyRight) || rl.IsKeyDown(rl.KeyD) {
g.player.position.X += 5
}
if (g.player.position.X + g.player.size.X/2) >= screenWidth {
g.player.position.X = screenWidth - g.player.size.X/2
}
if !g.ball.active {
if rl.IsKeyPressed(rl.KeySpace) {
g.ball.active = true
g.ball.speed = rl.Vector2{0, -5}
}
}
if g.ball.active {
g.ball.position.X += g.ball.speed.X
g.ball.position.Y += g.ball.speed.Y
} else {
g.ball.position = rl.Vector2{g.player.position.X, screenHeight*7/8 - 30}
}
// Collision logic: ball vs walls
if ((g.ball.position.X + g.ball.radius) >= screenWidth) || ((g.ball.position.X - g.ball.radius) <= 0) {
g.ball.speed.X *= -1
}
if (g.ball.position.Y - g.ball.radius) <= 0 {
g.ball.speed.Y *= -1
}
if (g.ball.position.Y + g.ball.radius) >= screenHeight {
g.ball.speed = rl.Vector2{0, 0}
g.ball.active = false
g.player.life--
}
if (rl.CheckCollisionCircleRec(g.ball.position, g.ball.radius,
rl.Rectangle{g.player.position.X - g.player.size.X/2, g.player.position.Y - g.player.size.Y/2, g.player.size.X, g.player.size.Y})) {
if g.ball.speed.Y > 0 {
g.ball.speed.Y *= -1
g.ball.speed.X = (g.ball.position.X - g.player.position.X) / (g.player.size.X / 2) * 5
}
}
// Collision logic: ball vs bricks
for i := 0; i < LINES_OF_BRICKS; i++ {
for j := 0; j < BRICKS_PER_LINE; j++ {
if g.brick[i][j].active {
if ((g.ball.position.Y - g.ball.radius) <= (g.brick[i][j].position.Y + g.brickSize.Y/2)) &&
((g.ball.position.Y - g.ball.radius) > (g.brick[i][j].position.Y + g.brickSize.Y/2 + g.ball.speed.Y)) &&
((float32(math.Abs(float64(g.ball.position.X - g.brick[i][j].position.X)))) < (g.brickSize.X/2 + g.ball.radius*2/3)) &&
(g.ball.speed.Y < 0) {
// Hit below
g.brick[i][j].active = false
g.ball.speed.Y *= -1
} else if ((g.ball.position.Y + g.ball.radius) >= (g.brick[i][j].position.Y - g.brickSize.Y/2)) &&
((g.ball.position.Y + g.ball.radius) < (g.brick[i][j].position.Y - g.brickSize.Y/2 + g.ball.speed.Y)) &&
((float32(math.Abs(float64(g.ball.position.X - g.brick[i][j].position.X)))) < (g.brickSize.X/2 + g.ball.radius*2/3)) &&
(g.ball.speed.Y > 0) {
// Hit above
g.brick[i][j].active = false
g.ball.speed.Y *= -1
} else if ((g.ball.position.X + g.ball.radius) >= (g.brick[i][j].position.X - g.brickSize.X/2)) &&
((g.ball.position.X + g.ball.radius) < (g.brick[i][j].position.X - g.brickSize.X/2 + g.ball.speed.X)) &&
((float32(math.Abs(float64(g.ball.position.Y - g.brick[i][j].position.Y)))) < (g.brickSize.Y/2 + g.ball.radius*2/3)) &&
(g.ball.speed.X > 0) {
// Hit left
g.brick[i][j].active = false
g.ball.speed.X *= -1
} else if ((g.ball.position.X - g.ball.radius) <= (g.brick[i][j].position.X + g.brickSize.X/2)) &&
((g.ball.position.X - g.ball.radius) > (g.brick[i][j].position.X + g.brickSize.X/2 + g.ball.speed.X)) &&
((float32(math.Abs(float64(g.ball.position.Y - g.brick[i][j].position.Y)))) < (g.brickSize.Y/2 + g.ball.radius*2/3)) &&
(g.ball.speed.X < 0) {
// Hit right
g.brick[i][j].active = false
g.ball.speed.X *= -1
}
}
}
}
}
// Game over logic
if g.player.life <= 0 {
g.gameOver = true
} else {
g.gameOver = true
for i := 0; i < LINES_OF_BRICKS; i++ {
for j := 0; j < BRICKS_PER_LINE; j++ {
if g.brick[i][j].active {
g.gameOver = false
}
}
}
}
} else {
if rl.IsKeyPressed(rl.KeyEnter) {
g.Init()
g.gameOver = false
}
}
}
// Draw - draw game
func (g *Game) Draw() {
rl.BeginDrawing()
rl.ClearBackground(rl.White)
if !g.gameOver {
// Draw player bar
rl.DrawRectangle(int32(g.player.position.X-g.player.size.X/2), int32(g.player.position.Y-g.player.size.Y/2), int32(g.player.size.X), int32(g.player.size.Y), rl.Black)
// Draw player lives
for i := 0; i < g.player.life; i++ {
rl.DrawRectangle(int32(20+40*i), screenHeight-30, 35, 10, rl.LightGray)
}
// Draw Ball
rl.DrawCircleV(g.ball.position, g.ball.radius, rl.Maroon)
for i := 0; i < LINES_OF_BRICKS; i++ {
for j := 0; j < BRICKS_PER_LINE; j++ {
if g.brick[i][j].active {
if (i+j)%2 == 0 {
rl.DrawRectangle(int32(g.brick[i][j].position.X-g.brickSize.X/2), int32(g.brick[i][j].position.Y-g.brickSize.Y/2), int32(g.brickSize.X), int32(g.brickSize.Y), rl.Gray)
} else {
rl.DrawRectangle(int32(g.brick[i][j].position.X-g.brickSize.X/2), int32(g.brick[i][j].position.Y-g.brickSize.Y/2), int32(g.brickSize.X), int32(g.brickSize.Y), rl.DarkGray)
}
}
}
}
if g.pause {
rl.DrawText("GAME PAUSED", screenWidth/2-rl.MeasureText("GAME PAUSED", 40)/2, screenHeight/2+screenHeight/4-40, 40, rl.Gray)
}
} else {
str := "PRESS [ENTER] TO PLAY AGAIN"
x := int(rl.GetScreenWidth()/2) - int(rl.MeasureText(str, 20)/2)
y := rl.GetScreenHeight()/2 - 50
rl.DrawText(str, int32(x), int32(y), 20, rl.Gray)
}
rl.EndDrawing()
}

View file

@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"os" "os"
"runtime" "runtime"
"github.com/gen2brain/raylib-go/raylib"
) )
const ( const (
@ -33,20 +35,20 @@ const (
// Floppy type // Floppy type
type Floppy struct { type Floppy struct {
Position rl.Vector2 Position raylib.Vector2
} }
// Pipe type // Pipe type
type Pipe struct { type Pipe struct {
Rec rl.Rectangle Rec raylib.Rectangle
Color rl.Color Color raylib.Color
Active bool Active bool
} }
// Particle type // Particle type
type Particle struct { type Particle struct {
Position rl.Vector2 Position raylib.Vector2
Color rl.Color Color raylib.Color
Alpha float32 Alpha float32
Size float32 Size float32
Rotation float32 Rotation float32
@ -55,17 +57,17 @@ type Particle struct {
// Game type // Game type
type Game struct { type Game struct {
FxFlap rl.Sound FxFlap raylib.Sound
FxSlap rl.Sound FxSlap raylib.Sound
FxPoint rl.Sound FxPoint raylib.Sound
FxClick rl.Sound FxClick raylib.Sound
TxSprites rl.Texture2D TxSprites raylib.Texture2D
TxSmoke rl.Texture2D TxSmoke raylib.Texture2D
TxClouds rl.Texture2D TxClouds raylib.Texture2D
CloudRec rl.Rectangle CloudRec raylib.Rectangle
FrameRec rl.Rectangle FrameRec raylib.Rectangle
GameOver bool GameOver bool
Dead bool Dead bool
@ -82,7 +84,7 @@ type Game struct {
Particles []Particle Particles []Particle
Pipes []Pipe Pipes []Pipe
PipesPos []rl.Vector2 PipesPos []raylib.Vector2
} }
// NewGame - Start new game // NewGame - Start new game
@ -93,7 +95,7 @@ func NewGame() (g Game) {
// On Android this sets callback function to be used for android_main // On Android this sets callback function to be used for android_main
func init() { func init() {
rl.SetCallbackFunc(main) raylib.SetCallbackFunc(main)
} }
func main() { func main() {
@ -102,16 +104,16 @@ func main() {
game.GameOver = true game.GameOver = true
// Initialize window // Initialize window
rl.InitWindow(screenWidth, screenHeight, "Floppy Gopher") raylib.InitWindow(screenWidth, screenHeight, "Floppy Gopher")
// Initialize audio // Initialize audio
rl.InitAudioDevice() raylib.InitAudioDevice()
// NOTE: Textures and Sounds MUST be loaded after Window/Audio initialization // NOTE: Textures and Sounds MUST be loaded after Window/Audio initialization
game.Load() game.Load()
// Limit FPS // Limit FPS
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
// Main loop // Main loop
for !game.WindowShouldClose { for !game.WindowShouldClose {
@ -126,10 +128,10 @@ func main() {
game.Unload() game.Unload()
// Close audio // Close audio
rl.CloseAudioDevice() raylib.CloseAudioDevice()
// Close window // Close window
rl.CloseWindow() raylib.CloseWindow()
// Exit // Exit
os.Exit(0) os.Exit(0)
@ -139,37 +141,37 @@ func main() {
func (g *Game) Init() { func (g *Game) Init() {
// Gopher // Gopher
g.Floppy = Floppy{rl.NewVector2(80, float32(screenHeight)/2-spriteSize/2)} g.Floppy = Floppy{raylib.NewVector2(80, float32(screenHeight)/2-spriteSize/2)}
// Sprite rectangle // Sprite rectangle
g.FrameRec = rl.NewRectangle(0, 0, spriteSize, spriteSize) g.FrameRec = raylib.NewRectangle(0, 0, spriteSize, spriteSize)
// Cloud rectangle // Cloud rectangle
g.CloudRec = rl.NewRectangle(0, 0, float32(screenWidth), float32(g.TxClouds.Height)) g.CloudRec = raylib.NewRectangle(0, 0, float32(screenWidth), float32(g.TxClouds.Height))
// Initialize particles // Initialize particles
g.Particles = make([]Particle, maxParticles) g.Particles = make([]Particle, maxParticles)
for i := 0; i < maxParticles; i++ { for i := 0; i < maxParticles; i++ {
g.Particles[i].Position = rl.NewVector2(0, 0) g.Particles[i].Position = raylib.NewVector2(0, 0)
g.Particles[i].Color = rl.RayWhite g.Particles[i].Color = raylib.RayWhite
g.Particles[i].Alpha = 1.0 g.Particles[i].Alpha = 1.0
g.Particles[i].Size = float32(rl.GetRandomValue(1, 30)) / 20.0 g.Particles[i].Size = float32(raylib.GetRandomValue(1, 30)) / 20.0
g.Particles[i].Rotation = float32(rl.GetRandomValue(0, 360)) g.Particles[i].Rotation = float32(raylib.GetRandomValue(0, 360))
g.Particles[i].Active = false g.Particles[i].Active = false
} }
// Pipes positions // Pipes positions
g.PipesPos = make([]rl.Vector2, maxPipes) g.PipesPos = make([]raylib.Vector2, maxPipes)
for i := 0; i < maxPipes; i++ { for i := 0; i < maxPipes; i++ {
g.PipesPos[i].X = float32(480 + 360*i) g.PipesPos[i].X = float32(480 + 360*i)
g.PipesPos[i].Y = -float32(rl.GetRandomValue(0, 240)) g.PipesPos[i].Y = -float32(raylib.GetRandomValue(0, 240))
} }
// Pipes colors // Pipes colors
colors := []rl.Color{ colors := []raylib.Color{
rl.Orange, rl.Red, rl.Gold, rl.Lime, raylib.Orange, raylib.Red, raylib.Gold, raylib.Lime,
rl.Violet, rl.Brown, rl.LightGray, rl.Blue, raylib.Violet, raylib.Brown, raylib.LightGray, raylib.Blue,
rl.Yellow, rl.Green, rl.Purple, rl.Beige, raylib.Yellow, raylib.Green, raylib.Purple, raylib.Beige,
} }
// Pipes // Pipes
@ -179,7 +181,7 @@ func (g *Game) Init() {
g.Pipes[i].Rec.Y = g.PipesPos[i/2].Y g.Pipes[i].Rec.Y = g.PipesPos[i/2].Y
g.Pipes[i].Rec.Width = pipesWidth g.Pipes[i].Rec.Width = pipesWidth
g.Pipes[i].Rec.Height = 550 g.Pipes[i].Rec.Height = 550
g.Pipes[i].Color = colors[rl.GetRandomValue(0, int32(len(colors)-1))] g.Pipes[i].Color = colors[raylib.GetRandomValue(0, int32(len(colors)-1))]
g.Pipes[i+1].Rec.X = g.PipesPos[i/2].X g.Pipes[i+1].Rec.X = g.PipesPos[i/2].X
g.Pipes[i+1].Rec.Y = 1200 + g.PipesPos[i/2].Y - 550 g.Pipes[i+1].Rec.Y = 1200 + g.PipesPos[i/2].Y - 550
@ -201,35 +203,35 @@ func (g *Game) Init() {
// Load - Load resources // Load - Load resources
func (g *Game) Load() { func (g *Game) Load() {
g.FxFlap = rl.LoadSound("sounds/flap.wav") g.FxFlap = raylib.LoadSound("sounds/flap.wav")
g.FxSlap = rl.LoadSound("sounds/slap.wav") g.FxSlap = raylib.LoadSound("sounds/slap.wav")
g.FxPoint = rl.LoadSound("sounds/point.wav") g.FxPoint = raylib.LoadSound("sounds/point.wav")
g.FxClick = rl.LoadSound("sounds/click.wav") g.FxClick = raylib.LoadSound("sounds/click.wav")
g.TxSprites = rl.LoadTexture("images/sprite.png") g.TxSprites = raylib.LoadTexture("images/sprite.png")
g.TxSmoke = rl.LoadTexture("images/smoke.png") g.TxSmoke = raylib.LoadTexture("images/smoke.png")
g.TxClouds = rl.LoadTexture("images/clouds.png") g.TxClouds = raylib.LoadTexture("images/clouds.png")
} }
// Unload - Unload resources // Unload - Unload resources
func (g *Game) Unload() { func (g *Game) Unload() {
rl.UnloadSound(g.FxFlap) raylib.UnloadSound(g.FxFlap)
rl.UnloadSound(g.FxSlap) raylib.UnloadSound(g.FxSlap)
rl.UnloadSound(g.FxPoint) raylib.UnloadSound(g.FxPoint)
rl.UnloadSound(g.FxClick) raylib.UnloadSound(g.FxClick)
rl.UnloadTexture(g.TxSprites) raylib.UnloadTexture(g.TxSprites)
rl.UnloadTexture(g.TxSmoke) raylib.UnloadTexture(g.TxSmoke)
rl.UnloadTexture(g.TxClouds) raylib.UnloadTexture(g.TxClouds)
} }
// Update - Update game // Update - Update game
func (g *Game) Update() { func (g *Game) Update() {
if rl.WindowShouldClose() { if raylib.WindowShouldClose() {
g.WindowShouldClose = true g.WindowShouldClose = true
} }
if !g.GameOver { if !g.GameOver {
if rl.IsKeyPressed(rl.KeyP) || rl.IsKeyPressed(rl.KeyBack) { if raylib.IsKeyPressed(raylib.KeyP) || raylib.IsKeyPressed(raylib.KeyBack) {
rl.PlaySound(g.FxClick) raylib.PlaySound(g.FxClick)
if runtime.GOOS == "android" && g.Pause { if runtime.GOOS == "android" && g.Pause {
g.WindowShouldClose = true g.WindowShouldClose = true
@ -257,8 +259,8 @@ func (g *Game) Update() {
} }
// Movement/Controls // Movement/Controls
if rl.IsKeyDown(rl.KeySpace) || rl.IsMouseButtonDown(rl.MouseLeftButton) { if raylib.IsKeyDown(raylib.KeySpace) || raylib.IsMouseButtonDown(raylib.MouseLeftButton) {
rl.PlaySound(g.FxFlap) raylib.PlaySound(g.FxFlap)
// Activate one particle every frame // Activate one particle every frame
for i := 0; i < maxParticles; i++ { for i := 0; i < maxParticles; i++ {
@ -313,11 +315,11 @@ func (g *Game) Update() {
// Check Collisions // Check Collisions
for i := 0; i < maxPipes*2; i++ { for i := 0; i < maxPipes*2; i++ {
if rl.CheckCollisionRecs(rl.NewRectangle(g.Floppy.Position.X, g.Floppy.Position.Y, spriteSize, spriteSize), g.Pipes[i].Rec) { if raylib.CheckCollisionRecs(raylib.NewRectangle(g.Floppy.Position.X, g.Floppy.Position.Y, spriteSize, spriteSize), g.Pipes[i].Rec) {
// OMG You killed Gopher you bastard! // OMG You killed Gopher you bastard!
g.Dead = true g.Dead = true
rl.PlaySound(g.FxSlap) raylib.PlaySound(g.FxSlap)
} else if (g.PipesPos[i/2].X < g.Floppy.Position.X-spriteSize) && g.Pipes[i/2].Active && !g.GameOver { } else if (g.PipesPos[i/2].X < g.Floppy.Position.X-spriteSize) && g.Pipes[i/2].Active && !g.GameOver {
// Score point // Score point
g.Score += 1 g.Score += 1
@ -331,7 +333,7 @@ func (g *Game) Update() {
g.HiScore = g.Score g.HiScore = g.Score
} }
rl.PlaySound(g.FxPoint) raylib.PlaySound(g.FxPoint)
} }
} }
} else { } else {
@ -349,17 +351,17 @@ func (g *Game) Update() {
} }
} }
} else { } else {
if rl.IsMouseButtonDown(rl.MouseLeftButton) { if raylib.IsMouseButtonDown(raylib.MouseLeftButton) {
g.Pause = !g.Pause g.Pause = !g.Pause
} }
} }
} else { } else {
if rl.IsKeyPressed(rl.KeyEnter) || rl.IsMouseButtonDown(rl.MouseLeftButton) { if raylib.IsKeyPressed(raylib.KeyEnter) || raylib.IsMouseButtonDown(raylib.MouseLeftButton) {
rl.PlaySound(g.FxClick) raylib.PlaySound(g.FxClick)
// Return of the Gopher! // Return of the Gopher!
g.Init() g.Init()
} else if runtime.GOOS == "android" && rl.IsKeyDown(rl.KeyBack) { } else if runtime.GOOS == "android" && raylib.IsKeyDown(raylib.KeyBack) {
g.WindowShouldClose = true g.WindowShouldClose = true
} }
@ -377,32 +379,32 @@ func (g *Game) Update() {
// Draw - Draw game // Draw - Draw game
func (g *Game) Draw() { func (g *Game) Draw() {
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.SkyBlue) raylib.ClearBackground(raylib.SkyBlue)
if !g.GameOver { if !g.GameOver {
// Draw clouds // Draw clouds
rl.DrawTextureRec(g.TxClouds, g.CloudRec, rl.NewVector2(0, float32(screenHeight-g.TxClouds.Height)), rl.RayWhite) raylib.DrawTextureRec(g.TxClouds, g.CloudRec, raylib.NewVector2(0, float32(screenHeight-g.TxClouds.Height)), raylib.RayWhite)
// Draw rotated clouds // Draw rotated clouds
rl.DrawTexturePro(g.TxClouds, rl.NewRectangle(-g.CloudRec.X, 0, float32(g.TxClouds.Width), float32(g.TxClouds.Height)), raylib.DrawTexturePro(g.TxClouds, raylib.NewRectangle(-g.CloudRec.X, 0, float32(g.TxClouds.Width), float32(g.TxClouds.Height)),
rl.NewRectangle(0, 0, float32(g.TxClouds.Width), float32(g.TxClouds.Height)), rl.NewVector2(float32(g.TxClouds.Width), float32(g.TxClouds.Height)), 180, rl.White) raylib.NewRectangle(0, 0, float32(g.TxClouds.Width), float32(g.TxClouds.Height)), raylib.NewVector2(float32(g.TxClouds.Width), float32(g.TxClouds.Height)), 180, raylib.White)
// Draw Gopher // Draw Gopher
rl.DrawTextureRec(g.TxSprites, g.FrameRec, g.Floppy.Position, rl.RayWhite) raylib.DrawTextureRec(g.TxSprites, g.FrameRec, g.Floppy.Position, raylib.RayWhite)
// Draw active particles // Draw active particles
if !g.Dead { if !g.Dead {
for i := 0; i < maxParticles; i++ { for i := 0; i < maxParticles; i++ {
if g.Particles[i].Active { if g.Particles[i].Active {
rl.DrawTexturePro( raylib.DrawTexturePro(
g.TxSmoke, g.TxSmoke,
rl.NewRectangle(0, 0, float32(g.TxSmoke.Width), float32(g.TxSmoke.Height)), raylib.NewRectangle(0, 0, float32(g.TxSmoke.Width), float32(g.TxSmoke.Height)),
rl.NewRectangle(g.Particles[i].Position.X, g.Particles[i].Position.Y, float32(g.TxSmoke.Width)*g.Particles[i].Size, float32(g.TxSmoke.Height)*g.Particles[i].Size), raylib.NewRectangle(g.Particles[i].Position.X, g.Particles[i].Position.Y, float32(g.TxSmoke.Width)*g.Particles[i].Size, float32(g.TxSmoke.Height)*g.Particles[i].Size),
rl.NewVector2(float32(g.TxSmoke.Width)*g.Particles[i].Size/2, float32(g.TxSmoke.Height)*g.Particles[i].Size/2), raylib.NewVector2(float32(g.TxSmoke.Width)*g.Particles[i].Size/2, float32(g.TxSmoke.Height)*g.Particles[i].Size/2),
g.Particles[i].Rotation, g.Particles[i].Rotation,
rl.Fade(g.Particles[i].Color, g.Particles[i].Alpha), raylib.Fade(g.Particles[i].Color, g.Particles[i].Alpha),
) )
} }
} }
@ -410,41 +412,41 @@ func (g *Game) Draw() {
// Draw pipes // Draw pipes
for i := 0; i < maxPipes; i++ { for i := 0; i < maxPipes; i++ {
rl.DrawRectangle(int32(g.Pipes[i*2].Rec.X), int32(g.Pipes[i*2].Rec.Y), int32(g.Pipes[i*2].Rec.Width), int32(g.Pipes[i*2].Rec.Height), g.Pipes[i*2].Color) raylib.DrawRectangle(int32(g.Pipes[i*2].Rec.X), int32(g.Pipes[i*2].Rec.Y), int32(g.Pipes[i*2].Rec.Width), int32(g.Pipes[i*2].Rec.Height), g.Pipes[i*2].Color)
rl.DrawRectangle(int32(g.Pipes[i*2+1].Rec.X), int32(g.Pipes[i*2+1].Rec.Y), int32(g.Pipes[i*2+1].Rec.Width), int32(g.Pipes[i*2+1].Rec.Height), g.Pipes[i*2].Color) raylib.DrawRectangle(int32(g.Pipes[i*2+1].Rec.X), int32(g.Pipes[i*2+1].Rec.Y), int32(g.Pipes[i*2+1].Rec.Width), int32(g.Pipes[i*2+1].Rec.Height), g.Pipes[i*2].Color)
// Draw borders // Draw borders
rl.DrawRectangleLines(int32(g.Pipes[i*2].Rec.X), int32(g.Pipes[i*2].Rec.Y), int32(g.Pipes[i*2].Rec.Width), int32(g.Pipes[i*2].Rec.Height), rl.Black) raylib.DrawRectangleLines(int32(g.Pipes[i*2].Rec.X), int32(g.Pipes[i*2].Rec.Y), int32(g.Pipes[i*2].Rec.Width), int32(g.Pipes[i*2].Rec.Height), raylib.Black)
rl.DrawRectangleLines(int32(g.Pipes[i*2+1].Rec.X), int32(g.Pipes[i*2+1].Rec.Y), int32(g.Pipes[i*2+1].Rec.Width), int32(g.Pipes[i*2+1].Rec.Height), rl.Black) raylib.DrawRectangleLines(int32(g.Pipes[i*2+1].Rec.X), int32(g.Pipes[i*2+1].Rec.Y), int32(g.Pipes[i*2+1].Rec.Width), int32(g.Pipes[i*2+1].Rec.Height), raylib.Black)
} }
// Draw Super Flashing FX (one frame only) // Draw Super Flashing FX (one frame only)
if g.SuperFX { if g.SuperFX {
rl.DrawRectangle(0, 0, screenWidth, screenHeight, rl.White) raylib.DrawRectangle(0, 0, screenWidth, screenHeight, raylib.White)
g.SuperFX = false g.SuperFX = false
} }
// Draw HI-SCORE // Draw HI-SCORE
rl.DrawText(fmt.Sprintf("%02d", g.Score), 20, 20, 32, rl.Black) raylib.DrawText(fmt.Sprintf("%02d", g.Score), 20, 20, 32, raylib.Black)
rl.DrawText(fmt.Sprintf("HI-SCORE: %02d", g.HiScore), 20, 64, 20, rl.Black) raylib.DrawText(fmt.Sprintf("HI-SCORE: %02d", g.HiScore), 20, 64, 20, raylib.Black)
if g.Pause { if g.Pause {
// Draw PAUSED text // Draw PAUSED text
rl.DrawText("PAUSED", screenWidth/2-rl.MeasureText("PAUSED", 24)/2, screenHeight/2-50, 20, rl.Black) raylib.DrawText("PAUSED", screenWidth/2-raylib.MeasureText("PAUSED", 24)/2, screenHeight/2-50, 20, raylib.Black)
} }
} else { } else {
// Draw text // Draw text
rl.DrawText("Floppy Gopher", int32(rl.GetScreenWidth())/2-rl.MeasureText("Floppy Gopher", 40)/2, int32(rl.GetScreenHeight())/2-150, 40, rl.RayWhite) raylib.DrawText("Floppy Gopher", raylib.GetScreenWidth()/2-raylib.MeasureText("Floppy Gopher", 40)/2, raylib.GetScreenHeight()/2-150, 40, raylib.RayWhite)
if runtime.GOOS == "android" { if runtime.GOOS == "android" {
rl.DrawText("[TAP] TO PLAY", int32(rl.GetScreenWidth())/2-rl.MeasureText("[TAP] TO PLAY", 20)/2, int32(rl.GetScreenHeight())/2-50, 20, rl.Black) raylib.DrawText("[TAP] TO PLAY", raylib.GetScreenWidth()/2-raylib.MeasureText("[TAP] TO PLAY", 20)/2, raylib.GetScreenHeight()/2-50, 20, raylib.Black)
} else { } else {
rl.DrawText("[ENTER] TO PLAY", int32(rl.GetScreenWidth())/2-rl.MeasureText("[ENTER] TO PLAY", 20)/2, int32(rl.GetScreenHeight())/2-50, 20, rl.Black) raylib.DrawText("[ENTER] TO PLAY", raylib.GetScreenWidth()/2-raylib.MeasureText("[ENTER] TO PLAY", 20)/2, raylib.GetScreenHeight()/2-50, 20, raylib.Black)
} }
// Draw Gopher // Draw Gopher
rl.DrawTextureRec(g.TxSprites, g.FrameRec, rl.NewVector2(float32(rl.GetScreenWidth()/2-spriteSize/2), float32(rl.GetScreenHeight()/2)), rl.RayWhite) raylib.DrawTextureRec(g.TxSprites, g.FrameRec, raylib.NewVector2(float32(raylib.GetScreenWidth()/2-spriteSize/2), float32(raylib.GetScreenHeight()/2)), raylib.RayWhite)
} }
rl.EndDrawing() raylib.EndDrawing()
} }

View file

@ -4,7 +4,7 @@ import (
"math/rand" "math/rand"
"time" "time"
rl "git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
const ( const (
@ -13,8 +13,8 @@ const (
// Cell type // Cell type
type Cell struct { type Cell struct {
Position rl.Vector2 Position raylib.Vector2
Size rl.Vector2 Size raylib.Vector2
Alive bool Alive bool
Next bool Next bool
Visited bool Visited bool
@ -32,15 +32,15 @@ type Game struct {
} }
func main() { func main() {
rand.New(rand.NewSource(time.Now().UnixNano())) rand.Seed(time.Now().UnixNano())
game := Game{} game := Game{}
game.Init(false) game.Init(false)
rl.InitWindow(game.ScreenWidth, game.ScreenHeight, "Conway's Game of Life") raylib.InitWindow(game.ScreenWidth, game.ScreenHeight, "Conway's Game of Life")
rl.SetTargetFPS(20) raylib.SetTargetFPS(20)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
if game.Playing { if game.Playing {
game.Update() game.Update()
} }
@ -50,7 +50,7 @@ func main() {
game.Draw() game.Draw()
} }
rl.CloseWindow() raylib.CloseWindow()
} }
// Init - Initialize game // Init - Initialize game
@ -70,8 +70,8 @@ func (g *Game) Init(clear bool) {
for x := int32(0); x <= g.Cols; x++ { for x := int32(0); x <= g.Cols; x++ {
for y := int32(0); y <= g.Rows; y++ { for y := int32(0); y <= g.Rows; y++ {
g.Cells[x][y] = &Cell{} g.Cells[x][y] = &Cell{}
g.Cells[x][y].Position = rl.NewVector2((float32(x) * squareSize), (float32(y)*squareSize)+1) g.Cells[x][y].Position = raylib.NewVector2((float32(x) * squareSize), (float32(y)*squareSize)+1)
g.Cells[x][y].Size = rl.NewVector2(squareSize-1, squareSize-1) g.Cells[x][y].Size = raylib.NewVector2(squareSize-1, squareSize-1)
if rand.Float64() < 0.1 && clear == false { if rand.Float64() < 0.1 && clear == false {
g.Cells[x][y].Alive = true g.Cells[x][y].Alive = true
} }
@ -82,19 +82,19 @@ func (g *Game) Init(clear bool) {
// Input - Game input // Input - Game input
func (g *Game) Input() { func (g *Game) Input() {
// control // control
if rl.IsKeyPressed(rl.KeyR) { if raylib.IsKeyPressed(raylib.KeyR) {
g.Init(false) g.Init(false)
} }
if rl.IsKeyPressed(rl.KeyC) { if raylib.IsKeyPressed(raylib.KeyC) {
g.Init(true) g.Init(true)
} }
if rl.IsKeyDown(rl.KeyRight) && !g.Playing { if raylib.IsKeyDown(raylib.KeyRight) && !g.Playing {
g.Update() g.Update()
} }
if rl.IsMouseButtonPressed(rl.MouseLeftButton) { if raylib.IsMouseButtonPressed(raylib.MouseLeftButton) {
g.Click(rl.GetMouseX(), rl.GetMouseY()) g.Click(raylib.GetMouseX(), raylib.GetMouseY())
} }
if rl.IsKeyPressed(rl.KeySpace) { if raylib.IsKeyPressed(raylib.KeySpace) {
g.Playing = !g.Playing g.Playing = !g.Playing
} }
@ -165,36 +165,36 @@ func (g *Game) CountNeighbors(x, y int32) int {
// Draw - Draw game // Draw - Draw game
func (g *Game) Draw() { func (g *Game) Draw() {
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
// Draw cells // Draw cells
for x := int32(0); x <= g.Cols; x++ { for x := int32(0); x <= g.Cols; x++ {
for y := int32(0); y <= g.Rows; y++ { for y := int32(0); y <= g.Rows; y++ {
if g.Cells[x][y].Alive { if g.Cells[x][y].Alive {
rl.DrawRectangleV(g.Cells[x][y].Position, g.Cells[x][y].Size, rl.Blue) raylib.DrawRectangleV(g.Cells[x][y].Position, g.Cells[x][y].Size, raylib.Blue)
} else if g.Cells[x][y].Visited { } else if g.Cells[x][y].Visited {
rl.DrawRectangleV(g.Cells[x][y].Position, g.Cells[x][y].Size, rl.Color{R: 128, G: 177, B: 136, A: 255}) raylib.DrawRectangleV(g.Cells[x][y].Position, g.Cells[x][y].Size, raylib.Color{R: 128, G: 177, B: 136, A: 255})
} }
} }
} }
// Draw grid lines // Draw grid lines
for i := int32(0); i < g.Cols+1; i++ { for i := int32(0); i < g.Cols+1; i++ {
rl.DrawLineV( raylib.DrawLineV(
rl.NewVector2(float32(squareSize*i), 0), raylib.NewVector2(float32(squareSize*i), 0),
rl.NewVector2(float32(squareSize*i), float32(g.ScreenHeight)), raylib.NewVector2(float32(squareSize*i), float32(g.ScreenHeight)),
rl.LightGray, raylib.LightGray,
) )
} }
for i := int32(0); i < g.Rows+1; i++ { for i := int32(0); i < g.Rows+1; i++ {
rl.DrawLineV( raylib.DrawLineV(
rl.NewVector2(0, float32(squareSize*i)), raylib.NewVector2(0, float32(squareSize*i)),
rl.NewVector2(float32(g.ScreenWidth), float32(squareSize*i)), raylib.NewVector2(float32(g.ScreenWidth), float32(squareSize*i)),
rl.LightGray, raylib.LightGray,
) )
} }
rl.EndDrawing() raylib.EndDrawing()
} }

View file

@ -1,174 +0,0 @@
package main
import (
"fmt"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
// Game settings
const (
screenWidth = 800
screenHeight = 600
)
// Paddle struct
type Paddle struct {
Pos rl.Vector2
Width float32
Height float32
Speed float32
}
// Ball struct
type Ball struct {
Pos rl.Vector2
Speed rl.Vector2
Radius float32
}
// Game struct
type Game struct {
paddle1 Paddle
paddle2 Paddle
ball Ball
player1Score int
player2Score int
}
// Check for collision between ball and paddle, and determine side
func CheckCollisionSide(ball Ball, paddle Paddle) string {
closestX := rl.Clamp(ball.Pos.X, paddle.Pos.X, paddle.Pos.X+paddle.Width)
closestY := rl.Clamp(ball.Pos.Y, paddle.Pos.Y, paddle.Pos.Y+paddle.Height)
dx := ball.Pos.X - closestX
dy := ball.Pos.Y - closestY
distanceSq := dx*dx + dy*dy
radiusSq := ball.Radius * ball.Radius
if distanceSq <= radiusSq {
// Determine where it hit
if closestX == paddle.Pos.X || closestX == paddle.Pos.X+paddle.Width {
return "side"
}
if closestY == paddle.Pos.Y || closestY == paddle.Pos.Y+paddle.Height {
return "topbottom"
}
return "side" // fallback
}
return "none"
}
// Initialize the game state
func (g *Game) Init() {
g.paddle1 = Paddle{
Pos: rl.NewVector2(30, float32(screenHeight/2-50)),
Width: 10,
Height: 100,
Speed: 5,
}
g.paddle2 = Paddle{
Pos: rl.NewVector2(float32(screenWidth-40), float32(screenHeight/2-50)),
Width: 10,
Height: 100,
Speed: 5,
}
g.ball = Ball{
Pos: rl.NewVector2(float32(screenWidth/2), float32(screenHeight/2)),
Speed: rl.NewVector2(5, 4),
Radius: 10,
}
g.player1Score = 0
g.player2Score = 0
}
// Game update logic
func (g *Game) Update() {
// Player 1 - W/S
if rl.IsKeyDown(rl.KeyW) && g.paddle1.Pos.Y > 0 {
g.paddle1.Pos.Y -= g.paddle1.Speed
}
if rl.IsKeyDown(rl.KeyS) && g.paddle1.Pos.Y < screenHeight-g.paddle1.Height {
g.paddle1.Pos.Y += g.paddle1.Speed
}
// Player 2 - Up/Down
if rl.IsKeyDown(rl.KeyUp) && g.paddle2.Pos.Y > 0 {
g.paddle2.Pos.Y -= g.paddle2.Speed
}
if rl.IsKeyDown(rl.KeyDown) && g.paddle2.Pos.Y < screenHeight-g.paddle2.Height {
g.paddle2.Pos.Y += g.paddle2.Speed
}
// Ball movement
g.ball.Pos.X += g.ball.Speed.X
g.ball.Pos.Y += g.ball.Speed.Y
// Ball bounce off top/bottom walls
if g.ball.Pos.Y <= g.ball.Radius || g.ball.Pos.Y >= float32(screenHeight)-g.ball.Radius {
g.ball.Speed.Y *= -1
}
// Ball collisions with paddle sides only
if CheckCollisionSide(g.ball, g.paddle1) == "side" {
g.ball.Speed.X *= -1
// Reposition ball outside paddle1
g.ball.Pos.X = g.paddle1.Pos.X + g.paddle1.Width + g.ball.Radius
}
if CheckCollisionSide(g.ball, g.paddle2) == "side" {
g.ball.Speed.X *= -1
// Reposition ball outside paddle2
g.ball.Pos.X = g.paddle2.Pos.X - g.ball.Radius
}
// Scoring
if g.ball.Pos.X < 0 {
g.player2Score++
g.ball.Pos = rl.NewVector2(float32(screenWidth/2), float32(screenHeight/2))
g.ball.Speed.X *= -1
}
if g.ball.Pos.X > float32(screenWidth) {
g.player1Score++
g.ball.Pos = rl.NewVector2(float32(screenWidth/2), float32(screenHeight/2))
g.ball.Speed.X *= -1
}
}
// Draw game elements
func (g *Game) Draw() {
// Draw paddles
rl.DrawRectangleV(g.paddle1.Pos, rl.NewVector2(g.paddle1.Width, g.paddle1.Height), rl.Black)
rl.DrawRectangleV(g.paddle2.Pos, rl.NewVector2(g.paddle2.Width, g.paddle2.Height), rl.Black)
// Draw ball
rl.DrawCircleV(g.ball.Pos, g.ball.Radius, rl.Black)
// Draw scores
rl.DrawText(fmt.Sprintf("Player 1 : %d", g.player1Score), 20, 20, 20, rl.DarkGray)
rl.DrawText(fmt.Sprintf("Player 2 : %d", g.player2Score), screenWidth-140, 20, 20, rl.DarkGray)
}
func main() {
rl.InitWindow(screenWidth, screenHeight, "Pong in Go!")
rl.SetTargetFPS(60)
var game Game
game.Init()
for !rl.WindowShouldClose() {
game.Update()
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
game.Draw()
rl.EndDrawing()
}
rl.CloseWindow()
}

View file

@ -1,5 +1,9 @@
package main package main
import (
"github.com/gen2brain/raylib-go/raylib"
)
const ( const (
snakeLength = 256 snakeLength = 256
squareSize = 31 squareSize = 31
@ -7,18 +11,18 @@ const (
// Snake type // Snake type
type Snake struct { type Snake struct {
Position rl.Vector2 Position raylib.Vector2
Size rl.Vector2 Size raylib.Vector2
Speed rl.Vector2 Speed raylib.Vector2
Color rl.Color Color raylib.Color
} }
// Food type // Food type
type Food struct { type Food struct {
Position rl.Vector2 Position raylib.Vector2
Size rl.Vector2 Size raylib.Vector2
Active bool Active bool
Color rl.Color Color raylib.Color
} }
// Game type // Game type
@ -32,9 +36,9 @@ type Game struct {
Fruit Food Fruit Food
Snake []Snake Snake []Snake
SnakePosition []rl.Vector2 SnakePosition []raylib.Vector2
AllowMove bool AllowMove bool
Offset rl.Vector2 Offset raylib.Vector2
CounterTail int CounterTail int
} }
@ -42,17 +46,17 @@ func main() {
game := Game{} game := Game{}
game.Init() game.Init()
rl.InitWindow(game.ScreenWidth, game.ScreenHeight, "sample game: snake") raylib.InitWindow(game.ScreenWidth, game.ScreenHeight, "sample game: snake")
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
game.Update() game.Update()
game.Draw() game.Draw()
} }
rl.CloseWindow() raylib.CloseWindow()
} }
// Init - Initialize game // Init - Initialize game
@ -67,58 +71,58 @@ func (g *Game) Init() {
g.CounterTail = 1 g.CounterTail = 1
g.AllowMove = false g.AllowMove = false
g.Offset = rl.Vector2{} g.Offset = raylib.Vector2{}
g.Offset.X = float32(g.ScreenWidth % squareSize) g.Offset.X = float32(g.ScreenWidth % squareSize)
g.Offset.Y = float32(g.ScreenHeight % squareSize) g.Offset.Y = float32(g.ScreenHeight % squareSize)
g.Snake = make([]Snake, snakeLength) g.Snake = make([]Snake, snakeLength)
for i := 0; i < snakeLength; i++ { for i := 0; i < snakeLength; i++ {
g.Snake[i].Position = rl.NewVector2(g.Offset.X/2, g.Offset.Y/2) g.Snake[i].Position = raylib.NewVector2(g.Offset.X/2, g.Offset.Y/2)
g.Snake[i].Size = rl.NewVector2(squareSize, squareSize) g.Snake[i].Size = raylib.NewVector2(squareSize, squareSize)
g.Snake[i].Speed = rl.NewVector2(squareSize, 0) g.Snake[i].Speed = raylib.NewVector2(squareSize, 0)
if i == 0 { if i == 0 {
g.Snake[i].Color = rl.DarkBlue g.Snake[i].Color = raylib.DarkBlue
} else { } else {
g.Snake[i].Color = rl.Blue g.Snake[i].Color = raylib.Blue
} }
} }
g.SnakePosition = make([]rl.Vector2, snakeLength) g.SnakePosition = make([]raylib.Vector2, snakeLength)
for i := 0; i < snakeLength; i++ { for i := 0; i < snakeLength; i++ {
g.SnakePosition[i] = rl.NewVector2(0.0, 0.0) g.SnakePosition[i] = raylib.NewVector2(0.0, 0.0)
} }
g.Fruit.Size = rl.NewVector2(squareSize, squareSize) g.Fruit.Size = raylib.NewVector2(squareSize, squareSize)
g.Fruit.Color = rl.SkyBlue g.Fruit.Color = raylib.SkyBlue
g.Fruit.Active = false g.Fruit.Active = false
} }
// Update - Update game // Update - Update game
func (g *Game) Update() { func (g *Game) Update() {
if !g.GameOver { if !g.GameOver {
if rl.IsKeyPressed(rl.KeyP) { if raylib.IsKeyPressed('P') {
g.Pause = !g.Pause g.Pause = !g.Pause
} }
if !g.Pause { if !g.Pause {
// control // control
if rl.IsKeyPressed(rl.KeyRight) && g.Snake[0].Speed.X == 0 && g.AllowMove { if raylib.IsKeyPressed(raylib.KeyRight) && g.Snake[0].Speed.X == 0 && g.AllowMove {
g.Snake[0].Speed = rl.NewVector2(squareSize, 0) g.Snake[0].Speed = raylib.NewVector2(squareSize, 0)
g.AllowMove = false g.AllowMove = false
} }
if rl.IsKeyPressed(rl.KeyLeft) && g.Snake[0].Speed.X == 0 && g.AllowMove { if raylib.IsKeyPressed(raylib.KeyLeft) && g.Snake[0].Speed.X == 0 && g.AllowMove {
g.Snake[0].Speed = rl.NewVector2(-squareSize, 0) g.Snake[0].Speed = raylib.NewVector2(-squareSize, 0)
g.AllowMove = false g.AllowMove = false
} }
if rl.IsKeyPressed(rl.KeyUp) && g.Snake[0].Speed.Y == 0 && g.AllowMove { if raylib.IsKeyPressed(raylib.KeyUp) && g.Snake[0].Speed.Y == 0 && g.AllowMove {
g.Snake[0].Speed = rl.NewVector2(0, -squareSize) g.Snake[0].Speed = raylib.NewVector2(0, -squareSize)
g.AllowMove = false g.AllowMove = false
} }
if rl.IsKeyPressed(rl.KeyDown) && g.Snake[0].Speed.Y == 0 && g.AllowMove { if raylib.IsKeyPressed(raylib.KeyDown) && g.Snake[0].Speed.Y == 0 && g.AllowMove {
g.Snake[0].Speed = rl.NewVector2(0, squareSize) g.Snake[0].Speed = raylib.NewVector2(0, squareSize)
g.AllowMove = false g.AllowMove = false
} }
@ -155,16 +159,16 @@ func (g *Game) Update() {
if !g.Fruit.Active { if !g.Fruit.Active {
g.Fruit.Active = true g.Fruit.Active = true
g.Fruit.Position = rl.NewVector2( g.Fruit.Position = raylib.NewVector2(
float32(rl.GetRandomValue(0, (g.ScreenWidth/squareSize)-1)*squareSize)+(g.Offset.X)/2, float32(raylib.GetRandomValue(0, (g.ScreenWidth/squareSize)-1)*squareSize+int32(g.Offset.X)/2),
float32(rl.GetRandomValue(0, (g.ScreenHeight/squareSize)-1)*squareSize)+(g.Offset.Y)/2, float32(raylib.GetRandomValue(0, (g.ScreenHeight/squareSize)-1)*squareSize+int32(g.Offset.Y)/2),
) )
for i := 0; i < g.CounterTail; i++ { for i := 0; i < g.CounterTail; i++ {
for (g.Fruit.Position.X == g.Snake[i].Position.X) && (g.Fruit.Position.Y == g.Snake[i].Position.Y) { for (g.Fruit.Position.X == g.Snake[i].Position.X) && (g.Fruit.Position.Y == g.Snake[i].Position.Y) {
g.Fruit.Position = rl.NewVector2( g.Fruit.Position = raylib.NewVector2(
float32(rl.GetRandomValue(0, (g.ScreenWidth/squareSize)-1)*squareSize)+g.Offset.X/2, float32(raylib.GetRandomValue(0, (g.ScreenWidth/squareSize)-1)*squareSize),
float32(rl.GetRandomValue(0, (g.ScreenHeight/squareSize)-1)*squareSize)+g.Offset.Y/2, float32(raylib.GetRandomValue(0, (g.ScreenHeight/squareSize)-1)*squareSize),
) )
i = 0 i = 0
} }
@ -172,9 +176,9 @@ func (g *Game) Update() {
} }
// collision // collision
if rl.CheckCollisionRecs( if raylib.CheckCollisionRecs(
rl.NewRectangle(g.Snake[0].Position.X, g.Snake[0].Position.Y, g.Snake[0].Size.X, g.Snake[0].Size.Y), raylib.NewRectangle(g.Snake[0].Position.X, g.Snake[0].Position.Y, g.Snake[0].Size.X, g.Snake[0].Size.Y),
rl.NewRectangle(g.Fruit.Position.X, g.Fruit.Position.Y, g.Fruit.Size.X, g.Fruit.Size.Y), raylib.NewRectangle(g.Fruit.Position.X, g.Fruit.Position.Y, g.Fruit.Size.X, g.Fruit.Size.Y),
) { ) {
g.Snake[g.CounterTail].Position = g.SnakePosition[g.CounterTail-1] g.Snake[g.CounterTail].Position = g.SnakePosition[g.CounterTail-1]
g.CounterTail += 1 g.CounterTail += 1
@ -184,7 +188,7 @@ func (g *Game) Update() {
g.FramesCounter++ g.FramesCounter++
} }
} else { } else {
if rl.IsKeyPressed(rl.KeyEnter) { if raylib.IsKeyPressed(raylib.KeyEnter) {
g.Init() g.Init()
g.GameOver = false g.GameOver = false
} }
@ -193,42 +197,42 @@ func (g *Game) Update() {
// Draw - Draw game // Draw - Draw game
func (g *Game) Draw() { func (g *Game) Draw() {
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
if !g.GameOver { if !g.GameOver {
// Draw grid lines // Draw grid lines
for i := int32(0); i < g.ScreenWidth/squareSize+1; i++ { for i := int32(0); i < g.ScreenWidth/squareSize+1; i++ {
rl.DrawLineV( raylib.DrawLineV(
rl.NewVector2(float32(squareSize*i)+g.Offset.X/2, g.Offset.Y/2), raylib.NewVector2(float32(squareSize*i)+g.Offset.X/2, g.Offset.Y/2),
rl.NewVector2(float32(squareSize*i)+g.Offset.X/2, float32(g.ScreenHeight)-g.Offset.Y/2), raylib.NewVector2(float32(squareSize*i)+g.Offset.X/2, float32(g.ScreenHeight)-g.Offset.Y/2),
rl.LightGray, raylib.LightGray,
) )
} }
for i := int32(0); i < g.ScreenHeight/squareSize+1; i++ { for i := int32(0); i < g.ScreenHeight/squareSize+1; i++ {
rl.DrawLineV( raylib.DrawLineV(
rl.NewVector2(g.Offset.X/2, float32(squareSize*i)+g.Offset.Y/2), raylib.NewVector2(g.Offset.X/2, float32(squareSize*i)+g.Offset.Y/2),
rl.NewVector2(float32(g.ScreenWidth)-g.Offset.X/2, float32(squareSize*i)+g.Offset.Y/2), raylib.NewVector2(float32(g.ScreenWidth)-g.Offset.X/2, float32(squareSize*i)+g.Offset.Y/2),
rl.LightGray, raylib.LightGray,
) )
} }
// Draw snake // Draw snake
for i := 0; i < g.CounterTail; i++ { for i := 0; i < g.CounterTail; i++ {
rl.DrawRectangleV(g.Snake[i].Position, g.Snake[i].Size, g.Snake[i].Color) raylib.DrawRectangleV(g.Snake[i].Position, g.Snake[i].Size, g.Snake[i].Color)
} }
// Draw fruit to pick // Draw fruit to pick
rl.DrawRectangleV(g.Fruit.Position, g.Fruit.Size, g.Fruit.Color) raylib.DrawRectangleV(g.Fruit.Position, g.Fruit.Size, g.Fruit.Color)
if g.Pause { if g.Pause {
rl.DrawText("GAME PAUSED", g.ScreenWidth/2-rl.MeasureText("GAME PAUSED", 40)/2, g.ScreenHeight/2-40, 40, rl.Gray) raylib.DrawText("GAME PAUSED", g.ScreenWidth/2-raylib.MeasureText("GAME PAUSED", 40)/2, g.ScreenHeight/2-40, 40, raylib.Gray)
} }
} else { } else {
rl.DrawText("PRESS [ENTER] TO PLAY AGAIN", int32(rl.GetScreenWidth())/2-rl.MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2, int32(rl.GetScreenHeight())/2-50, 20, rl.Gray) raylib.DrawText("PRESS [ENTER] TO PLAY AGAIN", raylib.GetScreenWidth()/2-raylib.MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2, raylib.GetScreenHeight()/2-50, 20, raylib.Gray)
} }
rl.EndDrawing() raylib.EndDrawing()
} }

View file

@ -1,26 +0,0 @@
module examples
go 1.21
replace git.terah.dev/UnrealXR/raylib-go/raylib => ../raylib
replace git.terah.dev/UnrealXR/raylib-go/raygui => ../raygui
replace git.terah.dev/UnrealXR/raylib-go/easings => ../easings
replace git.terah.dev/UnrealXR/raylib-go/physics => ../physics
require (
git.terah.dev/UnrealXR/raylib-go/easings v0.0.0-00010101000000-000000000000
git.terah.dev/UnrealXR/raylib-go/physics v0.0.0-00010101000000-000000000000
git.terah.dev/UnrealXR/raylib-go/raygui v0.0.0-00010101000000-000000000000
git.terah.dev/UnrealXR/raylib-go/raylib v0.0.0-20241202103652-5d50abe7c65b
github.com/jakecoffman/cp v1.2.1
github.com/neguse/go-box2d-lite v0.0.0-20170921151050-5d8ed9b7272b
)
require (
github.com/ebitengine/purego v0.8.1 // indirect
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect
golang.org/x/sys v0.27.0 // indirect
)

View file

@ -1,10 +0,0 @@
github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE=
github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/jakecoffman/cp v1.2.1 h1:zkhc2Gpo9l4NLUZfeG3j33+3bQD7MkqPa+n5PdX+5mI=
github.com/jakecoffman/cp v1.2.1/go.mod h1:JjY/Fp6d8E1CHnu74gWNnU0+b9VzEdUVPoJxg2PsTQg=
github.com/neguse/go-box2d-lite v0.0.0-20170921151050-5d8ed9b7272b h1:+67TGbwfgeB5o03Rx+ZBW44zAQ+wUujcwdRA0p9CbJI=
github.com/neguse/go-box2d-lite v0.0.0-20170921151050-5d8ed9b7272b/go.mod h1:kvKwD9codtns5mvpA53V3vLnqFb/Ahcu8zgkGM0SIbI=
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo=
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak=
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=

View file

@ -0,0 +1,92 @@
package main
import (
"fmt"
"github.com/gen2brain/raylib-go/raygui"
"github.com/gen2brain/raylib-go/raylib"
)
func main() {
screenWidth := int32(800)
screenHeight := int32(450)
raylib.SetConfigFlags(raylib.FlagVsyncHint)
raylib.InitWindow(screenWidth, screenHeight, "raylib [gui] example - basic controls")
buttonToggle := true
buttonClicked := false
checkboxChecked := false
spinnerValue := 5
sliderValue := float32(10)
sliderBarValue := float32(70)
progressValue := float32(0.5)
comboActive := 0
comboLastActive := 0
toggleActive := 0
toggleText := []string{"Item 1", "Item 2", "Item 3"}
comboText := []string{"default_light", "default_dark", "hello_kitty", "monokai", "obsidian", "solarized_light", "solarized", "zahnrad"}
var inputText string
raylib.SetTargetFPS(60)
for !raylib.WindowShouldClose() {
if buttonClicked {
progressValue += 0.1
if progressValue >= 1.1 {
progressValue = 0.0
}
}
raylib.BeginDrawing()
raylib.ClearBackground(raylib.Beige)
raygui.Label(raylib.NewRectangle(50, 50, 80, 20), "Label")
buttonClicked = raygui.Button(raylib.NewRectangle(50, 70, 80, 40), "Button")
raygui.Label(raylib.NewRectangle(70, 140, 20, 20), "Checkbox")
checkboxChecked = raygui.CheckBox(raylib.NewRectangle(50, 140, 20, 20), checkboxChecked)
raygui.Label(raylib.NewRectangle(50, 190, 200, 20), "ProgressBar")
raygui.ProgressBar(raylib.NewRectangle(50, 210, 200, 20), progressValue)
raygui.Label(raylib.NewRectangle(200+50+5, 210, 20, 20), fmt.Sprintf("%.1f", progressValue))
raygui.Label(raylib.NewRectangle(50, 260, 200, 20), "Slider")
sliderValue = raygui.Slider(raylib.NewRectangle(50, 280, 200, 20), sliderValue, 0, 100)
raygui.Label(raylib.NewRectangle(200+50+5, 280, 20, 20), fmt.Sprintf("%.0f", sliderValue))
buttonToggle = raygui.ToggleButton(raylib.NewRectangle(50, 350, 100, 40), "ToggleButton", buttonToggle)
raygui.Label(raylib.NewRectangle(500, 50, 200, 20), "ToggleGroup")
toggleActive = raygui.ToggleGroup(raylib.NewRectangle(500, 70, 60, 30), toggleText, toggleActive)
raygui.Label(raylib.NewRectangle(500, 120, 200, 20), "SliderBar")
sliderBarValue = raygui.SliderBar(raylib.NewRectangle(500, 140, 200, 20), sliderBarValue, 0, 100)
raygui.Label(raylib.NewRectangle(500+200+5, 140, 20, 20), fmt.Sprintf("%.0f", sliderBarValue))
raygui.Label(raylib.NewRectangle(500, 190, 200, 20), "Spinner")
spinnerValue = raygui.Spinner(raylib.NewRectangle(500, 210, 200, 20), spinnerValue, 0, 100)
raygui.Label(raylib.NewRectangle(500, 260, 200, 20), "ComboBox")
comboActive = raygui.ComboBox(raylib.NewRectangle(500, 280, 200, 20), comboText, comboActive)
if comboLastActive != comboActive {
raygui.LoadGuiStyle(fmt.Sprintf("styles/%s.style", comboText[comboActive]))
comboLastActive = comboActive
}
raygui.Label(raylib.NewRectangle(500, 330, 200, 20), "TextBox")
inputText = raygui.TextBox(raylib.NewRectangle(500, 350, 200, 20), inputText)
raylib.EndDrawing()
}
raylib.CloseWindow()
}

View file

@ -0,0 +1,99 @@
GLOBAL_BASE_COLOR 0xf5f5f5ff
GLOBAL_BORDER_COLOR 0xf5f5f5ff
GLOBAL_TEXT_COLOR 0xf5f5f5ff
GLOBAL_TEXT_FONTSIZE 0xa
GLOBAL_BORDER_WIDTH 0x1
BACKGROUND_COLOR 0x293235ff
LINES_COLOR 0x90abb5ff
LABEL_BORDER_WIDTH 0x0
LABEL_TEXT_COLOR 0x90acb4ff
LABEL_TEXT_PADDING 0x0
BUTTON_BORDER_WIDTH 0x2
BUTTON_TEXT_PADDING 0x0
BUTTON_DEFAULT_BORDER_COLOR 0x3e4a4fff
BUTTON_DEFAULT_INSIDE_COLOR 0x344041ff
BUTTON_DEFAULT_TEXT_COLOR 0x90acb4ff
BUTTON_HOVER_BORDER_COLOR 0x47595fff
BUTTON_HOVER_INSIDE_COLOR 0x334f59ff
BUTTON_HOVER_TEXT_COLOR 0x90acb4ff
BUTTON_PRESSED_BORDER_COLOR 0x5f9aa4ff
BUTTON_PRESSED_INSIDE_COLOR 0x334f59ff
BUTTON_PRESSED_TEXT_COLOR 0x5f9aa8ff
TOGGLE_TEXT_PADDING 0x20
TOGGLE_BORDER_WIDTH 0x1
TOGGLE_DEFAULT_BORDER_COLOR 0x3e4b4dff
TOGGLE_DEFAULT_INSIDE_COLOR 0x344041ff
TOGGLE_DEFAULT_TEXT_COLOR 0x828282ff
TOGGLE_HOVER_BORDER_COLOR 0x47595fff
TOGGLE_HOVER_INSIDE_COLOR 0x334f59ff
TOGGLE_HOVER_TEXT_COLOR 0x828282ff
TOGGLE_PRESSED_BORDER_COLOR 0x5f9aa8ff
TOGGLE_PRESSED_INSIDE_COLOR 0x334f59ff
TOGGLE_PRESSED_TEXT_COLOR 0x5f9aa8ff
TOGGLE_ACTIVE_BORDER_COLOR 0x92c763ff
TOGGLE_ACTIVE_INSIDE_COLOR 0x334f59ff
TOGGLE_ACTIVE_TEXT_COLOR 0x92c763ff
TOGGLEGROUP_PADDING 0x3
SLIDER_BORDER_WIDTH 0x1
SLIDER_BUTTON_BORDER_WIDTH 0x0
SLIDER_BORDER_COLOR 0x828282ff
SLIDER_INSIDE_COLOR 0x3e4b4dff
SLIDER_DEFAULT_COLOR 0x92c763ff
SLIDER_HOVER_COLOR 0xc3e0a9ff
SLIDER_ACTIVE_COLOR 0xffffffff
SLIDERBAR_BORDER_COLOR 0x828282ff
SLIDERBAR_INSIDE_COLOR 0x344041ff
SLIDERBAR_DEFAULT_COLOR 0x92c763ff
SLIDERBAR_HOVER_COLOR 0xc3e0a9ff
SLIDERBAR_ACTIVE_COLOR 0xffffffff
SLIDERBAR_ZERO_LINE_COLOR 0x828282ff
PROGRESSBAR_BORDER_COLOR 0x828282ff
PROGRESSBAR_INSIDE_COLOR 0x3e4b4dff
PROGRESSBAR_PROGRESS_COLOR 0x92c763ff
PROGRESSBAR_BORDER_WIDTH 0x1
SPINNER_LABEL_BORDER_COLOR 0x3e4b4dff
SPINNER_LABEL_INSIDE_COLOR 0x344041ff
SPINNER_DEFAULT_BUTTON_BORDER_COLOR 0x3e4b4dff
SPINNER_DEFAULT_BUTTON_INSIDE_COLOR 0x344041ff
SPINNER_DEFAULT_SYMBOL_COLOR 0x5f9aa8ff
SPINNER_DEFAULT_TEXT_COLOR 0x5f9aa8ff
SPINNER_HOVER_BUTTON_BORDER_COLOR 0x47595fff
SPINNER_HOVER_BUTTON_INSIDE_COLOR 0x334f59ff
SPINNER_HOVER_SYMBOL_COLOR 0x5f9aa8ff
SPINNER_HOVER_TEXT_COLOR 0x5f9aa8ff
SPINNER_PRESSED_BUTTON_BORDER_COLOR 0x92c763ff
SPINNER_PRESSED_BUTTON_INSIDE_COLOR 0x334f59ff
SPINNER_PRESSED_SYMBOL_COLOR 0x92c763ff
SPINNER_PRESSED_TEXT_COLOR 0x92c763ff
COMBOBOX_PADDING 0x1
COMBOBOX_BUTTON_WIDTH 0x30
COMBOBOX_BUTTON_HEIGHT 0x20
COMBOBOX_BORDER_WIDTH 0x1
COMBOBOX_DEFAULT_BORDER_COLOR 0x3e4b4dff
COMBOBOX_DEFAULT_INSIDE_COLOR 0x344041ff
COMBOBOX_DEFAULT_TEXT_COLOR 0x5f9aa8ff
COMBOBOX_DEFAULT_LIST_TEXT_COLOR 0x5f9aa8ff
COMBOBOX_HOVER_BORDER_COLOR 0x47595fff
COMBOBOX_HOVER_INSIDE_COLOR 0x334f59ff
COMBOBOX_HOVER_TEXT_COLOR 0x5f9aa8ff
COMBOBOX_HOVER_LIST_TEXT_COLOR 0x5f9aa8ff
COMBOBOX_PRESSED_BORDER_COLOR 0x5f9aa8ff
COMBOBOX_PRESSED_INSIDE_COLOR 0x334f59ff
COMBOBOX_PRESSED_TEXT_COLOR 0x5f9aa8ff
COMBOBOX_PRESSED_LIST_BORDER_COLOR 0x92c763ff
COMBOBOX_PRESSED_LIST_INSIDE_COLOR 0x334f59ff
COMBOBOX_PRESSED_LIST_TEXT_COLOR 0x92c763ff
CHECKBOX_DEFAULT_BORDER_COLOR 0x47595fff
CHECKBOX_DEFAULT_INSIDE_COLOR 0x344041ff
CHECKBOX_HOVER_BORDER_COLOR 0x47595fff
CHECKBOX_HOVER_INSIDE_COLOR 0x334f59ff
CHECKBOX_CLICK_BORDER_COLOR 0x5f9aa8ff
CHECKBOX_CLICK_INSIDE_COLOR 0x334f59ff
CHECKBOX_STATUS_ACTIVE_COLOR 0x92c763ff
CHECKBOX_INSIDE_WIDTH 0x2
TEXTBOX_BORDER_WIDTH 0x1
TEXTBOX_BORDER_COLOR 0x47595fff
TEXTBOX_INSIDE_COLOR 0x828282ff
TEXTBOX_TEXT_COLOR 0xff
TEXTBOX_LINE_COLOR 0xff
TEXTBOX_TEXT_FONTSIZE 0xa

View file

@ -0,0 +1,99 @@
GLOBAL_BASE_COLOR 0xf5f5f5ff
GLOBAL_BORDER_COLOR 0xf5f5f5ff
GLOBAL_TEXT_COLOR 0xf5f5f5ff
GLOBAL_TEXT_FONTSIZE 0xa
GLOBAL_BORDER_WIDTH 0x1
BACKGROUND_COLOR 0xf5f5f5ff
LINES_COLOR 0x90abb5ff
LABEL_BORDER_WIDTH 0x1
LABEL_TEXT_COLOR 0x4d4d4dff
LABEL_TEXT_PADDING 0x14
BUTTON_BORDER_WIDTH 0x2
BUTTON_TEXT_PADDING 0x14
BUTTON_DEFAULT_BORDER_COLOR 0x828282ff
BUTTON_DEFAULT_INSIDE_COLOR 0xc8c8c8ff
BUTTON_DEFAULT_TEXT_COLOR 0x4d4d4dff
BUTTON_HOVER_BORDER_COLOR 0xc8c8c8ff
BUTTON_HOVER_INSIDE_COLOR 0xffffffff
BUTTON_HOVER_TEXT_COLOR 0x868686ff
BUTTON_PRESSED_BORDER_COLOR 0x7bb0d6ff
BUTTON_PRESSED_INSIDE_COLOR 0xbcecffff
BUTTON_PRESSED_TEXT_COLOR 0x5f9aa7ff
TOGGLE_TEXT_PADDING 0x14
TOGGLE_BORDER_WIDTH 0x1
TOGGLE_DEFAULT_BORDER_COLOR 0x828282ff
TOGGLE_DEFAULT_INSIDE_COLOR 0xc8c8c8ff
TOGGLE_DEFAULT_TEXT_COLOR 0x828282ff
TOGGLE_HOVER_BORDER_COLOR 0xc8c8c8ff
TOGGLE_HOVER_INSIDE_COLOR 0xffffffff
TOGGLE_HOVER_TEXT_COLOR 0x828282ff
TOGGLE_PRESSED_BORDER_COLOR 0xbdd7eaff
TOGGLE_PRESSED_INSIDE_COLOR 0xddf5ffff
TOGGLE_PRESSED_TEXT_COLOR 0xafccd3ff
TOGGLE_ACTIVE_BORDER_COLOR 0x7bb0d6ff
TOGGLE_ACTIVE_INSIDE_COLOR 0xbcecffff
TOGGLE_ACTIVE_TEXT_COLOR 0x5f9aa7ff
TOGGLEGROUP_PADDING 0x3
SLIDER_BORDER_WIDTH 0x1
SLIDER_BUTTON_BORDER_WIDTH 0x1
SLIDER_BORDER_COLOR 0x828282ff
SLIDER_INSIDE_COLOR 0xc8c8c8ff
SLIDER_DEFAULT_COLOR 0xbcecffff
SLIDER_HOVER_COLOR 0xffffffff
SLIDER_ACTIVE_COLOR 0xddf5ffff
SLIDERBAR_BORDER_COLOR 0x828282ff
SLIDERBAR_INSIDE_COLOR 0xc8c8c8ff
SLIDERBAR_DEFAULT_COLOR 0xbcecffff
SLIDERBAR_HOVER_COLOR 0xffffffff
SLIDERBAR_ACTIVE_COLOR 0xddf5ffff
SLIDERBAR_ZERO_LINE_COLOR 0x828282ff
PROGRESSBAR_BORDER_COLOR 0x828282ff
PROGRESSBAR_INSIDE_COLOR 0xc8c8c8ff
PROGRESSBAR_PROGRESS_COLOR 0xbcecffff
PROGRESSBAR_BORDER_WIDTH 0x2
SPINNER_LABEL_BORDER_COLOR 0x828282ff
SPINNER_LABEL_INSIDE_COLOR 0xc8c8c8ff
SPINNER_DEFAULT_BUTTON_BORDER_COLOR 0x828282ff
SPINNER_DEFAULT_BUTTON_INSIDE_COLOR 0xc8c8c8ff
SPINNER_DEFAULT_SYMBOL_COLOR 0xff
SPINNER_DEFAULT_TEXT_COLOR 0xff
SPINNER_HOVER_BUTTON_BORDER_COLOR 0xc8c8c8ff
SPINNER_HOVER_BUTTON_INSIDE_COLOR 0xffffffff
SPINNER_HOVER_SYMBOL_COLOR 0xff
SPINNER_HOVER_TEXT_COLOR 0xff
SPINNER_PRESSED_BUTTON_BORDER_COLOR 0x7bb0d6ff
SPINNER_PRESSED_BUTTON_INSIDE_COLOR 0xbcecffff
SPINNER_PRESSED_SYMBOL_COLOR 0x5f9aa7ff
SPINNER_PRESSED_TEXT_COLOR 0xff
COMBOBOX_PADDING 0x1
COMBOBOX_BUTTON_WIDTH 0x1e
COMBOBOX_BUTTON_HEIGHT 0x14
COMBOBOX_BORDER_WIDTH 0x1
COMBOBOX_DEFAULT_BORDER_COLOR 0x828282ff
COMBOBOX_DEFAULT_INSIDE_COLOR 0xc8c8c8ff
COMBOBOX_DEFAULT_TEXT_COLOR 0x828282ff
COMBOBOX_DEFAULT_LIST_TEXT_COLOR 0x828282ff
COMBOBOX_HOVER_BORDER_COLOR 0xc8c8c8ff
COMBOBOX_HOVER_INSIDE_COLOR 0xffffffff
COMBOBOX_HOVER_TEXT_COLOR 0x828282ff
COMBOBOX_HOVER_LIST_TEXT_COLOR 0x828282ff
COMBOBOX_PRESSED_BORDER_COLOR 0x7bb0d6ff
COMBOBOX_PRESSED_INSIDE_COLOR 0xbcecffff
COMBOBOX_PRESSED_TEXT_COLOR 0x5f9aa7ff
COMBOBOX_PRESSED_LIST_BORDER_COLOR 0x78acff
COMBOBOX_PRESSED_LIST_INSIDE_COLOR 0x66e7ffff
COMBOBOX_PRESSED_LIST_TEXT_COLOR 0x78acff
CHECKBOX_DEFAULT_BORDER_COLOR 0x828282ff
CHECKBOX_DEFAULT_INSIDE_COLOR 0xffffffff
CHECKBOX_HOVER_BORDER_COLOR 0xc8c8c8ff
CHECKBOX_HOVER_INSIDE_COLOR 0xffffffff
CHECKBOX_CLICK_BORDER_COLOR 0x66e7ffff
CHECKBOX_CLICK_INSIDE_COLOR 0xddf5ffff
CHECKBOX_STATUS_ACTIVE_COLOR 0xbcecffff
CHECKBOX_INSIDE_WIDTH 0x1
TEXTBOX_BORDER_WIDTH 0x1
TEXTBOX_BORDER_COLOR 0x828282ff
TEXTBOX_INSIDE_COLOR 0xf5f5f5ff
TEXTBOX_TEXT_COLOR 0xff
TEXTBOX_LINE_COLOR 0xff
TEXTBOX_TEXT_FONTSIZE 0xa

View file

@ -0,0 +1,98 @@
GLOBAL_BASE_COLOR 0xff80c1ff
GLOBAL_BORDER_COLOR 0xf5f5f5ff
GLOBAL_TEXT_COLOR 0x650065ff
GLOBAL_TEXT_FONTSIZE 0xa
GLOBAL_BORDER_WIDTH 0x1
BACKGROUND_COLOR 0xffd4eaff
LABEL_BORDER_WIDTH 0x1
LABEL_TEXT_COLOR 0x650065ff
LABEL_TEXT_PADDING 0x14
BUTTON_BORDER_WIDTH 0x2
BUTTON_TEXT_PADDING 0x14
BUTTON_DEFAULT_BORDER_COLOR 0x828282ff
BUTTON_DEFAULT_INSIDE_COLOR 0xffc6e3ff
BUTTON_DEFAULT_TEXT_COLOR 0x650065ff
BUTTON_HOVER_BORDER_COLOR 0xc8c8c8ff
BUTTON_HOVER_INSIDE_COLOR 0xffc6e3ff
BUTTON_HOVER_TEXT_COLOR 0x761c76ff
BUTTON_PRESSED_BORDER_COLOR 0x7bb0d6ff
BUTTON_PRESSED_INSIDE_COLOR 0xffb8dcff
BUTTON_PRESSED_TEXT_COLOR 0xa971a9ff
TOGGLE_TEXT_PADDING 0x14
TOGGLE_BORDER_WIDTH 0x1
TOGGLE_DEFAULT_BORDER_COLOR 0x828282ff
TOGGLE_DEFAULT_INSIDE_COLOR 0xffc6e3ff
TOGGLE_DEFAULT_TEXT_COLOR 0x650065ff
TOGGLE_HOVER_BORDER_COLOR 0xc8c8c8ff
TOGGLE_HOVER_INSIDE_COLOR 0xffc6e3ff
TOGGLE_HOVER_TEXT_COLOR 0x761c76ff
TOGGLE_PRESSED_BORDER_COLOR 0xbdd7eaff
TOGGLE_PRESSED_INSIDE_COLOR 0xffb8dcff
TOGGLE_PRESSED_TEXT_COLOR 0xa971a9ff
TOGGLE_ACTIVE_BORDER_COLOR 0x7bb0d6ff
TOGGLE_ACTIVE_INSIDE_COLOR 0xff8ec7ff
TOGGLE_ACTIVE_TEXT_COLOR 0xa971a9ff
TOGGLEGROUP_PADDING 0x3
SLIDER_BORDER_WIDTH 0x1
SLIDER_BUTTON_BORDER_WIDTH 0x1
SLIDER_BORDER_COLOR 0x828282ff
SLIDER_INSIDE_COLOR 0xffc6e3ff
SLIDER_DEFAULT_COLOR 0xffaad5ff
SLIDER_HOVER_COLOR 0xff9cceff
SLIDER_ACTIVE_COLOR 0xff80c1ff
SLIDERBAR_BORDER_COLOR 0x828282ff
SLIDERBAR_INSIDE_COLOR 0xffc6e3ff
SLIDERBAR_DEFAULT_COLOR 0xffaad5ff
SLIDERBAR_HOVER_COLOR 0xff9cceff
SLIDERBAR_ACTIVE_COLOR 0xff80c1ff
SLIDERBAR_ZERO_LINE_COLOR 0xff8ec7ff
PROGRESSBAR_BORDER_COLOR 0x828282ff
PROGRESSBAR_INSIDE_COLOR 0xffc6e3ff
PROGRESSBAR_PROGRESS_COLOR 0xffaad5ff
PROGRESSBAR_BORDER_WIDTH 0x2
SPINNER_LABEL_BORDER_COLOR 0x828282ff
SPINNER_LABEL_INSIDE_COLOR 0xffc6e3ff
SPINNER_DEFAULT_BUTTON_BORDER_COLOR 0x828282ff
SPINNER_DEFAULT_BUTTON_INSIDE_COLOR 0xffc6e3ff
SPINNER_DEFAULT_SYMBOL_COLOR 0x650065ff
SPINNER_DEFAULT_TEXT_COLOR 0x650065ff
SPINNER_HOVER_BUTTON_BORDER_COLOR 0xc8c8c8ff
SPINNER_HOVER_BUTTON_INSIDE_COLOR 0xffc6e3ff
SPINNER_HOVER_SYMBOL_COLOR 0x761c76ff
SPINNER_HOVER_TEXT_COLOR 0x761c76ff
SPINNER_PRESSED_BUTTON_BORDER_COLOR 0x7bb0d6ff
SPINNER_PRESSED_BUTTON_INSIDE_COLOR 0xffb8dcff
SPINNER_PRESSED_SYMBOL_COLOR 0xa971a9ff
SPINNER_PRESSED_TEXT_COLOR 0xa971a9ff
COMBOBOX_PADDING 0x1
COMBOBOX_BUTTON_WIDTH 0x1e
COMBOBOX_BUTTON_HEIGHT 0x1e
COMBOBOX_BORDER_WIDTH 0x1
COMBOBOX_DEFAULT_BORDER_COLOR 0x828282ff
COMBOBOX_DEFAULT_INSIDE_COLOR 0xffc6e3ff
COMBOBOX_DEFAULT_TEXT_COLOR 0x650065ff
COMBOBOX_DEFAULT_LIST_TEXT_COLOR 0x650065ff
COMBOBOX_HOVER_BORDER_COLOR 0xc8c8c8ff
COMBOBOX_HOVER_INSIDE_COLOR 0xffc6e3ff
COMBOBOX_HOVER_TEXT_COLOR 0x761c76ff
COMBOBOX_HOVER_LIST_TEXT_COLOR 0x761c76ff
COMBOBOX_PRESSED_BORDER_COLOR 0x7bb0d6ff
COMBOBOX_PRESSED_INSIDE_COLOR 0xff8ec7ff
COMBOBOX_PRESSED_TEXT_COLOR 0xba8dbaff
COMBOBOX_PRESSED_LIST_BORDER_COLOR 0x78acff
COMBOBOX_PRESSED_LIST_INSIDE_COLOR 0xff8ec7ff
COMBOBOX_PRESSED_LIST_TEXT_COLOR 0xba8dbaff
CHECKBOX_DEFAULT_BORDER_COLOR 0x828282ff
CHECKBOX_DEFAULT_INSIDE_COLOR 0xffc6e3ff
CHECKBOX_HOVER_BORDER_COLOR 0xc8c8c8ff
CHECKBOX_HOVER_INSIDE_COLOR 0xffffffff
CHECKBOX_CLICK_BORDER_COLOR 0x66e7ffff
CHECKBOX_CLICK_INSIDE_COLOR 0xffaad5ff
CHECKBOX_STATUS_ACTIVE_COLOR 0xff8ec7ff
CHECKBOX_INSIDE_WIDTH 0x4
TEXTBOX_BORDER_WIDTH 0x1
TEXTBOX_BORDER_COLOR 0x828282ff
TEXTBOX_INSIDE_COLOR 0xffc6e3ff
TEXTBOX_TEXT_COLOR 0x650065ff
TEXTBOX_LINE_COLOR 0x985598ff
TEXTBOX_TEXT_FONTSIZE 0xa

View file

@ -0,0 +1,98 @@
GLOBAL_BASE_COLOR 0x262921ff
GLOBAL_BORDER_COLOR 0x102ff
GLOBAL_TEXT_COLOR 0xf8f8f1ff
GLOBAL_TEXT_FONTSIZE 0xa
GLOBAL_BORDER_WIDTH 0x1
BACKGROUND_COLOR 0xb6b7b5ff
LABEL_BORDER_WIDTH 0x1
LABEL_TEXT_COLOR 0xf8f8f1ff
LABEL_TEXT_PADDING 0x14
BUTTON_BORDER_WIDTH 0x2
BUTTON_TEXT_PADDING 0x14
BUTTON_DEFAULT_BORDER_COLOR 0x38393aff
BUTTON_DEFAULT_INSIDE_COLOR 0x9e9f9cff
BUTTON_DEFAULT_TEXT_COLOR 0xf8f8f1ff
BUTTON_HOVER_BORDER_COLOR 0x1c1d1eff
BUTTON_HOVER_INSIDE_COLOR 0x9e9f9cff
BUTTON_HOVER_TEXT_COLOR 0xf8f8f2ff
BUTTON_PRESSED_BORDER_COLOR 0x102ff
BUTTON_PRESSED_INSIDE_COLOR 0x868883ff
BUTTON_PRESSED_TEXT_COLOR 0xfbfbf7ff
TOGGLE_TEXT_PADDING 0x14
TOGGLE_BORDER_WIDTH 0x1
TOGGLE_DEFAULT_BORDER_COLOR 0x38393aff
TOGGLE_DEFAULT_INSIDE_COLOR 0x9e9f9cff
TOGGLE_DEFAULT_TEXT_COLOR 0xf8f8f1ff
TOGGLE_HOVER_BORDER_COLOR 0x1c1d1eff
TOGGLE_HOVER_INSIDE_COLOR 0x9e9f9cff
TOGGLE_HOVER_TEXT_COLOR 0xf8f8f2ff
TOGGLE_PRESSED_BORDER_COLOR 0x102ff
TOGGLE_PRESSED_INSIDE_COLOR 0x868883ff
TOGGLE_PRESSED_TEXT_COLOR 0xfbfbf7ff
TOGGLE_ACTIVE_BORDER_COLOR 0x102ff
TOGGLE_ACTIVE_INSIDE_COLOR 0x3e4039ff
TOGGLE_ACTIVE_TEXT_COLOR 0xfbfbf7ff
TOGGLEGROUP_PADDING 0x3
SLIDER_BORDER_WIDTH 0x1
SLIDER_BUTTON_BORDER_WIDTH 0x1
SLIDER_BORDER_COLOR 0x38393aff
SLIDER_INSIDE_COLOR 0x9e9f9cff
SLIDER_DEFAULT_COLOR 0x6e706bff
SLIDER_HOVER_COLOR 0x565852ff
SLIDER_ACTIVE_COLOR 0x262921ff
SLIDERBAR_BORDER_COLOR 0x38393aff
SLIDERBAR_INSIDE_COLOR 0x9e9f9cff
SLIDERBAR_DEFAULT_COLOR 0x6e706bff
SLIDERBAR_HOVER_COLOR 0x565852ff
SLIDERBAR_ACTIVE_COLOR 0x262921ff
SLIDERBAR_ZERO_LINE_COLOR 0x3e4039ff
PROGRESSBAR_BORDER_COLOR 0x38393aff
PROGRESSBAR_INSIDE_COLOR 0x9e9f9cff
PROGRESSBAR_PROGRESS_COLOR 0x6e706bff
PROGRESSBAR_BORDER_WIDTH 0x2
SPINNER_LABEL_BORDER_COLOR 0x38393aff
SPINNER_LABEL_INSIDE_COLOR 0x9e9f9cff
SPINNER_DEFAULT_BUTTON_BORDER_COLOR 0x38393aff
SPINNER_DEFAULT_BUTTON_INSIDE_COLOR 0x9e9f9cff
SPINNER_DEFAULT_SYMBOL_COLOR 0xf8f8f1ff
SPINNER_DEFAULT_TEXT_COLOR 0xf8f8f1ff
SPINNER_HOVER_BUTTON_BORDER_COLOR 0x1c1d1eff
SPINNER_HOVER_BUTTON_INSIDE_COLOR 0x9e9f9cff
SPINNER_HOVER_SYMBOL_COLOR 0xf8f8f2ff
SPINNER_HOVER_TEXT_COLOR 0xf8f8f2ff
SPINNER_PRESSED_BUTTON_BORDER_COLOR 0x102ff
SPINNER_PRESSED_BUTTON_INSIDE_COLOR 0x868883ff
SPINNER_PRESSED_SYMBOL_COLOR 0xfbfbf7ff
SPINNER_PRESSED_TEXT_COLOR 0xfbfbf7ff
COMBOBOX_PADDING 0x1
COMBOBOX_BUTTON_WIDTH 0x1e
COMBOBOX_BUTTON_HEIGHT 0x1e
COMBOBOX_BORDER_WIDTH 0x1
COMBOBOX_DEFAULT_BORDER_COLOR 0x38393aff
COMBOBOX_DEFAULT_INSIDE_COLOR 0x9e9f9cff
COMBOBOX_DEFAULT_TEXT_COLOR 0xf8f8f1ff
COMBOBOX_DEFAULT_LIST_TEXT_COLOR 0xf8f8f1ff
COMBOBOX_HOVER_BORDER_COLOR 0x1c1d1eff
COMBOBOX_HOVER_INSIDE_COLOR 0x9e9f9cff
COMBOBOX_HOVER_TEXT_COLOR 0xf8f8f2ff
COMBOBOX_HOVER_LIST_TEXT_COLOR 0xf8f8f2ff
COMBOBOX_PRESSED_BORDER_COLOR 0x102ff
COMBOBOX_PRESSED_INSIDE_COLOR 0x3e4039ff
COMBOBOX_PRESSED_TEXT_COLOR 0xfbfbf8ff
COMBOBOX_PRESSED_LIST_BORDER_COLOR 0x102ff
COMBOBOX_PRESSED_LIST_INSIDE_COLOR 0x3e4039ff
COMBOBOX_PRESSED_LIST_TEXT_COLOR 0xfbfbf8ff
CHECKBOX_DEFAULT_BORDER_COLOR 0x38393aff
CHECKBOX_DEFAULT_INSIDE_COLOR 0x9e9f9cff
CHECKBOX_HOVER_BORDER_COLOR 0x1c1d1eff
CHECKBOX_HOVER_INSIDE_COLOR 0xffffffff
CHECKBOX_CLICK_BORDER_COLOR 0x102ff
CHECKBOX_CLICK_INSIDE_COLOR 0x6e706bff
CHECKBOX_STATUS_ACTIVE_COLOR 0x3e4039ff
CHECKBOX_INSIDE_WIDTH 0x4
TEXTBOX_BORDER_WIDTH 0x1
TEXTBOX_BORDER_COLOR 0x38393aff
TEXTBOX_INSIDE_COLOR 0x9e9f9cff
TEXTBOX_TEXT_COLOR 0xf8f8f1ff
TEXTBOX_LINE_COLOR 0xfafaf5ff
TEXTBOX_TEXT_FONTSIZE 0xa

View file

@ -0,0 +1,98 @@
GLOBAL_BASE_COLOR 0x293034ff
GLOBAL_BORDER_COLOR 0x102ff
GLOBAL_TEXT_COLOR 0xa8e2aeff
GLOBAL_TEXT_FONTSIZE 0xa
GLOBAL_BORDER_WIDTH 0x1
BACKGROUND_COLOR 0xb7babbff
LABEL_BORDER_WIDTH 0x1
LABEL_TEXT_COLOR 0xa8e2aeff
LABEL_TEXT_PADDING 0x14
BUTTON_BORDER_WIDTH 0x2
BUTTON_TEXT_PADDING 0x14
BUTTON_DEFAULT_BORDER_COLOR 0x38393aff
BUTTON_DEFAULT_INSIDE_COLOR 0x9fa3a4ff
BUTTON_DEFAULT_TEXT_COLOR 0xa8e2aeff
BUTTON_HOVER_BORDER_COLOR 0x1c1d1eff
BUTTON_HOVER_INSIDE_COLOR 0x9fa3a4ff
BUTTON_HOVER_TEXT_COLOR 0xb1e5b7ff
BUTTON_PRESSED_BORDER_COLOR 0x102ff
BUTTON_PRESSED_INSIDE_COLOR 0x888c8eff
BUTTON_PRESSED_TEXT_COLOR 0xceeed2ff
TOGGLE_TEXT_PADDING 0x14
TOGGLE_BORDER_WIDTH 0x1
TOGGLE_DEFAULT_BORDER_COLOR 0x38393aff
TOGGLE_DEFAULT_INSIDE_COLOR 0x9fa3a4ff
TOGGLE_DEFAULT_TEXT_COLOR 0xa8e2aeff
TOGGLE_HOVER_BORDER_COLOR 0x1c1d1eff
TOGGLE_HOVER_INSIDE_COLOR 0x9fa3a4ff
TOGGLE_HOVER_TEXT_COLOR 0xb1e5b7ff
TOGGLE_PRESSED_BORDER_COLOR 0x102ff
TOGGLE_PRESSED_INSIDE_COLOR 0x888c8eff
TOGGLE_PRESSED_TEXT_COLOR 0xceeed2ff
TOGGLE_ACTIVE_BORDER_COLOR 0x102ff
TOGGLE_ACTIVE_INSIDE_COLOR 0x40474aff
TOGGLE_ACTIVE_TEXT_COLOR 0xceeed2ff
TOGGLEGROUP_PADDING 0x3
SLIDER_BORDER_WIDTH 0x1
SLIDER_BUTTON_BORDER_WIDTH 0x1
SLIDER_BORDER_COLOR 0x38393aff
SLIDER_INSIDE_COLOR 0x9fa3a4ff
SLIDER_DEFAULT_COLOR 0x707577ff
SLIDER_HOVER_COLOR 0x585e61ff
SLIDER_ACTIVE_COLOR 0x293034ff
SLIDERBAR_BORDER_COLOR 0x38393aff
SLIDERBAR_INSIDE_COLOR 0x9fa3a4ff
SLIDERBAR_DEFAULT_COLOR 0x707577ff
SLIDERBAR_HOVER_COLOR 0x585e61ff
SLIDERBAR_ACTIVE_COLOR 0x293034ff
SLIDERBAR_ZERO_LINE_COLOR 0x40474aff
PROGRESSBAR_BORDER_COLOR 0x38393aff
PROGRESSBAR_INSIDE_COLOR 0x9fa3a4ff
PROGRESSBAR_PROGRESS_COLOR 0x707577ff
PROGRESSBAR_BORDER_WIDTH 0x2
SPINNER_LABEL_BORDER_COLOR 0x38393aff
SPINNER_LABEL_INSIDE_COLOR 0x9fa3a4ff
SPINNER_DEFAULT_BUTTON_BORDER_COLOR 0x38393aff
SPINNER_DEFAULT_BUTTON_INSIDE_COLOR 0x9fa3a4ff
SPINNER_DEFAULT_SYMBOL_COLOR 0xa8e2aeff
SPINNER_DEFAULT_TEXT_COLOR 0xa8e2aeff
SPINNER_HOVER_BUTTON_BORDER_COLOR 0x1c1d1eff
SPINNER_HOVER_BUTTON_INSIDE_COLOR 0x9fa3a4ff
SPINNER_HOVER_SYMBOL_COLOR 0xb1e5b7ff
SPINNER_HOVER_TEXT_COLOR 0xb1e5b7ff
SPINNER_PRESSED_BUTTON_BORDER_COLOR 0x102ff
SPINNER_PRESSED_BUTTON_INSIDE_COLOR 0x888c8eff
SPINNER_PRESSED_SYMBOL_COLOR 0xceeed2ff
SPINNER_PRESSED_TEXT_COLOR 0xceeed2ff
COMBOBOX_PADDING 0x1
COMBOBOX_BUTTON_WIDTH 0x1e
COMBOBOX_BUTTON_HEIGHT 0x1e
COMBOBOX_BORDER_WIDTH 0x1
COMBOBOX_DEFAULT_BORDER_COLOR 0x38393aff
COMBOBOX_DEFAULT_INSIDE_COLOR 0x9fa3a4ff
COMBOBOX_DEFAULT_TEXT_COLOR 0xa8e2aeff
COMBOBOX_DEFAULT_LIST_TEXT_COLOR 0xa8e2aeff
COMBOBOX_HOVER_BORDER_COLOR 0x1c1d1eff
COMBOBOX_HOVER_INSIDE_COLOR 0x9fa3a4ff
COMBOBOX_HOVER_TEXT_COLOR 0xb1e5b7ff
COMBOBOX_HOVER_LIST_TEXT_COLOR 0xb1e5b7ff
COMBOBOX_PRESSED_BORDER_COLOR 0x102ff
COMBOBOX_PRESSED_INSIDE_COLOR 0x40474aff
COMBOBOX_PRESSED_TEXT_COLOR 0xd8f2dbff
COMBOBOX_PRESSED_LIST_BORDER_COLOR 0x102ff
COMBOBOX_PRESSED_LIST_INSIDE_COLOR 0x40474aff
COMBOBOX_PRESSED_LIST_TEXT_COLOR 0xd8f2dbff
CHECKBOX_DEFAULT_BORDER_COLOR 0x38393aff
CHECKBOX_DEFAULT_INSIDE_COLOR 0x9fa3a4ff
CHECKBOX_HOVER_BORDER_COLOR 0x1c1d1eff
CHECKBOX_HOVER_INSIDE_COLOR 0xffffffff
CHECKBOX_CLICK_BORDER_COLOR 0x102ff
CHECKBOX_CLICK_INSIDE_COLOR 0x707577ff
CHECKBOX_STATUS_ACTIVE_COLOR 0x40474aff
CHECKBOX_INSIDE_WIDTH 0x4
TEXTBOX_BORDER_WIDTH 0x1
TEXTBOX_BORDER_COLOR 0x38393aff
TEXTBOX_INSIDE_COLOR 0x9fa3a4ff
TEXTBOX_TEXT_COLOR 0xa8e2aeff
TEXTBOX_LINE_COLOR 0xc5ebc9ff
TEXTBOX_TEXT_FONTSIZE 0xa

View file

@ -0,0 +1,98 @@
GLOBAL_BASE_COLOR 0x2b36ff
GLOBAL_BORDER_COLOR 0x102ff
GLOBAL_TEXT_COLOR 0xf8f8f1ff
GLOBAL_TEXT_FONTSIZE 0xa
GLOBAL_BORDER_WIDTH 0x1
BACKGROUND_COLOR 0xaab8bcff
LABEL_BORDER_WIDTH 0x1
LABEL_TEXT_COLOR 0xf8f8f1ff
LABEL_TEXT_PADDING 0x14
BUTTON_BORDER_WIDTH 0x2
BUTTON_TEXT_PADDING 0x14
BUTTON_DEFAULT_BORDER_COLOR 0x38393aff
BUTTON_DEFAULT_INSIDE_COLOR 0x8da0a5ff
BUTTON_DEFAULT_TEXT_COLOR 0xf8f8f1ff
BUTTON_HOVER_BORDER_COLOR 0x1c1d1eff
BUTTON_HOVER_INSIDE_COLOR 0x8da0a5ff
BUTTON_HOVER_TEXT_COLOR 0xf8f8f2ff
BUTTON_PRESSED_BORDER_COLOR 0x102ff
BUTTON_PRESSED_INSIDE_COLOR 0x71898fff
BUTTON_PRESSED_TEXT_COLOR 0xfbfbf7ff
TOGGLE_TEXT_PADDING 0x14
TOGGLE_BORDER_WIDTH 0x1
TOGGLE_DEFAULT_BORDER_COLOR 0x38393aff
TOGGLE_DEFAULT_INSIDE_COLOR 0x8da0a5ff
TOGGLE_DEFAULT_TEXT_COLOR 0xf8f8f1ff
TOGGLE_HOVER_BORDER_COLOR 0x1c1d1eff
TOGGLE_HOVER_INSIDE_COLOR 0x8da0a5ff
TOGGLE_HOVER_TEXT_COLOR 0xf8f8f2ff
TOGGLE_PRESSED_BORDER_COLOR 0x102ff
TOGGLE_PRESSED_INSIDE_COLOR 0x71898fff
TOGGLE_PRESSED_TEXT_COLOR 0xfbfbf7ff
TOGGLE_ACTIVE_BORDER_COLOR 0x102ff
TOGGLE_ACTIVE_INSIDE_COLOR 0x1c424cff
TOGGLE_ACTIVE_TEXT_COLOR 0xfbfbf7ff
TOGGLEGROUP_PADDING 0x3
SLIDER_BORDER_WIDTH 0x1
SLIDER_BUTTON_BORDER_WIDTH 0x1
SLIDER_BORDER_COLOR 0x38393aff
SLIDER_INSIDE_COLOR 0x8da0a5ff
SLIDER_DEFAULT_COLOR 0x557179ff
SLIDER_HOVER_COLOR 0x385a62ff
SLIDER_ACTIVE_COLOR 0x2b36ff
SLIDERBAR_BORDER_COLOR 0x38393aff
SLIDERBAR_INSIDE_COLOR 0x8da0a5ff
SLIDERBAR_DEFAULT_COLOR 0x557179ff
SLIDERBAR_HOVER_COLOR 0x385a62ff
SLIDERBAR_ACTIVE_COLOR 0x2b36ff
SLIDERBAR_ZERO_LINE_COLOR 0x1c424cff
PROGRESSBAR_BORDER_COLOR 0x38393aff
PROGRESSBAR_INSIDE_COLOR 0x8da0a5ff
PROGRESSBAR_PROGRESS_COLOR 0x557179ff
PROGRESSBAR_BORDER_WIDTH 0x2
SPINNER_LABEL_BORDER_COLOR 0x38393aff
SPINNER_LABEL_INSIDE_COLOR 0x8da0a5ff
SPINNER_DEFAULT_BUTTON_BORDER_COLOR 0x38393aff
SPINNER_DEFAULT_BUTTON_INSIDE_COLOR 0x8da0a5ff
SPINNER_DEFAULT_SYMBOL_COLOR 0xf8f8f1ff
SPINNER_DEFAULT_TEXT_COLOR 0xf8f8f1ff
SPINNER_HOVER_BUTTON_BORDER_COLOR 0x1c1d1eff
SPINNER_HOVER_BUTTON_INSIDE_COLOR 0x8da0a5ff
SPINNER_HOVER_SYMBOL_COLOR 0xf8f8f2ff
SPINNER_HOVER_TEXT_COLOR 0xf8f8f2ff
SPINNER_PRESSED_BUTTON_BORDER_COLOR 0x102ff
SPINNER_PRESSED_BUTTON_INSIDE_COLOR 0x71898fff
SPINNER_PRESSED_SYMBOL_COLOR 0xfbfbf7ff
SPINNER_PRESSED_TEXT_COLOR 0xfbfbf7ff
COMBOBOX_PADDING 0x1
COMBOBOX_BUTTON_WIDTH 0x1e
COMBOBOX_BUTTON_HEIGHT 0x1e
COMBOBOX_BORDER_WIDTH 0x1
COMBOBOX_DEFAULT_BORDER_COLOR 0x38393aff
COMBOBOX_DEFAULT_INSIDE_COLOR 0x8da0a5ff
COMBOBOX_DEFAULT_TEXT_COLOR 0xf8f8f1ff
COMBOBOX_DEFAULT_LIST_TEXT_COLOR 0xf8f8f1ff
COMBOBOX_HOVER_BORDER_COLOR 0x1c1d1eff
COMBOBOX_HOVER_INSIDE_COLOR 0x8da0a5ff
COMBOBOX_HOVER_TEXT_COLOR 0xf8f8f2ff
COMBOBOX_HOVER_LIST_TEXT_COLOR 0xf8f8f2ff
COMBOBOX_PRESSED_BORDER_COLOR 0x102ff
COMBOBOX_PRESSED_INSIDE_COLOR 0x1c424cff
COMBOBOX_PRESSED_TEXT_COLOR 0xfbfbf8ff
COMBOBOX_PRESSED_LIST_BORDER_COLOR 0x102ff
COMBOBOX_PRESSED_LIST_INSIDE_COLOR 0x1c424cff
COMBOBOX_PRESSED_LIST_TEXT_COLOR 0xfbfbf8ff
CHECKBOX_DEFAULT_BORDER_COLOR 0x38393aff
CHECKBOX_DEFAULT_INSIDE_COLOR 0x8da0a5ff
CHECKBOX_HOVER_BORDER_COLOR 0x1c1d1eff
CHECKBOX_HOVER_INSIDE_COLOR 0xffffffff
CHECKBOX_CLICK_BORDER_COLOR 0x102ff
CHECKBOX_CLICK_INSIDE_COLOR 0x557179ff
CHECKBOX_STATUS_ACTIVE_COLOR 0x1c424cff
CHECKBOX_INSIDE_WIDTH 0x4
TEXTBOX_BORDER_WIDTH 0x1
TEXTBOX_BORDER_COLOR 0x38393aff
TEXTBOX_INSIDE_COLOR 0x8da0a5ff
TEXTBOX_TEXT_COLOR 0xf8f8f1ff
TEXTBOX_LINE_COLOR 0xfafaf5ff
TEXTBOX_TEXT_FONTSIZE 0xa

View file

@ -0,0 +1,98 @@
GLOBAL_BASE_COLOR 0xfcf6e3ff
GLOBAL_BORDER_COLOR 0x102ff
GLOBAL_TEXT_COLOR 0x657b82ff
GLOBAL_TEXT_FONTSIZE 0xa
GLOBAL_BORDER_WIDTH 0x1
BACKGROUND_COLOR 0xfefcf5ff
LABEL_BORDER_WIDTH 0x1
LABEL_TEXT_COLOR 0x657b82ff
LABEL_TEXT_PADDING 0x14
BUTTON_BORDER_WIDTH 0x2
BUTTON_TEXT_PADDING 0x14
BUTTON_DEFAULT_BORDER_COLOR 0x38393aff
BUTTON_DEFAULT_INSIDE_COLOR 0xfdfbf2ff
BUTTON_DEFAULT_TEXT_COLOR 0x657b82ff
BUTTON_HOVER_BORDER_COLOR 0x1c1d1eff
BUTTON_HOVER_INSIDE_COLOR 0xfdfbf2ff
BUTTON_HOVER_TEXT_COLOR 0x76898fff
BUTTON_PRESSED_BORDER_COLOR 0x102ff
BUTTON_PRESSED_INSIDE_COLOR 0xfdfaefff
BUTTON_PRESSED_TEXT_COLOR 0xa9b5b9ff
TOGGLE_TEXT_PADDING 0x14
TOGGLE_BORDER_WIDTH 0x1
TOGGLE_DEFAULT_BORDER_COLOR 0x38393aff
TOGGLE_DEFAULT_INSIDE_COLOR 0xfdfbf2ff
TOGGLE_DEFAULT_TEXT_COLOR 0x657b82ff
TOGGLE_HOVER_BORDER_COLOR 0x1c1d1eff
TOGGLE_HOVER_INSIDE_COLOR 0xfdfbf2ff
TOGGLE_HOVER_TEXT_COLOR 0x76898fff
TOGGLE_PRESSED_BORDER_COLOR 0x102ff
TOGGLE_PRESSED_INSIDE_COLOR 0xfdfaefff
TOGGLE_PRESSED_TEXT_COLOR 0xa9b5b9ff
TOGGLE_ACTIVE_BORDER_COLOR 0x102ff
TOGGLE_ACTIVE_INSIDE_COLOR 0xfcf7e6ff
TOGGLE_ACTIVE_TEXT_COLOR 0xa9b5b9ff
TOGGLEGROUP_PADDING 0x3
SLIDER_BORDER_WIDTH 0x1
SLIDER_BUTTON_BORDER_WIDTH 0x1
SLIDER_BORDER_COLOR 0x38393aff
SLIDER_INSIDE_COLOR 0xfdfbf2ff
SLIDER_DEFAULT_COLOR 0xfdf9ecff
SLIDER_HOVER_COLOR 0xfcf8e9ff
SLIDER_ACTIVE_COLOR 0xfcf6e3ff
SLIDERBAR_BORDER_COLOR 0x38393aff
SLIDERBAR_INSIDE_COLOR 0xfdfbf2ff
SLIDERBAR_DEFAULT_COLOR 0xfdf9ecff
SLIDERBAR_HOVER_COLOR 0xfcf8e9ff
SLIDERBAR_ACTIVE_COLOR 0xfcf6e3ff
SLIDERBAR_ZERO_LINE_COLOR 0xfcf7e6ff
PROGRESSBAR_BORDER_COLOR 0x38393aff
PROGRESSBAR_INSIDE_COLOR 0xfdfbf2ff
PROGRESSBAR_PROGRESS_COLOR 0xfdf9ecff
PROGRESSBAR_BORDER_WIDTH 0x2
SPINNER_LABEL_BORDER_COLOR 0x38393aff
SPINNER_LABEL_INSIDE_COLOR 0xfdfbf2ff
SPINNER_DEFAULT_BUTTON_BORDER_COLOR 0x38393aff
SPINNER_DEFAULT_BUTTON_INSIDE_COLOR 0xfdfbf2ff
SPINNER_DEFAULT_SYMBOL_COLOR 0x657b82ff
SPINNER_DEFAULT_TEXT_COLOR 0x657b82ff
SPINNER_HOVER_BUTTON_BORDER_COLOR 0x1c1d1eff
SPINNER_HOVER_BUTTON_INSIDE_COLOR 0xfdfbf2ff
SPINNER_HOVER_SYMBOL_COLOR 0x76898fff
SPINNER_HOVER_TEXT_COLOR 0x76898fff
SPINNER_PRESSED_BUTTON_BORDER_COLOR 0x102ff
SPINNER_PRESSED_BUTTON_INSIDE_COLOR 0xfdfaefff
SPINNER_PRESSED_SYMBOL_COLOR 0xa9b5b9ff
SPINNER_PRESSED_TEXT_COLOR 0xa9b5b9ff
COMBOBOX_PADDING 0x1
COMBOBOX_BUTTON_WIDTH 0x1e
COMBOBOX_BUTTON_HEIGHT 0x1e
COMBOBOX_BORDER_WIDTH 0x1
COMBOBOX_DEFAULT_BORDER_COLOR 0x38393aff
COMBOBOX_DEFAULT_INSIDE_COLOR 0xfdfbf2ff
COMBOBOX_DEFAULT_TEXT_COLOR 0x657b82ff
COMBOBOX_DEFAULT_LIST_TEXT_COLOR 0x657b82ff
COMBOBOX_HOVER_BORDER_COLOR 0x1c1d1eff
COMBOBOX_HOVER_INSIDE_COLOR 0xfdfbf2ff
COMBOBOX_HOVER_TEXT_COLOR 0x76898fff
COMBOBOX_HOVER_LIST_TEXT_COLOR 0x76898fff
COMBOBOX_PRESSED_BORDER_COLOR 0x102ff
COMBOBOX_PRESSED_INSIDE_COLOR 0xfcf7e6ff
COMBOBOX_PRESSED_TEXT_COLOR 0xbac4c7ff
COMBOBOX_PRESSED_LIST_BORDER_COLOR 0x102ff
COMBOBOX_PRESSED_LIST_INSIDE_COLOR 0xfcf7e6ff
COMBOBOX_PRESSED_LIST_TEXT_COLOR 0xbac4c7ff
CHECKBOX_DEFAULT_BORDER_COLOR 0x38393aff
CHECKBOX_DEFAULT_INSIDE_COLOR 0xfdfbf2ff
CHECKBOX_HOVER_BORDER_COLOR 0x1c1d1eff
CHECKBOX_HOVER_INSIDE_COLOR 0xffffffff
CHECKBOX_CLICK_BORDER_COLOR 0x102ff
CHECKBOX_CLICK_INSIDE_COLOR 0xfdf9ecff
CHECKBOX_STATUS_ACTIVE_COLOR 0xfcf7e6ff
CHECKBOX_INSIDE_WIDTH 0x4
TEXTBOX_BORDER_WIDTH 0x1
TEXTBOX_BORDER_COLOR 0x38393aff
TEXTBOX_INSIDE_COLOR 0xfdfbf2ff
TEXTBOX_TEXT_COLOR 0x657b82ff
TEXTBOX_LINE_COLOR 0x98a7abff
TEXTBOX_TEXT_FONTSIZE 0xa

View file

@ -0,0 +1,98 @@
GLOBAL_BASE_COLOR 0xf5f5f5ff
GLOBAL_BORDER_COLOR 0xf5f5f5ff
GLOBAL_TEXT_COLOR 0xf5f5f5ff
GLOBAL_TEXT_FONTSIZE 0xa
GLOBAL_BORDER_WIDTH 0x1
BACKGROUND_COLOR 0x2d2d2dff
LABEL_BORDER_WIDTH 0x2
LABEL_TEXT_COLOR 0xafafafff
LABEL_TEXT_PADDING 0x14
BUTTON_BORDER_WIDTH 0x1
BUTTON_TEXT_PADDING 0x14
BUTTON_DEFAULT_BORDER_COLOR 0x414141ff
BUTTON_DEFAULT_INSIDE_COLOR 0x323232ff
BUTTON_DEFAULT_TEXT_COLOR 0xafafafff
BUTTON_HOVER_BORDER_COLOR 0x3e3e3eff
BUTTON_HOVER_INSIDE_COLOR 0x2d2d2dff
BUTTON_HOVER_TEXT_COLOR 0x767472ff
BUTTON_PRESSED_BORDER_COLOR 0x414141ff
BUTTON_PRESSED_INSIDE_COLOR 0x323232ff
BUTTON_PRESSED_TEXT_COLOR 0x616161ff
TOGGLE_TEXT_PADDING 0x14
TOGGLE_BORDER_WIDTH 0x1
TOGGLE_DEFAULT_BORDER_COLOR 0x414141ff
TOGGLE_DEFAULT_INSIDE_COLOR 0x323232ff
TOGGLE_DEFAULT_TEXT_COLOR 0xafafafff
TOGGLE_HOVER_BORDER_COLOR 0x3e3e3eff
TOGGLE_HOVER_INSIDE_COLOR 0x2d2d2dff
TOGGLE_HOVER_TEXT_COLOR 0x767472ff
TOGGLE_PRESSED_BORDER_COLOR 0x414141ff
TOGGLE_PRESSED_INSIDE_COLOR 0x323232ff
TOGGLE_PRESSED_TEXT_COLOR 0x616161ff
TOGGLE_ACTIVE_BORDER_COLOR 0xafafafff
TOGGLE_ACTIVE_INSIDE_COLOR 0x414141ff
TOGGLE_ACTIVE_TEXT_COLOR 0xa3a3a3ff
TOGGLEGROUP_PADDING 0x3
SLIDER_BORDER_WIDTH 0x0
SLIDER_BUTTON_BORDER_WIDTH 0x0
SLIDER_BORDER_COLOR 0x414141ff
SLIDER_INSIDE_COLOR 0x232525ff
SLIDER_DEFAULT_COLOR 0x646464ff
SLIDER_HOVER_COLOR 0x767472ff
SLIDER_ACTIVE_COLOR 0x929291ff
SLIDERBAR_BORDER_COLOR 0x828282ff
SLIDERBAR_INSIDE_COLOR 0x262626ff
SLIDERBAR_DEFAULT_COLOR 0x616161ff
SLIDERBAR_HOVER_COLOR 0x646464ff
SLIDERBAR_ACTIVE_COLOR 0x929292ff
SLIDERBAR_ZERO_LINE_COLOR 0xafafafff
PROGRESSBAR_BORDER_COLOR 0x828282ff
PROGRESSBAR_INSIDE_COLOR 0x262626ff
PROGRESSBAR_PROGRESS_COLOR 0x646464ff
PROGRESSBAR_BORDER_WIDTH 0x0
SPINNER_LABEL_BORDER_COLOR 0x414141ff
SPINNER_LABEL_INSIDE_COLOR 0x323232ff
SPINNER_DEFAULT_BUTTON_BORDER_COLOR 0x414141ff
SPINNER_DEFAULT_BUTTON_INSIDE_COLOR 0x323232ff
SPINNER_DEFAULT_SYMBOL_COLOR 0xafafafff
SPINNER_DEFAULT_TEXT_COLOR 0xafafafff
SPINNER_HOVER_BUTTON_BORDER_COLOR 0x3e3e3eff
SPINNER_HOVER_BUTTON_INSIDE_COLOR 0x2d2d2dff
SPINNER_HOVER_SYMBOL_COLOR 0x767472ff
SPINNER_HOVER_TEXT_COLOR 0x767472ff
SPINNER_PRESSED_BUTTON_BORDER_COLOR 0x414141ff
SPINNER_PRESSED_BUTTON_INSIDE_COLOR 0x323232ff
SPINNER_PRESSED_SYMBOL_COLOR 0x646464ff
SPINNER_PRESSED_TEXT_COLOR 0x646464ff
COMBOBOX_PADDING 0x1
COMBOBOX_BUTTON_WIDTH 0x1e
COMBOBOX_BUTTON_HEIGHT 0x1e
COMBOBOX_BORDER_WIDTH 0x1
COMBOBOX_DEFAULT_BORDER_COLOR 0x414141ff
COMBOBOX_DEFAULT_INSIDE_COLOR 0x323232ff
COMBOBOX_DEFAULT_TEXT_COLOR 0xafafafff
COMBOBOX_DEFAULT_LIST_TEXT_COLOR 0xafafafff
COMBOBOX_HOVER_BORDER_COLOR 0x3e3e3eff
COMBOBOX_HOVER_INSIDE_COLOR 0x2d2d2dff
COMBOBOX_HOVER_TEXT_COLOR 0x767472ff
COMBOBOX_HOVER_LIST_TEXT_COLOR 0x767472ff
COMBOBOX_PRESSED_BORDER_COLOR 0x414141ff
COMBOBOX_PRESSED_INSIDE_COLOR 0x323232ff
COMBOBOX_PRESSED_TEXT_COLOR 0x646464ff
COMBOBOX_PRESSED_LIST_BORDER_COLOR 0x414141ff
COMBOBOX_PRESSED_LIST_INSIDE_COLOR 0x323232ff
COMBOBOX_PRESSED_LIST_TEXT_COLOR 0x646464ff
CHECKBOX_DEFAULT_BORDER_COLOR 0x414141ff
CHECKBOX_DEFAULT_INSIDE_COLOR 0x323232ff
CHECKBOX_HOVER_BORDER_COLOR 0x3e3e3eff
CHECKBOX_HOVER_INSIDE_COLOR 0x2d2d2dff
CHECKBOX_CLICK_BORDER_COLOR 0x414141ff
CHECKBOX_CLICK_INSIDE_COLOR 0x323232ff
CHECKBOX_STATUS_ACTIVE_COLOR 0x414141ff
CHECKBOX_INSIDE_WIDTH 0x2
TEXTBOX_BORDER_WIDTH 0x1
TEXTBOX_BORDER_COLOR 0x414141ff
TEXTBOX_INSIDE_COLOR 0x323232ff
TEXTBOX_TEXT_COLOR 0xafafafff
TEXTBOX_LINE_COLOR 0xafafafff
TEXTBOX_TEXT_FONTSIZE 0x9

View file

@ -1,31 +0,0 @@
package main
import (
"fmt"
gui "git.terah.dev/UnrealXR/raylib-go/raygui"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
func main() {
rl.InitWindow(800, 450, "raygui - button")
rl.SetTargetFPS(60)
var button bool
for !rl.WindowShouldClose() {
rl.BeginDrawing()
rl.ClearBackground(rl.Black)
button = gui.Button(rl.NewRectangle(50, 150, 100, 40), "Click")
if button {
fmt.Println("Clicked on button")
}
rl.EndDrawing()
}
rl.CloseWindow()
}

View file

@ -1,281 +0,0 @@
package main
import (
"fmt"
gui "git.terah.dev/UnrealXR/raylib-go/raygui"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
/*******************************************************************************************
*
* raygui - controls test suite
*
* TEST CONTROLS:
* - gui.DropdownBox()
* - gui.CheckBox()
* - gui.Spinner()
* - gui.ValueBox()
* - gui.TextBox()
* - gui.Button()
* - gui.ComboBox()
* - gui.ListView()
* - gui.ToggleGroup()
* - gui.ColorPicker()
* - gui.Slider()
* - gui.SliderBar()
* - gui.ProgressBar()
* - gui.ColorBarAlpha()
* - gui.ScrollPanel()
*
*
* DEPENDENCIES:
* raylib 4.0 - Windowing/input management and drawing.
* raygui 3.2 - Immediate-mode GUI controls.
*
* COMPILATION (Windows - MinGW):
* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
*
* LICENSE: zlib/libpng
*
* Copyright (c) 2016-2022 Ramon Santamaria (@raysan5)
*
**********************************************************************************************/
//#define RAYGUI_CUSTOM_ICONS // It requires providing gui_icons.h in the same directory
//#include "gui_icons.h" // External icons data provided, it can be generated with rGuiIcons tool
// ------------------------------------------------------------------------------------
// Program main entry point
// ------------------------------------------------------------------------------------
func main() {
// Initialization
//---------------------------------------------------------------------------------------
const (
screenWidth = 690
screenHeight = 560
)
rl.InitWindow(screenWidth, screenHeight, "raygui - controls test suite")
rl.SetExitKey(0)
// GUI controls initialization
//----------------------------------------------------------------------------------
var (
dropdownBox000Active int32 = 0
dropDown000EditMode bool = false
dropdownBox001Active int32 = 0
dropDown001EditMode bool = false
spinner001Value int32 = 0
spinnerEditMode bool = false
valueBox002Value int32 = 0
valueBoxEditMode bool = false
textBoxText = "Text box"
textBoxEditMode bool = false
listViewScrollIndex int32 = 0
listViewActive int32 = -1
listViewExScrollIndex int32 = 0
listViewExActive int32 = 2
listViewExFocus int32 = -1
listViewExList = []string{"This", "is", "a", "list view", "with", "disable", "elements", "amazing!"}
colorPickerValue = rl.Red
sliderValue float32 = 50
sliderBarValue float32 = 60
progressValue float32 = 0.4
forceSquaredChecked bool = false
alphaValue float32 = 0.5
comboBoxActive int32 = 1
toggleGroupActive int32 = 0
viewScroll = rl.Vector2{0, 0}
//----------------------------------------------------------------------------------
// Custom GUI font loading
//Font font = LoadFontEx("fonts/rainyhearts16.ttf", 12, 0, 0);
//GuiSetFont(font);
exitWindow bool = false
showMessageBox bool = false
textInput string
showTextInputBox bool = false
// TODO textInputFileName string
)
rl.SetTargetFPS(60)
//--------------------------------------------------------------------------------------
// Main game loop
for !exitWindow { // Detect window close button or ESC key
// Update
//----------------------------------------------------------------------------------
exitWindow = rl.WindowShouldClose()
if rl.IsKeyPressed(rl.KeyEscape) {
showMessageBox = !showMessageBox
}
if rl.IsKeyDown(rl.KeyLeftControl) && rl.IsKeyPressed(rl.KeyS) {
showTextInputBox = true
}
// TODO if rl.IsFileDropped() {
// TODO var droppedFiles gui.FilePathList = rl.LoadDroppedFiles()
// TODO if (droppedFiles.count > 0) && rl.IsFileExtension(droppedFiles.paths[0], ".rgs") {
// TODO gui.LoadStyle(droppedFiles.paths[0])
// TODO }
// TODO rl.UnloadDroppedFiles(droppedFiles) // Clear internal buffers
// TODO }
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
rl.BeginDrawing()
rl.ClearBackground(rl.GetColor(uint(gui.GetStyle(gui.DEFAULT, gui.BACKGROUND_COLOR))))
// raygui: controls drawing
//----------------------------------------------------------------------------------
if dropDown000EditMode || dropDown001EditMode {
gui.Lock()
} else if !dropDown000EditMode && !dropDown001EditMode {
gui.Unlock()
}
//GuiDisable();
// First GUI column
//GuiSetStyle(CHECKBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
forceSquaredChecked = gui.CheckBox(rl.Rectangle{25, 108, 15, 15}, "FORCE CHECK!", forceSquaredChecked)
gui.SetStyle(gui.TEXTBOX, gui.TEXT_ALIGNMENT, gui.TEXT_ALIGN_CENTER)
//GuiSetStyle(VALUEBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
gui.Spinner(rl.Rectangle{25, 135, 125, 30}, "", &spinner001Value, 0, 100, spinnerEditMode)
if gui.ValueBox(rl.Rectangle{25, 175, 125, 30}, "", &valueBox002Value, 0, 100, valueBoxEditMode) {
valueBoxEditMode = !valueBoxEditMode
}
gui.SetStyle(gui.TEXTBOX, gui.TEXT_ALIGNMENT, int64(gui.TEXT_ALIGN_LEFT))
if gui.TextBox(rl.Rectangle{25, 215, 125, 30}, &textBoxText, 64, textBoxEditMode) {
textBoxEditMode = !textBoxEditMode
}
gui.SetStyle(gui.BUTTON, gui.TEXT_ALIGNMENT, gui.TEXT_ALIGN_CENTER)
if gui.Button(rl.Rectangle{25, 255, 125, 30}, gui.IconText(gui.ICON_FILE_SAVE, "Save File")) {
showTextInputBox = true
}
gui.GroupBox(rl.Rectangle{25, 310, 125, 150}, "STATES")
//GuiLock();
gui.SetState(gui.STATE_NORMAL)
if gui.Button(rl.Rectangle{30, 320, 115, 30}, "NORMAL") {
}
gui.SetState(gui.STATE_FOCUSED)
if gui.Button(rl.Rectangle{30, 355, 115, 30}, "FOCUSED") {
}
gui.SetState(gui.STATE_PRESSED)
if gui.Button(rl.Rectangle{30, 390, 115, 30}, "#15#PRESSED") {
}
gui.SetState(gui.STATE_DISABLED)
if gui.Button(rl.Rectangle{30, 425, 115, 30}, "DISABLED") {
}
gui.SetState(gui.STATE_NORMAL)
//GuiUnlock();
comboBoxActive = gui.ComboBox(rl.Rectangle{25, 470, 125, 30}, "ONE;TWO;THREE;FOUR", comboBoxActive)
// NOTE: gui.DropdownBox must draw after any other control that can be covered on unfolding
gui.SetStyle(gui.DROPDOWNBOX, gui.TEXT_ALIGNMENT, int64(gui.TEXT_ALIGN_LEFT))
if gui.DropdownBox(rl.Rectangle{25, 65, 125, 30}, "#01#ONE;#02#TWO;#03#THREE;#04#FOUR", &dropdownBox001Active, dropDown001EditMode) {
dropDown001EditMode = !dropDown001EditMode
}
gui.SetStyle(gui.DROPDOWNBOX, gui.TEXT_ALIGNMENT, gui.TEXT_ALIGN_CENTER)
if gui.DropdownBox(rl.Rectangle{25, 25, 125, 30}, "ONE;TWO;THREE", &dropdownBox000Active, dropDown000EditMode) {
dropDown000EditMode = !dropDown000EditMode
}
// Second GUI column
listViewActive = gui.ListView(rl.Rectangle{165, 25, 140, 140}, "Charmander;Bulbasaur;#18#Squirtel;Pikachu;Eevee;Pidgey", &listViewScrollIndex, listViewActive)
listViewExActive = gui.ListViewEx(rl.Rectangle{165, 180, 140, 200}, listViewExList, &listViewExFocus, &listViewExScrollIndex, listViewExActive)
toggleGroupActive = gui.ToggleGroup(rl.Rectangle{165, 400, 140, 25}, "#1#ONE\n#3#TWO\n#8#THREE\n#23#", toggleGroupActive)
// Third GUI column
gui.Panel(rl.NewRectangle(320, 25, 225, 140), "Panel Info")
colorPickerValue = gui.ColorPicker(rl.Rectangle{320, 185, 196, 192}, "", colorPickerValue)
sliderValue = gui.Slider(rl.Rectangle{355, 400, 165, 20}, "TEST",
fmt.Sprintf("%2.2f", sliderValue), sliderValue, -50, 100)
sliderBarValue = gui.SliderBar(rl.Rectangle{320, 430, 200, 20}, "",
fmt.Sprintf("%2.2f", sliderBarValue), sliderBarValue, 0, 100)
progressValue = gui.ProgressBar(rl.Rectangle{320, 460, 200, 20}, "", "", progressValue, 0, 1)
// NOTE: View rectangle could be used to perform some scissor test
var view rl.Rectangle
gui.ScrollPanel(rl.Rectangle{560, 25, 102, 354}, "", rl.Rectangle{560, 25, 300, 1200}, &viewScroll, &view)
var mouseCell rl.Vector2
gui.Grid(rl.Rectangle{560, 25 + 180 + 195, 100, 120}, "", 20, 3, &mouseCell)
alphaValue = gui.ColorBarAlpha(rl.Rectangle{320, 490, 200, 30}, "", alphaValue)
gui.StatusBar(rl.Rectangle{0, float32(rl.GetScreenHeight()) - 20, float32(rl.GetScreenWidth()), 20}, "This is a status bar")
if showMessageBox {
rl.DrawRectangle(0, 0, int32(rl.GetScreenWidth()), int32(rl.GetScreenHeight()), rl.Fade(rl.RayWhite, 0.8))
var result int32 = gui.MessageBox(rl.Rectangle{float32(rl.GetScreenWidth())/2 - 125, float32(rl.GetScreenHeight())/2 - 50, 250, 100}, gui.IconText(gui.ICON_EXIT, "Close Window"), "Do you really want to exit?", "Yes;No")
if (result == 0) || (result == 2) {
showMessageBox = false
} else if result == 1 {
exitWindow = true
}
}
if showTextInputBox {
rl.DrawRectangle(0, 0, int32(rl.GetScreenWidth()), int32(rl.GetScreenHeight()), rl.Fade(rl.RayWhite, 0.8))
var secretViewActive bool
var result int32 = gui.TextInputBox(
rl.Rectangle{float32(rl.GetScreenWidth())/2 - 120, float32(rl.GetScreenHeight())/2 - 60, 240, 140},
"Save",
gui.IconText(gui.ICON_FILE_SAVE, "Save file as..."),
"Ok;Cancel",
&textInput, 255, &secretViewActive)
if result == 1 {
// TODO: Validate textInput value and save
// strcpy(textInputFileName, textInput)
// TODO textInputFileName = textInput
}
if (result == 0) || (result == 1) || (result == 2) {
showTextInputBox = false
//strcpy(textInput, "\0");
textInput = ""
}
}
//----------------------------------------------------------------------------------
rl.EndDrawing()
//----------------------------------------------------------------------------------
}
// De-Initialization
//--------------------------------------------------------------------------------------
rl.CloseWindow() // Close window and OpenGL context
//--------------------------------------------------------------------------------------
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View file

@ -1,3 +0,0 @@
This example loads a custom .rgi-file and draws the 255th icon. You can use the [rGuiIcons](https://raylibtech.itch.io/rguiicons) tool to view or create icon files.
![Screenshot](./screenshot.png)

View file

@ -1,20 +0,0 @@
package main
import (
"git.terah.dev/UnrealXR/raylib-go/raygui"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
func main() {
rl.InitWindow(800, 600, "raylib-go - icons example")
defer rl.CloseWindow()
raygui.LoadIcons("default_icons_with_255.rgi", false)
for !rl.WindowShouldClose() {
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
raygui.DrawIcon(raygui.ICON_255, 100, 100, 8, rl.Gray)
rl.EndDrawing()
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8 KiB

View file

@ -1,99 +0,0 @@
package main
import (
"fmt"
gui "git.terah.dev/UnrealXR/raylib-go/raygui"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
/*******************************************************************************************
*
* raygui - portable window
*
* DEPENDENCIES:
* raylib 4.0 - Windowing/input management and drawing.
* raygui 3.0 - Immediate-mode GUI controls.
*
* COMPILATION (Windows - MinGW):
* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
*
* LICENSE: zlib/libpng
*
* Copyright (c) 2016-2022 Ramon Santamaria (@raysan5)
*
**********************************************************************************************/
// ------------------------------------------------------------------------------------
// Program main entry point
// ------------------------------------------------------------------------------------
func main() {
// Initialization
//---------------------------------------------------------------------------------------
const (
screenWidth = 800
screenHeight = 600
)
rl.SetConfigFlags(rl.FlagWindowUndecorated)
rl.InitWindow(screenWidth, screenHeight, "raygui - portable window")
// General variables
var (
mousePosition = rl.Vector2{0, 0}
windowPosition = rl.Vector2{500, 200}
panOffset = mousePosition
dragWindow = false
)
rl.SetWindowPosition(int(windowPosition.X), int(windowPosition.Y))
exitWindow := false
rl.SetTargetFPS(60)
//--------------------------------------------------------------------------------------
// Main game loop
for !exitWindow && !rl.WindowShouldClose() { // Detect window close button or ESC key
// Update
//----------------------------------------------------------------------------------
mousePosition = rl.GetMousePosition()
if rl.IsMouseButtonPressed(rl.MouseLeftButton) {
if (rl.CheckCollisionPointRec(mousePosition, rl.Rectangle{0, 0, screenWidth, 20})) {
dragWindow = true
panOffset = mousePosition
}
}
if dragWindow {
windowPosition.X += (mousePosition.X - panOffset.X)
windowPosition.Y += (mousePosition.Y - panOffset.Y)
if rl.IsMouseButtonReleased(rl.MouseLeftButton) {
dragWindow = false
}
rl.SetWindowPosition(int(windowPosition.X), int(windowPosition.Y))
}
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
exitWindow = gui.WindowBox(rl.Rectangle{0, 0, screenWidth, screenHeight}, "#198# PORTABLE WINDOW")
rl.DrawText(fmt.Sprintf("Mouse Position: [ %.0f, %.0f ]", mousePosition.X, mousePosition.Y), 10, 40, 10, rl.DarkGray)
rl.EndDrawing()
//----------------------------------------------------------------------------------
}
// De-Initialization
//--------------------------------------------------------------------------------------
rl.CloseWindow() // Close window and OpenGL context
//--------------------------------------------------------------------------------------
}

View file

@ -1,193 +0,0 @@
package main
import (
"fmt"
gui "git.terah.dev/UnrealXR/raylib-go/raygui"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
/*******************************************************************************************
*
* raygui - Controls test
*
* TEST CONTROLS:
* - gui.ScrollPanel()
*
* DEPENDENCIES:
* raylib 4.0 - Windowing/input management and drawing.
* raygui 3.0 - Immediate-mode GUI controls.
*
* COMPILATION (Windows - MinGW):
* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
*
* COMPILATION (Linux - gcc):
* gcc -o $(NAME_PART) $(FILE_NAME) -I../../src -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -std=c99
*
* LICENSE: zlib/libpng
*
* Copyright (c) 2019-2022 Vlad Adrian (@Demizdor) and Ramon Santamaria (@raysan5)
*
**********************************************************************************************/
// ------------------------------------------------------------------------------------
// Program main entry point
// ------------------------------------------------------------------------------------
func main() {
// Initialization
//---------------------------------------------------------------------------------------
const (
screenWidth = 800
screenHeight = 450
)
rl.InitWindow(screenWidth, screenHeight, "raygui - gui.ScrollPanel()")
var (
panelRec = rl.Rectangle{20, 40, 200, 150}
panelContentRec = rl.Rectangle{0, 0, 340, 340}
panelView = rl.Rectangle{0, 0, 0, 0}
panelScroll = rl.Vector2{99, -20}
mouseCell = rl.Vector2{0, 0}
showContentArea = true
)
rl.SetTargetFPS(60)
//---------------------------------------------------------------------------------------
// Main game loop
for !rl.WindowShouldClose() {
// Detect window close button or ESC key
// Update
//----------------------------------------------------------------------------------
// TODO: Implement required update logic
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.DrawText(fmt.Sprintf("[%.1f, %.1f]", panelScroll.X, panelScroll.Y), 4, 4, 20, rl.Red)
gui.ScrollPanel(panelRec, "", panelContentRec, &panelScroll, &panelView)
rl.BeginScissorMode(int32(panelView.X), int32(panelView.Y), int32(panelView.Width), int32(panelView.Height))
gui.Grid(rl.Rectangle{
float32(panelRec.X + panelScroll.X),
float32(panelRec.Y + panelScroll.Y),
float32(panelContentRec.Width),
float32(panelContentRec.Height),
}, "", 16, 3, &mouseCell)
rl.EndScissorMode()
if showContentArea {
rl.DrawRectangle(
int32(panelRec.X+panelScroll.X),
int32(panelRec.Y+panelScroll.Y),
int32(panelContentRec.Width),
int32(panelContentRec.Height),
rl.Fade(rl.Red, 0.1),
)
}
DrawStyleEditControls()
showContentArea = gui.CheckBox(rl.Rectangle{565, 80, 20, 20}, "SHOW CONTENT AREA", showContentArea)
panelContentRec.Width = gui.SliderBar(rl.Rectangle{590, 385, 145, 15},
"WIDTH",
fmt.Sprintf("%.1f", panelContentRec.Width),
panelContentRec.Width,
1, 600)
panelContentRec.Height = gui.SliderBar(rl.Rectangle{590, 410, 145, 15},
"HEIGHT",
fmt.Sprintf("%.1f", panelContentRec.Height),
panelContentRec.Height, 1, 400)
rl.EndDrawing()
//----------------------------------------------------------------------------------
}
// De-Initialization
//--------------------------------------------------------------------------------------
rl.CloseWindow() // Close window and OpenGL context
//--------------------------------------------------------------------------------------
}
// Draw and process scroll bar style edition controls
func DrawStyleEditControls() {
// ScrollPanel style controls
//----------------------------------------------------------
gui.GroupBox(rl.Rectangle{550, 170, 220, 205}, "SCROLLBAR STYLE")
var style int32
style = int32(gui.GetStyle(gui.SCROLLBAR, gui.BORDER_WIDTH))
gui.Label(rl.Rectangle{555, 195, 110, 10}, "BORDER_WIDTH")
gui.Spinner(rl.Rectangle{670, 190, 90, 20}, "", &style, 0, 6, false)
gui.SetStyle(gui.SCROLLBAR, gui.BORDER_WIDTH, int64(style))
style = int32(gui.GetStyle(gui.SCROLLBAR, gui.ARROWS_SIZE))
gui.Label(rl.Rectangle{555, 220, 110, 10}, "ARROWS_SIZE")
gui.Spinner(rl.Rectangle{670, 215, 90, 20}, "", &style, 4, 14, false)
gui.SetStyle(gui.SCROLLBAR, gui.ARROWS_SIZE, int64(style))
style = int32(gui.GetStyle(gui.SCROLLBAR, gui.SLIDER_PADDING))
gui.Label(rl.Rectangle{555, 245, 110, 10}, "SLIDER_PADDING")
gui.Spinner(rl.Rectangle{670, 240, 90, 20}, "", &style, 0, 14, false)
gui.SetStyle(gui.SCROLLBAR, gui.SLIDER_PADDING, int64(style))
style = boolToint32(gui.CheckBox(rl.Rectangle{565, 280, 20, 20}, "ARROWS_VISIBLE", int32Tobool(int32(gui.GetStyle(gui.SCROLLBAR, gui.ARROWS_VISIBLE)))))
gui.SetStyle(gui.SCROLLBAR, gui.ARROWS_VISIBLE, int64(style))
style = int32(gui.GetStyle(gui.SCROLLBAR, gui.SLIDER_PADDING))
gui.Label(rl.Rectangle{555, 325, 110, 10}, "SLIDER_PADDING")
gui.Spinner(rl.Rectangle{670, 320, 90, 20}, "", &style, 0, 14, false)
gui.SetStyle(gui.SCROLLBAR, gui.SLIDER_PADDING, int64(style))
style = int32(gui.GetStyle(gui.SCROLLBAR, gui.SLIDER_WIDTH))
gui.Label(rl.Rectangle{555, 350, 110, 10}, "SLIDER_WIDTH")
gui.Spinner(rl.Rectangle{670, 345, 90, 20}, "", &style, 2, 100, false)
gui.SetStyle(gui.SCROLLBAR, gui.SLIDER_WIDTH, int64(style))
var text string
if gui.GetStyle(gui.LISTVIEW, gui.SCROLLBAR_SIDE) == gui.SCROLLBAR_LEFT_SIDE {
text = "SCROLLBAR: LEFT"
} else {
text = "SCROLLBAR: RIGHT"
}
style = boolToint32(gui.Toggle(rl.Rectangle{560, 110, 200, 35}, text, int32Tobool(int32(gui.GetStyle(gui.LISTVIEW, gui.SCROLLBAR_SIDE)))))
gui.SetStyle(gui.LISTVIEW, gui.SCROLLBAR_SIDE, int64(style))
//----------------------------------------------------------
// ScrollBar style controls
//----------------------------------------------------------
gui.GroupBox(rl.Rectangle{550, 20, 220, 135}, "SCROLLPANEL STYLE")
style = int32(gui.GetStyle(gui.LISTVIEW, gui.SCROLLBAR_WIDTH))
gui.Label(rl.Rectangle{555, 35, 110, 10}, "SCROLLBAR_WIDTH")
gui.Spinner(rl.Rectangle{670, 30, 90, 20}, "", &style, 6, 30, false)
gui.SetStyle(gui.LISTVIEW, gui.SCROLLBAR_WIDTH, int64(style))
style = int32(gui.GetStyle(gui.DEFAULT, gui.BORDER_WIDTH))
gui.Label(rl.Rectangle{555, 60, 110, 10}, "BORDER_WIDTH")
gui.Spinner(rl.Rectangle{670, 55, 90, 20}, "", &style, 0, 20, false)
gui.SetStyle(gui.DEFAULT, gui.BORDER_WIDTH, int64(style))
//----------------------------------------------------------
}
func boolToint32(b bool) int32 {
if b {
return 1
}
return 0
}
func int32Tobool(v int32) bool {
return 0 < v
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 KiB

View file

@ -1,95 +0,0 @@
/*******************************************************************************************
*
* raylib [models] example - Load 3d model with animations and play them
*
* Example originally created with raylib 2.5, last time updated with raylib 3.5
*
* Example contributed by Culacant (@culacant) and reviewed by Ramon Santamaria (@raysan5)
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2019-2024 Culacant (@culacant) and Ramon Santamaria (@raysan5)
*
********************************************************************************************
*
* NOTE: To export a model from blender, make sure it is not posed, the vertices need to be
* in the same position as they would be in edit mode and the scale of your models is
* set to 0. Scaling can be done from the export menu.
*
********************************************************************************************/
package main
import (
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
)
func main() {
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - model animation")
camera := rl.Camera{}
camera.Position = rl.NewVector3(10.0, 10.0, 10.0)
camera.Target = rl.NewVector3(0.0, 0.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0
camera.Projection = rl.CameraPerspective
model := rl.LoadModel("guy.iqm")
texture := rl.LoadTexture("guytex.png")
rl.SetMaterialTexture(model.Materials, rl.MapDiffuse, texture)
position := rl.NewVector3(0, 0, 0)
anims := rl.LoadModelAnimations("guyanim.iqm")
animFrameCount := 0
rl.DisableCursor()
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
rl.UpdateCamera(&camera, rl.CameraFirstPerson)
if rl.IsKeyDown(rl.KeySpace) {
animFrameCount++
animCurrent := anims[0]
animFrameNum := animCurrent.FrameCount
rl.UpdateModelAnimation(model, anims[0], int32(animFrameCount))
if animFrameCount >= int(animFrameNum) {
animFrameCount = 0
}
}
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera)
rl.DrawModelEx(model, position, rl.NewVector3(1, 0, 0), -90, rl.NewVector3(1, 1, 1), rl.White)
// Draw translation cubes
for i := int32(0); i < model.BoneCount; i++ {
pose := anims[0].GetFramePose(animFrameCount, int(i))
rl.DrawCube(pose.Translation, 0.2, 0.2, 0.2, rl.Red)
}
rl.DrawGrid(10, 1)
rl.EndMode3D()
rl.DrawText("PRESS SPACE to PLAY MODEL ANIMATION", 10, 10, 20, rl.Black)
rl.DrawText("(c) Guy IQM 3D model by @culacant", 10, 30, 10, rl.Black)
rl.EndDrawing()
}
rl.UnloadModel(model)
rl.UnloadModelAnimations(anims)
rl.UnloadTexture(texture)
rl.CloseWindow()
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Before After
Before After

View file

@ -1,94 +1,48 @@
/******************************************************************************************* package main
*
* raylib [models] example - Drawing billboards
*
* Example originally created with raylib 1.3, last time updated with raylib 3.5
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2015-2024 Ramon Santamaria (@raysan5)
*
********************************************************************************************/package main
import ( import (
rl "git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
) )
func main() { func main() {
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - drawing billboards") screenWidth := int32(800)
screenHeight := int32(450)
camera := rl.Camera{} raylib.InitWindow(screenWidth, screenHeight, "raylib [models] example - drawing billboards")
camera.Position = rl.NewVector3(5.0, 4.0, 5.0)
camera.Target = rl.NewVector3(0.0, 2.0, 0.0) camera := raylib.Camera{}
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) camera.Position = raylib.NewVector3(5.0, 4.0, 5.0)
camera.Target = raylib.NewVector3(0.0, 2.0, 0.0)
camera.Up = raylib.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0 camera.Fovy = 45.0
camera.Projection = rl.CameraPerspective camera.Type = raylib.CameraPerspective
bill := rl.LoadTexture("billboard.png") // Our texture billboard bill := raylib.LoadTexture("billboard.png") // Our texture billboard
billPositionStatic := rl.NewVector3(0.0, 2.0, 0.0) // Position of static billboard billPosition := raylib.NewVector3(0.0, 2.0, 0.0) // Position where draw billboard
billPositionRotating := rl.NewVector3(1.0, 2.0, 1.0) // Position of rotating billboard
// Entire billboard texture, source is used to take a segment from a larger texture. raylib.SetCameraMode(camera, raylib.CameraOrbital) // Set an orbital camera mode
source := rl.Rectangle{
Width: float32(bill.Width), raylib.SetTargetFPS(60)
Height: float32(bill.Height),
for !raylib.WindowShouldClose() {
raylib.UpdateCamera(&camera) // Update camera
raylib.BeginDrawing()
raylib.ClearBackground(raylib.RayWhite)
raylib.BeginMode3D(camera)
raylib.DrawBillboard(camera, bill, billPosition, 2.0, raylib.White)
raylib.DrawGrid(10, 1.0) // Draw a grid
raylib.EndMode3D()
raylib.EndDrawing()
} }
// NOTE: Billboard locked on axis-Y raylib.UnloadTexture(bill) // Unload texture
billUp := rl.Vector3{Y: 1.0}
// Set the height of the rotating billboard to 1.0 with the aspect ratio fixed raylib.CloseWindow()
size := rl.Vector2{
X: source.Width / source.Height,
Y: 1.0,
}
// Rotate around origin
// Here we choose to rotate around the image center
origin := rl.Vector2Scale(size, 0.5)
// Distance is needed for the correct billboard draw order
// Larger distance (further away from the camera) should be drawn prior to smaller distance.
var distanceStatic, distanceRotating, rotation float32
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
// Update
rl.UpdateCamera(&camera, rl.CameraOrbital) // Update camera with orbital camera mode
rotation += 0.4
distanceStatic = rl.Vector3Distance(camera.Position, billPositionStatic)
distanceRotating = rl.Vector3Distance(camera.Position, billPositionRotating)
// Draw
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera)
rl.DrawGrid(10, 1.0) // Draw a grid
// Draw order matters!
if distanceStatic > distanceRotating {
rl.DrawBillboard(camera, bill, billPositionStatic, 2.0, rl.White)
rl.DrawBillboardPro(camera, bill, source, billPositionRotating, billUp, size, origin, rotation, rl.White)
} else {
rl.DrawBillboardPro(camera, bill, source, billPositionRotating, billUp, size, origin, rotation, rl.White)
rl.DrawBillboard(camera, bill, billPositionStatic, 2.0, rl.White)
}
rl.EndMode3D()
rl.DrawFPS(10, 10)
rl.EndDrawing()
}
rl.UnloadTexture(bill) // Unload texture
rl.CloseWindow()
} }

View file

@ -1,69 +1,69 @@
package main package main
import ( import (
"git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
func main() { func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - box collisions") raylib.InitWindow(screenWidth, screenHeight, "raylib [models] example - box collisions")
camera := rl.Camera{} camera := raylib.Camera{}
camera.Position = rl.NewVector3(0.0, 10.0, 10.0) camera.Position = raylib.NewVector3(0.0, 10.0, 10.0)
camera.Target = rl.NewVector3(0.0, 0.0, 0.0) camera.Target = raylib.NewVector3(0.0, 0.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) camera.Up = raylib.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0 camera.Fovy = 45.0
camera.Projection = rl.CameraPerspective camera.Type = raylib.CameraPerspective
playerPosition := rl.NewVector3(0.0, 1.0, 2.0) playerPosition := raylib.NewVector3(0.0, 1.0, 2.0)
playerSize := rl.NewVector3(1.0, 2.0, 1.0) playerSize := raylib.NewVector3(1.0, 2.0, 1.0)
playerColor := rl.Green playerColor := raylib.Green
enemyBoxPos := rl.NewVector3(-4.0, 1.0, 0.0) enemyBoxPos := raylib.NewVector3(-4.0, 1.0, 0.0)
enemyBoxSize := rl.NewVector3(2.0, 2.0, 2.0) enemyBoxSize := raylib.NewVector3(2.0, 2.0, 2.0)
enemySpherePos := rl.NewVector3(4.0, 0.0, 0.0) enemySpherePos := raylib.NewVector3(4.0, 0.0, 0.0)
enemySphereSize := float32(1.5) enemySphereSize := float32(1.5)
collision := false collision := false
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
// Update // Update
// Move player // Move player
if rl.IsKeyDown(rl.KeyRight) { if raylib.IsKeyDown(raylib.KeyRight) {
playerPosition.X += 0.2 playerPosition.X += 0.2
} else if rl.IsKeyDown(rl.KeyLeft) { } else if raylib.IsKeyDown(raylib.KeyLeft) {
playerPosition.X -= 0.2 playerPosition.X -= 0.2
} else if rl.IsKeyDown(rl.KeyDown) { } else if raylib.IsKeyDown(raylib.KeyDown) {
playerPosition.Z += 0.2 playerPosition.Z += 0.2
} else if rl.IsKeyDown(rl.KeyUp) { } else if raylib.IsKeyDown(raylib.KeyUp) {
playerPosition.Z -= 0.2 playerPosition.Z -= 0.2
} }
collision = false collision = false
// Check collisions player vs enemy-box // Check collisions player vs enemy-box
if rl.CheckCollisionBoxes( if raylib.CheckCollisionBoxes(
rl.NewBoundingBox( raylib.NewBoundingBox(
rl.NewVector3(playerPosition.X-playerSize.X/2, playerPosition.Y-playerSize.Y/2, playerPosition.Z-playerSize.Z/2), raylib.NewVector3(playerPosition.X-playerSize.X/2, playerPosition.Y-playerSize.Y/2, playerPosition.Z-playerSize.Z/2),
rl.NewVector3(playerPosition.X+playerSize.X/2, playerPosition.Y+playerSize.Y/2, playerPosition.Z+playerSize.Z/2)), raylib.NewVector3(playerPosition.X+playerSize.X/2, playerPosition.Y+playerSize.Y/2, playerPosition.Z+playerSize.Z/2)),
rl.NewBoundingBox( raylib.NewBoundingBox(
rl.NewVector3(enemyBoxPos.X-enemyBoxSize.X/2, enemyBoxPos.Y-enemyBoxSize.Y/2, enemyBoxPos.Z-enemyBoxSize.Z/2), raylib.NewVector3(enemyBoxPos.X-enemyBoxSize.X/2, enemyBoxPos.Y-enemyBoxSize.Y/2, enemyBoxPos.Z-enemyBoxSize.Z/2),
rl.NewVector3(enemyBoxPos.X+enemyBoxSize.X/2, enemyBoxPos.Y+enemyBoxSize.Y/2, enemyBoxPos.Z+enemyBoxSize.Z/2)), raylib.NewVector3(enemyBoxPos.X+enemyBoxSize.X/2, enemyBoxPos.Y+enemyBoxSize.Y/2, enemyBoxPos.Z+enemyBoxSize.Z/2)),
) { ) {
collision = true collision = true
} }
// Check collisions player vs enemy-sphere // Check collisions player vs enemy-sphere
if rl.CheckCollisionBoxSphere( if raylib.CheckCollisionBoxSphere(
rl.NewBoundingBox( raylib.NewBoundingBox(
rl.NewVector3(playerPosition.X-playerSize.X/2, playerPosition.Y-playerSize.Y/2, playerPosition.Z-playerSize.Z/2), raylib.NewVector3(playerPosition.X-playerSize.X/2, playerPosition.Y-playerSize.Y/2, playerPosition.Z-playerSize.Z/2),
rl.NewVector3(playerPosition.X+playerSize.X/2, playerPosition.Y+playerSize.Y/2, playerPosition.Z+playerSize.Z/2)), raylib.NewVector3(playerPosition.X+playerSize.X/2, playerPosition.Y+playerSize.Y/2, playerPosition.Z+playerSize.Z/2)),
enemySpherePos, enemySpherePos,
enemySphereSize, enemySphereSize,
) { ) {
@ -71,40 +71,40 @@ func main() {
} }
if collision { if collision {
playerColor = rl.Red playerColor = raylib.Red
} else { } else {
playerColor = rl.Green playerColor = raylib.Green
} }
// Draw // Draw
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.BeginMode3D(camera) raylib.BeginMode3D(camera)
// Draw enemy-box // Draw enemy-box
rl.DrawCube(enemyBoxPos, enemyBoxSize.X, enemyBoxSize.Y, enemyBoxSize.Z, rl.Gray) raylib.DrawCube(enemyBoxPos, enemyBoxSize.X, enemyBoxSize.Y, enemyBoxSize.Z, raylib.Gray)
rl.DrawCubeWires(enemyBoxPos, enemyBoxSize.X, enemyBoxSize.Y, enemyBoxSize.Z, rl.DarkGray) raylib.DrawCubeWires(enemyBoxPos, enemyBoxSize.X, enemyBoxSize.Y, enemyBoxSize.Z, raylib.DarkGray)
// Draw enemy-sphere // Draw enemy-sphere
rl.DrawSphere(enemySpherePos, enemySphereSize, rl.Gray) raylib.DrawSphere(enemySpherePos, enemySphereSize, raylib.Gray)
rl.DrawSphereWires(enemySpherePos, enemySphereSize, 16, 16, rl.DarkGray) raylib.DrawSphereWires(enemySpherePos, enemySphereSize, 16, 16, raylib.DarkGray)
// Draw player // Draw player
rl.DrawCubeV(playerPosition, playerSize, playerColor) raylib.DrawCubeV(playerPosition, playerSize, playerColor)
rl.DrawGrid(10, 1.0) // Draw a grid raylib.DrawGrid(10, 1.0) // Draw a grid
rl.EndMode3D() raylib.EndMode3D()
rl.DrawText("Move player with cursors to collide", 220, 40, 20, rl.Gray) raylib.DrawText("Move player with cursors to collide", 220, 40, 20, raylib.Gray)
rl.DrawFPS(10, 10) raylib.DrawFPS(10, 10)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,68 +1,71 @@
package main package main
import ( import (
rl "git.terah.dev/UnrealXR/raylib-go/raylib" "github.com/gen2brain/raylib-go/raylib"
) )
func main() { func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - cubesmap loading and drawing") raylib.InitWindow(screenWidth, screenHeight, "raylib [models] example - cubesmap loading and drawing")
camera := rl.Camera{} camera := raylib.Camera{}
camera.Position = rl.NewVector3(16.0, 14.0, 16.0) camera.Position = raylib.NewVector3(16.0, 14.0, 16.0)
camera.Target = rl.NewVector3(0.0, 0.0, 0.0) camera.Target = raylib.NewVector3(0.0, 0.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) camera.Up = raylib.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0 camera.Fovy = 45.0
camera.Type = raylib.CameraPerspective
image := rl.LoadImage("cubicmap.png") // Load cubicmap image (RAM) image := raylib.LoadImage("cubicmap.png") // Load cubicmap image (RAM)
cubicmap := rl.LoadTextureFromImage(image) // Convert image to texture to display (VRAM) cubicmap := raylib.LoadTextureFromImage(image) // Convert image to texture to display (VRAM)
mesh := rl.GenMeshCubicmap(*image, rl.NewVector3(1.0, 1.0, 1.0)) mesh := raylib.GenMeshCubicmap(*image, raylib.NewVector3(1.0, 1.0, 1.0))
model := rl.LoadModelFromMesh(mesh) model := raylib.LoadModelFromMesh(mesh)
// NOTE: By default each cube is mapped to one part of texture atlas // NOTE: By default each cube is mapped to one part of texture atlas
texture := rl.LoadTexture("cubicmap_atlas.png") // Load map texture texture := raylib.LoadTexture("cubicmap_atlas.png") // Load map texture
rl.SetMaterialTexture(model.Materials, rl.MapDiffuse, texture) // Set map diffuse texture model.Material.Maps[raylib.MapDiffuse].Texture = texture // Set map diffuse texture
mapPosition := rl.NewVector3(-16.0, 0.0, -8.0) // Set model position mapPosition := raylib.NewVector3(-16.0, 0.0, -8.0) // Set model position
rl.UnloadImage(image) // Unload cubicmap image from RAM, already uploaded to VRAM raylib.UnloadImage(image) // Unload cubicmap image from RAM, already uploaded to VRAM
rl.SetTargetFPS(60) raylib.SetCameraMode(camera, raylib.CameraOrbital) // Set an orbital camera mode
for !rl.WindowShouldClose() { raylib.SetTargetFPS(60)
for !raylib.WindowShouldClose() {
// Update // Update
rl.UpdateCamera(&camera, rl.CameraOrbital) // Update camera with orbital camera mode raylib.UpdateCamera(&camera) // Update camera
// Draw // Draw
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.BeginMode3D(camera) raylib.BeginMode3D(camera)
rl.DrawModel(model, mapPosition, 1.0, rl.White) raylib.DrawModel(model, mapPosition, 1.0, raylib.White)
rl.EndMode3D() raylib.EndMode3D()
rl.DrawTextureEx(cubicmap, rl.NewVector2(float32(screenWidth-cubicmap.Width*4-20), 20), 0.0, 4.0, rl.White) raylib.DrawTextureEx(cubicmap, raylib.NewVector2(float32(screenWidth-cubicmap.Width*4-20), 20), 0.0, 4.0, raylib.White)
rl.DrawRectangleLines(screenWidth-cubicmap.Width*4-20, 20, cubicmap.Width*4, cubicmap.Height*4, rl.Green) raylib.DrawRectangleLines(screenWidth-cubicmap.Width*4-20, 20, cubicmap.Width*4, cubicmap.Height*4, raylib.Green)
rl.DrawText("cubicmap image used to", 658, 90, 10, rl.Gray) raylib.DrawText("cubicmap image used to", 658, 90, 10, raylib.Gray)
rl.DrawText("generate map 3d model", 658, 104, 10, rl.Gray) raylib.DrawText("generate map 3d model", 658, 104, 10, raylib.Gray)
rl.DrawFPS(10, 10) raylib.DrawFPS(10, 10)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.UnloadTexture(cubicmap) // Unload cubicmap texture raylib.UnloadTexture(cubicmap) // Unload cubicmap texture
rl.UnloadTexture(texture) // Unload map texture raylib.UnloadTexture(texture) // Unload map texture
rl.UnloadModel(model) // Unload map model raylib.UnloadModel(model) // Unload map model
rl.CloseWindow() raylib.CloseWindow()
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

View file

@ -1,256 +0,0 @@
/*******************************************************************************************
*
* raylib [models] example - Draw textured cube
*
* Example originally created with raylib 4.5, last time updated with raylib 4.5
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2022-2024 Ramon Santamaria (@raysan5)
*
********************************************************************************************/
package main
import rl "git.terah.dev/UnrealXR/raylib-go/raylib"
const (
screenWidth = 800
screenHeight = 450
)
func main() {
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - draw cube texture")
// Define the camera to look into our 3d world
camera := rl.Camera{
Position: rl.Vector3{
Y: 10.0,
Z: 10.0,
},
Target: rl.Vector3{},
Up: rl.Vector3{Y: 1.0},
Fovy: 45.0,
Projection: rl.CameraPerspective,
}
// Load texture to be applied to the cubes sides
texture := rl.LoadTexture("cubicmap_atlas.png")
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
// Main game loop
for !rl.WindowShouldClose() { // Detect window close button or ESC key
// Update
// TODO: Update your variables here
// Draw
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera)
// Draw cube with an applied texture
vec := rl.Vector3{
X: -2.0,
Y: 2.0,
}
DrawCubeTexture(texture, vec, 2.0, 4.0, 2.0, rl.White)
// Draw cube with an applied texture, but only a defined rectangle piece of the texture
rec := rl.Rectangle{
Y: float32(texture.Height) / 2.0,
Width: float32(texture.Width) / 2.0,
Height: float32(texture.Height) / 2.0,
}
vec = rl.Vector3{
X: 2.0,
Y: 1.0,
}
DrawCubeTextureRec(texture, rec, vec, 2.0, 2.0, 2.0, rl.White)
rl.DrawGrid(10, 1.0) // Draw a grid
rl.EndMode3D()
rl.DrawFPS(10, 10)
rl.EndDrawing()
}
// De-Initialization
rl.UnloadTexture(texture) // Unload texture
rl.CloseWindow() // Close window and OpenGL context
}
// DrawCubeTexture draws a textured cube
// NOTE: Cube position is the center position
func DrawCubeTexture(texture rl.Texture2D, position rl.Vector3, width, height, length float32, color rl.Color) {
x := position.X
y := position.Y
z := position.Z
// Set desired texture to be enabled while drawing following vertex data
rl.SetTexture(texture.ID)
// Vertex data transformation can be defined with the commented lines,
// but in this example we calculate the transformed vertex data directly when calling rlVertex3f()
// rl.PushMatrix()
// NOTE: Transformation is applied in inverse order (scale -> rotate -> translate)
//rl.Translatef(2.0, 0.0, 0.0)
//rl.Rotatef(45, 0, 1, )
//rl.Scalef(2.0, 2.0, 2.0)
rl.Begin(rl.Quads)
rl.Color4ub(color.R, color.G, color.B, color.A)
// Front Face
rl.Normal3f(0.0, 0.0, 1.0) // Normal Pointing Towards Viewer
rl.TexCoord2f(0.0, 0.0)
rl.Vertex3f(x-width/2, y-height/2, z+length/2) // Bottom Left Of The Texture and Quad
rl.TexCoord2f(1.0, 0.0)
rl.Vertex3f(x+width/2, y-height/2, z+length/2) // Bottom Right Of The Texture and Quad
rl.TexCoord2f(1.0, 1.0)
rl.Vertex3f(x+width/2, y+height/2, z+length/2) // Top Right Of The Texture and Quad
rl.TexCoord2f(0.0, 1.0)
rl.Vertex3f(x-width/2, y+height/2, z+length/2) // Top Left Of The Texture and Quad
// Back Face
rl.Normal3f(0.0, 0.0, -1.0) // Normal Pointing Away From Viewer
rl.TexCoord2f(1.0, 0.0)
rl.Vertex3f(x-width/2, y-height/2, z-length/2) // Bottom Right Of The Texture and Quad
rl.TexCoord2f(1.0, 1.0)
rl.Vertex3f(x-width/2, y+height/2, z-length/2) // Top Right Of The Texture and Quad
rl.TexCoord2f(0.0, 1.0)
rl.Vertex3f(x+width/2, y+height/2, z-length/2) // Top Left Of The Texture and Quad
rl.TexCoord2f(0.0, 0.0)
rl.Vertex3f(x+width/2, y-height/2, z-length/2) // Bottom Left Of The Texture and Quad
// Top Face
rl.Normal3f(0.0, 1.0, 0.0) // Normal Pointing Up
rl.TexCoord2f(0.0, 1.0)
rl.Vertex3f(x-width/2, y+height/2, z-length/2) // Top Left Of The Texture and Quad.
rl.TexCoord2f(0.0, 0.0)
rl.Vertex3f(x-width/2, y+height/2, z+length/2) // Bottom Left Of The Texture and Quad
rl.TexCoord2f(1.0, 0.0)
rl.Vertex3f(x+width/2, y+height/2, z+length/2) // Bottom Right Of The Texture and Quad
rl.TexCoord2f(1.0, 1.0)
rl.Vertex3f(x+width/2, y+height/2, z-length/2) // Top Right Of The Texture and Quad Bottom Face
rl.Normal3f(0.0, -1.0, 0.0) // Normal Pointing Down
rl.TexCoord2f(1.0, 1.0)
rl.Vertex3f(x-width/2, y-height/2, z-length/2) // Top Right Of The Texture and Quad
rl.TexCoord2f(0.0, 1.0)
rl.Vertex3f(x+width/2, y-height/2, z-length/2) // Top Left Of The Texture and Quad
rl.TexCoord2f(0.0, 0.0)
rl.Vertex3f(x+width/2, y-height/2, z+length/2) // Bottom Left Of The Texture and Quad
rl.TexCoord2f(1.0, 0.0)
rl.Vertex3f(x-width/2, y-height/2, z+length/2) // Bottom Right Of The Texture and Quad
// Right face
rl.Normal3f(1.0, 0.0, 0.0) // Normal Pointing Right
rl.TexCoord2f(1.0, 0.0)
rl.Vertex3f(x+width/2, y-height/2, z-length/2) // Bottom Right Of The Texture and Quad
rl.TexCoord2f(1.0, 1.0)
rl.Vertex3f(x+width/2, y+height/2, z-length/2) // Top Right Of The Texture and Quad
rl.TexCoord2f(0.0, 1.0)
rl.Vertex3f(x+width/2, y+height/2, z+length/2) // Top Left Of The Texture and Quad
rl.TexCoord2f(0.0, 0.0)
rl.Vertex3f(x+width/2, y-height/2, z+length/2) // Bottom Left Of The Texture and Quad
// Left Face
rl.Normal3f(-1.0, 0.0, 0.0) // Normal Pointing Left
rl.TexCoord2f(0.0, 0.0)
rl.Vertex3f(x-width/2, y-height/2, z-length/2) // Bottom Left Of The Texture and Quad
rl.TexCoord2f(1.0, 0.0)
rl.Vertex3f(x-width/2, y-height/2, z+length/2) // Bottom Right Of The Texture and Quad
rl.TexCoord2f(1.0, 1.0)
rl.Vertex3f(x-width/2, y+height/2, z+length/2) // Top Right Of The Texture and Quad
rl.TexCoord2f(0.0, 1.0)
rl.Vertex3f(x-width/2, y+height/2, z-length/2) // Top Left Of The Texture and Quad
rl.End()
//rl.PopMatrix()
rl.SetTexture(0)
}
// DrawCubeTextureRec draws a cube with texture piece applied to all faces
func DrawCubeTextureRec(texture rl.Texture2D, source rl.Rectangle, position rl.Vector3, width, height,
length float32, color rl.Color) {
x := position.X
y := position.Y
z := position.Z
texWidth := float32(texture.Width)
texHeight := float32(texture.Height)
// Set desired texture to be enabled while drawing following vertex data
rl.SetTexture(texture.ID)
// We calculate the normalized texture coordinates for the desired texture-source-rectangle
// It means converting from (tex.width, tex.height) coordinates to [0.0f, 1.0f] equivalent
rl.Begin(rl.Quads)
rl.Color4ub(color.R, color.G, color.B, color.A)
// Front face
rl.Normal3f(0.0, 0.0, 1.0)
rl.TexCoord2f(source.X/texWidth, (source.Y+source.Height)/texHeight)
rl.Vertex3f(x-width/2, y-height/2, z+length/2)
rl.TexCoord2f((source.X+source.Width)/texWidth, (source.Y+source.Height)/texHeight)
rl.Vertex3f(x+width/2, y-height/2, z+length/2)
rl.TexCoord2f((source.X+source.Width)/texWidth, source.Y/texHeight)
rl.Vertex3f(x+width/2, y+height/2, z+length/2)
rl.TexCoord2f(source.X/texWidth, source.Y/texHeight)
rl.Vertex3f(x-width/2, y+height/2, z+length/2)
// Back face
rl.Normal3f(0.0, 0.0, -1.0)
rl.TexCoord2f((source.X+source.Width)/texWidth, (source.Y+source.Height)/texHeight)
rl.Vertex3f(x-width/2, y-height/2, z-length/2)
rl.TexCoord2f((source.X+source.Width)/texWidth, source.Y/texHeight)
rl.Vertex3f(x-width/2, y+height/2, z-length/2)
rl.TexCoord2f(source.X/texWidth, source.Y/texHeight)
rl.Vertex3f(x+width/2, y+height/2, z-length/2)
rl.TexCoord2f(source.X/texWidth, (source.Y+source.Height)/texHeight)
rl.Vertex3f(x+width/2, y-height/2, z-length/2)
// Top face
rl.Normal3f(0.0, 1.0, 0.0)
rl.TexCoord2f(source.X/texWidth, source.Y/texHeight)
rl.Vertex3f(x-width/2, y+height/2, z-length/2)
rl.TexCoord2f(source.X/texWidth, (source.Y+source.Height)/texHeight)
rl.Vertex3f(x-width/2, y+height/2, z+length/2)
rl.TexCoord2f((source.X+source.Width)/texWidth, (source.Y+source.Height)/texHeight)
rl.Vertex3f(x+width/2, y+height/2, z+length/2)
rl.TexCoord2f((source.X+source.Width)/texWidth, source.Y/texHeight)
rl.Vertex3f(x+width/2, y+height/2, z-length/2)
// Bottom face
rl.Normal3f(0.0, -1.0, 0.0)
rl.TexCoord2f((source.X+source.Width)/texWidth, source.Y/texHeight)
rl.Vertex3f(x-width/2, y-height/2, z-length/2)
rl.TexCoord2f(source.X/texWidth, source.Y/texHeight)
rl.Vertex3f(x+width/2, y-height/2, z-length/2)
rl.TexCoord2f(source.X/texWidth, (source.Y+source.Height)/texHeight)
rl.Vertex3f(x+width/2, y-height/2, z+length/2)
rl.TexCoord2f((source.X+source.Width)/texWidth, (source.Y+source.Height)/texHeight)
rl.Vertex3f(x-width/2, y-height/2, z+length/2)
// Right face
rl.Normal3f(1.0, 0.0, 0.0)
rl.TexCoord2f((source.X+source.Width)/texWidth, (source.Y+source.Height)/texHeight)
rl.Vertex3f(x+width/2, y-height/2, z-length/2)
rl.TexCoord2f((source.X+source.Width)/texWidth, source.Y/texHeight)
rl.Vertex3f(x+width/2, y+height/2, z-length/2)
rl.TexCoord2f(source.X/texWidth, source.Y/texHeight)
rl.Vertex3f(x+width/2, y+height/2, z+length/2)
rl.TexCoord2f(source.X/texWidth, (source.Y+source.Height)/texHeight)
rl.Vertex3f(x+width/2, y-height/2, z+length/2)
// Left face
rl.Normal3f(-1.0, 0.0, 0.0)
rl.TexCoord2f(source.X/texWidth, (source.Y+source.Height)/texHeight)
rl.Vertex3f(x-width/2, y-height/2, z-length/2)
rl.TexCoord2f((source.X+source.Width)/texWidth, (source.Y+source.Height)/texHeight)
rl.Vertex3f(x-width/2, y-height/2, z+length/2)
rl.TexCoord2f((source.X+source.Width)/texWidth, source.Y/texHeight)
rl.Vertex3f(x-width/2, y+height/2, z+length/2)
rl.TexCoord2f(source.X/texWidth, source.Y/texHeight)
rl.Vertex3f(x-width/2, y+height/2, z-length/2)
rl.End()
rl.SetTexture(0)
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

View file

@ -1,117 +0,0 @@
/*******************************************************************************************
*
* raylib [models] example - first person maze
*
* This example has been created using raylib-go v0.0.0-20220104071325-2f072dc2d259 (https://git.terah.dev/UnrealXR/raylib-go)
* raylib-go is licensed under an unmodified zlib/libpng license (https://git.terah.dev/UnrealXR/raylib-go/blob/master/LICENSE)
*
* Original C version for Raylib 2.5 Copyright (c) 2019 Ramon Santamaria (@raysan5)
* Converted to Go by Michael Redman January 4, 2022
*
********************************************************************************************/
package main
import (
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
func main() {
// Initialization
//--------------------------------------------------------------------------------------
var screenWidth int32 = 800
var screenHeight int32 = 450
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - first person maze")
// Define the camera to look into our 3d world
camera := rl.Camera{}
camera.Position = rl.NewVector3(0.2, 0.4, 0.2)
camera.Target = rl.NewVector3(0.0, 0.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0
camera.Projection = rl.CameraPerspective
imMap := rl.LoadImage("cubicmap.png") // Load cubicmap image (RAM)
cubicmap := rl.LoadTextureFromImage(imMap) // Convert image to texture to display (VRAM)
mesh := rl.GenMeshCubicmap(*imMap, rl.NewVector3(1.0, 1.0, 1.0))
model := rl.LoadModelFromMesh(mesh)
// NOTE: By default each cube is mapped to one part of texture atlas
texture := rl.LoadTexture("cubicmap_atlas.png") // load map texture
model.Materials.GetMap(rl.MapDiffuse).Texture = texture // Set map diffuse texture
// Get map image data to be used for collision detectio
mapPixels := rl.LoadImageColors(imMap)
rl.UnloadImage(imMap) // Unload image from RAM
mapPosition := rl.NewVector3(-16.0, 0.0, -8.0) // Set model position
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
// Main game loop
for !rl.WindowShouldClose() { // Detect window close button or ESC key
// Update
//----------------------------------------------------------------------------------
oldCamPos := camera.Position // Store old camera position
rl.UpdateCamera(&camera, rl.CameraFirstPerson) // Update camera with first person mode
// Check player collision (we simplify to 2D collision detection)
playerPos := rl.NewVector2(camera.Position.X, camera.Position.Z)
playerRadius := 0.1 // Collision radius (player is modelled as a cylinder for collision)
playerCellX := (int)(playerPos.X - mapPosition.X + 0.5)
playerCellY := (int)(playerPos.Y - mapPosition.Z + 0.5)
// Out-of-limits security check
if playerCellX < 0 {
playerCellX = 0
} else if playerCellX >= int(cubicmap.Width) {
playerCellX = int(cubicmap.Width) - 1
}
if playerCellY < 0 {
playerCellY = 0
} else if playerCellY >= int(cubicmap.Height) {
playerCellY = int(cubicmap.Height) - 1
}
// Check map collisions using image data and player position
// TODO: Improvement: Just check player surrounding cells for collision
for y := 0; y < int(cubicmap.Height); y++ {
for x := 0; x < int(cubicmap.Width); x++ {
// Collision: white pixel, only check R channel
if mapPixels[y*int(cubicmap.Width)+x].R == 255 && (rl.CheckCollisionCircleRec(playerPos, float32(playerRadius), rl.NewRectangle(float32(mapPosition.X-0.5+float32(x)), float32(mapPosition.Z-0.5+float32(y)), 1.0, 1.0))) {
// Collision detected, reset camera position
camera.Position = oldCamPos
}
}
}
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera)
rl.DrawModel(model, mapPosition, 1.0, rl.White) // Draw maze map
rl.EndMode3D()
rl.DrawTextureEx(cubicmap, rl.NewVector2(float32(rl.GetScreenWidth())-float32(cubicmap.Width)*4.0-20, 20.0), 0.0, 4.0, rl.White)
rl.DrawRectangleLines(int32(rl.GetScreenWidth())-cubicmap.Width*4-20, 20, cubicmap.Width*4, cubicmap.Height*4, rl.Green)
// Draw player position radar
rl.DrawRectangle(int32(rl.GetScreenWidth()-int(cubicmap.Width*4)-20+(playerCellX*4)), int32(20+playerCellY*4), 4, 4, rl.Red)
rl.DrawFPS(10, 10)
rl.EndDrawing()
//----------------------------------------------------------------------------------
}
// De-Initialization
//--------------------------------------------------------------------------------------
rl.UnloadTexture(cubicmap) // Unload cubicmap texture
rl.UnloadTexture(texture) // Unload map texture
rl.UnloadModel(model) // Unload map model
rl.CloseWindow() // Close window and OpenGL context
//--------------------------------------------------------------------------------------
}

View file

@ -1,48 +1,52 @@
package main package main
import (
"github.com/gen2brain/raylib-go/raylib"
)
func main() { func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - geometric shapes") raylib.InitWindow(screenWidth, screenHeight, "raylib [models] example - geometric shapes")
camera := rl.Camera{} camera := raylib.Camera{}
camera.Position = rl.NewVector3(0.0, 10.0, 10.0) camera.Position = raylib.NewVector3(0.0, 10.0, 10.0)
camera.Target = rl.NewVector3(0.0, 0.0, 0.0) camera.Target = raylib.NewVector3(0.0, 0.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) camera.Up = raylib.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0 camera.Fovy = 45.0
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.BeginMode3D(camera) raylib.BeginMode3D(camera)
rl.DrawCube(rl.NewVector3(-4.0, 0.0, 2.0), 2.0, 5.0, 2.0, rl.Red) raylib.DrawCube(raylib.NewVector3(-4.0, 0.0, 2.0), 2.0, 5.0, 2.0, raylib.Red)
rl.DrawCubeWires(rl.NewVector3(-4.0, 0.0, 2.0), 2.0, 5.0, 2.0, rl.Gold) raylib.DrawCubeWires(raylib.NewVector3(-4.0, 0.0, 2.0), 2.0, 5.0, 2.0, raylib.Gold)
rl.DrawCubeWires(rl.NewVector3(-4.0, 0.0, -2.0), 3.0, 6.0, 2.0, rl.Maroon) raylib.DrawCubeWires(raylib.NewVector3(-4.0, 0.0, -2.0), 3.0, 6.0, 2.0, raylib.Maroon)
rl.DrawSphere(rl.NewVector3(-1.0, 0.0, -2.0), 1.0, rl.Green) raylib.DrawSphere(raylib.NewVector3(-1.0, 0.0, -2.0), 1.0, raylib.Green)
rl.DrawSphereWires(rl.NewVector3(1.0, 0.0, 2.0), 2.0, 16, 16, rl.Lime) raylib.DrawSphereWires(raylib.NewVector3(1.0, 0.0, 2.0), 2.0, 16, 16, raylib.Lime)
rl.DrawCylinder(rl.NewVector3(4.0, 0.0, -2.0), 1.0, 2.0, 3.0, 4, rl.SkyBlue) raylib.DrawCylinder(raylib.NewVector3(4.0, 0.0, -2.0), 1.0, 2.0, 3.0, 4, raylib.SkyBlue)
rl.DrawCylinderWires(rl.NewVector3(4.0, 0.0, -2.0), 1.0, 2.0, 3.0, 4, rl.DarkBlue) raylib.DrawCylinderWires(raylib.NewVector3(4.0, 0.0, -2.0), 1.0, 2.0, 3.0, 4, raylib.DarkBlue)
rl.DrawCylinderWires(rl.NewVector3(4.5, -1.0, 2.0), 1.0, 1.0, 2.0, 6, rl.Brown) raylib.DrawCylinderWires(raylib.NewVector3(4.5, -1.0, 2.0), 1.0, 1.0, 2.0, 6, raylib.Brown)
rl.DrawCylinder(rl.NewVector3(1.0, 0.0, -4.0), 0.0, 1.5, 3.0, 8, rl.Gold) raylib.DrawCylinder(raylib.NewVector3(1.0, 0.0, -4.0), 0.0, 1.5, 3.0, 8, raylib.Gold)
rl.DrawCylinderWires(rl.NewVector3(1.0, 0.0, -4.0), 0.0, 1.5, 3.0, 8, rl.Pink) raylib.DrawCylinderWires(raylib.NewVector3(1.0, 0.0, -4.0), 0.0, 1.5, 3.0, 8, raylib.Pink)
rl.DrawGrid(10, 1.0) // Draw a grid raylib.DrawGrid(10, 1.0) // Draw a grid
rl.EndMode3D() raylib.EndMode3D()
rl.DrawFPS(10, 10) raylib.DrawFPS(10, 10)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,74 +0,0 @@
package main
import (
"fmt"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
func main() {
screenWidth := int32(1280)
screenHeight := int32(720)
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - gltf loading")
camera := rl.Camera{}
camera.Position = rl.NewVector3(5.0, 5.0, 5.0)
camera.Target = rl.NewVector3(0.0, 2.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0
camera.Projection = rl.CameraPerspective
model := rl.LoadModel("robot.glb")
animIndex := 0
animCurrentFrame := 0
modelAnims := rl.LoadModelAnimations("robot.glb")
position := rl.NewVector3(0, 0, 0)
rl.DisableCursor()
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
rl.UpdateCamera(&camera, rl.CameraOrbital)
if rl.IsKeyPressed(rl.KeyUp) {
animIndex++
if animIndex >= len(modelAnims) {
animIndex = 0
}
}
if rl.IsKeyPressed(rl.KeyDown) {
animIndex--
if animIndex < 0 {
animIndex = len(modelAnims) - 1
}
}
animPlaying := modelAnims[animIndex]
animCurrentFrame = (animCurrentFrame + 1) % int(animPlaying.FrameCount)
rl.UpdateModelAnimation(model, animPlaying, int32(animCurrentFrame))
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera)
rl.DrawModel(model, position, 0.8, rl.White)
rl.EndMode3D()
rl.DrawText(fmt.Sprintf("current animation: %s [%d]", animPlaying.GetName(), animIndex), 10, 10, 10, rl.Black)
rl.DrawText("UP/DOWN ARROW KEYS CHANGE ANIMATION", 10, 30, 10, rl.Black)
rl.EndDrawing()
}
rl.UnloadModel(model)
rl.CloseWindow()
}

View file

@ -1,66 +1,65 @@
package main package main
import ( import (
//"fmt" "github.com/gen2brain/raylib-go/raylib"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - heightmap loading and drawing") raylib.InitWindow(screenWidth, screenHeight, "raylib [models] example - heightmap loading and drawing")
camera := rl.Camera{} camera := raylib.Camera{}
camera.Position = rl.NewVector3(18.0, 16.0, 18.0) camera.Position = raylib.NewVector3(18.0, 16.0, 18.0)
camera.Target = rl.NewVector3(0.0, 0.0, 0.0) camera.Target = raylib.NewVector3(0.0, 0.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) camera.Up = raylib.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0 camera.Fovy = 45.0
image := rl.LoadImage("heightmap.png") // Load heightmap image (RAM) image := raylib.LoadImage("heightmap.png") // Load heightmap image (RAM)
texture := rl.LoadTextureFromImage(image) // Convert image to texture (VRAM) texture := raylib.LoadTextureFromImage(image) // Convert image to texture (VRAM)
mesh := rl.GenMeshHeightmap(*image, rl.NewVector3(16, 8, 16)) // Generate heightmap mesh (RAM and VRAM) mesh := raylib.GenMeshHeightmap(*image, raylib.NewVector3(16, 8, 16)) // Generate heightmap mesh (RAM and VRAM)
model := rl.LoadModelFromMesh(mesh) // Load model from generated mesh model := raylib.LoadModelFromMesh(mesh) // Load model from generated mesh
rl.SetMaterialTexture(model.Materials, rl.MapDiffuse, texture) // Set map diffuse texture model.Material.Maps[raylib.MapDiffuse].Texture = texture // Set map diffuse texture
mapPosition := raylib.NewVector3(-8.0, 0.0, -8.0) // Set model position
mapPosition := rl.NewVector3(-8.0, 0.0, -8.0) // Set model position raylib.UnloadImage(image) // Unload heightmap image from RAM, already uploaded to VRAM
rl.UnloadImage(image) // Unload heightmap image from RAM, already uploaded to VRAM raylib.SetCameraMode(camera, raylib.CameraOrbital) // Set an orbital camera mode
rl.SetTargetFPS(60) raylib.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !raylib.WindowShouldClose() {
// Update // Update
rl.UpdateCamera(&camera, rl.CameraOrbital) // Update camera with orbital camera mode raylib.UpdateCamera(&camera) // Update camera
// Draw // Draw
rl.BeginDrawing() raylib.BeginDrawing()
rl.ClearBackground(rl.RayWhite) raylib.ClearBackground(raylib.RayWhite)
rl.BeginMode3D(camera) raylib.BeginMode3D(camera)
rl.DrawModel(model, mapPosition, 1.0, rl.Red) raylib.DrawModel(model, mapPosition, 1.0, raylib.Red)
rl.DrawGrid(20, 1.0) raylib.DrawGrid(20, 1.0)
rl.EndMode3D() raylib.EndMode3D()
rl.DrawTexture(texture, screenWidth-texture.Width-20, 20, rl.White) raylib.DrawTexture(texture, screenWidth-texture.Width-20, 20, raylib.White)
rl.DrawRectangleLines(screenWidth-texture.Width-20, 20, texture.Width, texture.Height, rl.Green) raylib.DrawRectangleLines(screenWidth-texture.Width-20, 20, texture.Width, texture.Height, raylib.Green)
rl.DrawFPS(10, 10) raylib.DrawFPS(10, 10)
rl.EndDrawing() raylib.EndDrawing()
} }
rl.UnloadTexture(texture) // Unload map texture raylib.UnloadTexture(texture) // Unload map texture
rl.UnloadModel(model) // Unload map model raylib.UnloadModel(model) // Unload map model
rl.CloseWindow() raylib.CloseWindow()
} }

View file

@ -1,155 +0,0 @@
/*******************************************************************************************
*
* raylib [models] example - Load models M3D
*
* Example originally created with raylib 4.5, last time updated with raylib 4.5
*
* Example contributed by bzt (@bztsrc) and reviewed by Ramon Santamaria (@raysan5)
*
* NOTES:
* - Model3D (M3D) fileformat specs: https://gitlab.com/bztsrc/model3d
* - Bender M3D exported: https://gitlab.com/bztsrc/model3d/-/tree/master/blender
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2022-2024 bzt (@bztsrc)
*
********************************************************************************************/
package main
import (
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
)
func main() {
// Initialization
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - M3D model loading")
// Define the camera to look into our 3d world
camera := rl.Camera{
Position: rl.NewVector3(1.5, 1.5, 1.5),
Target: rl.NewVector3(0.0, 0.4, 0.0),
Up: rl.NewVector3(0.0, 1.0, 0.0),
Fovy: 45.0,
Projection: rl.CameraPerspective,
}
position := rl.NewVector3(0.0, 0.0, 0.0)
modelFileName := "cesium_man.m3d"
drawMesh := true
drawSkeleton := true
animPlaying := false // Store anim state, what to draw
// Load model
model := rl.LoadModel(modelFileName)
// Load animations
animFrameCounter := 0
animID := 0
anims := rl.LoadModelAnimations(modelFileName)
animsCount := int32(len(anims))
rl.DisableCursor()
rl.SetTargetFPS(60)
// Main game loop
for !rl.WindowShouldClose() {
// Update
rl.UpdateCamera(&camera, rl.CameraFirstPerson)
if animsCount > 0 {
// Play animation when space bar is held down (or step one frame with N)
if rl.IsKeyDown(rl.KeySpace) || rl.IsKeyPressed(rl.KeyN) {
animFrameCounter++
if animFrameCounter >= int(anims[animID].FrameCount) {
animFrameCounter = 0
}
rl.UpdateModelAnimation(model, anims[animID], int32(animFrameCounter))
animPlaying = true
}
// Select animation by pressing C
if rl.IsKeyPressed(rl.KeyC) {
animFrameCounter = 0
animID++
if animID >= int(animsCount) {
animID = 0
}
rl.UpdateModelAnimation(model, anims[animID], 0)
animPlaying = true
}
}
// Toggle skeleton drawing
if rl.IsKeyPressed(rl.KeyB) {
drawSkeleton = !drawSkeleton
}
// Toggle mesh drawing
if rl.IsKeyPressed(rl.KeyM) {
drawMesh = !drawMesh
}
// Draw
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera)
// Draw 3d model with texture
if drawMesh {
rl.DrawModel(model, position, 1.0, rl.White)
}
// Draw the animated skeleton
if drawSkeleton {
modelBones := model.GetBones()
modelPoses := model.GetBindPose()
anim := anims[animID]
animBones := anim.GetBones()
for bone := 0; bone < int(model.BoneCount)-1; bone++ {
if !animPlaying || animsCount == 0 {
// Display the bind-pose skeleton
rl.DrawCube(modelPoses[bone].Translation, 0.04, 0.04, 0.04, rl.Red)
if modelBones[bone].Parent >= 0 {
rl.DrawLine3D(modelPoses[bone].Translation, modelPoses[modelBones[bone].Parent].Translation, rl.Red)
}
} else {
// // Display the frame-pose skeleton
pos := anim.GetFramePose(animFrameCounter, bone).Translation
rl.DrawCube(pos, 0.05, 0.05, 0.05, rl.Red)
if animBones[bone].Parent >= 0 {
endPos := anim.GetFramePose(animFrameCounter, int(animBones[bone].Parent)).Translation
rl.DrawLine3D(pos, endPos, rl.Red)
}
}
}
}
rl.DrawGrid(10, 1.0)
rl.EndMode3D()
rl.DrawText("PRESS SPACE to PLAY MODEL ANIMATION", 10, screenHeight-80, 10, rl.Maroon)
rl.DrawText("PRESS N to STEP ONE ANIMATION FRAME", 10, screenHeight-60, 10, rl.DarkGray)
rl.DrawText("PRESS C to CYCLE THROUGH ANIMATIONS", 10, screenHeight-40, 10, rl.DarkGray)
rl.DrawText("PRESS M to toggle MESH, B to toggle SKELETON DRAWING", 10, screenHeight-20, 10, rl.DarkGray)
rl.DrawText("(c) CesiumMan model by KhronosGroup", screenWidth-210, screenHeight-20, 10, rl.Gray)
rl.EndDrawing()
}
// De-Initialization
rl.UnloadModelAnimations(anims)
rl.UnloadModel(model)
rl.CloseWindow()
}

View file

@ -1,167 +0,0 @@
package main
import (
"unsafe"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
func main() {
screenWidth := int32(1280)
screenHeight := int32(720)
numModels := 9
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - mesh generation")
camera := rl.Camera{}
camera.Position = rl.NewVector3(10.0, 5.0, 10.0)
camera.Target = rl.NewVector3(0.0, 0.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 45.0
camera.Projection = rl.CameraPerspective
checked := rl.GenImageChecked(2, 2, 1, 1, rl.Black, rl.Red)
texture := rl.LoadTextureFromImage(checked)
rl.UnloadImage(checked)
models := make([]rl.Model, numModels)
models[0] = rl.LoadModelFromMesh(rl.GenMeshPlane(2, 2, 4, 3))
models[1] = rl.LoadModelFromMesh(rl.GenMeshCube(2, 1, 2))
models[2] = rl.LoadModelFromMesh(rl.GenMeshSphere(2, 32, 32))
models[3] = rl.LoadModelFromMesh(rl.GenMeshHemiSphere(2, 16, 16))
models[4] = rl.LoadModelFromMesh(rl.GenMeshCylinder(1, 2, 16))
models[5] = rl.LoadModelFromMesh(rl.GenMeshTorus(0.25, 4, 16, 32))
models[6] = rl.LoadModelFromMesh(rl.GenMeshKnot(1, 2, 16, 128))
models[7] = rl.LoadModelFromMesh(rl.GenMeshPoly(5, 2))
models[8] = rl.LoadModelFromMesh(GenMeshCustom())
for i := 0; i < numModels; i++ {
rl.SetMaterialTexture(models[i].Materials, rl.MapDiffuse, texture)
}
position := rl.Vector3Zero()
currentModel := 0
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
rl.UpdateCamera(&camera, rl.CameraOrbital)
if rl.IsKeyPressed(rl.KeyUp) {
currentModel = (currentModel + 1) % numModels // Cycle between the textures
}
if rl.IsKeyPressed(rl.KeyDown) {
// Adding numModels here is necessary to avoid a crash
// where the golang % (modulus) operator, doesn't work as
// one might expect for negative numbers.
currentModel = (currentModel + numModels - 1) % numModels // Cycle between the textures
}
if rl.IsMouseButtonPressed(rl.MouseButtonLeft) {
currentModel = (currentModel + 1) % numModels // Cycle between the textures
}
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera)
rl.DrawModel(models[currentModel], position, 1, rl.White)
rl.DrawGrid(10, 1)
rl.EndMode3D()
rl.DrawRectangle(10, 10, 310, 50, rl.Fade(rl.SkyBlue, 0.5))
rl.DrawRectangleLines(10, 10, 310, 50, rl.Fade(rl.DarkBlue, 0.5))
rl.DrawText("UP/DOWN ARROW KEY OR LEFT MOUSE", 20, 20, 10, rl.Blue)
rl.DrawText("BUTTON TO CHANGE MODELS", 20, 40, 10, rl.Blue)
txt := "PLANE"
switch currentModel {
case 1:
txt = "CUBE"
case 2:
txt = "SPHERE"
case 3:
txt = "HEMISPHERE"
case 4:
txt = "CYLINDER"
case 5:
txt = "TORUS"
case 6:
txt = "KNOT"
case 7:
txt = "POLY"
case 8:
txt = "Custom (triangle)"
}
txtlen := rl.MeasureText(txt, 20)
rl.DrawText(txt, screenWidth/2-txtlen/2, 10, 20, rl.DarkBlue)
rl.EndDrawing()
}
rl.UnloadTexture(texture)
// Custom models meshes needs to be
// cleared manually
clearCustomMesh(models[8])
for i := 0; i < numModels; i++ {
rl.UnloadModel(models[i])
}
rl.CloseWindow()
}
func clearCustomMesh(model rl.Model) {
// Vertices, Normals and Texcoords of your CUSTOM mesh are Go slices.
// UnloadModel calls UnloadMesh for every mesh and UnloadMesh tries
// to free your Go slices. This will panic because it cannot free
// Go slices. Free() is a C function and it expects to free C memory
// and not a Go slice. So clear the slices manually like this.
model.Meshes.Vertices = nil
model.Meshes.Normals = nil
model.Meshes.Texcoords = nil
}
// GenMeshCustom generates a simple triangle mesh from code
func GenMeshCustom() rl.Mesh {
mesh := rl.Mesh{
TriangleCount: 1,
VertexCount: 3,
}
var vertices, normals, texcoords []float32
// 3 vertices
vertices = addCoord(vertices, 0, 0, 0)
vertices = addCoord(vertices, 1, 0, 2)
vertices = addCoord(vertices, 2, 0, 0)
mesh.Vertices = unsafe.SliceData(vertices)
// 3 normals
normals = addCoord(normals, 0, 1, 0)
normals = addCoord(normals, 0, 1, 0)
normals = addCoord(normals, 0, 1, 0)
mesh.Normals = unsafe.SliceData(normals)
// 3 texcoords
texcoords = addCoord(texcoords, 0, 0)
texcoords = addCoord(texcoords, 0.5, 1)
texcoords = addCoord(texcoords, 1, 0)
mesh.Texcoords = unsafe.SliceData(texcoords)
// Upload mesh data from CPU (RAM) to GPU (VRAM) memory
rl.UploadMesh(&mesh, false)
return mesh
}
func addCoord(slice []float32, values ...float32) []float32 {
for _, value := range values {
slice = append(slice, value)
}
return slice
}

View file

@ -1,261 +0,0 @@
/*******************************************************************************************
*
* raylib [models] example - Mesh picking in 3d mode, ground plane, triangle, mesh
*
* Example originally created with raylib 1.7, last time updated with raylib 4.0
*
* Example contributed by Joel Davis (@joeld42) and reviewed by Ramon Santamaria (@raysan5)
*
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software
*
* Copyright (c) 2017-2024 Joel Davis (@joeld42) and Ramon Santamaria (@raysan5)
*
********************************************************************************************/
package main
import (
"fmt"
"math"
"unsafe"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
)
// Program main entry point
func main() {
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - mesh picking")
// Define the camera to look into our 3d world
camera := rl.Camera{
Position: rl.Vector3{
X: 20.0,
Y: 20.0,
Z: 20.0,
}, // Camera position
Target: rl.Vector3{Y: 8.0}, // Camera looking at point
Up: rl.Vector3{Y: 1.6}, // Camera up vector (rotation towards target)
Fovy: 45.0, // Camera field-of-view Y
Projection: rl.CameraPerspective, // Camera projection type
}
var ray rl.Ray // Picking ray
tower := rl.LoadModel("turret.obj") // Load OBJ model
texture := rl.LoadTexture("turret_diffuse.png") // Load model texture
materials := unsafe.Slice(tower.Materials, tower.MaterialCount)
materials[0].GetMap(rl.MapDiffuse).Texture = texture // Set model diffuse texture
towerPos := rl.Vector3{} // Set model position
meshes := unsafe.Slice(tower.Meshes, tower.MeshCount)
towerBBox := rl.GetMeshBoundingBox(meshes[0]) // Get mesh bounding box
// Ground quad
g0 := rl.Vector3{
X: -50.0,
Z: -50.0,
}
g1 := rl.Vector3{
X: -50.0,
Z: 50.0,
}
g2 := rl.Vector3{
X: 50.0,
Z: 50.0,
}
g3 := rl.Vector3{
X: 50.0,
Z: -50.0,
}
// Test triangle
ta := rl.Vector3{
X: -25.0,
Y: 0.5,
}
tb := rl.Vector3{
X: -4.0,
Y: 2.5,
Z: 1.0,
}
tc := rl.Vector3{
X: -8.0,
Y: 6.5,
}
bary := rl.Vector3{}
// Test sphere
sp := rl.Vector3{
X: -30.0,
Y: 5.0,
Z: 5.0,
}
sr := float32(4.0)
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
// Main game loop
for !rl.WindowShouldClose() { // Detect window close button or ESC key
// Update
if rl.IsCursorHidden() {
rl.UpdateCamera(&camera, rl.CameraFirstPerson) // Update camera
}
// Toggle camera controls
if rl.IsMouseButtonPressed(rl.MouseButtonRight) {
if rl.IsCursorHidden() {
rl.EnableCursor()
} else {
rl.DisableCursor()
}
}
// Display information about the closest hit
collision := rl.RayCollision{
Distance: math.MaxFloat32,
Hit: false,
}
hitObjectName := "None"
cursorColor := rl.White
// Get ray and test against objects
// See issue : https://git.terah.dev/UnrealXR/raylib-go/issues/457
//ray = rl.GetScreenToWorldRay(rl.GetMousePosition(), camera)
ray = rl.GetMouseRay(rl.GetMousePosition(), camera)
// Check ray collision against ground quad
groundHitInfo := rl.GetRayCollisionQuad(ray, g0, g1, g2, g3)
if (groundHitInfo.Hit) && (groundHitInfo.Distance < collision.Distance) {
collision = groundHitInfo
cursorColor = rl.Green
hitObjectName = "Ground"
}
// Check ray collision against test triangle
triHitInfo := rl.GetRayCollisionTriangle(ray, ta, tb, tc)
if (triHitInfo.Hit) && (triHitInfo.Distance < collision.Distance) {
collision = triHitInfo
cursorColor = rl.Purple
hitObjectName = "Triangle"
bary = rl.Vector3Barycenter(collision.Point, ta, tb, tc)
}
// Check ray collision against test sphere
sphereHitInfo := rl.GetRayCollisionSphere(ray, sp, sr)
if (sphereHitInfo.Hit) && (sphereHitInfo.Distance < collision.Distance) {
collision = sphereHitInfo
cursorColor = rl.Orange
hitObjectName = "Sphere"
}
// Check ray collision against bounding box first, before trying the full ray-mesh test
boxHitInfo := rl.GetRayCollisionBox(ray, towerBBox)
if (boxHitInfo.Hit) && (boxHitInfo.Distance < collision.Distance) {
collision = boxHitInfo
cursorColor = rl.Orange
hitObjectName = "Box"
// Check ray collision against model meshes
meshHitInfo := rl.RayCollision{}
for m := int32(0); m < tower.MeshCount; m++ {
// NOTE: We consider the model.transform for the collision check, but
// it can be checked against any transform Matrix, used when checking against same
// model drawn multiple times with multiple transforms
meshHitInfo = rl.GetRayCollisionMesh(ray, meshes[m], tower.Transform)
if meshHitInfo.Hit {
// Save the closest hit mesh
if (!collision.Hit) || (collision.Distance > meshHitInfo.Distance) {
collision = meshHitInfo
}
break // Stop once one mesh collision is detected, the colliding mesh is m
}
}
if meshHitInfo.Hit {
collision = meshHitInfo
cursorColor = rl.Orange
hitObjectName = "Mesh"
}
}
// Draw
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera)
// Draw the tower
// WARNING: If scale is different from 1.0f,
// not considered by GetRayCollisionModel()
rl.DrawModel(tower, towerPos, 1.0, rl.White)
// Draw the test triangle
rl.DrawLine3D(ta, tb, rl.Purple)
rl.DrawLine3D(tb, tc, rl.Purple)
rl.DrawLine3D(tc, ta, rl.Purple)
// Draw the test sphere
rl.DrawSphereWires(sp, sr, 8, 8, rl.Purple)
// Draw the mesh bbox if we hit it
if boxHitInfo.Hit {
rl.DrawBoundingBox(towerBBox, rl.Lime)
}
// If we hit something, draw the cursor at the hit point
if collision.Hit {
rl.DrawCube(collision.Point, 0.3, 0.3, 0.3, cursorColor)
rl.DrawCubeWires(collision.Point, 0.3, 0.3, 0.3, rl.Red)
normalEnd := rl.Vector3{}
normalEnd.X = collision.Point.X + collision.Normal.X
normalEnd.Y = collision.Point.Y + collision.Normal.Y
normalEnd.Z = collision.Point.Z + collision.Normal.Z
rl.DrawLine3D(collision.Point, normalEnd, rl.Red)
}
rl.DrawRay(ray, rl.Maroon)
rl.DrawGrid(10, 10.0)
rl.EndMode3D()
// Draw some debug GUI text
rl.DrawText(fmt.Sprintf("Hit Object: %s", hitObjectName), 10, 50, 10, rl.Black)
if collision.Hit {
ypos := int32(70)
rl.DrawText(fmt.Sprintf("Distance: %3.2f", collision.Distance), 10, ypos, 10, rl.Black)
rl.DrawText(Vec2Str("Hit Pos : %3.2f %3.2f %3.2f", collision.Point), 10, ypos+15, 10, rl.Black)
rl.DrawText(Vec2Str("Hit Norm: %3.2f %3.2f %3.2f", collision.Normal), 10, ypos+30, 10, rl.Black)
if triHitInfo.Hit && hitObjectName == "Triangle" {
rl.DrawText(Vec2Str("Barycenter: %3.2f %3.2f %3.2f", bary), 10, ypos+45, 10, rl.Black)
}
}
rl.DrawText("Right click mouse to toggle camera controls", 10, 430, 10, rl.Gray)
rl.DrawText("(c) Turret 3D model by Alberto Cano", screenWidth-200, screenHeight-20, 10, rl.Gray)
rl.DrawFPS(10, 10)
rl.EndDrawing()
}
// De-Initialization
rl.UnloadModel(tower) // Unload model
rl.UnloadTexture(texture) // Unload texture
rl.CloseWindow() // Close window and OpenGL context
}
func Vec2Str(format string, vec rl.Vector3) string {
return fmt.Sprintf(format, vec.X, vec.Y, vec.Z)
}

Some files were not shown because too many files have changed in this diff Show more