Compare commits

...

372 commits

Author SHA1 Message Date
1468af2636 chore: Update README with notice of the fork status and build tags 2025-06-22 20:27:39 -04:00
d63f1b19df
chore: Fix module path 2025-06-22 17:48:18 -04:00
45473d7240
feature: Add DRM leasing code 2025-06-22 17:41:05 -04:00
3df816e2bf
chore: Remove broken CI workflows 2025-06-22 17:40:19 -04:00
d707d9e51c
chore: Initial attempt to migrate workflows
Some checks failed
Build / test-rgfw (1.21.x, docker) (push) Has been cancelled
Build / test-purego (1.21.x, docker) (push) Has been cancelled
Build / test-examples (1.21.x, docker) (push) Has been cancelled
Build / test-sdl (1.21.x, docker) (push) Has been cancelled
Build / test (1.21.x, docker) (push) Has been cancelled
Build / test-drm (1.21.x, docker) (push) Has been cancelled
2025-06-21 13:32:42 -04:00
bc3da009ef
fix: Fixes image URL
Some checks are pending
Build / test-rgfw (1.21.x, windows-latest) (push) Waiting to run
Build / test-purego (1.21.x, ubuntu-latest) (push) Waiting to run
Build / test-examples (1.21.x, ubuntu-latest) (push) Waiting to run
Build / test (1.21.x, macos-latest) (push) Waiting to run
Build / test (1.21.x, ubuntu-latest) (push) Waiting to run
Build / test (1.21.x, windows-latest) (push) Waiting to run
Build / test-drm (1.21.x, ubuntu-latest) (push) Waiting to run
Build / test-sdl (1.21.x, ubuntu-latest) (push) Waiting to run
Build / test-rgfw (1.21.x, macos-latest) (push) Waiting to run
Build / test-rgfw (1.21.x, ubuntu-latest) (push) Waiting to run
2025-06-21 13:24:38 -04:00
Milan Nikolic
eddd038123
Update README.md 2025-06-17 21:43:46 +02:00
Milan Nikolic
6039070d78
Merge pull request #505 from JupiterRider/raygui_return_values
raygui: fix Spinner() return value and fix possible misuse of unsafe.Pointer
2025-06-17 19:41:27 +02:00
JupiterRider
9a87dd6d60 raygui: Spinner returns true if clicked #503 2025-06-17 17:48:13 +02:00
JupiterRider
7e9246c069 raygui/cstring.go: "fix" possible misuse of unsafe.Pointer 2025-06-17 17:47:09 +02:00
Milan Nikolic
5d704708c4
Update bunnymark, issue #480 2025-06-09 19:36:06 +02:00
Milan Nikolic
3327fcaf9f
Update C sources 2025-06-09 15:53:56 +02:00
Milan Nikolic
e08c4cd054
Remove rres 2025-06-09 15:53:08 +02:00
Milan Nikolic
fca3bf26c5
Merge pull request #500 from lloydlobo/lloydlobo/examples-vertex-displacement
[examples] Add shader example: `vertex_displacement`
2025-05-21 23:03:03 +02:00
Lloyd Lobo
1d42dc5846 docs(examples): remove screenshot and screen recording artifacts
- remove screenshot PNG
- remove screenrec GIF
2025-05-18 15:02:12 +05:30
Lloyd Lobo
0380afdf21 docs(examples): create vertex_displacement example 2025-05-18 11:44:24 +05:30
Milan Nikolic
e6017e5fc4
Merge pull request #497 from SunnyFuji/patch-1
Create main.go
2025-05-04 04:26:11 +02:00
Milan Nikolic
5ca0e770e3
Merge pull request #486 from mohsengreen1388/pbr-example
example: I can add physic base render to example
2025-05-04 04:25:48 +02:00
SunnyFuji
761bde1e61
Create main.go
I created a pong Game and would like to submit it to the examples catalogue. I have debugged it and the only external dependencies are this projects and fmt.
2025-04-19 14:35:50 -05:00
Milan Nikolic
a4292f0f04
Merge pull request #495 from thearturca/feat/unload-sound-alias
feat(raylib): adds UnloadSoundAlias function
2025-04-09 07:28:54 +02:00
thearturca
ce20f0c639 feat(raylib): adds UnloadSoundAlias function
docs(raudio): adds function name to UnloadSoundAlias comment
2025-03-31 10:59:58 +03:00
Milan Nikolic
b542022337
Merge pull request #493 from jroimartin/wave-ptr
Change `WaveFormat` and `WaveCrop` signatures to accept a pointer to `Wave`
2025-03-27 11:37:58 +01:00
Roi Martin
705f704ecf Change WaveFormat and WaveCrop signatures to accept a pointer to Wave
The raylib functions `WaveFormat` and `WaveCrop` accept a pointer to
`Wave` because the wave is updated in-place. However, the current Go
bindings pass a copy of the wave to the C functions, so it is not
updated. This commit changes the signatures of the Go API so they also
accept a pointer to `Wave`.
2025-03-27 09:12:54 +01:00
Milan Nikolic
db8e47f0e5
Merge pull request #489 from JupiterRider/missing_rlgl_constants
missing constants from RLGL added
2025-02-15 05:22:52 +01:00
JupiterRider
3fd9012394 missing constants from RLGL added (fixes #488) 2025-02-14 22:42:09 +01:00
Mohsen Baghri
960a135c15 example: I can add physic base render to example 2025-01-26 21:57:23 +03:30
Milan Nikolic
6dbba4f81a
Merge pull request #484 from geo-stark/master
Add GetClipboardImage for drm platform.
2025-01-09 18:28:33 +01:00
George Stark
e31988d117 Add GetClipboardImage for drm platform.
Signed-off-by: George Stark <stark.georgy@gmail.com>
2025-01-09 19:07:59 +03:00
Milan Nikolic
d58ffe1a3a
Merge pull request #479 from sugarvoid/master
Add return value to `LoadTextureDepth`
2024-12-28 13:07:19 +01:00
sugarvoid
ff0ecd0e76 Add return value in rlgl_purego.go 2024-12-28 05:23:49 -06:00
sugarvoid
8e035f761c Add return value to LoadTextureDepth 2024-12-27 07:59:46 -06:00
Milan Nikolic
453bad2769
Merge pull request #477 from JupiterRider/rgfw_rumble
rcore_desktop_rgfw.c SetGamepadVibration added
2024-12-17 19:56:05 +01:00
JupiterRider
2040136e38 rcore_desktop_rgfw.c SetGamepadVibration added 2024-12-17 19:42:54 +01:00
Milan Nikolic
edb2c107b3
Merge pull request #476 from Alireza-Ta/android_enhancement
Android Compilation Enhancement
2024-12-17 12:51:49 +01:00
Milan Nikolic
078d0bec34
Merge pull request #475 from JupiterRider/audiostream_processor
fix purego version of DetachAudioStreamProcessor and DetachAudioMixedProcessor
2024-12-17 12:51:40 +01:00
Alireza-Ta
5dad257e8d Update androidcompile.bat file with minor tweaks. 2024-12-17 14:54:04 +03:30
Alireza-Ta
8490a60f72 Add GetClipboardImage for android platform. 2024-12-17 11:09:31 +03:30
JupiterRider
5868292fd5 fix purego version of DetachAudioStreamProcessor and DetachAudioMixedProcessor #425 2024-12-15 18:19:57 +01:00
Milan Nikolic
7a899c5e3a
Merge pull request #474 from JupiterRider/model_animation
ModelAnimation improvements
2024-12-15 05:38:39 +01:00
JupiterRider
c301540ef5 gltf_loading example shows the name of the current animation now 2024-12-14 22:04:59 +01:00
JupiterRider
041142d30c update another ModelAnimation example 2024-12-14 21:57:46 +01:00
JupiterRider
46524a8c46 Update examples for #466 2024-12-14 21:47:37 +01:00
JupiterRider
533c35110b ModelAnimation.GetName() added 2024-12-14 21:26:58 +01:00
JupiterRider
dce94f509d ModelAnimation.GetFramePose() added #466 2024-12-14 21:15:08 +01:00
JupiterRider
98ce816ab8 ModelAnimation.GetBones() added #466 2024-12-14 20:19:05 +01:00
Milan Nikolic
a9ad86d501
Update wayland headers 2024-12-07 12:43:08 +01:00
Milan Nikolic
659b0700ba
Add support for vendor 2024-12-07 11:37:19 +01:00
Milan Nikolic
3b89a24e68
Update README.md 2024-12-03 10:19:12 +01:00
Milan Nikolic
28ef2a891c
Update README.md 2024-12-03 09:25:44 +01:00
Milan Nikolic
b6bb8ec528
Export Wave data, issue #402 2024-12-03 09:17:34 +01:00
Milan Nikolic
ea071de5c2
Add support for SDL3 2024-12-03 09:06:39 +01:00
Milan Nikolic
5df9325f63
Add wayland build tag, issue #404 2024-12-03 08:00:59 +01:00
Milan Nikolic
aef24a2104
Update README.md 2024-12-03 07:15:50 +01:00
Milan Nikolic
c4ef7b53e9
Merge pull request #470 from Hultan/draw_cube_texture
New example: models/draw_cube_textured
2024-12-03 07:13:53 +01:00
Milan Nikolic
b6d58c5ba6
Merge pull request #469 from Hultan/yaw_pitch_roll
New example: models/yaw_pitch_roll
2024-12-03 07:13:38 +01:00
Milan Nikolic
db948137ee
Merge pull request #468 from Hultan/rlgl_solar_system
Models/rlgl_solar_system example
2024-12-03 07:13:24 +01:00
Milan Nikolic
04c9cea61b
Update modules 2024-12-02 11:59:55 +01:00
Milan Nikolic
8b5f8fe6bb
Update modules, issue #473 2024-12-02 11:54:24 +01:00
Milan Nikolic
a7ac43847a
Update modules 2024-12-02 11:45:37 +01:00
Milan Nikolic
4c05c52a4b
Update modules 2024-12-02 11:42:54 +01:00
Milan Nikolic
5d50abe7c6
Merge pull request #472 from JupiterRider/raylib_55
WIP: Update to raylib 5.5
2024-12-02 11:36:52 +01:00
JupiterRider
5ed790526c use android_run() 2024-11-29 19:45:51 +01:00
JupiterRider
c3489ebef8 fix "warning: 'ALIGN' macro redefined" on MacOS (same as 5943b16bad) 2024-11-29 19:28:34 +01:00
JupiterRider
4c9f2e5dd7 rlgl: rlSetUniform, rlSetUniformMatrix and rlSetUniformMatrices added 2024-11-29 18:43:53 +01:00
JupiterRider
574299012d rlgl: update rlLoadFramebuffer 2024-11-29 18:15:42 +01:00
JupiterRider
de01649968 rlgl: rlColorMask added 2024-11-29 18:01:24 +01:00
JupiterRider
e5537960f0 rlgl: rlBlitFramebuffer and rlBindFramebuffer added 2024-11-29 17:56:43 +01:00
JupiterRider
f10c42c14e rlgl: rlGetActiveFramebuffer added 2024-11-29 17:46:31 +01:00
JupiterRider
5d9fdd5313 rlgl: rlSetClipPlanes, rlGetCullDistanceNear and rlGetCullDistanceFar added 2024-11-29 17:42:27 +01:00
JupiterRider
692079f471 fix drm build (see 8a207901da) 2024-11-24 17:07:33 +01:00
JupiterRider
d054bd9043 LoadImageAnim functions: frames is a pointer, not a slice 2024-11-24 16:44:22 +01:00
JupiterRider
ffc0ab4fc6 fix GetScreenToWorldRay* cgo functions 2024-11-24 16:29:48 +01:00
JupiterRider
9e7c7db0ec fix "cannot use v (variable of type *Image) as Image value in return statement" 2024-11-24 16:29:09 +01:00
JupiterRider
aee70123d7 Additional ShaderUniformDataType constants + description added 2024-11-24 16:20:45 +01:00
JupiterRider
ccc9ef8662 rlgl: VertexBuffer has new field + descriptions added 2024-11-24 16:11:50 +01:00
JupiterRider
b922049f3b IsAudioStreamReady has been renamed 2024-11-24 16:02:37 +01:00
JupiterRider
24323485a0 IsMusicReady has been renamed 2024-11-24 16:00:10 +01:00
JupiterRider
0c2506a3cd WaveCrop parameters renamed 2024-11-24 15:58:13 +01:00
JupiterRider
3282ea28f2 IsSoundReady has been renamed 2024-11-24 15:54:51 +01:00
JupiterRider
f3553fea29 IsWaveReady has been renamed 2024-11-24 15:53:01 +01:00
JupiterRider
b09e22b6ad UpdateModelAnimationBones function added 2024-11-24 15:49:58 +01:00
JupiterRider
493260d376 IsMaterialReady has been renamed 2024-11-24 15:45:49 +01:00
JupiterRider
c9a7c5c130 DrawModelPoints() and DrawModelPointsEx() added 2024-11-24 15:43:30 +01:00
JupiterRider
22bfaf1652 DrawBillboard: size is scale 2024-11-24 15:35:41 +01:00
JupiterRider
47bd3b9420 IsModelReady has been renamed 2024-11-24 15:24:23 +01:00
JupiterRider
1d2d8d9350 IsFontReady has been renamed 2024-11-24 15:21:12 +01:00
JupiterRider
9d16da4548 ColorLerp function added 2024-11-24 15:00:38 +01:00
JupiterRider
090dbf62ef ColorToInt() comment updated 2024-11-24 14:49:41 +01:00
JupiterRider
36259e95a7 IsRenderTextureReady 2024-11-24 14:47:02 +01:00
JupiterRider
8d97c05afb IsRenderTextureReady has been renamed 2024-11-24 14:46:58 +01:00
JupiterRider
dbf9ed2bff IsTextureReady has been renamed 2024-11-24 14:44:41 +01:00
JupiterRider
d81d956c18 ImageDrawTriangle*-functions added 2024-11-24 14:41:13 +01:00
JupiterRider
07d2a6efde ImageDrawLineEx function added 2024-11-24 12:45:32 +01:00
JupiterRider
19bdd59547 ImageKernelConvolution function added 2024-11-24 12:39:13 +01:00
JupiterRider
bf03596ee4 ImageFromChannel function added 2024-11-24 12:28:19 +01:00
JupiterRider
23f1ab19b7 Update LoadImageAnim to match purego signature 2024-11-24 12:20:06 +01:00
JupiterRider
4da4ec54eb LoadImageAnimFromMemory function added 2024-11-24 12:17:59 +01:00
JupiterRider
77b59b8ebe GetMouseRay redirects to GetScreenToWorldRay 2024-11-23 21:48:43 +01:00
JupiterRider
873552f31a IsImageReady() is now IsImageValid() 2024-11-23 21:43:16 +01:00
JupiterRider
05860b8650 LoadImageSvg() has been removed 2024-11-23 21:40:07 +01:00
JupiterRider
cb6615f05b CheckCollisionCircleLine() added 2024-11-23 21:36:45 +01:00
JupiterRider
24c48cde91 DrawRectangleRoundedLinesEx function added (fixes #435) 2024-11-23 21:24:30 +01:00
JupiterRider
c364e5b3f5 Update DrawRectangleRoundedLines() (fixes #435) 2024-11-23 21:15:30 +01:00
JupiterRider
1b93816b90 DrawRectangleGradient*-functions parameter names modified 2024-11-23 21:09:13 +01:00
JupiterRider
1ad4e58c4f DrawRectangleGradient*-functions parameter names modified 2024-11-23 21:08:40 +01:00
JupiterRider
0f95293831 DrawCircleGradient() parameter names updated 2024-11-23 21:00:13 +01:00
JupiterRider
ff18bb497b GetShapesTexture() and GetShapesTextureRectangle() added 2024-11-23 20:56:02 +01:00
JupiterRider
972563ca1f SetGamepadVibration() added 2024-11-23 20:41:25 +01:00
JupiterRider
7275646a1d GetScreenToWorldRay() and GetScreenToWorldRayEx() added 2024-11-23 20:31:22 +01:00
JupiterRider
52954882a0 IsShaderReady() is now IsShaderValid() 2024-11-23 20:04:40 +01:00
JupiterRider
886e44de9c GetClipboardImage() added 2024-11-23 19:59:37 +01:00
JupiterRider
31abcc5ee4 GetCurrentMonitor() description fixed 2024-11-23 19:32:44 +01:00
JupiterRider
13942ea31b CubemapLayoutPanorama has been removed 2024-11-23 19:29:32 +01:00
JupiterRider
76be48cc11 Gamepad Buttons description fixed 2024-11-23 19:25:22 +01:00
JupiterRider
d7cae48c5a Value of KeyMenu has been changed 2024-11-23 19:22:25 +01:00
JupiterRider
7faf6e22e7 VrDeviceInfo.VScreenCenter field has been removed 2024-11-23 19:21:17 +01:00
JupiterRider
15e71af9da Mesh type has new fields 2024-11-23 19:19:11 +01:00
JupiterRider
11a0342061 update purego required dll version 2024-11-23 17:57:27 +01:00
JupiterRider
a0882a5b81 external c-sources updated 2024-11-23 17:27:55 +01:00
JupiterRider
2ad5a4babf remove svg sources (svg support has been moved to raylib-extras) 2024-11-23 17:25:20 +01:00
JupiterRider
724c790ff7 glfw sources updated 2024-11-23 17:21:57 +01:00
JupiterRider
fc50e055c0 platforms c-source files updated 2024-11-23 17:07:41 +01:00
JupiterRider
614ed9f942 utils.c updated 2024-11-23 17:05:01 +01:00
JupiterRider
e184faa15c rtextures.c updated 2024-11-23 17:04:44 +01:00
JupiterRider
c59907eea6 rtext.c updated 2024-11-23 16:59:00 +01:00
JupiterRider
4738b1467e rshapes.c updated 2024-11-23 16:57:42 +01:00
JupiterRider
37fd299f2a rmodels.c updated 2024-11-23 16:56:45 +01:00
JupiterRider
466f3e0804 rlgl.h updated 2024-11-23 16:53:25 +01:00
JupiterRider
3af3eea92a rgestures.h updated 2024-11-23 16:51:29 +01:00
JupiterRider
69cf3d30a4 rcore.c updated 2024-11-23 16:51:10 +01:00
JupiterRider
3e01b50698 update rcamera.h (has been rewritten in go as well) 2024-11-23 16:48:40 +01:00
JupiterRider
f293ef1482 raymath.h updated (not really required, because it has been rewritten in go) 2024-11-23 16:46:28 +01:00
JupiterRider
3b4a7104e2 raylib.h updated 2024-11-23 16:44:48 +01:00
JupiterRider
b1792a31d9 raudio.c updated 2024-11-23 16:43:26 +01:00
JupiterRider
c77be99ddc config.h updated 2024-11-23 16:38:51 +01:00
Per Hultqvist
8d54e15dc2 New example: models/draw_cube_textured 2024-11-18 14:18:05 +01:00
Per Hultqvist
bc9182ac34 New example: models/yaw_pitch_roll 2024-11-18 13:22:01 +01:00
Per Hultqvist
af2e6d755e New example: models/rlgl_solar_system 2024-11-18 12:41:48 +01:00
Per Hultqvist
5b33862cc1 Example fixed models/rlgl_solar_system 2024-11-18 12:19:33 +01:00
Milan Nikolic
01864c04b8
Merge pull request #467 from Hultan/obj_loading
Example fixed models/obj_loading
2024-11-17 16:30:00 +01:00
Milan Nikolic
b6c8a8e892
Merge pull request #465 from Hultan/m3d_loading
New example models/m3d_loading
2024-11-17 16:29:50 +01:00
Per Hultqvist
5eb8d9ded7 Example fixed models/obj_loading 2024-11-17 15:56:12 +01:00
Per Hultqvist
9782760778 New example models/m3d_loading 2024-11-16 18:23:44 +01:00
Milan Nikolic
f465c30447
Merge pull request #462 from Hultan/mesh_generation
Added a custom mesh to the example models/mesh_generation
2024-11-14 20:02:48 +01:00
Per Hultqvist
acf83f1ff9 New example models/mesh_picking 2024-11-11 18:42:02 +01:00
Per Hultqvist
e9aa553ec6 New example models/mesh_picking 2024-11-11 18:39:56 +01:00
Per Hultqvist
0ce1777bf3 New example models/mesh_picking 2024-11-11 16:46:28 +01:00
Milan Nikolic
60446bce15
Merge pull request #463 from Hultan/mesh_picking
New example models/mesh_picking
2024-11-11 15:44:50 +01:00
Milan Nikolic
4983e462e3
Merge pull request #461 from Hultan/billboard
Fixed example that differed : models/billboard
2024-11-11 15:43:21 +01:00
Milan Nikolic
bb09313fb5
Merge pull request #460 from Hultan/animation
Fixed example that differed : models/animations
2024-11-11 15:43:08 +01:00
Milan Nikolic
441f7fa504
Merge pull request #459 from Hultan/codepoints_loading
New example: text/codepoints_loading
2024-11-11 15:42:50 +01:00
Milan Nikolic
4b3433a06d
Merge pull request #458 from Hultan/draw_3d
New example: text/draw_3d
2024-11-11 15:42:28 +01:00
Per Hultqvist
de1c5d32ef New example models/mesh_picking 2024-11-11 15:02:05 +01:00
Per Hultqvist
0e82ab3a0d Added a custom mesh to the example models/mesh_generation 2024-11-11 08:53:10 +01:00
Per Hultqvist
6de5b09c62 Small path fix 2024-11-10 18:24:52 +01:00
Per Hultqvist
1073c97df9 Small path fix 2024-11-10 18:23:26 +01:00
Per Hultqvist
cac9dee8dd Fixed example that differed : models/billboard 2024-11-10 18:20:24 +01:00
Per Hultqvist
3f8ab9718f Fixed example that differed : models/animations 2024-11-10 18:05:33 +01:00
Per Hultqvist
7e465e47e2 New example (small change): text/codepoints_loading 2024-11-10 16:17:45 +01:00
Per Hultqvist
9108b3b7b0 New example: text/codepoints_loading 2024-11-10 16:06:52 +01:00
Per Hultqvist
a1df2e388e New example: text/draw_3d 2024-11-10 14:02:00 +01:00
Milan Nikolic
5e9516b94f
Merge pull request #456 from skullbulb/skybox-example
Added [models] example - skybox loading and drawing
2024-11-09 21:33:06 +01:00
skullbulb
382cbda3de Added [models] example - skybox loading and drawing 2024-11-09 19:34:09 +00:00
Milan Nikolic
553871567e
Merge pull request #455 from Hultan/unicode
New example: text/unicode
2024-11-08 14:55:34 +01:00
Milan Nikolic
ac16a0b3b6
Merge pull request #451 from Hultan/rectangle_bounds
New example: rectangle_bounds
2024-11-08 14:55:20 +01:00
Milan Nikolic
7a92d50d28
Merge pull request #452 from JupiterRider/DrawTextCodepoint
DrawTextCodepoint(s) functions added to cgo version
2024-11-08 14:53:46 +01:00
Per Hultqvist
afc255d0ca New example: text/unicode - small fix 2024-11-07 19:59:39 +01:00
Per Hultqvist
52946ea71d New example: text/unicode 2024-11-07 19:55:42 +01:00
JupiterRider
e171bb3751 DrawTextCodepoint(s) functions added to cgo version 2024-11-05 17:33:03 +01:00
Per Hultqvist
b7ac6957d3 New example: rectangle_bounds 2024-11-04 14:02:36 +01:00
Milan Nikolic
5100377cde
Merge pull request #449 from Hultan/input_box
New example: input_box
2024-11-03 18:12:47 +01:00
Milan Nikolic
3158dca464
Merge pull request #448 from JupiterRider/GenImageFontAtlas
GenImageFontAtlas added, font example added, LoadFontData function improved
2024-11-03 18:11:32 +01:00
Per Hultqvist
44e76696cc New example: input_box 2024-11-03 17:04:02 +01:00
JupiterRider
8c4ce9e206 remove trailing whitespace and carriage return in License file 2024-11-03 15:40:48 +01:00
JupiterRider
549dbcf4d8 SDF-font loading example added 2024-11-03 15:38:02 +01:00
JupiterRider
735af12e7f update LoadFontData: codePoints can now be nil, codepointCount defaults to 95 (like C raylib does) 2024-11-03 15:36:07 +01:00
JupiterRider
893dfa5f85 GenImageFontAtlas function added to cgo version as well 2024-11-03 15:13:14 +01:00
JupiterRider
8ea76a8e09 golang.org/x/exp is not in your go.mod file 2024-11-03 12:29:12 +01:00
Milan Nikolic
ab0d3a3fb2
Merge pull request #445 from Hultan/font_loading
New example: font_loading
2024-10-31 15:17:16 +01:00
Milan Nikolic
87d0d7185f
Merge pull request #444 from Hultan/font_filter
New example: font_filters
2024-10-31 15:17:06 +01:00
Per Hultqvist
c3e8a0f84a New example: font_loading 2024-10-31 13:34:37 +01:00
Per Hultqvist
8d78eefeee New example: font_filters 2024-10-31 13:06:59 +01:00
Milan Nikolic
8a6b23b2ed
Merge pull request #442 from Hultan/draw_ring
New example: Shapes/Draw_ring
2024-10-28 09:11:01 +01:00
Milan Nikolic
f8147233ca
Merge pull request #443 from Hultan/draw_circle_sector
New example: Shapes/draw_circle_sector
2024-10-28 09:10:44 +01:00
Per Hultqvist
1f7ddfca09 New example : shapes/draw_circle_sector 2024-10-24 17:21:11 +02:00
Per Hultqvist
bd66c8b623 New example : shapes/draw_ring 2024-10-24 17:15:30 +02:00
Hultan
6807b5cc47
Merge branch 'gen2brain:master' into master 2024-10-24 10:25:44 +02:00
Milan Nikolic
f2ab1b0c35
Merge pull request #438 from anasrar/master
feat(raymath): `MatrixDecompose`
2024-10-24 08:05:13 +02:00
Milan Nikolic
20a76b285d
Merge pull request #441 from JupiterRider/SetBlendMode
#437 take rl.BlendMode instead of int32
2024-10-24 07:58:50 +02:00
Milan Nikolic
d4e03b2d75
Merge pull request #440 from JupiterRider/DrawCircleLinesV
#436 DrawCircleLinesV to cgo-version added
2024-10-24 07:58:35 +02:00
Milan Nikolic
bb20d2da3e
Merge pull request #439 from JupiterRider/automationEvents
#431 AutomationEventList.GetEvents method added
2024-10-24 07:58:18 +02:00
JupiterRider
badf94c433 #437 take rl.BlendMode instead of int32 2024-10-23 21:36:14 +02:00
JupiterRider
5c0fc5c528 #436 DrawCircleLinesV to cgo-version added 2024-10-23 21:26:52 +02:00
JupiterRider
5268babfe0 #431 AutomationEventList.GetEvents method added 2024-10-23 20:48:36 +02:00
anasrar
f9b5993843
refactor(raymath): parameter typo 2024-10-23 01:44:47 +13:00
anasrar
da901b89c1
feat(raymath): MatrixDecompose 2024-10-23 01:10:52 +13:00
Per Hultqvist
d6c07f1bbf New example : core/vr_simulator 2024-10-19 18:08:02 +02:00
Milan Nikolic
b7833eeae8
Merge pull request #432 from Hultan/master
New example : Core/storage_values
2024-10-19 17:09:00 +02:00
Hultan
ec8840cdae
Merge branch 'gen2brain:master' into master 2024-10-19 16:28:15 +02:00
Per Hultqvist
f84ecd5b63 New example : core/storage_values 2024-10-19 16:27:24 +02:00
Milan Nikolic
0975c91121
Merge pull request #430 from Hultan/master
Small change in examples/texture/draw_tile
2024-10-19 11:21:48 +02:00
Hultan
077c9b9f63
Merge branch 'gen2brain:master' into master 2024-10-19 09:56:05 +02:00
Per Hultqvist
eb60c30db1 Textures/draw_tiled : Changed to the correct texture filter 2024-10-19 09:55:40 +02:00
Milan Nikolic
220865147a
Merge pull request #429 from JupiterRider/vr
vr functions added
2024-10-19 06:46:16 +02:00
JupiterRider
e9d222595d #428 BeginVrStereoMode and EndVrStereoMode purgo body added 2024-10-18 17:47:52 +02:00
JupiterRider
1eacaf732c #428 cgo vr functions added 2024-10-18 17:45:15 +02:00
Milan Nikolic
42a2d9159c
Merge pull request #423 from Hultan/master
3 more examples under texture
2024-10-17 18:35:16 +02:00
Per Hultqvist
8f5a54a530 Revert "New example : Textures/sprite_anim"
This reverts commit cf5c9f8b9a.
2024-10-17 16:35:11 +02:00
Per Hultqvist
3c0d4bcab6 New example : Textures/draw_tiled 2024-10-17 14:58:47 +02:00
Per Hultqvist
535ef37449 Merge remote-tracking branch 'origin/master' 2024-10-17 13:00:46 +02:00
Milan Nikolic
5c8466e15f
Merge pull request #422 from Hultan/master
Two new audio examples
2024-10-17 12:58:27 +02:00
Per Hultqvist
f1236640f9 New example : Textures/sprite_button 2024-10-17 12:44:25 +02:00
Per Hultqvist
cf5c9f8b9a New example : Textures/sprite_anim 2024-10-17 12:25:19 +02:00
Per Hultqvist
274a0b5854 New example : Textures/npatch_drawing 2024-10-17 11:54:12 +02:00
Per Hultqvist
a9a0a28119 New example : Audio/mixed processor 2024-10-17 11:04:50 +02:00
Per Hultqvist
5bed8af6d4 New example : Audio/sound_multi 2024-10-17 08:12:14 +02:00
Milan Nikolic
81eae2921a
Merge pull request #421 from Hultan/master
6 new raylib/core examples
2024-10-16 17:52:42 +02:00
Per Hultqvist
0a5dd6e49b Merge remote-tracking branch 'origin/master' 2024-10-16 16:07:19 +02:00
Per Hultqvist
d7bd66f339 New example : Window flags 2024-10-16 15:41:18 +02:00
Per Hultqvist
1ff1eefdf1 New example : Window letterbox 2024-10-16 14:52:18 +02:00
Per Hultqvist
c2b8b9ee3a New example : Custom Frame Control 2024-10-15 17:09:11 +02:00
Per Hultqvist
10a7b71ee0 New example : Custom Logging 2024-10-15 16:10:41 +02:00
Per Hultqvist
4e4f18a37c New example : Window should close 2024-10-15 15:19:15 +02:00
Per Hultqvist
afe70ad4c8 New example : 2d camera platform 2024-10-15 15:18:58 +02:00
Milan Nikolic
bf5ef18350
Merge pull request #420 from Hultan/master
Synced 3d camera splitscreen with raylib.com
2024-10-14 18:39:42 +02:00
Per Hultqvist
a33e6f490b Merge remote-tracking branch 'origin/master' 2024-10-14 18:18:11 +02:00
Per Hultqvist
5bf50a5c5b Synced up another raylib-go example with raylib:s example 2024-10-14 18:17:15 +02:00
Milan Nikolic
3039b26796
Merge pull request #419 from Hultan/master
Removed erroneous instructions
2024-10-14 17:30:18 +02:00
Per Hultqvist
e43e388549 Removed erroneous instructions 2024-10-14 17:15:36 +02:00
Milan Nikolic
f4adffe016
Merge pull request #418 from Hultan/master
3d camera first person example updated
2024-10-14 15:10:46 +02:00
Per Hultqvist
54b89f5a68 3d camera first person example updated to match https://www.raylib.com/examples/core/loader.html?name=core_3d_camera_first_person 2024-10-14 12:11:58 +02:00
Milan Nikolic
c66f9e2942
Merge pull request #415 from agrigoryan/feature/audio-mixed-processor
bindings for attaching/detaching mixed audio processor
2024-09-30 09:56:31 +02:00
agrigoryan
c2c8150de9 bindings for attaching/detaching mixed audio processor 2024-09-30 01:44:08 -04:00
Milan Nikolic
6bc3d79c96
Merge pull request #414 from imprity/NewImageFromImage-fix
Fix NewImageFromImage color converting
2024-09-16 07:06:33 +02:00
imprity
2053879bfb Fix NewImageFromImage color converting
Old version of NewImageFromImage converted colors incorrectly.
This commit fixes the issue.
2024-09-15 09:54:51 +09:00
Milan Nikolic
123ec7ae6b
Merge pull request #411 from JupiterRider/ColorFromNormalized-Fix
purego fix for ColorFromNormalized
2024-09-05 19:09:17 +02:00
JupiterRider
6c2499adff purego fix for ColorFromNormalized: Vector4 has to be passed as pointer (not by value) 2024-09-05 19:00:35 +02:00
Milan Nikolic
b4d0c52dc9
Merge pull request #406 from Aurora2500/mousebutton_newtype
[rcore] Added MouseButton newtype
2024-08-26 13:35:53 +02:00
Milan Nikolic
287f319ecb
Merge pull request #409 from JupiterRider/shaderfix
Some fixes for purego-version
2024-08-26 13:34:25 +02:00
JupiterRider
26bdccfe6f allow passing nil to LoadShader for purego as well (#172) 2024-08-21 22:54:05 +02:00
JupiterRider
d374f90b45 shader has to be passed as pointer 2024-08-21 22:49:35 +02:00
Aurora
a30a52c553 changed raylib_purego.go to use the new type 2024-08-13 12:27:47 +01:00
Aurora
afca9ac4b5 Added MouseButton newtype 2024-08-12 22:52:35 +01:00
Milan Nikolic
8861ee437d
Merge pull request #403 from elMuso/master
Android example: Added windows.bat and updated Readme
2024-08-07 13:16:36 +02:00
Arold
64b25f38d9 Android example: Added windows.bat and updated Readme 2024-08-06 22:53:40 -04:00
Milan Nikolic
62016ee92f
Merge pull request #396 from Palessan/palessan/raylib-go-sprite-gif-animations
Adding gif and sprite animation examples.
2024-06-28 14:51:41 +02:00
Palessan
ded439d849 rectangle will be renamed to textures_sprite_anim part 2/2
(using git mv to preserve git history)
2024-06-28 15:27:21 +03:00
Palessan
49d7e62303 rectangle will be renamed to textures_sprite_anim part 1/2 2024-06-28 15:18:23 +03:00
Palessan
6c3961f894 better to use the using existing method by passing the required []color.RGBA instead of the unsafe.Pointer 2024-06-28 15:11:11 +03:00
Palessan
f529bc2897 Adding gif and sprite animation examples.
-Added new UpdateTextureUnsafe method to support it.
2024-06-28 12:50:30 +03:00
Milan Nikolic
a997a44fb9
Support Windows 7, issue #392 2024-05-24 09:43:10 +02:00
Milan Nikolic
b7c9eeec1b
Merge pull request #391 from JupiterRider/GuiLoadIcons
[raygui] LoadIcons-, DrawIcon-function and example added
2024-05-22 22:09:53 +02:00
JupiterRider
d86638ae10 [raygui] LoadIcons-, DrawIcon-function and example added 2024-05-22 18:51:38 +02:00
Milan Nikolic
6c4349fd5c
Test purego 2024-05-22 17:12:50 +02:00
Milan Nikolic
b1a49c28b6
Merge pull request #384 from rocktavious/add-mul-matrix
Expose MultMatrix
2024-05-22 17:04:37 +02:00
Kyle
4a4f1ef82e
Remove purego implementation 2024-05-22 09:55:19 -05:00
Milan Nikolic
7430a4e0ef
Merge pull request #390 from JupiterRider/multmatrixf
MultMatrix for purego added
2024-05-22 16:30:10 +02:00
JupiterRider
9fe64ac4bd Fix MatrixToFloat 2024-05-22 16:23:31 +02:00
JupiterRider
86d08a7b86 MultMatrix for purego added 2024-05-22 15:37:00 +02:00
Kyle
426bcb3529
Fix typo 2024-05-22 07:12:22 -05:00
Kyle
b56bfca1e8
Update rlgl_purego.go correctly 2024-05-21 15:31:37 -05:00
Milan Nikolic
5314a4a209
Merge pull request #389 from JupiterRider/master
[raygui] don't trim leading and trailing white spaces (fix #351)
2024-05-18 18:08:52 +02:00
JupiterRider
a158bd444e [raygui] don't trim leading and trailing white spaces (fix #351) 2024-05-18 17:56:40 +02:00
Milan Nikolic
2915c1c582
Merge pull request #388 from JupiterRider/master
[raygui] use nil for empty strings
2024-05-16 21:26:30 +02:00
JupiterRider
7c239d1050 [raygui] use nil for empty strings; fixes #386 2024-05-16 20:41:28 +02:00
JupiterRider
c212c33886 [raygui] empty string will cause the draw of a title-bar, but nil doesn't 2024-05-16 19:05:18 +02:00
Milan Nikolic
e824a9b663
Merge pull request #387 from JupiterRider/master
TraceLog and TraceLogCallback fixes
2024-05-15 05:52:41 +02:00
JupiterRider
4c0391d217 comment fixed 2024-05-14 23:22:31 +02:00
JupiterRider
fa7e76c6a6 implement va_list for tracelog callbacks in purego 2024-05-14 23:17:31 +02:00
JupiterRider
6fd7907d31 Use fmt.Sprintf for TraceLog to match with cgo 2024-05-14 23:09:47 +02:00
JupiterRider
ac27873749 MAX_TRACELOG_BUFFER_SIZE is 256 since raylib 4.5 2024-05-14 22:49:48 +02:00
Kyle
49242a59c9
Update rlgl_purego.go 2024-05-13 07:15:11 -05:00
Kyle Rockman
da79f1d8b6 fix function to actually work 2024-05-11 19:38:23 -05:00
Kyle
032352a5ba
Update rlgl_cgo.go 2024-05-11 19:16:35 -05:00
Milan Nikolic
f68049cf26
Update darwin flags 2024-05-09 17:21:52 +02:00
Milan Nikolic
4b3ab504c8
Update RGFW 2024-05-09 17:21:05 +02:00
Milan Nikolic
9b53342ac0
Fix Android internal storage, issue #365 2024-05-09 08:27:51 +02:00
Milan Nikolic
c09c9462b4
Update README.md 2024-05-08 19:14:57 +02:00
Milan Nikolic
28722bb71f
Merge pull request #383 from zbednarke/raw-audio-example
Improve raw audio example
2024-05-08 14:26:20 +02:00
Milan Nikolic
48e419d11f
Update actions 2024-05-08 11:36:02 +02:00
Milan Nikolic
21775d2dee
Silence warnings 2024-05-08 11:26:39 +02:00
Milan Nikolic
451c14ce9f
Comment redefinitions 2024-05-08 11:25:08 +02:00
Milan Nikolic
64a63d5914
Update actions 2024-05-08 11:20:15 +02:00
Milan Nikolic
45279d6d25
Silence warnings 2024-05-08 11:19:01 +02:00
Milan Nikolic
6031600b18
Test RGFW 2024-05-08 11:09:31 +02:00
Milan Nikolic
7c4c1eed60
Update dependencies 2024-05-08 10:54:48 +02:00
Milan Nikolic
54ab84ca0c
Update README.md 2024-05-08 10:51:01 +02:00
Milan Nikolic
8a207901da
Fix DRM build 2024-05-08 10:50:08 +02:00
Milan Nikolic
6fa153fa53
Update dependencies 2024-05-08 10:31:41 +02:00
Milan Nikolic
7810550d63
Add RGFW backend 2024-05-08 10:30:05 +02:00
zbednarke
266797ff04 sine graphic 2024-05-07 20:42:31 -07:00
zbednarke
74d0b22ad1 lower sample rate 2024-05-07 20:38:52 -07:00
zbednarke
1a0035bfed make buffer bigger 2024-05-07 20:36:38 -07:00
zbednarke
a7fccc35a1 lower n samples per update to be on safe side 2024-05-07 20:20:12 -07:00
Zachary Bednarke
db4aa35b12 rename variables 2024-05-07 19:54:07 -07:00
Zachary Bednarke
65392e706d rename f t frequency 2024-05-07 19:51:43 -07:00
Zachary Bednarke
95c2f5679a pretty it up 2024-05-07 19:43:43 -07:00
Zachary Bednarke
18035cee69 first in fork 2024-05-07 19:37:13 -07:00
Milan Nikolic
1868520849
Update C sources 2024-05-07 21:54:39 +02:00
Milan Nikolic
2a66186c7d
Merge pull request #381 from ajsosa/borderless
Expose ToggleBorderlessWindowed() to golang.
2024-05-07 11:00:38 +02:00
Milan Nikolic
0b93fbfb6f
Merge pull request #382 from JFAexe/cgo-waittime
Add missing WaitTime
2024-05-07 11:00:21 +02:00
JFAexe
19429cd00d Add missing WaitTime 2024-05-05 10:21:22 +03:00
ajsosa
1c9f65903d
Expose ToggleBorderlessWindowed() to golang. 2024-04-28 18:30:46 -05:00
Milan Nikolic
f406ea403b
Merge pull request #379 from gabriel-marques/master
Added custom frame control functions to rcore.go
2024-04-24 19:27:46 +02:00
Gabriel Da Silva Marques
4523bcd71d Added custom frame control functions to rcore.go
Added SwapScreenBuffer() and PollInputEvents into rcore.go with corresponding comments
To use them it's necessary to build with CGO_CFLAGS="-DSUPPORT_CUSTOM_FRAME_CONTROL=1"
Also added more info in the raylib_purego.go file for theses two functions in order to inform that the dll must be recompiled
2024-04-24 18:10:35 +02:00
Milan Nikolic
278df68f40
Merge pull request #377 from JupiterRider/fix-return-values
Don't use struct return values
2024-04-21 21:10:56 +02:00
JupiterRider
8545220e18
Don't use struct return values
This fixes https://github.com/gen2brain/raylib-go/issues/376
2024-04-21 20:27:15 +02:00
Milan Nikolic
9548fadb54
Merge pull request #375 from alessandrojcm/master
feat: add DrawTextPro
2024-04-18 17:02:28 +02:00
Alessandro Cuppari
e717485867 fix: args should be pointers 2024-04-18 13:59:55 +01:00
Alessandro Cuppari
39b56ef013 feat: add DrawTextPro 2024-04-16 21:55:35 +01:00
Milan Nikolic
53f26d8a08
Merge pull request #371 from jdbann/fix-scroll-panel-view
Fix ScrollPanel view binding
2024-04-08 15:05:34 +02:00
John Bannister
0b4f8b1cc0 Fix ScrollPanel view binding
The values on the view parameter of ScrollPanel() should be updated with
the values set by the C method.
2024-04-07 14:12:03 +01:00
Milan Nikolic
c3665eb9ab
Add x11 build tag 2024-02-27 12:46:48 +01:00
Milan Nikolic
00f5f785e6
Update android example 2024-02-27 07:54:10 +01:00
Milan Nikolic
069b39e688
Fix android build 2024-02-27 07:48:19 +01:00
Milan Nikolic
468523fda4
Update README.md 2024-02-26 09:45:57 +01:00
Milan Nikolic
3889376dd3
Update actions 2024-02-26 09:38:46 +01:00
Milan Nikolic
cc776abd3b
Update actions 2024-02-26 09:35:31 +01:00
Milan Nikolic
caf96ad1c0
Update cgo 2024-02-26 09:29:23 +01:00
Milan Nikolic
83c4beb421
Add wayland files 2024-02-26 09:26:41 +01:00
Milan Nikolic
5abcc8b79c
Update wayland script 2024-02-26 09:26:12 +01:00
Milan Nikolic
8596a5db72
Rename wayland functions 2024-02-26 09:25:40 +01:00
Milan Nikolic
ce43cc1f10
Remove deps 2024-02-26 09:24:04 +01:00
Milan Nikolic
9a0e172ca7
Update GLFW 2024-02-26 09:23:08 +01:00
Milan Nikolic
0b7f0bb776
Merge pull request #352 from uprun/only-changes-2024-02-24
added LoadFontExByRunesNumber
2024-02-25 13:24:01 +01:00
Oleksandr Kryvonos
a870a09894 variadic parameter for runesNumber in LoadFontEx 2024-02-25 12:18:39 +01:00
Oleksandr Kryvonos
a490f10c86 copied only changes 2024-02-24 20:39:33 +01:00
Milan Nikolic
83d871a38f
Merge pull request #348 from unklnik/master
Update README.md
2024-01-25 12:10:08 +01:00
unkl nik
a5d0d71e50 Update README.md 2024-01-25 12:55:45 +02:00
Milan Nikolic
0e9c277161
Merge pull request #345 from shellfu/Issue-343
Add Compute Shader and SSBO Functions to raylib-go in `rlgl_purego.go`
2024-01-23 19:00:55 +01:00
ShellFu
74450e33c1
Merge pull request #1 from JupiterRider/Issue-343
Fixed  types and typos
2024-01-23 10:32:55 -07:00
JupiterRider
3bc33ec8b7 Update rlgl_cgo.go 2024-01-23 17:58:33 +01:00
JupiterRider
2a08e83ca4 Fix typo and data-types 2024-01-23 17:56:50 +01:00
Daniel 'ShellFu' Kendrick
0b58bcbe1b Add Compute Shader and SSBO Functions to raylib-go in rlgl_purego.go
This commit introduces functions related to compute shaders and
Shader Buffer Storage Objects (SSBOs) in raylib-go. It adds
bindings for loading, dispatching, and managing compute shaders
and SSBOs, aligning raylib-go more closely with the raylib C
library's capabilities. Specifically, the functions added are
`LoadComputeShaderProgram`, `ComputeShaderDispatch`, `LoadShaderBuffer`,
`UnloadShaderBuffer`, `UpdateShaderBuffer`, `BindShaderBuffer`,
`ReadShaderBuffer`, and `CopyShaderBuffer`. These additions enhance
raylib-go's utility for more advanced GPU operations.
2024-01-22 16:19:55 -07:00
Milan Nikolic
5cc3226b35
Merge pull request #344 from shellfu/Issue-343
Add Compute Shader and SSBO Functions to raylib-go
2024-01-22 14:23:02 +01:00
Daniel 'ShellFu' Kendrick
5c31cc3104 Add Compute Shader and SSBO Functions to raylib-go
This commit introduces functions related to compute shaders and
Shader Buffer Storage Objects (SSBOs) in raylib-go. It adds
bindings for loading, dispatching, and managing compute shaders
and SSBOs, aligning raylib-go more closely with the raylib C
library's capabilities. Specifically, the functions added are
`LoadComputeShaderProgram`, `ComputeShaderDispatch`, `LoadShaderBuffer`,
`UnloadShaderBuffer`, `UpdateShaderBuffer`, `BindShaderBuffer`,
`ReadShaderBuffer`, and `CopyShaderBuffer`. These additions enhance
raylib-go's utility for more advanced GPU operations.
2024-01-21 11:08:17 -07:00
Milan Nikolic
49aab27a9b
Merge pull request #342 from shellfu/Issue-341
Align raylib-go ExportImage with C Library Behavior
2024-01-16 13:05:07 +01:00
Daniel 'ShellFu' Kendrick
1f80c1e4c2 Removed test per maintainer instruction, added back in ImageFromImage and LoadTextureCubemap 2024-01-15 13:20:45 -07:00
Daniel 'ShellFu' Kendrick
509ad7da5c Align raylib-go ExportImage with C Library Behavior
The original raylib C library's ExportImage function returns a boolean to
indicate the success or failure of the export operation. This behavior was
missing in the raylib-go implementation, which provided no return value,
thereby limiting error handling capabilities.

This commit updates the ExportImage function in raylib-go to return a boolean
or an error, aligning it with its C counterpart and enabling idiomatic Go
error handling. The change includes updates to the function and tests to
reflect the new return type. This enhancement increases robustness and clarity
in error handling for Go developers using raylib-go.

The test suite has been updated and run to ensure the correct functioning of
the modified ExportImage function, with results confirming the expected
behavior in both successful and unsuccessful scenarios.

- Daniel "ShellFu" Kendrick
2024-01-15 12:20:40 -07:00
Milan Nikolic
483e94e4d9
Merge pull request #339 from pierrec/master
add ImageFromImage()
2024-01-10 11:28:18 +01:00
Pierre Curto
b63c9257c5 add ImageFromImage() 2024-01-10 10:22:54 +01:00
Milan Nikolic
b32467e017
Merge pull request #337 from JupiterRider/master
physics.GetBodies: return only non nil (active) bodies
2024-01-09 17:17:35 +01:00
JupiterRider
381d68b2a3 physics.GetBodies: return only non nil (active) bodies 2024-01-09 16:54:02 +01:00
Milan Nikolic
17ce081452
Merge pull request #332 from Gamerfiend/master
feat: update rtextures.go to have the func LoadTextureCubemap.
2023-12-30 16:04:16 +01:00
Snowminx
48241c48d2
fix: update purego signature to match 2023-12-29 20:42:43 -08:00
Snowminx
9553e2fd26
Merge branch 'gen2brain:master' into master 2023-12-29 20:40:08 -08:00
Milan Nikolic
6f8b5ec246
Merge pull request #334 from JupiterRider/master
Change signature of LoadFontFromMemory in raylib/rtext.go
2023-12-29 14:48:53 +01:00
JupiterRider
6656db4829 Change signature of LoadFontFromMemory in raylib/rtext.go to match with purego version 2023-12-28 16:06:40 +01:00
Snowminx
5c6d0848aa
Merge branch 'gen2brain:master' into master 2023-12-24 19:22:17 -08:00
Snowminx
1cee1d0534
fix: pass by value to c function 2023-12-24 19:21:57 -08:00
Snowminx
656b4a4a8d
fix: update to convert params to cgo 2023-12-24 18:36:56 -08:00
Milan Nikolic
6c3c38896e
Merge pull request #330 from Fluffy-Bean/master
Fix Grid mouseCell not updaing value
2023-12-25 03:18:19 +01:00
Milan Nikolic
ac28b4b4f1
Merge pull request #329 from CollCaz/master
Updated link to physac.h
2023-12-25 03:18:11 +01:00
Milan Nikolic
03d38e920f
Merge pull request #325 from jpgleeson/add-triangle-3d-binding
Add binding for DrawTriangle3D to rmodels.go
2023-12-25 03:18:02 +01:00
Snowminx
4bb9631420
feat: update rtextures.go to have the func LoadTextureCubemap. 2023-12-24 12:40:03 -08:00
Michał
cf285a20a1
Fix mouseCell pointer not updaing value 2023-12-19 14:38:36 +00:00
Yassen Tombokti
69512c77d6
Merge pull request #1 from CollCaz/CollCaz-patch-1
Updated the link to physac.h to point to the correct location.
2023-12-18 22:03:41 +00:00
Yassen Tombokti
2bee857547
Update README.md 2023-12-18 21:59:40 +00:00
jack gleeson
19dc46f86c Add binding for DrawTriangle3D to rmodels.go 2023-12-06 19:51:46 -08:00
Milan Nikolic
48309e2407
Merge pull request #322 from swazzles/master
Add flag for borderless windowed mode
2023-11-23 18:44:46 +01:00
Milan Nikolic
7ef92adf08
Merge pull request #321 from JupiterRider/master
Update purego
2023-11-23 18:39:35 +01:00
swazzles
34ea0cc7f5 Add flag for borderless windowed mode 2023-11-23 22:51:51 +11:00
JupiterRider
a5d2760b16 Remove obsolete comment 2023-11-22 19:06:35 +01:00
JupiterRider
f537de6ed9 go mod tidy 2023-11-22 16:29:10 +01:00
JupiterRider
f239fe2f67 Updat purego to 192c5e846faa64025fb8a6a94532c7a77fbd8dce 2023-11-22 16:26:21 +01:00
Milan Nikolic
a9659ea9c9
Merge pull request #318 from JupiterRider/master
Purego rlgl implemented
2023-11-18 19:18:07 +01:00
JupiterRider
db3e0be60e go mod tidy examples 2023-11-18 19:06:12 +01:00
JupiterRider
43d0a14b92
Merge branch 'master' into master 2023-11-18 18:56:48 +01:00
JupiterRider
2be56088ed Update modules 2023-11-18 18:50:49 +01:00
JupiterRider
fdd3d616da Update purego 2023-11-18 18:41:43 +01:00
JupiterRider
79286ba625 Make rlgl types public and add missung functions 2023-11-18 18:27:35 +01:00
JupiterRider
251b88bcb4 Purego rlgl implemented 2023-11-18 15:11:00 +01:00
415 changed files with 57463 additions and 44535 deletions

View file

@ -1,121 +0,0 @@
on: [push, pull_request]
name: Build
jobs:
test:
strategy:
matrix:
go-version: [1.21.x]
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Install Go
uses: actions/setup-go@v3
with:
go-version: ${{ matrix.go-version }}
- name: Checkout code
uses: actions/checkout@v3
- name: Install package
run: |
sudo apt-get update -y; sudo apt-get -y install libxi-dev libxinerama-dev libxcursor-dev libxrandr-dev libgl1-mesa-dev
if: runner.os == 'Linux'
- name: Build
run: go build ./...
working-directory: raylib
- name: Verify dependencies
run: go mod verify
working-directory: raylib
- name: Build
run: go build -v ./...
working-directory: raylib
- name: Run go vet
run: go vet ./...
working-directory: raylib
- name: Install staticcheck
run: go install honnef.co/go/tools/cmd/staticcheck@latest
working-directory: raylib
- name: Run staticcheck
run: staticcheck ./...
working-directory: raylib
- name: Run tests
run: go test -race -vet=off ./...
working-directory: raylib
test-drm:
strategy:
matrix:
go-version: [1.21.x]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Install Go
uses: actions/setup-go@v3
with:
go-version: ${{ matrix.go-version }}
- name: Checkout code
uses: actions/checkout@v3
- name: Install package
run: |
sudo apt-get update -y; sudo apt-get -y install libegl1-mesa-dev libdrm-dev
- name: Build
run: go build -tags drm
working-directory: raylib
test-sdl:
strategy:
matrix:
go-version: [1.21.x]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Install Go
uses: actions/setup-go@v3
with:
go-version: ${{ matrix.go-version }}
- name: Checkout code
uses: actions/checkout@v3
- name: Install package
run: |
sudo apt-get update -y; sudo apt-get -y install libgl1-mesa-dev libsdl2-dev
- name: Build
run: go build -tags sdl
working-directory: raylib
test-wayland:
strategy:
matrix:
go-version: [1.21.x]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Install Go
uses: actions/setup-go@v3
with:
go-version: ${{ matrix.go-version }}
- name: Checkout code
uses: actions/checkout@v3
- name: Install package
run: |
sudo apt-get update -y; sudo apt-get -y install libgl1-mesa-dev libwayland-dev libxkbcommon-dev
- name: Build
run: go build -tags wayland
working-directory: raylib
test-examples:
strategy:
matrix:
go-version: [1.21.x]
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Install Go
uses: actions/setup-go@v3
with:
go-version: ${{ matrix.go-version }}
- name: Checkout code
uses: actions/checkout@v3
- name: Install package
run: |
sudo apt-get update -y; sudo apt-get -y install libxi-dev libxinerama-dev libxcursor-dev libxrandr-dev libgl1-mesa-dev
- name: Build
run: go build ./...
working-directory: examples

View file

@ -1,12 +1,14 @@
![logo](https://goo.gl/XlIcXz) ![logo](https://git.terah.dev/UnrealXR/raylib-go/raw/branch/master/assets/raylib-go_256x256.png)
## raylib-go ## raylib-go
[![Build Status](https://github.com/gen2brain/raylib-go/actions/workflows/build.yml/badge.svg)](https://github.com/gen2brain/raylib-go/actions) [![Build Status](https://git.terah.dev/UnrealXR/raylib-go/actions/workflows/build.yml/badge.svg)](https://git.terah.dev/UnrealXR/raylib-go/actions)
[![GoDoc](https://godoc.org/github.com/gen2brain/raylib-go/raylib?status.svg)](https://godoc.org/github.com/gen2brain/raylib-go/raylib) [![GoDoc](https://godoc.org/git.terah.dev/UnrealXR/raylib-go/raylib?status.svg)](https://godoc.org/git.terah.dev/UnrealXR/raylib-go/raylib)
[![Go Report Card](https://goreportcard.com/badge/github.com/gen2brain/raylib-go/raylib)](https://goreportcard.com/report/github.com/gen2brain/raylib-go/raylib) [![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)
[![Examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](https://github.com/gen2brain/raylib-go/tree/master/examples) [![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)
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 enjoy 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.
raylib C source code is included and compiled together with bindings. Note that the first build can take a few minutes. 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). It is also possible to use raylib-go without cgo (Windows only; see requirements below).
@ -15,27 +17,15 @@ It is also possible to use raylib-go without cgo (Windows only; see requirements
##### Ubuntu ##### Ubuntu
###### X11 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 libxcursor-dev libxrandr-dev libxinerama-dev
###### Wayland
apt-get install libgl1-mesa-dev libwayland-dev libxkbcommon-dev
##### Fedora ##### Fedora
###### X11 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
###### Wayland
dnf install mesa-libGL-devel wayland-devel libxkbcommon-devel
##### macOS ##### macOS
On macOS you need Xcode or Command Line Tools for Xcode. On macOS, you need Xcode or Command Line Tools for Xcode (if you have `brew` installed, you already have this).
##### Windows ##### Windows
@ -51,40 +41,48 @@ To remove console window, build with `-ldflags "-H=windowsgui"`.
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`. 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. Put the raylib.dll into the root folder of your project or copy it into `C:\Windows\System32` for a system-wide installation.
As of November 15, 2023, raylib 5.0 is the required version. 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).
It is also possible build the dll yourself. You can find more infos at [raylib's wiki](https://github.com/raysan5/raylib/wiki/Working-on-Windows).
##### Android ##### Android
[Android example](https://github.com/gen2brain/raylib-go/tree/master/examples/others/android/example). [Android example](https://git.terah.dev/UnrealXR/raylib-go/tree/master/examples/others/android/example).
##### Wasm
For web bindings, refer to [Raylib-Go-Wasm](https://github.com/BrownNPC/Raylib-Go-Wasm); it should be largely compatible with this repository.
### Installation ### Installation
go get -v -u github.com/gen2brain/raylib-go/raylib go get -v -u git.terah.dev/UnrealXR/raylib-go/raylib
### Build tags ### Build tags
* `drm` - build for Linux native DRM mode, including Raspberry Pi 4 and other devices (PLATFORM_DRM) * `drm` - build for Linux native [DRM](https://en.wikipedia.org/wiki/Direct_Rendering_Manager) mode, including Raspberry Pi 4 and other devices (PLATFORM_DRM)
* `sdl` - build for SDL backend instead of internal GLFW (PLATFORM_DESKTOP_SDL) * `drm_disable_input` - disables keyboard input capabilities for the DRM backend. Requires the `drm` build tag as a prerequisite
* `wayland` - build against Wayland libraries (internal GLFW) * `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 * `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)) * `es2` - uses OpenGL ES 2.0 backend (can be used to link against [Google's ANGLE](https://github.com/google/angle))
* `es3` - experimental support for OpenGL ES 3.0 * `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/github.com/gen2brain/raylib-go/raylib). Also check raylib [cheatsheet](http://www.raylib.com/cheatsheet/cheatsheet.html). 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.
### Example ### Example
```go ```go
package main package main
import rl "github.com/gen2brain/raylib-go/raylib" import rl "git.terah.dev/UnrealXR/raylib-go/raylib"
func main() { func main() {
rl.InitWindow(800, 450, "raylib [core] example - basic window") rl.InitWindow(800, 450, "raylib [core] example - basic window")
@ -103,7 +101,7 @@ func main() {
} }
``` ```
Check more [examples](https://github.com/gen2brain/raylib-go/tree/master/examples) organized by raylib modules. Check more [examples](https://git.terah.dev/UnrealXR/raylib-go/tree/master/examples) organized by raylib modules.
### Cross-compile (Linux) ### Cross-compile (Linux)
@ -133,4 +131,4 @@ basic_window: Mach-O 64-bit arm64 executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|
### License ### License
raylib-go is licensed under an unmodified zlib/libpng license. View [LICENSE](https://github.com/gen2brain/raylib-go/blob/master/LICENSE). raylib-go is licensed under an unmodified zlib/libpng license. View [LICENSE](https://git.terah.dev/UnrealXR/raylib-go/blob/master/LICENSE).

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -1,4 +1,4 @@
## easings [![GoDoc](https://godoc.org/github.com/gen2brain/raylib-go/easings?status.svg)](https://godoc.org/github.com/gen2brain/raylib-go/easings) ## easings [![GoDoc](https://godoc.org/git.terah.dev/UnrealXR/raylib-go/easings?status.svg)](https://godoc.org/git.terah.dev/UnrealXR/raylib-go/easings)
Useful easing functions for values animation. Useful easing functions for values animation.

View file

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

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,155 @@
/*******************************************************************************************
*
* 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,7 +1,7 @@
package main package main
import ( import (
"github.com/gen2brain/raylib-go/raylib" "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
const maxCircles = 64 const maxCircles = 64

View file

@ -1,9 +1,5 @@
package main package main
import (
"github.com/gen2brain/raylib-go/raylib"
)
func main() { func main() {
rl.InitWindow(800, 450, "raylib [audio] example - music playing (streaming)") rl.InitWindow(800, 450, "raylib [audio] example - music playing (streaming)")
rl.InitAudioDevice() rl.InitAudioDevice()

View file

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

View file

@ -1,7 +1,7 @@
package main package main
import ( import (
"github.com/gen2brain/raylib-go/raylib" "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -0,0 +1,65 @@
/*******************************************************************************************
*
* 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 (
"github.com/gen2brain/raylib-go/raylib" "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
var ( var (

View file

@ -1,9 +1,5 @@
package main package main
import (
"github.com/gen2brain/raylib-go/raylib"
)
/******************************************************************************************* /*******************************************************************************************
* *
* raylib [core] example - 2d camera mouse zoom * raylib [core] example - 2d camera mouse zoom

View file

@ -0,0 +1,261 @@
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

@ -3,7 +3,7 @@ package main
import ( import (
"fmt" "fmt"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
var ( var (

View file

@ -3,7 +3,7 @@ package main
import ( import (
"os" "os"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
const colorCount = 23 const colorCount = 23

View file

@ -1,22 +1,43 @@
package main package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" "fmt"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
const ( const (
maxColumns = 20 maxColumns = 20
screenWidth = 800
screenHeight = 450
False = 0
True = 1
) )
func main() { var camModes = map[rl.CameraMode]string{
rl.InitWindow(800, 450, "raylib [core] example - 3d camera first person") 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() {
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera first person")
// Define the camera to look into our 3d world (position, target, up vector)
camera := rl.Camera3D{} camera := rl.Camera3D{}
camera.Position = rl.NewVector3(4.0, 2.0, 4.0) camera.Position = rl.NewVector3(0.0, 2.0, 4.0) // Camera position
camera.Target = rl.NewVector3(0.0, 1.8, 0.0) camera.Target = rl.NewVector3(0.0, 2.0, 0.0) // Camera looking at point
camera.Up = rl.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.Projection = rl.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)
@ -24,15 +45,81 @@ func main() {
colors := make([]rl.Color, maxColumns) colors := make([]rl.Color, maxColumns)
for i := 0; i < maxColumns; i++ { for i := 0; i < maxColumns; i++ {
heights[i] = float32(rl.GetRandomValue(1, 12)) heights[i] = rndF(1, 12)
positions[i] = rl.NewVector3(float32(rl.GetRandomValue(-15, 15)), heights[i]/2, float32(rl.GetRandomValue(-15, 15))) positions[i] = rl.NewVector3(rndF(-15, 15), heights[i]/2, rndF(-15, 15))
colors[i] = rl.NewColor(uint8(rl.GetRandomValue(20, 255)), uint8(rl.GetRandomValue(10, 55)), 30, 255) colors[i] = rl.NewColor(rndU(20, 255), rndU(10, 55), 30, 255)
} }
rl.SetTargetFPS(60) rl.DisableCursor() // Limit cursor to relative movement inside the window
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
for !rl.WindowShouldClose() { // Main game loop
rl.UpdateCamera(&camera, rl.CameraFirstPerson) // Update camera with first person mode 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
if rl.IsKeyPressed(rl.KeyP) {
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.
// 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
/*
// 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() rl.BeginDrawing()
@ -51,17 +138,57 @@ func main() {
rl.DrawCubeWires(positions[i], 2.0, heights[i], 2.0, rl.Maroon) rl.DrawCubeWires(positions[i], 2.0, heights[i], 2.0, rl.Maroon)
} }
// Draw player cube
if cameraMode == rl.CameraThirdPerson {
rl.DrawCube(camera.Target, 0.5, 0.5, 0.5, rl.Purple)
rl.DrawCubeWires(camera.Target, 0.5, 0.5, 0.5, rl.DarkPurple)
}
rl.EndMode3D() rl.EndMode3D()
rl.DrawRectangle(10, 10, 220, 70, rl.Fade(rl.SkyBlue, 0.5)) // Draw info boxes
rl.DrawRectangleLines(10, 10, 220, 70, rl.Blue) rl.DrawRectangle(5, 5, 330, 100, rl.Fade(rl.SkyBlue, 0.5))
rl.DrawRectangleLines(5, 5, 330, 100, rl.Blue)
rl.DrawText("First person camera default controls:", 20, 20, 10, rl.Black) rl.DrawText("Camera controls:", 15, 15, 10, rl.Black)
rl.DrawText("- Move with keys: W, A, S, D", 40, 40, 10, rl.DarkGray) rl.DrawText("- Move keys: W, A, S, D, Space, Left-Ctrl", 15, 30, 10, rl.Black)
rl.DrawText("- Mouse move to look around", 40, 60, 10, rl.DarkGray) 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.EndDrawing()
} }
rl.CloseWindow() 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,7 +1,7 @@
package main package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {
@ -44,8 +44,6 @@ func main() {
rl.DrawText("Free camera default controls:", 20, 20, 10, rl.Black) rl.DrawText("Free camera default controls:", 20, 20, 10, rl.Black)
rl.DrawText("- Mouse Wheel to Zoom in-out", 40, 40, 10, rl.DarkGray) rl.DrawText("- Mouse Wheel to Zoom in-out", 40, 40, 10, rl.DarkGray)
rl.DrawText("- Mouse Wheel Pressed to Pan", 40, 60, 10, rl.DarkGray) rl.DrawText("- Mouse Wheel Pressed to Pan", 40, 60, 10, rl.DarkGray)
rl.DrawText("- Alt + Mouse Wheel Pressed to Rotate", 40, 80, 10, rl.DarkGray)
rl.DrawText("- Alt + Ctrl + Mouse Wheel Pressed for Smooth Zoom", 40, 100, 10, rl.DarkGray)
rl.DrawText("- Z to zoom to (0, 0, 0)", 40, 120, 10, rl.DarkGray) rl.DrawText("- Z to zoom to (0, 0, 0)", 40, 120, 10, rl.DarkGray)
rl.EndDrawing() rl.EndDrawing()

View file

@ -1,13 +1,12 @@
package main package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
var ( var (
screenW = int32(800) screenW = int32(800)
screenH = int32(450) screenH = int32(450)
playerSize = float32(40)
cam1, cam2 rl.Camera3D cam1, cam2 rl.Camera3D
) )
@ -15,67 +14,63 @@ func main() {
rl.InitWindow(screenW, screenH, "raylib [core] example - 3d camera split screen") rl.InitWindow(screenW, screenH, "raylib [core] example - 3d camera split screen")
// Setup player 1 camera and screen
cam1.Fovy = 45 cam1.Fovy = 45
cam1.Up.Y = 1 cam1.Up.Y = 1
cam1.Target.Y = 1 cam1.Target.Y = 1
cam1.Position.Z = -3 cam1.Position.Z = -3
cam1.Position.Y = 0.5 cam1.Position.Y = 1
cam2 = cam1 // Setup player two camera and screen
cam1.Position.Z = 3 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) screenCam1 := rl.LoadRenderTexture(screenW/2, screenH)
screenCam2 := rl.LoadRenderTexture(screenW/2, screenH) screenCam2 := rl.LoadRenderTexture(screenW/2, screenH)
splitScreenRec := rl.NewRectangle(0, 0, float32(screenCam1.Texture.Width), -float32(screenCam1.Texture.Height)) splitScreenRec := rl.NewRectangle(0, 0, float32(screenCam1.Texture.Width), -float32(screenCam1.Texture.Height))
count := 5 count := float32(5)
spacing := float32(4) spacing := float32(4)
rl.SetTargetFPS(60) rl.SetTargetFPS(60)
for !rl.WindowShouldClose() { 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() frameOffset := 10 * rl.GetFrameTime()
// Move Player1 forward and backwards (no turning)
if rl.IsKeyDown(rl.KeyW) { if rl.IsKeyDown(rl.KeyW) {
cam1.Position.Z -= frameOffset
cam1.Target.Z -= frameOffset
} else if rl.IsKeyDown(rl.KeyS) {
cam1.Position.Z += frameOffset cam1.Position.Z += frameOffset
cam1.Target.Z += frameOffset cam1.Target.Z += frameOffset
} } else if rl.IsKeyDown(rl.KeyS) {
if rl.IsKeyDown(rl.KeyD) { cam1.Position.Z -= frameOffset
cam1.Position.X += frameOffset cam1.Target.Z -= frameOffset
cam1.Target.X += frameOffset
} else if rl.IsKeyDown(rl.KeyA) {
cam1.Position.X -= frameOffset
cam1.Target.X -= frameOffset
} }
// Move Player2 forward and backwards (no turning)
if rl.IsKeyDown(rl.KeyUp) { if rl.IsKeyDown(rl.KeyUp) {
cam2.Position.Z += frameOffset
cam2.Target.Z += frameOffset
} else if rl.IsKeyDown(rl.KeyDown) {
cam2.Position.Z -= frameOffset
cam2.Target.Z -= frameOffset
}
if rl.IsKeyDown(rl.KeyRight) {
cam2.Position.X -= frameOffset
cam2.Target.X -= frameOffset
} else if rl.IsKeyDown(rl.KeyLeft) {
cam2.Position.X += frameOffset cam2.Position.X += frameOffset
cam2.Target.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.BeginTextureMode(screenCam1)
rl.ClearBackground(rl.SkyBlue) rl.ClearBackground(rl.SkyBlue)
rl.BeginMode3D(cam1) rl.BeginMode3D(cam1)
rl.DrawPlane(rl.Vector3Zero(), rl.NewVector2(50, 50), rl.Beige) rl.DrawPlane(rl.Vector3Zero(), rl.NewVector2(50, 50), rl.Beige)
for x := -float32(count) * spacing; x <= float32(count)*spacing; x += spacing { for x := -count * spacing; x <= count*spacing; x += spacing {
for z := -float32(count) * spacing; z <= float32(count)*spacing; z += 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, 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(rl.NewVector3(x-0.5, 0.5, z), 0.25, 1, 0.25, rl.Brown)
} }
@ -87,17 +82,18 @@ func main() {
rl.EndMode3D() rl.EndMode3D()
rl.DrawRectangle(0, 0, screenW/2, 40, rl.Fade(rl.RayWhite, 0.8)) rl.DrawRectangle(0, 0, screenW/2, 40, rl.Fade(rl.RayWhite, 0.8))
rl.DrawText("PLAYER 1 WASD KEYS", 10, 10, 20, rl.Maroon) rl.DrawText("PLAYER1: W/S to move", 10, 10, 20, rl.Maroon)
rl.EndTextureMode() rl.EndTextureMode()
// Draw Player2 view to the render texture
rl.BeginTextureMode(screenCam2) rl.BeginTextureMode(screenCam2)
rl.ClearBackground(rl.SkyBlue) rl.ClearBackground(rl.SkyBlue)
rl.BeginMode3D(cam2) rl.BeginMode3D(cam2)
rl.DrawPlane(rl.Vector3Zero(), rl.NewVector2(50, 50), rl.Beige) rl.DrawPlane(rl.Vector3Zero(), rl.NewVector2(50, 50), rl.Beige)
for x := -float32(count) * spacing; x <= float32(count)*spacing; x += spacing { for x := -count * spacing; x <= count*spacing; x += spacing {
for z := -float32(count) * spacing; z <= float32(count)*spacing; z += 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, 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(rl.NewVector3(x, 0.5, z), 0.25, 1, 0.25, rl.Brown)
} }
@ -109,9 +105,10 @@ func main() {
rl.EndMode3D() rl.EndMode3D()
rl.DrawRectangle(0, 0, screenW/2, 40, rl.Fade(rl.RayWhite, 0.8)) rl.DrawRectangle(0, 0, screenW/2, 40, rl.Fade(rl.RayWhite, 0.8))
rl.DrawText("PLAYER 2 ARROW KEYS", 10, 10, 20, rl.Maroon) rl.DrawText("PLAYER2: UP/DOWN to move", 10, 10, 20, rl.Maroon)
rl.EndTextureMode() rl.EndTextureMode()
// Draw both views render textures to the screen side by side
rl.BeginDrawing() rl.BeginDrawing()
rl.ClearBackground(rl.Black) rl.ClearBackground(rl.Black)

View file

@ -1,7 +1,7 @@
package main package main
import ( import (
"github.com/gen2brain/raylib-go/raylib" "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -1,7 +1,7 @@
package main package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -1,6 +1,6 @@
package main package main
import "github.com/gen2brain/raylib-go/raylib" import "git.terah.dev/UnrealXR/raylib-go/raylib"
func main() { func main() {
rl.SetConfigFlags(rl.FlagVsyncHint) rl.SetConfigFlags(rl.FlagVsyncHint)

View file

@ -3,7 +3,7 @@ package main
import ( import (
"fmt" "fmt"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
const screenW = int32(1280) const screenW = int32(1280)

View file

@ -1,9 +1,5 @@
package main package main
import (
"github.com/gen2brain/raylib-go/raylib"
)
func main() { func main() {
rl.InitWindow(800, 450, "raylib [core] example - color selection (collision detection)") rl.InitWindow(800, 450, "raylib [core] example - color selection (collision detection)")

View file

@ -1,7 +1,7 @@
package main package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
/******************************************************************************************* /*******************************************************************************************

View file

@ -0,0 +1,131 @@
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

@ -0,0 +1,49 @@
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,9 +1,5 @@
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)

View file

@ -1,9 +1,5 @@
package main package main
import (
"github.com/gen2brain/raylib-go/raylib"
)
var ( var (
maxGestureStrings int = 20 maxGestureStrings int = 20
) )

View file

@ -3,7 +3,7 @@ package main
import ( import (
"fmt" "fmt"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
const ( const (

View file

@ -1,9 +1,5 @@
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)

View file

@ -1,7 +1,7 @@
package main package main
import ( import (
"github.com/gen2brain/raylib-go/raylib" "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -3,7 +3,7 @@ package main
import ( import (
"fmt" "fmt"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -3,7 +3,7 @@ package main
import ( import (
"fmt" "fmt"
"github.com/gen2brain/raylib-go/raylib" "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -1,7 +1,7 @@
package main package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
var ( var (

View file

@ -4,7 +4,7 @@ import (
"fmt" "fmt"
"math" "math"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
const screenW = int32(1280) const screenW = int32(1280)

View file

@ -0,0 +1,127 @@
/*******************************************************************************************
*
* 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
import (
"encoding/binary"
"fmt"
"os"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
storageDataFile = "storage.data"
// NOTE: Storage positions must start with 0, directly related to file memory layout
storagePositionScore = 0
storagePositionHiscore = 1
)
func main() {
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - storage save/load values")
var score int32
var hiscore int32
var framesCounter int32
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.IsKeyPressed(rl.KeyR) {
score = rl.GetRandomValue(1000, 2000)
hiscore = rl.GetRandomValue(2000, 4000)
}
if rl.IsKeyPressed(rl.KeyEnter) {
_ = SaveStorageValue(storagePositionScore, score)
_ = SaveStorageValue(storagePositionHiscore, hiscore)
} else if rl.IsKeyPressed(rl.KeySpace) {
// NOTE: If requested position could not be found, value 0 is returned
score, _ = LoadStorageValue(storagePositionScore)
hiscore, _ = LoadStorageValue(storagePositionHiscore)
}
framesCounter++
// Draw
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.DrawText(fmt.Sprintf("SCORE: %d", score), 280, 130, 40, rl.Maroon)
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)
rl.DrawText("Press R to generate random numbers", 220, 40, 20, rl.LightGray)
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()
}
// De-Initialization
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

@ -0,0 +1,52 @@
#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

@ -0,0 +1,53 @@
#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

@ -0,0 +1,137 @@
/*******************************************************************************************
*
* 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
import (
"fmt"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
glslVersion = 330 // Desktop
// glslVersion = 100 // Android, web
)
func main() {
// NOTE: screenWidth/screenHeight should match VR device aspect ratio
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - vr simulator")
// VR device parameters definition
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
// Following parameters are just an approximation to CV1 distortion stereo rendering
// Lens distortion constant parameters
LensDistortionValues: [4]float32{1.0, 0.22, 0.24, 0.0},
// Chromatic aberration correction parameters
ChromaAbCorrection: [4]float32{0.996, -0.004, 1.014, 0.0},
}
// Load VR stereo config for VR device parameters (Oculus Rift CV1 parameters)
config := rl.LoadVrStereoConfig(device)
// Distortion shader (uses device lens distortion and chroma)
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

@ -0,0 +1,260 @@
/*******************************************************************************************
*
* 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

@ -0,0 +1,115 @@
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

@ -0,0 +1,47 @@
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,7 +1,7 @@
package main package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -3,9 +3,9 @@ package main
import ( import (
"strings" "strings"
"github.com/gen2brain/raylib-go/easings" "git.terah.dev/UnrealXR/raylib-go/easings"
"github.com/gen2brain/raylib-go/raygui" "git.terah.dev/UnrealXR/raylib-go/raygui"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -18,7 +18,7 @@ package main
import ( import (
"math" "math"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
const ( const (

View file

@ -4,8 +4,6 @@ import (
"fmt" "fmt"
"os" "os"
"runtime" "runtime"
"github.com/gen2brain/raylib-go/raylib"
) )
const ( const (

View file

@ -4,7 +4,7 @@ import (
"math/rand" "math/rand"
"time" "time"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
const ( const (

174
examples/games/pong/main.go Normal file
View file

@ -0,0 +1,174 @@
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,9 +1,5 @@
package main package main
import (
"github.com/gen2brain/raylib-go/raylib"
)
const ( const (
snakeLength = 256 snakeLength = 256
squareSize = 31 squareSize = 31

View file

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

View file

@ -1,8 +1,10 @@
github.com/ebitengine/purego v0.5.0 h1:JrMGKfRIAM4/QVKaesIIT7m/UVjTj5GYhRSQYwfVdpo= github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE=
github.com/ebitengine/purego v0.5.0/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= 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 h1:zkhc2Gpo9l4NLUZfeG3j33+3bQD7MkqPa+n5PdX+5mI=
github.com/jakecoffman/cp v1.2.1/go.mod h1:JjY/Fp6d8E1CHnu74gWNnU0+b9VzEdUVPoJxg2PsTQg= 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 h1:+67TGbwfgeB5o03Rx+ZBW44zAQ+wUujcwdRA0p9CbJI=
github.com/neguse/go-box2d-lite v0.0.0-20170921151050-5d8ed9b7272b/go.mod h1:kvKwD9codtns5mvpA53V3vLnqFb/Ahcu8zgkGM0SIbI= github.com/neguse/go-box2d-lite v0.0.0-20170921151050-5d8ed9b7272b/go.mod h1:kvKwD9codtns5mvpA53V3vLnqFb/Ahcu8zgkGM0SIbI=
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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

@ -3,8 +3,8 @@ package main
import ( import (
"fmt" "fmt"
gui "github.com/gen2brain/raylib-go/raygui" gui "git.terah.dev/UnrealXR/raylib-go/raygui"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -3,8 +3,8 @@ package main
import ( import (
"fmt" "fmt"
gui "github.com/gen2brain/raylib-go/raygui" gui "git.terah.dev/UnrealXR/raylib-go/raygui"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
/******************************************************************************************* /*******************************************************************************************

View file

@ -0,0 +1,3 @@
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)

Binary file not shown.

View file

@ -0,0 +1,20 @@
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.

After

Width:  |  Height:  |  Size: 8 KiB

View file

@ -3,8 +3,8 @@ package main
import ( import (
"fmt" "fmt"
gui "github.com/gen2brain/raylib-go/raygui" gui "git.terah.dev/UnrealXR/raylib-go/raygui"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
/******************************************************************************************* /*******************************************************************************************

View file

@ -3,8 +3,8 @@ package main
import ( import (
"fmt" "fmt"
gui "github.com/gen2brain/raylib-go/raygui" gui "git.terah.dev/UnrealXR/raylib-go/raygui"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
/******************************************************************************************* /*******************************************************************************************

View file

@ -1,20 +1,42 @@
/*******************************************************************************************
*
* 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 package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
) )
func main() { func main() {
screenWidth := int32(1280)
screenHeight := int32(800)
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - model animation") rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - model animation")
camera := rl.Camera{} camera := rl.Camera{}
camera.Position = rl.NewVector3(10.0, 15.0, 10.0) camera.Position = rl.NewVector3(10.0, 10.0, 10.0)
camera.Target = rl.NewVector3(0.0, 0.0, 0.0) camera.Target = rl.NewVector3(0.0, 0.0, 0.0)
camera.Up = rl.NewVector3(0.0, 1.0, 0.0) camera.Up = rl.NewVector3(0.0, 1.0, 0.0)
camera.Fovy = 75.0 camera.Fovy = 45.0
camera.Projection = rl.CameraPerspective camera.Projection = rl.CameraPerspective
model := rl.LoadModel("guy.iqm") model := rl.LoadModel("guy.iqm")
@ -32,7 +54,7 @@ func main() {
for !rl.WindowShouldClose() { for !rl.WindowShouldClose() {
rl.UpdateCamera(&camera, rl.CameraOrbital) rl.UpdateCamera(&camera, rl.CameraFirstPerson)
if rl.IsKeyDown(rl.KeySpace) { if rl.IsKeyDown(rl.KeySpace) {
animFrameCount++ animFrameCount++
@ -43,17 +65,18 @@ func main() {
if animFrameCount >= int(animFrameNum) { if animFrameCount >= int(animFrameNum) {
animFrameCount = 0 animFrameCount = 0
} }
} }
rl.BeginDrawing() rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite) rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera) rl.BeginMode3D(camera)
rl.DrawModelEx(model, position, rl.NewVector3(1, 0, 0), -90, rl.NewVector3(1, 1, 1), rl.White) 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.DrawGrid(10, 1)
rl.EndMode3D() rl.EndMode3D()
@ -65,6 +88,7 @@ func main() {
} }
rl.UnloadModel(model) rl.UnloadModel(model)
rl.UnloadModelAnimations(anims)
rl.UnloadTexture(texture) rl.UnloadTexture(texture)
rl.CloseWindow() rl.CloseWindow()

View file

@ -1,13 +1,26 @@
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 "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
) )
func main() { func main() {
screenWidth := int32(800)
screenHeight := int32(450)
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - drawing billboards") rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - drawing billboards")
camera := rl.Camera{} camera := rl.Camera{}
@ -18,25 +31,60 @@ func main() {
camera.Projection = rl.CameraPerspective camera.Projection = rl.CameraPerspective
bill := rl.LoadTexture("billboard.png") // Our texture billboard bill := rl.LoadTexture("billboard.png") // Our texture billboard
billPosition := rl.NewVector3(0.0, 2.0, 0.0) // Position where draw billboard billPositionStatic := rl.NewVector3(0.0, 2.0, 0.0) // Position of static 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.
source := rl.Rectangle{
Width: float32(bill.Width),
Height: float32(bill.Height),
}
// NOTE: Billboard locked on axis-Y
billUp := rl.Vector3{Y: 1.0}
// Set the height of the rotating billboard to 1.0 with the aspect ratio fixed
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) rl.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !rl.WindowShouldClose() {
// Update
rl.UpdateCamera(&camera, rl.CameraOrbital) // Update camera with orbital camera mode 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.BeginDrawing()
rl.ClearBackground(rl.RayWhite) rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera) rl.BeginMode3D(camera)
rl.DrawGrid(10, 1.0) // Draw a grid rl.DrawGrid(10, 1.0) // Draw a grid
rl.DrawBillboard(camera, bill, billPosition, 2.0, rl.White) // 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.EndMode3D()
rl.DrawFPS(10, 10)
rl.EndDrawing() rl.EndDrawing()
} }

View file

@ -1,7 +1,7 @@
package main package main
import ( import (
"github.com/gen2brain/raylib-go/raylib" "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -1,7 +1,7 @@
package main package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View file

@ -0,0 +1,256 @@
/*******************************************************************************************
*
* 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)
}

View file

@ -2,8 +2,8 @@
* *
* raylib [models] example - first person maze * raylib [models] example - first person maze
* *
* This example has been created using raylib-go v0.0.0-20220104071325-2f072dc2d259 (https://github.com/gen2brain/raylib-go) * 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://github.com/gen2brain/raylib-go/blob/master/LICENSE) * 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) * Original C version for Raylib 2.5 Copyright (c) 2019 Ramon Santamaria (@raysan5)
* Converted to Go by Michael Redman January 4, 2022 * Converted to Go by Michael Redman January 4, 2022
@ -13,7 +13,7 @@
package main package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -1,9 +1,5 @@
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)

View file

@ -3,7 +3,7 @@ package main
import ( import (
"fmt" "fmt"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {
@ -62,7 +62,7 @@ func main() {
rl.EndMode3D() rl.EndMode3D()
rl.DrawText("current animation number: "+fmt.Sprint(animIndex), 10, 10, 10, rl.Black) 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.DrawText("UP/DOWN ARROW KEYS CHANGE ANIMATION", 10, 30, 10, rl.Black)
rl.EndDrawing() rl.EndDrawing()

View file

@ -3,7 +3,7 @@ package main
import ( import (
//"fmt" //"fmt"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

Binary file not shown.

View file

@ -0,0 +1,155 @@
/*******************************************************************************************
*
* 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,14 +1,16 @@
package main package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" "unsafe"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {
screenWidth := int32(1280) screenWidth := int32(1280)
screenHeight := int32(720) screenHeight := int32(720)
numModels := 8 numModels := 9
rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - mesh generation") rl.InitWindow(screenWidth, screenHeight, "raylib [models] example - mesh generation")
@ -33,6 +35,7 @@ func main() {
models[5] = rl.LoadModelFromMesh(rl.GenMeshTorus(0.25, 4, 16, 32)) models[5] = rl.LoadModelFromMesh(rl.GenMeshTorus(0.25, 4, 16, 32))
models[6] = rl.LoadModelFromMesh(rl.GenMeshKnot(1, 2, 16, 128)) models[6] = rl.LoadModelFromMesh(rl.GenMeshKnot(1, 2, 16, 128))
models[7] = rl.LoadModelFromMesh(rl.GenMeshPoly(5, 2)) models[7] = rl.LoadModelFromMesh(rl.GenMeshPoly(5, 2))
models[8] = rl.LoadModelFromMesh(GenMeshCustom())
for i := 0; i < numModels; i++ { for i := 0; i < numModels; i++ {
rl.SetMaterialTexture(models[i].Materials, rl.MapDiffuse, texture) rl.SetMaterialTexture(models[i].Materials, rl.MapDiffuse, texture)
@ -49,12 +52,17 @@ func main() {
rl.UpdateCamera(&camera, rl.CameraOrbital) rl.UpdateCamera(&camera, rl.CameraOrbital)
if rl.IsKeyPressed(rl.KeyUp) { if rl.IsKeyPressed(rl.KeyUp) {
currentModel++ currentModel = (currentModel + 1) % numModels // Cycle between the textures
if currentModel >= numModels {
currentModel = 0
} }
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.BeginDrawing()
rl.ClearBackground(rl.RayWhite) rl.ClearBackground(rl.RayWhite)
@ -66,9 +74,10 @@ func main() {
rl.EndMode3D() rl.EndMode3D()
rl.DrawRectangle(10, 10, 310, 30, rl.Fade(rl.SkyBlue, 0.5)) rl.DrawRectangle(10, 10, 310, 50, rl.Fade(rl.SkyBlue, 0.5))
rl.DrawRectangleLines(10, 10, 310, 30, rl.Fade(rl.DarkBlue, 0.5)) rl.DrawRectangleLines(10, 10, 310, 50, rl.Fade(rl.DarkBlue, 0.5))
rl.DrawText("UP ARROW KEY TO CHANGE MODELS", 20, 20, 10, rl.Blue) 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" txt := "PLANE"
switch currentModel { switch currentModel {
@ -86,6 +95,8 @@ func main() {
txt = "KNOT" txt = "KNOT"
case 7: case 7:
txt = "POLY" txt = "POLY"
case 8:
txt = "Custom (triangle)"
} }
txtlen := rl.MeasureText(txt, 20) txtlen := rl.MeasureText(txt, 20)
rl.DrawText(txt, screenWidth/2-txtlen/2, 10, 20, rl.DarkBlue) rl.DrawText(txt, screenWidth/2-txtlen/2, 10, 20, rl.DarkBlue)
@ -94,9 +105,63 @@ func main() {
} }
rl.UnloadTexture(texture) rl.UnloadTexture(texture)
// Custom models meshes needs to be
// cleared manually
clearCustomMesh(models[8])
for i := 0; i < numModels; i++ { for i := 0; i < numModels; i++ {
rl.UnloadModel(models[i]) rl.UnloadModel(models[i])
} }
rl.CloseWindow() 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

@ -0,0 +1,261 @@
/*******************************************************************************************
*
* 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)
}

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

View file

@ -1,9 +1,22 @@
package main package main
import ( import (
"github.com/gen2brain/raylib-go/raylib" "path/filepath"
"slices"
"unsafe"
"git.terah.dev/UnrealXR/raylib-go/raylib"
) )
var supportedFileTypes = []string{
".obj",
".gltf",
".glb",
".vox",
".iqm",
".m3d",
}
func main() { func main() {
screenWidth := int32(800) screenWidth := int32(800)
screenHeight := int32(450) screenHeight := int32(450)
@ -24,26 +37,75 @@ func main() {
position := rl.NewVector3(0.0, 0.0, 0.0) // Set model position position := rl.NewVector3(0.0, 0.0, 0.0) // Set model position
meshes := unsafe.Slice(obj.Meshes, obj.MeshCount)
bounds := rl.GetMeshBoundingBox(meshes[0]) // Set model bounds
selected := false
rl.DisableCursor()
rl.SetTargetFPS(60) rl.SetTargetFPS(60)
for !rl.WindowShouldClose() { for !rl.WindowShouldClose() {
// Update
rl.UpdateCamera(&camera, rl.CameraFirstPerson)
// Load new models/textures on drag&drop
if rl.IsFileDropped() {
droppedFiles := rl.LoadDroppedFiles()
if len(droppedFiles) == 1 { // Only support one file dropped
if slices.Contains(supportedFileTypes, filepath.Ext(droppedFiles[0])) { // Model file formats supported
rl.UnloadModel(obj) // Unload previous model
obj = rl.LoadModel(droppedFiles[0]) // Load new model
rl.SetMaterialTexture(obj.Materials, rl.MapDiffuse, texture) // Set current map diffuse texture
meshes = unsafe.Slice(obj.Meshes, obj.MeshCount)
bounds = rl.GetMeshBoundingBox(meshes[0])
// TODO: Move camera position from target enough distance to visualize model properly
} else if filepath.Ext(droppedFiles[0]) == ".png" { // Texture file formats supported
// Unload current model texture and load new one
rl.UnloadTexture(texture)
texture = rl.LoadTexture(droppedFiles[0])
rl.SetMaterialTexture(obj.Materials, rl.MapDiffuse, texture) // Set current map diffuse texture
}
}
rl.UnloadDroppedFiles() // Unload file paths from memory
}
// Select model on mouse click
if rl.IsMouseButtonPressed(rl.MouseButtonLeft) {
// Check collision between ray and box
if rl.GetRayCollisionBox(rl.GetMouseRay(rl.GetMousePosition(), camera), bounds).Hit {
selected = !selected
} else {
selected = false
}
}
rl.BeginDrawing() rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite) rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera) rl.BeginMode3D(camera)
rl.DrawModel(obj, position, 1.0, rl.White) // Draw 3d model with texture rl.DrawModel(obj, position, 1.0, rl.White) // Draw 3d model with texture
rl.DrawGrid(20, 10.0) // Draw a grid rl.DrawGrid(20, 10.0) // Draw a grid
if selected {
rl.DrawBoundingBox(bounds, rl.Green) // Draw selection box
}
rl.EndMode3D() rl.EndMode3D()
rl.DrawText("Drag & drop model to load mesh/texture", 10, screenHeight-20, 10, rl.Gray)
if selected {
rl.DrawText("Model selected!", screenWidth-110, 10, 10, rl.Green)
}
rl.DrawText("(c) Castle 3D model by Alberto Cano", screenWidth-200, screenHeight-20, 10, rl.Gray) rl.DrawText("(c) Castle 3D model by Alberto Cano", screenWidth-200, screenHeight-20, 10, rl.Gray)
rl.DrawFPS(10, 10)
rl.EndDrawing() rl.EndDrawing()
} }
rl.UnloadTexture(texture) // Unload texture rl.UnloadTexture(texture) // Unload texture
rl.UnloadModel(obj) // Unload model rl.UnloadModel(obj) // Unload model

View file

@ -1,7 +1,7 @@
package main package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -0,0 +1,155 @@
/*******************************************************************************************
*
* raylib [models] example - rlgl module usage with push/pop matrix transformations
*
* NOTE: This example uses [rlgl] module functionality (pseudo-OpenGL 1.1 style coding)
*
* 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) 2018-2024 Ramon Santamaria (@raysan5)
*
********************************************************************************************/
package main
import (
"math"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
const (
screenWidth = 800
screenHeight = 450
sunRadius = 4.0
earthRadius = 0.6
moonRadius = 0.16
earthOrbitRadius = 8.0
moonOrbitRadius = 1.5
rings, slices = 16, 16
)
func main() {
// Initialization
title := "raylib [models] example - rlgl module usage with push/pop matrix transformations"
rl.InitWindow(screenWidth, screenHeight, title)
// Define the camera to look into our 3d world
camera := rl.Camera{
Position: rl.Vector3{
X: 16.0,
Y: 16.0,
Z: 16.0,
}, // Camera position
Target: rl.Vector3{}, // Camera looking at point
Up: rl.Vector3{Y: 1.0}, // Camera up vector (rotation towards target)
Fovy: 45.0, // Camera field-of-view Y
Projection: rl.CameraPerspective, // Camera projection type
}
var rotationSpeed float32 = 0.2 // General system rotation speed
var earthRotation float32 // Rotation of earth around itself (days) in degrees
var earthOrbitRotation float32 // Rotation of earth around the Sun (years) in degrees
var moonRotation float32 // Rotation of moon around itself
var moonOrbitRotation float32 // Rotation of moon around earth in degrees
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.CameraOrbital)
earthRotation += 5.0 * rotationSpeed
earthOrbitRotation += 365 / 360.0 * (5.0 * rotationSpeed) * rotationSpeed
moonRotation += 2.0 * rotationSpeed
moonOrbitRotation += 8.0 * rotationSpeed
// Draw
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera)
rl.PushMatrix()
rl.Scalef(sunRadius, sunRadius, sunRadius) // Scale Sun
DrawSphereBasic(rl.Gold) // Draw the Sun
rl.PopMatrix()
rl.PushMatrix()
rl.Rotatef(earthOrbitRotation, 0.0, 1.0, 0.0) // Rotation for Earth orbit around Sun
rl.Translatef(earthOrbitRadius, 0.0, 0.0) // Translation for Earth orbit
rl.PushMatrix()
rl.Rotatef(earthRotation, 0.25, 1.0, 0.0) // Rotation for Earth itself
rl.Scalef(earthRadius, earthRadius, earthRadius) // Scale Earth
DrawSphereBasic(rl.Blue) // Draw the Earth
rl.PopMatrix()
rl.Rotatef(moonOrbitRotation, 0.0, 1.0, 0.0) // Rotation for Moon orbit around Earth
rl.Translatef(moonOrbitRadius, 0.0, 0.0) // Translation for Moon orbit
rl.Rotatef(moonRotation, 0.0, 1.0, 0.0) // Rotation for Moon itself
rl.Scalef(moonRadius, moonRadius, moonRadius) // Scale Moon
DrawSphereBasic(rl.LightGray) // Draw the Moon
rl.PopMatrix()
// Some reference elements (not affected by previous matrix transformations)
rl.DrawCircle3D(rl.Vector3{}, earthOrbitRadius, rl.NewVector3(1, 0, 0), 90.0, rl.Fade(rl.Red, 0.5))
rl.DrawGrid(20, 1.0)
rl.EndMode3D()
rl.DrawText("EARTH ORBITING AROUND THE SUN!", 400, 10, 20, rl.Maroon)
rl.DrawFPS(10, 10)
rl.EndDrawing()
}
// De-Initialization
rl.CloseWindow() // Close window and OpenGL context
}
// DrawSphereBasic draws a sphere without any matrix transformation
// NOTE: Sphere is drawn in world position ( 0, 0, 0 ) with radius 1.0f
func DrawSphereBasic(color rl.Color) {
// Make sure there is enough space in the internal render batch
// buffer to store all required vertex, batch is reset if required
rl.CheckRenderBatchLimit((rings + 2) * slices * 6)
rl.Begin(rl.Triangles)
rl.Color4ub(color.R, color.G, color.B, color.A)
for ring := int32(0); ring < (rings + 2); ring++ {
for slice := int32(0); slice < slices; slice++ {
rl.Vertex3f(getCoords(ring, slice))
rl.Vertex3f(getCoords(ring+1, slice+1))
rl.Vertex3f(getCoords(ring+1, slice))
rl.Vertex3f(getCoords(ring, slice))
rl.Vertex3f(getCoords(ring, slice+1))
rl.Vertex3f(getCoords(ring+1, slice+1))
}
}
rl.End()
}
func getCoords(ring, slice int32) (x, y, z float32) {
ringF := float64(ring)
sliceF := float64(slice)
// Calculate angels
alpha := rl.Deg2rad * (270 + (180/(float64(rings)+1))*ringF)
beta := rl.Deg2rad * (sliceF * 360 / float64(slices))
// Calculate coords
x = float32(math.Cos(alpha) * math.Sin(beta))
y = float32(math.Sin(alpha))
z = float32(math.Cos(alpha) * math.Cos(beta))
return x, y, z
}

View file

@ -0,0 +1,125 @@
package main
import (
"fmt"
"path/filepath"
"unsafe"
rl "git.terah.dev/UnrealXR/raylib-go/raylib"
)
func main() {
skyboxFilename := "skybox.png"
rl.InitWindow(800, 450, "raylib [models] example - skybox loading and drawing")
camera := rl.NewCamera3D(
rl.NewVector3(1.0, 1.0, 1.0),
rl.NewVector3(4.0, 1.0, 4.0),
rl.NewVector3(0.0, 1.0, 0.0),
45.0,
rl.CameraPerspective,
)
// load skybox shader and set required locations
skyboxShader := rl.LoadShader("skybox.vs", "skybox.fs")
setShaderIntValue(skyboxShader, "environmentMap", rl.MapCubemap)
// load skybox model
cube := rl.GenMeshCube(1.0, 1.0, 1.0)
skybox := rl.LoadModelFromMesh(cube)
skybox.Materials.Shader = skyboxShader
// load cubemap texture
skyboxImg := rl.LoadImage(skyboxFilename)
skyboxTexture := rl.LoadTextureCubemap(skyboxImg, rl.CubemapLayoutAutoDetect)
rl.UnloadImage(skyboxImg)
rl.SetMaterialTexture(skybox.Materials, rl.MapCubemap, skyboxTexture)
// limit cursor to relative movement inside the window
rl.DisableCursor()
// set our game to run at 60 frames-per-second
rl.SetTargetFPS(60)
for !rl.WindowShouldClose() {
rl.UpdateCamera(&camera, rl.CameraFirstPerson)
// load new cubemap texture on drag&drop
if rl.IsFileDropped() {
droppedFiles := rl.LoadDroppedFiles()
// only support one file dropped
if len(droppedFiles) == 1 {
switch filepath.Ext(droppedFiles[0]) {
case ".png", ".jpg", ".bmp", ".tga":
skyboxFilename = droppedFiles[0]
rl.UnloadTexture(skyboxTexture)
img := rl.LoadImage(skyboxFilename)
skyboxTexture = rl.LoadTextureCubemap(img, rl.CubemapLayoutAutoDetect)
rl.UnloadImage(img)
rl.SetMaterialTexture(skybox.Materials, rl.MapCubemap, skyboxTexture)
}
}
rl.UnloadDroppedFiles()
}
rl.BeginDrawing()
rl.ClearBackground(rl.White)
rl.BeginMode3D(camera)
// we are inside the cube, we need to disable backface culling
rl.DisableBackfaceCulling()
rl.DisableDepthMask()
rl.DrawModel(skybox, rl.NewVector3(0, 0, 0), 1.0, rl.White)
// restore depth and backface culling
rl.EnableBackfaceCulling()
rl.EnableDepthMask()
rl.DrawGrid(10, 1.0)
rl.EndMode3D()
rl.DrawText(
fmt.Sprintf("File: %s", skyboxFilename),
10,
int32(rl.GetScreenHeight()-20),
10,
rl.Black,
)
rl.DrawFPS(10, 10)
rl.EndDrawing()
}
rl.UnloadModel(skybox)
rl.UnloadTexture(skyboxTexture)
rl.UnloadShader(skyboxShader)
rl.CloseWindow()
}
func setShaderIntValue(shader rl.Shader, name string, value int32) {
rl.SetShaderValue(
shader,
rl.GetShaderLocation(shader, name),
unsafe.Slice((*float32)(unsafe.Pointer(&value)), 4),
rl.ShaderUniformInt,
)
}

View file

@ -0,0 +1,19 @@
#version 330
// input vertex attributes (from vertex shader)
in vec3 fragPosition;
// input uniform values
uniform samplerCube environmentMap;
// output fragment color
out vec4 finalColor;
void main()
{
// fetch color from texture map
vec3 color = texture(environmentMap, fragPosition).rgb;
// calculate final fragment color
finalColor = vec4(color, 1.0);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -0,0 +1,24 @@
#version 330
// input vertex attributes
in vec3 vertexPosition;
// input uniform values
uniform mat4 matProjection;
uniform mat4 matView;
// output vertex attributes (to fragment shader)
out vec3 fragPosition;
void main()
{
// calculate fragment position based on model transformations
fragPosition = vertexPosition;
// remove translation from the view matrix
mat4 rotView = mat4(mat3(matView));
vec4 clipPos = matProjection*rotView*vec4(vertexPosition, 1.0);
// calculate final vertex position
gl_Position = clipPos;
}

View file

@ -1,7 +1,7 @@
package main package main
import ( import (
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -3,7 +3,7 @@ package main
import ( import (
"math" "math"
rl "github.com/gen2brain/raylib-go/raylib" rl "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
func main() { func main() {

View file

@ -0,0 +1,113 @@
/*******************************************************************************************
*
* raylib [models] example - Plane rotations (yaw, pitch, roll)
*
* Example originally created with raylib 1.8, last time updated with raylib 4.0
*
* Example contributed by Berni (@Berni8k) 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 Berni (@Berni8k) and Ramon Santamaria (@raysan5)
*
********************************************************************************************/
package main
import rl "git.terah.dev/UnrealXR/raylib-go/raylib"
const (
screenWidth = 800
screenHeight = 450
)
func main() {
//SetConfigFlags(FLAG_MSAA_4X_HINT | FLAG_WINDOW_HIGHDPI)
title := "raylib [models] example - plane rotations (yaw, pitch, roll)"
rl.InitWindow(screenWidth, screenHeight, title)
camera := rl.Camera{
Position: rl.Vector3{
Y: 50.0,
Z: -120.0,
}, // Camera position perspective
Target: rl.Vector3{}, // Camera looking at point
Up: rl.Vector3{Y: 1.0}, // Camera up vector (rotation towards target)
Fovy: 30.0, // Camera field-of-view Y
Projection: rl.CameraPerspective, // Camera type
}
model := rl.LoadModel("plane.obj") // Load model
texture := rl.LoadTexture("plane_diffuse.png") // Load model texture
rl.SetMaterialTexture(model.Materials, rl.MapDiffuse, texture) // Set map diffuse texture
var pitch, roll, yaw float32
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
// Plane pitch (x-axis) controls
pitch = controlPlane(pitch, 0.6, rl.KeyDown, rl.KeyUp)
// Plane yaw (y-axis) controls
roll = controlPlane(roll, 1.0, rl.KeyLeft, rl.KeyRight)
// Plane roll (z-axis) controls
yaw = controlPlane(yaw, 1.0, rl.KeyA, rl.KeyS)
// Transformation matrix for rotations
rotationV := rl.Vector3{
X: rl.Deg2rad * pitch,
Y: rl.Deg2rad * yaw,
Z: rl.Deg2rad * roll,
}
model.Transform = rl.MatrixRotateXYZ(rotationV)
// Draw
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
// Draw 3D model (recommended to draw 3D always before 2D)
rl.BeginMode3D(camera)
// Draw 3d model with texture
rl.DrawModel(model, rl.Vector3{Y: -8.0}, 1.0, rl.White)
rl.DrawGrid(10, 10.0)
rl.EndMode3D()
// Draw controls info
rl.DrawRectangle(30, 370, 260, 70, rl.Fade(rl.Green, 0.5))
rl.DrawRectangleLines(30, 370, 260, 70, rl.Fade(rl.DarkGreen, 0.5))
rl.DrawText("Pitch controlled with: KEY_UP / KEY_DOWN", 40, 380, 10, rl.DarkGray)
rl.DrawText("Roll controlled with: KEY_LEFT / KEY_RIGHT", 40, 400, 10, rl.DarkGray)
rl.DrawText("Yaw controlled with: KEY_A / KEY_S", 40, 420, 10, rl.DarkGray)
rl.DrawText("(c) WWI Plane Model created by GiaHanLam", screenWidth-240, screenHeight-20, 10, rl.DarkGray)
rl.EndDrawing()
}
// De-Initialization
rl.UnloadModel(model) // Unload model data
rl.UnloadTexture(texture) // Unload texture data
rl.CloseWindow() // Close window and OpenGL context
}
func controlPlane(ctrl, value float32, key1, key2 int32) float32 {
if rl.IsKeyDown(key1) {
ctrl -= value
} else if rl.IsKeyDown(key2) {
ctrl += value
} else {
if ctrl > 0.0 {
ctrl -= value / 2
} else if ctrl < 0.0 {
ctrl += value / 2
}
}
return ctrl
}

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 KiB

View file

@ -3,7 +3,7 @@
To compile example to shared library you will need [Android NDK](https://developer.android.com/ndk/downloads/index.html). To compile example to shared library you will need [Android NDK](https://developer.android.com/ndk/downloads/index.html).
To build Android apk you will need [Android SDK](http://developer.android.com/sdk/index.html#Other). To build Android apk you will need [Android SDK](http://developer.android.com/sdk/index.html#Other).
Export path to Android NDK, point to location where you have unpacked archive: Export path to Android NDK, point to location where you have unpacked archive (WARNING: NDK 27 is not supported . See https://github.com/raysan5/raylib/issues/4166):
export ANDROID_NDK_HOME=/opt/android-ndk export ANDROID_NDK_HOME=/opt/android-ndk
@ -33,16 +33,17 @@ To build apk export path to Android SDK, point to location where you unpacked ar
export ANDROID_HOME=/opt/android-sdk export ANDROID_HOME=/opt/android-sdk
And build apk with ant: And build apk:
cd android
ant clean debug
Or with gradle:
./gradlew assembleDebug ./gradlew assembleDebug
If everything is successfully built apk can be found in bin/ directory or in the android/build/outputs in case `gradle` is used. If everything is successfully built apk can be found in the android/build/outputs.
For aarch64/arm64 replace `arm-linux-androideabi` with `aarch64-linux-android`, set GOARCH to arm64 and use minimum `ANDROID_API=21`. For aarch64/arm64 replace `arm-linux-androideabi` with `aarch64-linux-android`, set GOARCH to arm64 and use minimum `ANDROID_API=21`.
### Windows
To build shared libraries on Windows you can inspect the file `androidcompile.bat` by opening it on a text editor, it can then be configured to generate the libraries when running the .bat file
See also [instructions](https://developer.android.com/build/building-cmdline#build_bundle) to build a android app bundle for appstore distribution

View file

@ -1,10 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.github.gen2brain.raylib.go"
android:versionCode="1" android:versionCode="1"
android:versionName="1.0"> android:versionName="1.0">
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="27" /> <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="34" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" /> <uses-feature android:glEsVersion="0x00020000" android:required="true" />
<!-- We do not have Java code. Therefore android:hasCode is set to false. --> <!-- We do not have Java code. Therefore android:hasCode is set to false. -->
@ -15,6 +14,7 @@
<!-- Our activity is the built-in NativeActivity framework class. --> <!-- Our activity is the built-in NativeActivity framework class. -->
<activity android:name="android.app.NativeActivity" <activity android:name="android.app.NativeActivity"
android:exported="true"
android:configChanges="orientation|keyboardHidden|screenSize" android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="landscape" android:screenOrientation="landscape"
android:clearTaskOnLaunch="true"> android:clearTaskOnLaunch="true">

View file

@ -1,13 +1,14 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
compileSdkVersion 27 namespace = "com.example.android"
buildToolsVersion '27.0.3' compileSdkVersion 34
buildToolsVersion '34.0.0'
defaultConfig { defaultConfig {
applicationId "com.example.android" applicationId "com.example.android"
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 27 targetSdkVersion 34
versionCode 1 versionCode 1
versionName '1.0' versionName '1.0'
} }

View file

@ -1,92 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="example" default="help">
<!-- The local.properties file is created and updated by the 'android' tool.
It contains the path to the SDK. It should *NOT* be checked into
Version Control Systems. -->
<property file="local.properties" />
<!-- The ant.properties file can be created by you. It is only edited by the
'android' tool to add properties to it.
This is the place to change some Ant specific build properties.
Here are some properties you may want to change/update:
source.dir
The name of the source directory. Default is 'src'.
out.dir
The name of the output directory. Default is 'bin'.
For other overridable properties, look at the beginning of the rules
files in the SDK, at tools/ant/build.xml
Properties related to the SDK location or the project target should
be updated using the 'android' tool with the 'update' action.
This file is an integral part of the build system for your
application and should be checked into Version Control Systems.
-->
<property file="ant.properties" />
<!-- if sdk.dir was not set from one of the property file, then
get it from the ANDROID_HOME env var.
This must be done before we load project.properties since
the proguard config can use sdk.dir -->
<property environment="env" />
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
<isset property="env.ANDROID_HOME" />
</condition>
<!-- The project.properties file is created and updated by the 'android'
tool, as well as ADT.
This contains project specific properties such as project target, and library
dependencies. Lower level build properties are stored in ant.properties
(or in .classpath for Eclipse projects).
This file is an integral part of the build system for your
application and should be checked into Version Control Systems. -->
<loadproperties srcFile="project.properties" />
<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
unless="sdk.dir"
/>
<!--
Import per project custom build rules if present at the root of the project.
This is the place to put custom intermediary targets such as:
-pre-build
-pre-compile
-post-compile (This is typically used for code obfuscation.
Compiled code location: ${out.classes.absolute.dir}
If this is not done in place, override ${out.dex.input.absolute.dir})
-post-package
-post-build
-pre-clean
-->
<import file="custom_rules.xml" optional="true" />
<!-- Import the actual build file.
To customize existing targets, there are two options:
- Customize only one target:
- copy/paste the target into this file, *before* the
<import> task.
- customize it to your needs.
- Customize the whole content of build.xml
- copy/paste the content of the rules files (minus the top node)
into this file, replacing the <import> task.
- customize to your needs.
***********************
****** IMPORTANT ******
***********************
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
in order to avoid having your file be overridden by tools such as "android update project"
-->
<!-- version-tag: 1 -->
<import file="${sdk.dir}/tools/ant/build.xml" />
</project>

View file

@ -1,2 +0,0 @@
# Project target.
target=android-27

View file

@ -0,0 +1,68 @@
@REM Set your desired api. Max is 31
@set ANDROID_API=31
@REM Your library name. If you change it here you should also change it in your android manifest...
@set LIBRARY_NAME=example
@REM Set your android sdk folder here
@set ANDROID_HOME=F:/AndroidSDK
@REM Set your android NDK folder here. WARNING: NDK 27 is not supported yet. See https://github.com/raysan5/raylib/issues/4166
@set ANDROID_NDK_HOME=F:/AndroidSDK/ndk/23.2.8568313
@REM The target architecture for android. See https://developer.android.com/ndk/guides/abis.
@REM Valid options are: armeabi-v7a,arm64-v8a,x86,x86_64 or "all" if you want to build for all architectures.
@set TARGET_ARCH="all"
@REM Automatic setup. Should work by default. Do not change anything below here
@set PATH=%ANDROID_NDK_HOME%/toolchains/llvm/prebuilt/windows-x86_64/bin;%PATH%
@set ANDROID_SYSROOT=%ANDROID_NDK_HOME%/toolchains/llvm/prebuilt/windows-x86_64/sysroot
@set ANDROID_TOOLCHAIN=%ANDROID_NDK_HOME%/toolchains/llvm/prebuilt/windows-x86_64
@IF %TARGET_ARCH% == "all" (
@GOTO:BUILDALL
) else (
@GOTO:MAIN
)
:COMPILE
@echo compiling for platform %FL% and architecture %GOARCH%
@set CGO_CFLAGS="-I%ANDROID_SYSROOT%/usr/include -I%ANDROID_SYSROOT%/usr/include/%TRIPLE% --sysroot=%ANDROID_SYSROOT% -D__ANDROID_API__=%ANDROID_API%"
@set CGO_LDFLAGS="-L%ANDROID_SYSROOT%/usr/lib/%TRIPLE%/%ANDROID_API% -L%ANDROID_TOOLCHAIN%/%TRIPLE%/lib --sysroot=%ANDROID_SYSROOT%"
@set CGO_ENABLED=1
@set GOOS=android
@set GOARCH=%GOARCH%
@go build -buildmode=c-shared -ldflags="-s -w -extldflags=-Wl,-soname,lib%LIBRARY_NAME%.so" -o=android/libs/%FL%/lib%LIBRARY_NAME%.so
@EXIT /B
:BUILDALL
@set TARGET_ARCH="armeabi-v7a"
@CALL:MAIN
@set TARGET_ARCH="arm64-v8a"
@CALL:MAIN
@set TARGET_ARCH="x86"
@CALL:MAIN
@set TARGET_ARCH="x86_64"
@CALL:MAIN
@EXIT /B
:MAIN
@IF %TARGET_ARCH% == "armeabi-v7a" (
@set CC="armv7a-linux-androideabi%ANDROID_API%-clang"
@set TRIPLE=arm-linux-androideabi
@set FL=armeabi-v7a
@set GOARCH=arm
@CALL:COMPILE )
@IF %TARGET_ARCH% == "arm64-v8a" (
@set CC="aarch64-linux-android%ANDROID_API%-clang"
@set TRIPLE=aarch64-linux-android
@set FL=arm64-v8a
@set GOARCH=arm64
@CALL:COMPILE )
@IF %TARGET_ARCH% == "x86" (
@set CC="i686-linux-android%ANDROID_API%-clang"
@set TRIPLE=i686-linux-android
@set FL=x86
@set GOARCH=386
@CALL:COMPILE )
@IF %TARGET_ARCH% == "x86_64" (
@set CC="x86_64-linux-android%ANDROID_API%-clang"
@set TRIPLE=x86_64-linux-android
@set FL=x86_64
@set GOARCH=amd64
@CALL:COMPILE )
@EXIT /B

View file

@ -4,7 +4,7 @@ buildscript {
google() google()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.0.1' classpath 'com.android.tools.build:gradle:8.2.2'
} }
} }

View file

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-all.zip

View file

@ -4,7 +4,7 @@ import (
"os" "os"
"runtime" "runtime"
"github.com/gen2brain/raylib-go/raylib" "git.terah.dev/UnrealXR/raylib-go/raylib"
) )
// Game states // Game states

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