From 4fa0834a3d3b9d49be62fa5571efb72101248279 Mon Sep 17 00:00:00 2001 From: DarknessFX Date: Fri, 3 Jan 2025 03:17:08 -0500 Subject: [PATCH] . --- .../zig_raylib_examples/.vscode/launch.json | 36 + .../zig_raylib_examples/.vscode/tasks.json | 131 + .../zig_raylib_examples.code-workspace | 200 + projects/zig_raylib_examples/asset/raylib.ico | Bin 0 -> 99678 bytes projects/zig_raylib_examples/asset/raylib.png | Bin 0 -> 1868 bytes projects/zig_raylib_examples/build.zig | 62 + .../core/core_2d_camera.zig | 144 + .../core/core_2d_camera_mouse_zoom.zig | 133 + .../core/core_2d_camera_split_screen.zig | 168 + .../core/core_3d_camera_first_person.zig | 207 + .../core/core_3d_camera_free.zig | 85 + .../core/core_3d_camera_mode.zig | 82 + .../core/core_3d_camera_split_screen.zig | 170 + .../core/core_3d_picking.zig | 120 + .../core/core_automation_events.zig | 301 + .../core/core_basic_screen_manager.zig | 136 + .../core/core_basic_window.zig | 55 + .../core/core_custom_frame_control.zig | 130 + .../core/core_custom_logging.zig | 83 + .../core/core_drop_files copy.zig | 102 + .../core/core_drop_files.zig | 102 + .../core/core_input_gamepad.zig | 195 + .../core/core_input_gamepad_info.zig | 82 + .../core/core_input_gestures.zig | 120 + .../core/core_input_keys.zig | 62 + .../core/core_input_mouse.zig | 72 + .../core/core_input_mouse_wheel.zig | 66 + .../core/core_input_multitouch.zig | 77 + .../core/core_input_virtual_controls.zig | 141 + .../core/core_random_values.zig | 70 + .../core/core_scissor_test.zig | 79 + .../core/core_smooth_pixelperfect.zig | 121 + .../core/core_vr_simulator.zig | 136 + .../core/core_window_flags.zig | 185 + .../core/core_window_letterbox.zig | 131 + .../core/core_window_should_close.zig | 75 + .../core/core_world_screen.zig | 108 + projects/zig_raylib_examples/core/notes.txt | 7 + .../core/resources/LICENSE.md | 4 + .../core/resources/distortion100.fs | 52 + .../core/resources/distortion330.fs | 53 + .../core/resources/ps3.png | Bin 0 -> 19280 bytes .../core/resources/xbox.png | Bin 0 -> 16112 bytes .../lib/raylib/include/raylib.h | 1713 ++++++ .../lib/raylib/include/raymath.h | 2950 +++++++++ .../lib/raylib/include/rcamera.h | 555 ++ .../lib/raylib/include/rlgl.h | 5255 +++++++++++++++++ .../zig_raylib_examples/lib/raylib/raylib.lib | Bin 0 -> 1919234 bytes .../lib/raylib/raylib_gles3.lib | Bin 0 -> 1701270 bytes .../zig_raylib_examples.ico | Bin 0 -> 99678 bytes .../zig_raylib_examples.rc | 32 + 51 files changed, 14788 insertions(+) create mode 100644 projects/zig_raylib_examples/.vscode/launch.json create mode 100644 projects/zig_raylib_examples/.vscode/tasks.json create mode 100644 projects/zig_raylib_examples/.vscode/zig_raylib_examples.code-workspace create mode 100644 projects/zig_raylib_examples/asset/raylib.ico create mode 100644 projects/zig_raylib_examples/asset/raylib.png create mode 100644 projects/zig_raylib_examples/build.zig create mode 100644 projects/zig_raylib_examples/core/core_2d_camera.zig create mode 100644 projects/zig_raylib_examples/core/core_2d_camera_mouse_zoom.zig create mode 100644 projects/zig_raylib_examples/core/core_2d_camera_split_screen.zig create mode 100644 projects/zig_raylib_examples/core/core_3d_camera_first_person.zig create mode 100644 projects/zig_raylib_examples/core/core_3d_camera_free.zig create mode 100644 projects/zig_raylib_examples/core/core_3d_camera_mode.zig create mode 100644 projects/zig_raylib_examples/core/core_3d_camera_split_screen.zig create mode 100644 projects/zig_raylib_examples/core/core_3d_picking.zig create mode 100644 projects/zig_raylib_examples/core/core_automation_events.zig create mode 100644 projects/zig_raylib_examples/core/core_basic_screen_manager.zig create mode 100644 projects/zig_raylib_examples/core/core_basic_window.zig create mode 100644 projects/zig_raylib_examples/core/core_custom_frame_control.zig create mode 100644 projects/zig_raylib_examples/core/core_custom_logging.zig create mode 100644 projects/zig_raylib_examples/core/core_drop_files copy.zig create mode 100644 projects/zig_raylib_examples/core/core_drop_files.zig create mode 100644 projects/zig_raylib_examples/core/core_input_gamepad.zig create mode 100644 projects/zig_raylib_examples/core/core_input_gamepad_info.zig create mode 100644 projects/zig_raylib_examples/core/core_input_gestures.zig create mode 100644 projects/zig_raylib_examples/core/core_input_keys.zig create mode 100644 projects/zig_raylib_examples/core/core_input_mouse.zig create mode 100644 projects/zig_raylib_examples/core/core_input_mouse_wheel.zig create mode 100644 projects/zig_raylib_examples/core/core_input_multitouch.zig create mode 100644 projects/zig_raylib_examples/core/core_input_virtual_controls.zig create mode 100644 projects/zig_raylib_examples/core/core_random_values.zig create mode 100644 projects/zig_raylib_examples/core/core_scissor_test.zig create mode 100644 projects/zig_raylib_examples/core/core_smooth_pixelperfect.zig create mode 100644 projects/zig_raylib_examples/core/core_vr_simulator.zig create mode 100644 projects/zig_raylib_examples/core/core_window_flags.zig create mode 100644 projects/zig_raylib_examples/core/core_window_letterbox.zig create mode 100644 projects/zig_raylib_examples/core/core_window_should_close.zig create mode 100644 projects/zig_raylib_examples/core/core_world_screen.zig create mode 100644 projects/zig_raylib_examples/core/notes.txt create mode 100644 projects/zig_raylib_examples/core/resources/LICENSE.md create mode 100644 projects/zig_raylib_examples/core/resources/distortion100.fs create mode 100644 projects/zig_raylib_examples/core/resources/distortion330.fs create mode 100644 projects/zig_raylib_examples/core/resources/ps3.png create mode 100644 projects/zig_raylib_examples/core/resources/xbox.png create mode 100644 projects/zig_raylib_examples/lib/raylib/include/raylib.h create mode 100644 projects/zig_raylib_examples/lib/raylib/include/raymath.h create mode 100644 projects/zig_raylib_examples/lib/raylib/include/rcamera.h create mode 100644 projects/zig_raylib_examples/lib/raylib/include/rlgl.h create mode 100644 projects/zig_raylib_examples/lib/raylib/raylib.lib create mode 100644 projects/zig_raylib_examples/lib/raylib/raylib_gles3.lib create mode 100644 projects/zig_raylib_examples/zig_raylib_examples.ico create mode 100644 projects/zig_raylib_examples/zig_raylib_examples.rc diff --git a/projects/zig_raylib_examples/.vscode/launch.json b/projects/zig_raylib_examples/.vscode/launch.json new file mode 100644 index 0000000..d4ce92d --- /dev/null +++ b/projects/zig_raylib_examples/.vscode/launch.json @@ -0,0 +1,36 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug", + "type": "cppvsdbg", + "request": "launch", + "presentation": { + "hidden": false, + "group": "", + "order": 1 + }, + "program": "${workspaceFolder}/bin/Debug/${workspaceFolderBasename}.exe", + "args": [ ], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "preLaunchTask": "${defaultBuildTask}", + "console": "integratedTerminal", + "symbolSearchPath": "${workspaceFolder}/bin/Debug/", + }, + { + "name": "Debug Attach", + "type": "cppvsdbg", + "request": "attach", + "presentation": { + "hidden": true, + "group": "", + "order": 2 + }, + "preLaunchTask": "Zig: Run main", + "internalConsoleOptions": "openOnFirstSessionStart", + "processId": "${command:pickProcess}" + } + ] +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/.vscode/tasks.json b/projects/zig_raylib_examples/.vscode/tasks.json new file mode 100644 index 0000000..609a3a0 --- /dev/null +++ b/projects/zig_raylib_examples/.vscode/tasks.json @@ -0,0 +1,131 @@ +{ + "tasks": [{ + "label": "Zig: Build", + "args": [ "build", "--summary", "all" ], + "detail": "zig build --summary all", + "command": "zig", "type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "build", "isDefault": true }, + "presentation": { "group": "build", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "Zig: Build Release Safe.", + "args": [ "build", "-Doptimize=ReleaseSafe", "--summary", "all" ], + "detail": "zig build -Doptimize=ReleaseSafe --summary all", + "command": "zig", "type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "build", "isDefault": false }, + "presentation": { "group": "build", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "Zig: Build Release Fast.", + "args": [ "build", "-Doptimize=ReleaseFast", "--summary", "all" ], + "detail": "zig build -Doptimize=ReleaseFast --summary all", + "command": "zig","type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "build", "isDefault": false }, + "presentation": { "group": "build", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "Zig: Build Release Small.", + "args": [ "build", "-Doptimize=ReleaseSmall", "--summary", "all" ], + "detail": "zig build -Doptimize=ReleaseSmall --summary all", + "command": "zig", "type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "build", "isDefault": false }, + "presentation": { "group": "build", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "Zig: Build Release Strip.", + "args": [ ], + "detail": "zig build-exe -O ReleaseSmall -fstrip -fsingle-threaded (+ lots of options) main.zig", + "command": "buildReleaseStrip.bat", "type": "shell", "options": { "cwd": "${workspaceRoot}\\tools" }, "group": { "kind": "build", "isDefault": false }, + "presentation": { "group": "build", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "Zig: Test", + "args": [ "test", "${file}" ], + "detail": "'zig test' in the current workspace.", + "command": "zig", "type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "test", "isDefault": true }, + "presentation": { "group": "test", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "Zig: Run main", + "args": [ "run", "-lc", + "-lwinmm", "-lgdi32", "-lopengl32", "-lraylib", + "-Llib/raylib", + "-Ilib/raylib/include", + "main.zig" + ], + "detail": "zig run main.zig", + "command": "zig", "type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "none", "isDefault": true }, + "presentation": { "group": "launch", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "Zig: Run main (With Args)", + "args": [ "run", "-lc", + "-lwinmm", "-lgdi32", "-lopengl32", "-lraylib", + "-Llib/raylib", + "-Ilib/raylib/include", + "main.zig" , "--", "ArgsForYourProgram" ], + "detail": "zig run main.zig -- ArgsForYourProgram", + "command": "zig", "type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "none", "isDefault": false }, + "presentation": { "group": "launch", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "Zig: Run main (Fast)", + "args": [ "run", "-lc", + "-lwinmm", "-lgdi32", "-lopengl32", "-lraylib", + "-Llib/raylib", + "-Ilib/raylib/include", + "main.zig" , "-O", "ReleaseFast" ], + "detail": "zig run main.zig -O ReleaseFast", + "command": "zig", "type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "none", "isDefault": false }, + "presentation": { "group": "launch", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "Zig: Run main (Safe)", + "args": [ "run", "-lc", + "-lwinmm", "-lgdi32", "-lopengl32", "-lraylib", + "-Llib/raylib", + "-Ilib/raylib/include", + "main.zig" , "-O", "ReleaseSafe" ], + "detail": "zig run main.zig -O ReleaseSafe", + "command": "zig", "type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "none", "isDefault": false }, + "presentation": { "group": "launch", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "Zig: Run main (Small)", + "args": [ "run", "-lc", + "-lwinmm", "-lgdi32", "-lopengl32", "-lraylib", + "-Llib/raylib", + "-Ilib/raylib/include", + "main.zig" , "-O", "ReleaseSmall" ], + "detail": "zig run main.zig -O ReleaseSmall", + "command": "zig", "type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "none", "isDefault": false }, + "presentation": { "group": "launch", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "Zig: Run current file", + "args": [ "run", "-lc", + "-lwinmm", "-lgdi32", "-lopengl32", "-lraylib", + "-Llib/raylib", + "-Ilib/raylib/include", + "${file}" + ], + "detail": "'zig run' active file in the current workspace.", + "command": "zig", "type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "none", "isDefault": false }, + "presentation": { "group": "launch", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "zTime Zig: Run current file", + "args": [ "zig", "run", "-lc", + "-lwinmm", "-lgdi32", "-lopengl32", "-lraylib", + "-Llib/raylib", + "-Ilib/raylib/include", + "${file}" ], + "detail": "'zTime zig run' active file in the current workspace.", + "command": "zig", "type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "none", "isDefault": false }, + "presentation": { "group": "zTime", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }, + { + "label": "Zig: Docs", + "args": [ "run", "-femit-docs", "main.zig" ], + "detail": "Generate docs from source comments.", + "command": "zig", "type": "shell", "options": { "cwd": "${workspaceRoot}" }, "group": { "kind": "none", "isDefault": false }, + "presentation": { "group": "docs", "echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true, "close": false }, "problemMatcher": [] + }], + "version": "2.0.0" +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/.vscode/zig_raylib_examples.code-workspace b/projects/zig_raylib_examples/.vscode/zig_raylib_examples.code-workspace new file mode 100644 index 0000000..4755d19 --- /dev/null +++ b/projects/zig_raylib_examples/.vscode/zig_raylib_examples.code-workspace @@ -0,0 +1,200 @@ +{ + "folders": [{ "path": ".." }], + "settings": { + // Zig Workspace + "files.exclude": { + "*.lnk": true, + "**/.git": true, + ".gitignore": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "**/Thumbs.db": true, + // VSCODE FOLDERS -------- + "**/.vscode": false, + "**/.code-workspace": true, + // ZIG FOLDERS -------- + "**/zig-cache": true, + "**/.zig-cache": true + }, + "search.exclude": { + "**/node_modules": true, + "**/bower_components": true, + "**/*.code-search": true, + // ZIG FOLDERS -------- + "**/zig-out": true + }, + "files.watcherExclude": { + // ZIG FOLDERS -------- + "**/zig-cache": true + }, + + // DarknessFX settings + "telemetry.telemetryLevel": "off", + "workbench.colorTheme": "Default Dark+", + "workbench.startupEditor": "none", + "workbench.colorCustomizations": { + "statusBar.background" : "#1A1A1A", + "statusBar.noFolderBackground" : "#212121", + "statusBar.debuggingBackground": "#263238", + "editorBracketHighlight.foreground1": "#888888", + "editorBracketHighlight.foreground2": "#686888", + "editorBracketHighlight.foreground3": "#688868", + "editorBracketHighlight.foreground4": "#886868", + "editorBracketHighlight.foreground5": "#686868", + }, + "editor.tokenColorCustomizations": { + "comments": "#546E7A", + "functions": "#DFAB4B", + "keywords": "#367CB6", + "numbers": "#CE9178", + "strings": "#CE9178", + "types": "#2EA990", + "variables": "#7CBCDE", + + "[Default Dark+]": { + "textMateRules": [ + { + "scope": [ + "other", + "source", + "keyword.operator", + "keyword.operator.noexcept", + "punctuation", + "punctuation.dot", + "punctuation.comma", + "punctuation.definitions", + "punctuation.definition.comment", + "punctuation.definition.tag", + "punctuation.definition.tag.html", + "punctuation.definition.tag.begin.html", + "punctuation.definition.tag.end.html", + "punctuation.section.embedded", + "punctuation.separator", + "punctuation.separator.inheritance.php", + ], + "settings": { + "foreground": "#758E68", + "fontStyle": "", + } + }, + { + "scope": [ + "comment", + ], + "settings": { + "fontStyle": "italic", + } + }, + { + "scope": [ + "keyword", + "keyword.control", + "keyword.other", + "keyword.other.template", + "keyword.other.substitution", + "keyword.other.unit", + "storage", + "storage.type", + "storage.modifier", + "keywordLiteral", + "keyword.literal", + "keyword.constant.default", + ], + "settings": { + "fontStyle": "italic", + "foreground": "#367CB6" + } + }, + { + "scope": [ + "support.class", + "support.type", + "entity.name.type", + "entity.name.namespace", + "entity.other.attribute", + "entity.name.scope-resolution", + "entity.name.class", + ], + "settings": { + "foreground": "#2EA990" + } + }, + ], + }, + }, + "editor.tabSize": 2, + "editor.fontSize": 16, + "editor.unicodeHighlight.invisibleCharacters": false, + "editor.autoClosingBrackets": "never", + "editor.autoSurround": "never", + "editor.autoClosingQuotes": "never", + "editor.detectIndentation": false, + "editor.lightbulb.enabled": "off", + "workbench.editor.focusRecentEditorAfterClose": false, + "workbench.panel.defaultLocation": "left", + "workbench.panel.opensMaximized": "never", + "workbench.editor.tabSizing": "fixed", + "workbench.editor.tabSizingFixedMaxWidth": 140, + "workbench.sideBar.location": "right", + "debug.allowBreakpointsEverywhere": true, + "debug.onTaskErrors": "abort", + "explorer.confirmDragAndDrop": false, + "explorer.compactFolders": false, + "explorer.confirmDelete": false, + "terminal.integrated.profiles.windows": { + "Windows Terminal": { + "path": "wt", + "args": [ + "-p", "cmd", "cmd" + ], + "icon": "terminal-bash", + }, + "Command Prompt": { + "path": [ + "${env:windir}\\Sysnative\\cmd.exe", + "${env:windir}\\System32\\cmd.exe" + ], + "args": [], + "icon": "terminal-cmd" + }, + "PowerShell": { + "source": "PowerShell", + "icon": "terminal-powershell" + }, + "Git Bash": { + "source": "Git Bash" + }, + }, + "terminal.integrated.tabs.location": "left", + "terminal.integrated.defaultProfile.windows": "Command Prompt", + "C_Cpp.vcFormat.space.groupSquareBrackets": false, + "C_Cpp.loggingLevel": "Debug", + "C_Cpp.codeAnalysis.clangTidy.codeAction.formatFixes": false, + "git.openRepositoryInParentFolders": "never", + "html.autoCreateQuotes": false, + "zig.buildFilePath": "${workspaceFolder}", + "zig.formattingProvider": "off", + "zig.checkForUpdate": false, + "zig.zls.enabled": true, + "zig.zls.highlightGlobalVarDeclarations": true, + "zig.zls.semanticTokens": "full", + "zig.zls.enableArgumentPlaceholders": false, + "zig.zls.inlayHintsExcludeSingleArgument": false, + "zig.zls.enableAutofix": false, + "zig.zls.checkForUpdate": false, + "zig.zls.enableInlayHints": false, + "zig.zls.preferAstCheckAsChildProcess": false, + "files.associations": { + "raylib.h": "c", + "rcamera.h": "c", + "raymath.h": "c" + }, + }, + "extensions": { + "recommendations": [ + "pkief.material-icon-theme" + ] + } +} diff --git a/projects/zig_raylib_examples/asset/raylib.ico b/projects/zig_raylib_examples/asset/raylib.ico new file mode 100644 index 0000000000000000000000000000000000000000..b06b6be40cebe4cdaeeca31675c801995f680b7c GIT binary patch literal 99678 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 literal 0 HcmV?d00001 diff --git a/projects/zig_raylib_examples/asset/raylib.png b/projects/zig_raylib_examples/asset/raylib.png new file mode 100644 index 0000000000000000000000000000000000000000..99ba5437467d000717a2782ad404210d81ae934d GIT binary patch literal 1868 zcmXX{Ygm%m7G}I8MhfZ?9Cak7W6fA%cE-V5l7LZZjy8G2%fx7@`HaXYiN{1O5*_nW z9knU1FogzGDrYp*Xv_=U49=5y#)Ef7#wOI1&K-e<4%u6Mn=BrKF{ zwcT+$1Ol--dW3WW*bBe~H37aMaqnt@?UT$CWCG;wkn?Vbj%8h&ia;iCM%oz<7r43H8nj88ya+S=ed7iy|A91DeloWW9nee7Y@jcIXhxz|DH^;gbQEiD|x7q}-iL)ovr)wx}vz}!)JgR6$!&hhH zvulr4qx_`D8{rhB|wDaU3o z&lcvJ7-uG2wBA+W8$^MTd!{6OUHqu$6+`cpr8^cSa$i8W7#^jo7;`x3p@bvV4)%Ij=2zAt z-`U@Tl1u3AAW}tKi<95LvD;+}_wJTPe)jf1bXb-&`m8gBA%oFz%~xH+Tu0#msSxe-R8a#?EG_314vC6?=ip<#koH7NeT6B?_qyHW@Xr|Yvn-eX?A`?gxR z!u3*jSW&a%;Nth3`!~NS^(mEr`FBhruetgPq`6S^tcH~`j9ElFG-{)!<&M|9*kj+T zI^PptuT8Mqr%#THz}%3BePsNMk)X7Ow|fZ*vIsNQoh=%QVndWHS8I_c4^HhkWFHkT zF5f)<-xpt?I3VcN#mCyu=_TznoqrDq67&91#E`HMN~zb>BNo*fU6 zf#QDcEjg5(uKe1{4P%9cwNL0ERlv%Rd5tB{c-ix?g6U!f98Y=Cj6$ z%sL(&xb7uZo_7k!+*~}6WHqG#D>LBnuozn7Qw=Ik|B*)1rIk&)g; z(jR)gM)ckrIyWXs`Jp78-9466LZ8vXMR`D6@M;P}0W@mKWXw<(fdX4Q)$qBmiD(8+ zwb!%K7mQ#V3Cc^ILCM2GX=nyi&WWzcOv867Z*cqPdN+WK5WjGo(9NDdU_0|EV) z-6Uave1fxf&DIS-O{6e?{IVg!W4RkCEKmk4AdIQBNyqjfPD*{l_5Ak*^Z3o>KP3fP zvQ5spLT#y^Ek}Xk_q8sG`!d&`j01&)bC#}{-fJ3Y`SW);@1}>Y4c$b}H!VWDEl{Lg%Iu_CzP@<}RS|Ifa+_xEsl-EB5jQbZ_po##8&Fh2Mn6QYmI4 z$0xeqT>u5|j3QK2V5=;<&9-tNVAJlv0iK;of%y=%24yO)1BRI$9P(|+Xz%&B`qa!G% zHLY(B6liwV|NE(8hIes3N`1+~pQe4;t7jA~?Kn6PABk{p_<6o&E#J_pEU`d}CoPpm zkupKP<$sYHPjBKgXG+o3HWL1g)Jl=Iye}kp88Kd@*|z>7inCM?m|O+D#-60#`QD2) zGhJ+S+H@T3r3n1>#odjJrd-Ty%+F5eov+Wkt1mupI(XY)+#RySi>N2r^&q9)(f)(K zDa`G9!mwr{PhDB%NaMqGV49iu9aFOS4hxEb7~P+T*_e?}Jp6?p2DnMJ=CCX_qtwUL zOuzG=PI{l&Et9>iftulq19*Fi#|ITC1ZbQktocV!ZQyG17ltOU!vL3yP}MYluxS|2 z9tQ0K)bi+6FE$zVW@~a-`*`u7{RTgF4;xz)dW#1x2e8{SJ`UJ4U&m1**AJ6a8!gQY z@}ftX02<;q7}5936$T=EOi)WyyICByV`gS%Uh5wj*|e#!o$-27m= 13) dir.close(); + + var iter = dir.iterate(); + while (try iter.next()) |entry| { + if (std.mem.endsWith(u8, entry.name, ".zig")) { + const source_path = try std.fs.path.join(b.allocator, &.{ folder, entry.name }); + buildExample(b, target, optimize, source_path, entry.name); + } + } + } +} + +pub fn buildExample(b: *std.Build, + target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, + sourcepath: []const u8, sourcename: []const u8) void { + const projectname = "zig_raylib_examples"; + //const sourcefile = "main.zig"; + + const exe = b.addExecutable(.{ + .name = sourcename, + .root_source_file = b.path(sourcepath), + .target = target, + .optimize = optimize + }); + exe.addWin32ResourceFile(.{ + .file = b.path(projectname ++ ".rc"), + .flags = &.{"/c65001"}, // UTF-8 codepage + }); + exe.linkLibC(); + + exe.addIncludePath( b.path("lib/raylib/include") ); + exe.addLibraryPath( b.path("lib/raylib") ); + exe.linkSystemLibrary("raylib"); + exe.linkSystemLibrary("winmm"); + exe.linkSystemLibrary("gdi32"); + exe.linkSystemLibrary("opengl32"); + + switch (optimize) { + .Debug => b.exe_dir = "bin/Debug", + .ReleaseSafe => b.exe_dir = "bin/ReleaseSafe", + .ReleaseFast => b.exe_dir = "bin/ReleaseFast", + .ReleaseSmall => b.exe_dir = "bin/ReleaseSmall" + //else => b.exe_dir = "bin/Else", + } + b.installArtifact(exe); +} diff --git a/projects/zig_raylib_examples/core/core_2d_camera.zig b/projects/zig_raylib_examples/core/core_2d_camera.zig new file mode 100644 index 0000000..f1174a4 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_2d_camera.zig @@ -0,0 +1,144 @@ +//!zig-autodoc-section: core_2d_camera.Main +//! raylib_examples/core_2d_camera.zig +//! Example - 2D Camera system. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); + @cInclude("stdlib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth: c_int = 800; + const screenHeight: c_int = 450; + const MAX_BUILDINGS: usize = 100; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera"); + + var player: rl.Rectangle = .{ .x=400, .y=280, .width=40, .height=40 }; + var buildings: [MAX_BUILDINGS]rl.Rectangle = undefined; + var buildColors: [MAX_BUILDINGS]rl.Color = undefined; + + var spacing: c_int = 0; + + for (0..MAX_BUILDINGS) |i| { + buildings[i].width = toFloat(rl.GetRandomValue(50, 200)); + buildings[i].height = toFloat(rl.GetRandomValue(100, 800)); + buildings[i].y = toFloat(screenHeight) - 130.0 - buildings[i].height; + buildings[i].x = -6000.0 + toFloat(spacing); + + spacing += toInt(buildings[i].width); + + buildColors[i] = rl.Color{ + .r = @intCast(rl.GetRandomValue(200, 240)), + .g = @intCast(rl.GetRandomValue(200, 240)), + .b = @intCast(rl.GetRandomValue(200, 250)), + .a = 255, + }; + } + + var camera: rl.Camera2D = .{}; + camera.target = rl.Vector2{ .x = player.x + 20.0, .y = player.y + 20.0 }; + camera.offset = rl.Vector2{ .x = toFloat(screenWidth) / 2.0, .y = toFloat(screenHeight) / 2.0 }; + camera.rotation = 0.0; + camera.zoom = 1.0; + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + // Player movement + if (rl.IsKeyDown(rl.KEY_RIGHT)) player.x += 2 + else if (rl.IsKeyDown(rl.KEY_LEFT)) player.x -= 2; + + // Camera target follows player + camera.target = rl.Vector2{ .x = player.x + 20, .y = player.y + 20 }; + + // Camera rotation controls + if (rl.IsKeyDown(rl.KEY_A)) camera.rotation -= 1 + else if (rl.IsKeyDown(rl.KEY_S)) camera.rotation += 1; + + // Limit camera rotation to 80 degrees (-40 to 40) + if (camera.rotation > 40) camera.rotation = 40 + else if (camera.rotation < -40) camera.rotation = -40; + + // Camera zoom controls + camera.zoom += rl.GetMouseWheelMove() * 0.05; + + if (camera.zoom > 3.0) camera.zoom = 3.0 + else if (camera.zoom < 0.1) camera.zoom = 0.1; + + // Camera reset (zoom and rotation) + if (rl.IsKeyPressed(rl.KEY_R)) { + camera.zoom = 1.0; + camera.rotation = 0.0; + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + rl.BeginMode2D(camera); + + rl.DrawRectangle(-6000, 320, 13000, 8000, rl.DARKGRAY); + + for (0..MAX_BUILDINGS) |i| { + rl.DrawRectangleRec(buildings[i], buildColors[i]); + } + + rl.DrawRectangleRec(player, rl.RED); + + rl.DrawLine(toInt(camera.target.x), -screenHeight * 10, toInt(camera.target.x), screenHeight * 10, rl.GREEN); + rl.DrawLine(-screenWidth * 10, toInt(camera.target.y), screenWidth * 10, toInt(camera.target.y), rl.GREEN); + + rl.EndMode2D(); + + rl.DrawText("SCREEN AREA", 640, 10, 20, rl.RED); + + rl.DrawRectangle(0, 0, screenWidth, 5, rl.RED); + rl.DrawRectangle(0, 5, 5, screenHeight - 10, rl.RED); + rl.DrawRectangle(screenWidth - 5, 5, 5, screenHeight - 10, rl.RED); + rl.DrawRectangle(0, screenHeight - 5, screenWidth, 5, rl.RED); + + rl.DrawRectangle(10, 10, 250, 113, rl.Fade(rl.SKYBLUE, 0.5)); + rl.DrawRectangleLines(10, 10, 250, 113, rl.BLUE); + + rl.DrawText("Free 2d camera controls:", 20, 20, 10, rl.BLACK); + rl.DrawText("- Right/Left to move Offset", 40, 40, 10, rl.DARKGRAY); + rl.DrawText("- Mouse Wheel to Zoom in-out", 40, 60, 10, rl.DARKGRAY); + rl.DrawText("- A / S to Rotate", 40, 80, 10, rl.DARKGRAY); + rl.DrawText("- R to reset Zoom and Rotation", 40, 100, 10, rl.DARKGRAY); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_2d_camera_mouse_zoom.zig b/projects/zig_raylib_examples/core/core_2d_camera_mouse_zoom.zig new file mode 100644 index 0000000..a49defd --- /dev/null +++ b/projects/zig_raylib_examples/core/core_2d_camera_mouse_zoom.zig @@ -0,0 +1,133 @@ +//!zig-autodoc-section: core_2d_camera_mouse_zoom.Main +//! raylib_examples/core_2d_camera_mouse_zoom.zig +//! Example - 2d camera mouse zoom. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); + @cInclude("rlgl.h"); + @cInclude("raymath.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth: c_int = 800; + const screenHeight: c_int = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera mouse zoom"); + + var camera = rl.Camera2D{ + .offset = .{ .x = 0.0, .y = 0.0 }, + .target = .{ .x = 0.0, .y = 0.0 }, + .rotation = 0.0, + .zoom = 1.0, + }; + + var zoomMode: i32 = 0; // 0-Mouse Wheel, 1-Mouse Move + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { + // Update + //---------------------------------------------------------------------------------- + if (rl.IsKeyPressed(rl.KEY_ONE)) zoomMode = 0 + else if (rl.IsKeyPressed(rl.KEY_TWO)) zoomMode = 1; + + // Translate based on mouse right click + if (rl.IsMouseButtonDown(rl.MOUSE_BUTTON_LEFT)) { + var delta = rl.GetMouseDelta(); + delta = rl.Vector2Scale(delta, -1.0 / camera.zoom); + camera.target = rl.Vector2Add(camera.target, delta); + } + + if (zoomMode == 0) { + // Zoom based on mouse wheel + const wheel = rl.GetMouseWheelMove(); + if (wheel != 0) { + // Get the world point that is under the mouse + const mouseWorldPos = rl.GetScreenToWorld2D(rl.GetMousePosition(), camera); + + // Set the offset to where the mouse is + camera.offset = rl.GetMousePosition(); + + // Set the target to match the world space point + camera.target = mouseWorldPos; + + // Zoom increment + var scaleFactor = 1.0 + (0.25 * rl.fabsf(wheel)); + if (wheel < 0) scaleFactor = 1.0 / scaleFactor; + camera.zoom = rl.Clamp(camera.zoom * scaleFactor, 0.125, 64.0); + } + } else { + // Zoom based on mouse right click + if (rl.IsMouseButtonPressed(rl.MOUSE_BUTTON_RIGHT)) { + const mouseWorldPos = rl.GetScreenToWorld2D(rl.GetMousePosition(), camera); + camera.offset = rl.GetMousePosition(); + camera.target = mouseWorldPos; + } + if (rl.IsMouseButtonDown(rl.MOUSE_BUTTON_RIGHT)) { + const deltaX = rl.GetMouseDelta().x; + var scaleFactor = 1.0 + (0.01 * rl.fabsf(deltaX)); + if (deltaX < 0) scaleFactor = 1.0 / scaleFactor; + camera.zoom = rl.Clamp(camera.zoom * scaleFactor, 0.125, 64.0); + } + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + rl.ClearBackground(rl.RAYWHITE); + + rl.BeginMode2D(camera); + rl.rlPushMatrix(); + rl.rlTranslatef(0, 25 * 50, 0); + rl.rlRotatef(90, 1, 0, 0); + rl.DrawGrid(100, 50); + rl.rlPopMatrix(); + + rl.DrawCircle(toInt(toFloat(rl.GetScreenWidth()) / 2.0), toInt(toFloat(rl.GetScreenHeight()) / 2.0), 50, rl.MAROON); + rl.EndMode2D(); + + rl.DrawCircleV(rl.GetMousePosition(), 4, rl.DARKGRAY); + rl.DrawTextEx( + rl.GetFontDefault(), + rl.TextFormat("[%i, %i]", rl.GetMouseX(), rl.GetMouseY()), + rl.Vector2Add(rl.GetMousePosition(), .{ .x = -44, .y = -24 }), + 20, + 2, + rl.BLACK + ); + + rl.DrawText("[1][2] Select mouse zoom mode (Wheel or Move)", 20, 20, 20, rl.DARKGRAY); + if (zoomMode == 0) rl.DrawText("Mouse left button drag to move, mouse wheel to zoom", 20, 50, 20, rl.DARKGRAY) + else rl.DrawText("Mouse left button drag to move, mouse press and move to zoom", 20, 50, 20, rl.DARKGRAY); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_2d_camera_split_screen.zig b/projects/zig_raylib_examples/core/core_2d_camera_split_screen.zig new file mode 100644 index 0000000..319536b --- /dev/null +++ b/projects/zig_raylib_examples/core/core_2d_camera_split_screen.zig @@ -0,0 +1,168 @@ +//!zig-autodoc-section: core_2d_camera_split_screen.Main +//! raylib_examples/core_2d_camera_split_screen.zig +//! Example - 2d camera split screen. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +const PLAYER_SIZE: f32 = 40.0; + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 440; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera split screen"); + + var player1 = rl.Rectangle{ .x = 200, .y = 200, .width = PLAYER_SIZE, .height = PLAYER_SIZE }; + var player2 = rl.Rectangle{ .x = 250, .y = 200, .width = PLAYER_SIZE, .height = PLAYER_SIZE }; + + var camera1 = rl.Camera2D{}; + camera1.target = rl.Vector2{ .x = player1.x, .y = player1.y }; + camera1.offset = rl.Vector2{ .x = 200.0, .y = 200.0 }; + camera1.rotation = 0.0; + camera1.zoom = 1.0; + + var camera2 = rl.Camera2D{}; + camera2.target = rl.Vector2{ .x = player2.x, .y = player2.y }; + camera2.offset = rl.Vector2{ .x = 200.0, .y = 200.0 }; + camera2.rotation = 0.0; + camera2.zoom = 1.0; + + const screenCamera1 = rl.LoadRenderTexture(screenWidth / 2, screenHeight); + const screenCamera2 = rl.LoadRenderTexture(screenWidth / 2, screenHeight); + + // Build a flipped rectangle the size of the split view to use for drawing later + const splitScreenRect = rl.Rectangle{ .x = 0.0, .y = 0.0, .width = toFloat(screenCamera1.texture.width), .height = toFloat(-screenCamera1.texture.height) }; + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + if (rl.IsKeyDown(rl.KEY_S)) player1.y += 3.0 + else if (rl.IsKeyDown(rl.KEY_W)) player1.y -= 3.0; + if (rl.IsKeyDown(rl.KEY_D)) player1.x += 3.0 + else if (rl.IsKeyDown(rl.KEY_A)) player1.x -= 3.0; + + if (rl.IsKeyDown(rl.KEY_UP)) player2.y -= 3.0 + else if (rl.IsKeyDown(rl.KEY_DOWN)) player2.y += 3.0; + if (rl.IsKeyDown(rl.KEY_RIGHT)) player2.x += 3.0 + else if (rl.IsKeyDown(rl.KEY_LEFT)) player2.x -= 3.0; + + camera1.target = rl.Vector2{ .x = player1.x, .y = player1.y }; + camera2.target = rl.Vector2{ .x = player2.x, .y = player2.y }; + + const fscreenWidth: f32 = @floatFromInt(rl.GetScreenWidth()); + const fscreenHeight: f32 = @floatFromInt(rl.GetScreenHeight()); + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginTextureMode(screenCamera1); + rl.ClearBackground(rl.RAYWHITE); + + rl.BeginMode2D(camera1); + + // Draw full scene with first camera + for (0..@intCast(toInt(fscreenWidth / PLAYER_SIZE + 1.0))) |i| { + const fi: f32 = @floatFromInt(i); + rl.DrawLineV(rl.Vector2{ .x = PLAYER_SIZE * fi, .y = 0 }, rl.Vector2{ .x = PLAYER_SIZE * fi, .y = screenHeight }, rl.LIGHTGRAY); + } + + for (0..@intCast(toInt(fscreenHeight / PLAYER_SIZE + 1.0))) |i| { + const fi: f32 = @floatFromInt(i); + rl.DrawLineV(rl.Vector2{ .x = 0, .y = PLAYER_SIZE * fi }, rl.Vector2{ .x = screenWidth, .y = PLAYER_SIZE * fi }, rl.LIGHTGRAY); + } + + for (0..@intCast(toInt(fscreenWidth / PLAYER_SIZE))) |i| { + const fi: f32 = @floatFromInt(i); + for (0..@intCast(toInt(screenHeight / PLAYER_SIZE))) |j| { + const fj: f32 = @floatFromInt(j); + rl.DrawText(rl.TextFormat("[%i,%i]", i, j), toInt(10.0 + PLAYER_SIZE * fi), toInt(15.0 + PLAYER_SIZE * fj), 10, rl.LIGHTGRAY); + } + } + + rl.DrawRectangleRec(player1, rl.RED); + rl.DrawRectangleRec(player2, rl.BLUE); + rl.EndMode2D(); + + rl.DrawRectangle(0, 0, toInt(fscreenWidth / 2.0), 30, rl.Fade(rl.RAYWHITE, 0.6)); + rl.DrawText("PLAYER1: W/S/A/D to move", 10, 10, 10, rl.MAROON); + + rl.EndTextureMode(); + + rl.BeginTextureMode(screenCamera2); + rl.ClearBackground(rl.RAYWHITE); + + rl.BeginMode2D(camera2); + + // Draw full scene with second camera + for (0..@intCast(toInt(screenWidth / PLAYER_SIZE + 1))) |i| { + const fi: f32 = @floatFromInt(i); + rl.DrawLineV(rl.Vector2{ .x = PLAYER_SIZE * fi, .y = 0.0 }, rl.Vector2{ .x = PLAYER_SIZE * fi, .y = screenHeight }, rl.LIGHTGRAY); + } + + for (0..@intCast(toInt(screenHeight / PLAYER_SIZE + 1))) |i| { + const fi: f32 = @floatFromInt(i); + rl.DrawLineV(rl.Vector2{ .x = 0.0, .y = PLAYER_SIZE * fi }, rl.Vector2{ .x = screenWidth, .y = PLAYER_SIZE * fi }, rl.LIGHTGRAY); + } + + for (0..@intCast(toInt(screenWidth / PLAYER_SIZE))) |i| { + const fi: f32 = @floatFromInt(i); + for (0..@intCast(toInt(screenHeight / PLAYER_SIZE))) |j| { + const fj: f32 = @floatFromInt(j); + rl.DrawText(rl.TextFormat("[%i,%i]", i, j), toInt(10.0 + PLAYER_SIZE * fi), toInt(15.0 + PLAYER_SIZE * fj), 10, rl.LIGHTGRAY); + } + } + + rl.DrawRectangleRec(player1, rl.RED); + rl.DrawRectangleRec(player2, rl.BLUE); + + rl.EndMode2D(); + + rl.DrawRectangle(0, 0, toInt(fscreenWidth / 2.0), 30, rl.Fade(rl.RAYWHITE, 0.6)); + rl.DrawText("PLAYER2: UP/DOWN/LEFT/RIGHT to move", 10, 10, 10, rl.DARKBLUE); + + rl.EndTextureMode(); + + // Draw both views render textures to the screen side by side + rl.BeginDrawing(); + rl.ClearBackground(rl.BLACK); + + rl.DrawTextureRec(screenCamera1.texture, splitScreenRect, rl.Vector2{ .x = 0, .y = 0 }, rl.WHITE); + rl.DrawTextureRec(screenCamera2.texture, splitScreenRect, rl.Vector2{ .x = screenWidth / 2.0, .y = 0 }, rl.WHITE); + + rl.DrawRectangle(toInt(fscreenWidth / 2.0) - 2, 0, 4, rl.GetScreenHeight(), rl.LIGHTGRAY); + rl.EndDrawing(); + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.UnloadRenderTexture(screenCamera1); // Unload render texture + rl.UnloadRenderTexture(screenCamera2); // Unload render texture + + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/projects/zig_raylib_examples/core/core_3d_camera_first_person.zig b/projects/zig_raylib_examples/core/core_3d_camera_first_person.zig new file mode 100644 index 0000000..468c1b9 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_3d_camera_first_person.zig @@ -0,0 +1,207 @@ +//!zig-autodoc-section: core_3d_camera_first_person.Main +//! raylib_examples/core_3d_camera_first_person.zig +//! Example - 3d camera first person. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); + @cInclude("rcamera.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} +inline fn toU8(value: c_int) u8 { return @as(u8, @intCast(value));} + +const MAX_COLUMNS: c_int = 20; + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera first person"); + + // Define the camera to look into our 3d world (position, target, up vector) + var camera = rl.Camera{}; + camera.position = rl.Vector3{ .x = 0.0, .y = 2.0, .z = 4.0 }; // Camera position + camera.target = rl.Vector3{ .x = 0.0, .y = 2.0, .z = 0.0 }; // Camera looking at point + camera.up = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }; // Camera up vector (rotation towards target) + camera.fovy = 60.0; // Camera field-of-view Y + camera.projection = rl.CAMERA_PERSPECTIVE; // Camera projection type + + var cameraMode = rl.CAMERA_FIRST_PERSON; + + // Generates some random columns + var heights: [MAX_COLUMNS]f32 = undefined; + var positions: [MAX_COLUMNS]rl.Vector3 = undefined; + var colors: [MAX_COLUMNS]rl.Color = undefined; + + for (0..MAX_COLUMNS) |i| { + heights[i] = toFloat(rl.GetRandomValue(1, 12)); + positions[i] = rl.Vector3{ .x = toFloat(rl.GetRandomValue(-15, 15)), + .y = heights[i] / 2.0, + .z = toFloat(rl.GetRandomValue(-15, 15)) }; + colors[i] = rl.Color{ + .r = toU8(rl.GetRandomValue(20, 255)), + .g = toU8(rl.GetRandomValue(10, 55)), + .b = 30, + .a = 255, + }; + } + + 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 + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + // Switch camera mode + if (rl.IsKeyPressed(rl.KEY_ONE)) { + cameraMode = rl.CAMERA_FREE; + camera.up = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }; // Reset roll + } + + if (rl.IsKeyPressed(rl.KEY_TWO)) { + cameraMode = rl.CAMERA_FIRST_PERSON; + camera.up = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }; // Reset roll + } + + if (rl.IsKeyPressed(rl.KEY_THREE)) { + cameraMode = rl.CAMERA_THIRD_PERSON; + camera.up = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }; // Reset roll + } + + if (rl.IsKeyPressed(rl.KEY_FOUR)) { + cameraMode = rl.CAMERA_ORBITAL; + camera.up = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }; // Reset roll + } + + // Switch camera projection + if (rl.IsKeyPressed(rl.KEY_P)) { + if (camera.projection == rl.CAMERA_PERSPECTIVE) { + // Create isometric view + cameraMode = rl.CAMERA_THIRD_PERSON; + // Note: The target distance is related to the render distance in the orthographic projection + camera.position = rl.Vector3{ .x = 0.0, .y = 2.0, .z = -100.0 }; + camera.target = rl.Vector3{ .x = 0.0, .y = 2.0, .z = 0.0 }; + camera.up = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }; + camera.projection = rl.CAMERA_ORTHOGRAPHIC; + 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.CAMERA_ORTHOGRAPHIC) { + // Reset to default view + cameraMode = rl.CAMERA_THIRD_PERSON; + camera.position = rl.Vector3{ .x = 0.0, .y = 2.0, .z = 10.0 }; + camera.target = rl.Vector3{ .x = 0.0, .y = 2.0, .z = 0.0 }; + camera.up = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }; + camera.projection = rl.CAMERA_PERSPECTIVE; + 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 advanced camera controls, it's recommended to compute camera movement manually + rl.UpdateCamera(&camera, cameraMode); // Update camera + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + rl.BeginMode3D(camera); + + rl.DrawPlane(rl.Vector3{ .x = 0.0, .y = 0.0, .z = 0.0 }, rl.Vector2{ .x = 32.0, .y = 32.0 }, rl.LIGHTGRAY); // Draw ground + rl.DrawCube(rl.Vector3{ .x = -16.0, .y = 2.5, .z = 0.0 }, 1.0, 5.0, 32.0, rl.BLUE); // Draw a blue wall + rl.DrawCube(rl.Vector3{ .x = 16.0, .y = 2.5, .z = 0.0 }, 1.0, 5.0, 32.0, rl.LIME); // Draw a green wall + rl.DrawCube(rl.Vector3{ .x = 0.0, .y = 2.5, .z = 16.0 }, 32.0, 5.0, 1.0, rl.GOLD); // Draw a yellow wall + + // Draw some cubes around + for (0..MAX_COLUMNS) |i| { + rl.DrawCube(positions[i], 2.0, heights[i], 2.0, colors[i]); + rl.DrawCubeWires(positions[i], 2.0, heights[i], 2.0, rl.MAROON); + } + + // Draw player cube + if (cameraMode == rl.CAMERA_THIRD_PERSON) { + 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(); + + // Draw info boxes + rl.DrawRectangle(5, 5, 330, 100, rl.Fade(rl.SKYBLUE, 0.5)); + rl.DrawRectangleLines(5, 5, 330, 100, rl.BLUE); + + rl.DrawText("Camera controls:", 15, 15, 10, rl.BLACK); + rl.DrawText("- Move keys: W, A, S, D, Space, Left-Ctrl", 15, 30, 10, rl.BLACK); + rl.DrawText("- Look around: arrow keys or mouse", 15, 45, 10, rl.BLACK); + rl.DrawText("- Camera mode keys: 1, 2, 3, 4", 15, 60, 10, rl.BLACK); + rl.DrawText("- Zoom keys: num-plus, num-minus or mouse scroll", 15, 75, 10, rl.BLACK); + rl.DrawText("- Camera projection key: P", 15, 90, 10, rl.BLACK); + + rl.DrawRectangle(600, 5, 195, 100, rl.Fade(rl.SKYBLUE, 0.5)); + rl.DrawRectangleLines(600, 5, 195, 100, rl.BLUE); + + const cameraStatus = @as([*c]const u8, @ptrCast( + if (cameraMode == rl.CAMERA_FREE) "FREE" + else if (cameraMode == rl.CAMERA_FIRST_PERSON) "FIRST_PERSON" + else if (cameraMode == rl.CAMERA_THIRD_PERSON) "THIRD_PERSON" + else if (cameraMode == rl.CAMERA_ORBITAL) "ORBITAL" + else "CUSTOM")); + + rl.DrawText("Camera status:", 610, 15, 10, rl.BLACK); + rl.DrawText(rl.TextFormat("- Mode: %s", cameraStatus), + 610, 30, 10, rl.BLACK + ); + const projectionStatus = @as([*c]const u8, @ptrCast( + if (camera.projection == rl.CAMERA_PERSPECTIVE) "PERSPECTIVE" + else if (camera.projection == rl.CAMERA_ORTHOGRAPHIC) "ORTHOGRAPHIC" + else "CUSTOM")); + rl.DrawText( + rl.TextFormat("- Projection: %s", projectionStatus), + 610, 45, 10, rl.BLACK + ); + rl.DrawText( + rl.TextFormat("- Position: (%06.3f, %06.3f, %06.3f)", camera.position.x, camera.position.y, camera.position.z), + 610, 60, 10, rl.BLACK + ); + rl.DrawText( + rl.TextFormat("- Target: (%06.3f, %06.3f, %06.3f)", camera.target.x, camera.target.y, camera.target.z), + 610, 75, 10, rl.BLACK + ); + rl.DrawText( + rl.TextFormat("- Up: (%06.3f, %06.3f, %06.3f)", camera.up.x, camera.up.y, camera.up.z), + 610, 90, 10, rl.BLACK + ); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_3d_camera_free.zig b/projects/zig_raylib_examples/core/core_3d_camera_free.zig new file mode 100644 index 0000000..142e2aa --- /dev/null +++ b/projects/zig_raylib_examples/core/core_3d_camera_free.zig @@ -0,0 +1,85 @@ +//!zig-autodoc-section: core_3d_camera_free.Main +//! raylib_examples/core_3d_camera_free.zig +//! Example - Initialize 3d camera free. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera free"); + + // Define the camera to look into our 3d world + var camera: rl.Camera3D = undefined; + camera.position = rl.Vector3{ .x = 10.0, .y = 10.0, .z = 10.0 }; // Camera position + camera.target = rl.Vector3{ .x = 0.0, .y = 0.0, .z = 0.0 }; // Camera looking at point + camera.up = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }; // Camera up vector (rotation towards target) + camera.fovy = 45.0; // Camera field-of-view Y + camera.projection = rl.CAMERA_PERSPECTIVE; // Camera projection type + + const cubePosition = rl.Vector3{ .x = 0.0, .y = 0.0, .z = 0.0 }; + + 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 + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + rl.UpdateCamera(&camera, rl.CAMERA_FREE); + + if (rl.IsKeyPressed('Z')) camera.target = rl.Vector3{ .x = 0.0, .y = 0.0, .z = 0.0 }; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + 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(10, 1.0); + + rl.EndMode3D(); + + rl.DrawRectangle(10, 10, 320, 93, rl.Fade(rl.SKYBLUE, 0.5)); + rl.DrawRectangleLines(10, 10, 320, 93, rl.BLUE); + + 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 Pressed to Pan", 40, 60, 10, rl.DARKGRAY); + rl.DrawText("- Z to zoom to (0, 0, 0)", 40, 80, 10, rl.DARKGRAY); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_3d_camera_mode.zig b/projects/zig_raylib_examples/core/core_3d_camera_mode.zig new file mode 100644 index 0000000..0e9c795 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_3d_camera_mode.zig @@ -0,0 +1,82 @@ +//!zig-autodoc-section: core_3d_camera_mode.Main +//! raylib_examples/core_3d_camera_mode.zig +//! Example - Initialize 3d camera mode. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth: i32 = 800; + const screenHeight: i32 = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera mode"); + + // Define the camera to look into our 3d world + const camera = rl.Camera3D{ + .position = rl.Vector3{ .x = 0.0, .y = 10.0, .z = 10.0 }, // Camera position + .target = rl.Vector3{ .x = 0.0, .y = 0.0, .z = 0.0 }, // Camera looking at point + .up = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }, // Camera up vector (rotation towards target) + .fovy = 45.0, // Camera field-of-view Y + .projection = rl.CAMERA_PERSPECTIVE, // Camera mode type + }; + + const cubePosition = rl.Vector3{ + .x = 0.0, + .y = 0.0, + .z = 0.0, + }; + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!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); + + rl.DrawCube(cubePosition, 2.0, 2.0, 2.0, rl.RED); + rl.DrawCubeWires(cubePosition, 2.0, 2.0, 2.0, rl.MAROON); + + rl.DrawGrid(10, 1.0); + + rl.EndMode3D(); + + rl.DrawText("Welcome to the third dimension!", 10, 40, 20, rl.DARKGRAY); + + rl.DrawFPS(10, 10); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_3d_camera_split_screen.zig b/projects/zig_raylib_examples/core/core_3d_camera_split_screen.zig new file mode 100644 index 0000000..44ca801 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_3d_camera_split_screen.zig @@ -0,0 +1,170 @@ +//!zig-autodoc-section: core_3d_camera_split_screen.Main +//! raylib_examples/core_3d_camera_split_screen.zig +//! Example - 3d cmaera split screen. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera split screen"); + + // Setup player 1 camera and screen + var cameraPlayer1 = rl.Camera{}; + cameraPlayer1.fovy = 45.0; + cameraPlayer1.up.y = 1.0; + cameraPlayer1.target.y = 1.0; + cameraPlayer1.position.z = -3.0; + cameraPlayer1.position.y = 1.0; + + const screenPlayer1 = rl.LoadRenderTexture(screenWidth / 2, screenHeight); + + // Setup player two camera and screen + var cameraPlayer2 = rl.Camera{}; + cameraPlayer2.fovy = 45.0; + cameraPlayer2.up.y = 1.0; + cameraPlayer2.target.y = 3.0; + cameraPlayer2.position.x = -3.0; + cameraPlayer2.position.y = 3.0; + + const screenPlayer2 = rl.LoadRenderTexture(screenWidth / 2, screenHeight); + + // Build a flipped rectangle the size of the split view to use for drawing later + const splitScreenRect = rl.Rectangle{ .x = 0.0, .y = 0.0, .width = toFloat(screenPlayer1.texture.width), .height = toFloat(-screenPlayer1.texture.height) }; + + // Grid data + const count = 5; + const spacing = 4; + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + // If anyone moves this frame, how far will they move based on the time since the last frame + // this moves things at 10 world units per second, regardless of the actual FPS + const offsetThisFrame = 10.0 * rl.GetFrameTime(); + + // Move Player1 forward and backwards (no turning) + if (rl.IsKeyDown(rl.KEY_W)) { + cameraPlayer1.position.z += offsetThisFrame; + cameraPlayer1.target.z += offsetThisFrame; + } else if (rl.IsKeyDown(rl.KEY_S)) { + cameraPlayer1.position.z -= offsetThisFrame; + cameraPlayer1.target.z -= offsetThisFrame; + } + + // Move Player2 forward and backwards (no turning) + if (rl.IsKeyDown(rl.KEY_UP)) { + cameraPlayer2.position.x += offsetThisFrame; + cameraPlayer2.target.x += offsetThisFrame; + } else if (rl.IsKeyDown(rl.KEY_DOWN)) { + cameraPlayer2.position.x -= offsetThisFrame; + cameraPlayer2.target.x -= offsetThisFrame; + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + // Draw Player1 view to the render texture + rl.BeginTextureMode(screenPlayer1); + rl.ClearBackground(rl.SKYBLUE); + + rl.BeginMode3D(cameraPlayer1); + + // Draw scene: grid of cube trees on a plane to make a "world" + rl.DrawPlane(rl.Vector3{ .x = 0.0, .y = 0.0, .z = 0.0 }, rl.Vector2{ .x = 50, .y = 50 }, rl.BEIGE); // Simple world plane + + var x1: f32 = -count * spacing; + while (x1 <= count * spacing) : (x1 += spacing) { + var z1: f32 = -count * spacing; + while (z1 <= count * spacing) : (z1 += spacing) { + rl.DrawCube(rl.Vector3{ .x = x1, .y = 1.5, .z = z1 }, 1, 1, 1, rl.LIME); + rl.DrawCube(rl.Vector3{ .x = x1, .y = 0.5, .z = z1 }, 0.25, 1, 0.25, rl.BROWN); + } + } + + // Draw a cube at each player's position + rl.DrawCube(cameraPlayer1.position, 1, 1, 1, rl.RED); + rl.DrawCube(cameraPlayer2.position, 1, 1, 1, rl.BLUE); + + rl.EndMode3D(); + + rl.DrawRectangle(0, 0, toInt(toFloat(rl.GetScreenWidth()) / 2.0), 40, rl.Fade(rl.RAYWHITE, 0.8)); + rl.DrawText("PLAYER1: W/S to move", 10, 10, 20, rl.MAROON); + + rl.EndTextureMode(); + + // Draw Player2 view to the render texture + rl.BeginTextureMode(screenPlayer2); + rl.ClearBackground(rl.SKYBLUE); + + rl.BeginMode3D(cameraPlayer2); + + // Draw scene: grid of cube trees on a plane to make a "world" + rl.DrawPlane(rl.Vector3{ .x = 0.0, .y = 0.0, .z = 0.0 }, rl.Vector2{ .x = 50, .y = 50 }, rl.BEIGE); // Simple world plane + + var x2: f32 = -count * spacing; + while (x2 <= count * spacing) : (x2 += spacing) { + var z2: f32 = -count * spacing; + while (z2 <= count * spacing) : (z2 += spacing) { + rl.DrawCube(rl.Vector3{ .x = x2, .y = 1.5, .z = z2 }, 1, 1, 1, rl.LIME); + rl.DrawCube(rl.Vector3{ .x = x2, .y = 0.5, .z = z2 }, 0.25, 1, 0.25, rl.BROWN); + } + } + + + // Draw a cube at each player's position + rl.DrawCube(cameraPlayer1.position, 1, 1, 1, rl.RED); + rl.DrawCube(cameraPlayer2.position, 1, 1, 1, rl.BLUE); + + rl.EndMode3D(); + + rl.DrawRectangle(0, 0, toInt(toFloat(rl.GetScreenWidth()) / 2.0), 40, rl.Fade(rl.RAYWHITE, 0.8)); + rl.DrawText("PLAYER2: UP/DOWN to move", 10, 10, 20, rl.DARKBLUE); + + rl.EndTextureMode(); + + // Draw both views render textures to the screen side by side + rl.BeginDrawing(); + rl.ClearBackground(rl.BLACK); + + rl.DrawTextureRec(screenPlayer1.texture, splitScreenRect, rl.Vector2{ .x = 0.0, .y = 0.0 }, rl.WHITE); + rl.DrawTextureRec(screenPlayer2.texture, splitScreenRect, rl.Vector2{ .x = screenWidth / 2.0, .y = 0.0 }, rl.WHITE); + + rl.DrawRectangle(toInt(toFloat(rl.GetScreenWidth()) / 2.0) - 2, 0, 4, rl.GetScreenHeight(), rl.LIGHTGRAY); + rl.EndDrawing(); + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.UnloadRenderTexture(screenPlayer1); // Unload render texture + rl.UnloadRenderTexture(screenPlayer2); // Unload render texture + + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/projects/zig_raylib_examples/core/core_3d_picking.zig b/projects/zig_raylib_examples/core/core_3d_picking.zig new file mode 100644 index 0000000..458d28f --- /dev/null +++ b/projects/zig_raylib_examples/core/core_3d_picking.zig @@ -0,0 +1,120 @@ +//!zig-autodoc-section: core_3d_picking.Main +//! raylib_examples/core_3d_picking.zig +//! Example - Picking in 3d mode. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); + @cInclude("stdlib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth: i32 = 800; + const screenHeight: i32 = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d picking"); + + // Define the camera to look into our 3d world + var camera: rl.Camera = undefined; + camera.position = rl.Vector3{ .x = 10.0, .y = 10.0, .z = 10.0 }; // Camera position + camera.target = rl.Vector3{ .x = 0.0, .y = 0.0, .z = 0.0 }; // Camera looking at point + camera.up = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }; // Camera up vector (rotation towards target) + camera.fovy = 45.0; // Camera field-of-view Y + camera.projection = rl.CAMERA_PERSPECTIVE; // Camera projection type + + const cubePosition = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }; + const cubeSize = rl.Vector3{ .x = 2.0, .y = 2.0, .z = 2.0 }; + + var ray: rl.Ray = undefined; // Picking line ray + var collision: rl.RayCollision = undefined; // Ray collision hit info + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + if (rl.IsCursorHidden()) rl.UpdateCamera(&camera, rl.CAMERA_FIRST_PERSON); + + // Toggle camera controls + if (rl.IsMouseButtonPressed(rl.MOUSE_BUTTON_RIGHT)) { + if (rl.IsCursorHidden()) rl.EnableCursor() + else rl.DisableCursor(); + } + + if (rl.IsMouseButtonPressed(rl.MOUSE_BUTTON_LEFT)) { + if (!collision.hit) { + ray = rl.GetScreenToWorldRay(rl.GetMousePosition(), camera); + + // Check collision between ray and box + collision = rl.GetRayCollisionBox(ray, + rl.BoundingBox{ + .min = rl.Vector3{ .x = cubePosition.x - cubeSize.x / 2, .y = cubePosition.y - cubeSize.y / 2, .z = cubePosition.z - cubeSize.z / 2 }, + .max = rl.Vector3{ .x = cubePosition.x + cubeSize.x / 2, .y = cubePosition.y + cubeSize.y / 2, .z = cubePosition.z + cubeSize.z / 2 }, + }); + } else { + collision.hit = false; + } + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + rl.BeginMode3D(camera); + + if (collision.hit) { + rl.DrawCube(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, rl.RED); + rl.DrawCubeWires(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, rl.MAROON); + rl.DrawCubeWires(cubePosition, cubeSize.x + 0.2, cubeSize.y + 0.2, cubeSize.z + 0.2, rl.GREEN); + } else { + rl.DrawCube(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, rl.GRAY); + rl.DrawCubeWires(cubePosition, cubeSize.x, cubeSize.y, cubeSize.z, rl.DARKGRAY); + } + + rl.DrawRay(ray, rl.MAROON); + rl.DrawGrid(10, 1.0); + + rl.EndMode3D(); + + rl.DrawText("Try clicking on the box with your mouse!", 240, 10, 20, rl.DARKGRAY); + + if (collision.hit) { + rl.DrawText("BOX SELECTED", toInt(toFloat(screenWidth - rl.MeasureText("BOX SELECTED", 30)) / 2.0), toInt(toFloat(screenHeight) * 0.1), 30, rl.GREEN); + } + + rl.DrawText("Right click mouse to toggle camera controls", 10, 430, 10, rl.GRAY); + + rl.DrawFPS(10, 10); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_automation_events.zig b/projects/zig_raylib_examples/core/core_automation_events.zig new file mode 100644 index 0000000..6787ac0 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_automation_events.zig @@ -0,0 +1,301 @@ +//!zig-autodoc-section: core_automation_events.Main +//! raylib_examples/core_automation_events.zig +//! Example - automation events. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} +inline fn toU8(value: c_int) u8 { return @as(u8, @intCast(value));} + +const GRAVITY: c_int = 400; +const PLAYER_JUMP_SPD: c_int = 350.0; +const PLAYER_HOR_SPD: c_int = 200.0; +const MAX_ENVIRONMENT_ELEMENTS: c_int = 5; + +const Player = struct { + position: rl.Vector2, + speed: f32, + canJump: bool, +}; + +const EnvElement = struct { + rect: rl.Rectangle, + blocking: i32, + color: rl.Color, +}; + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - automation events"); + + // Define player + var player = Player{ .position = rl.Vector2{ .x = 400, .y = 280 }, .speed = 0, .canJump = false }; + + // Define environment elements (platforms) + var envElements: [MAX_ENVIRONMENT_ELEMENTS]EnvElement = undefined; + envElements[0] = EnvElement{ .rect = rl.Rectangle{ .x = 0, .y = 0, .width = 1000, .height = 400 }, .blocking = 0, .color = rl.LIGHTGRAY }; + envElements[1] = EnvElement{ .rect = rl.Rectangle{ .x = 0, .y = 400, .width = 1000, .height = 200 }, .blocking = 1, .color = rl.GRAY }; + envElements[2] = EnvElement{ .rect = rl.Rectangle{ .x = 300, .y = 200, .width = 400, .height = 10 }, .blocking = 1, .color = rl.GRAY }; + envElements[3] = EnvElement{ .rect = rl.Rectangle{ .x = 250, .y = 300, .width = 100, .height = 10 }, .blocking = 1, .color = rl.GRAY }; + envElements[4] = EnvElement{ .rect = rl.Rectangle{ .x = 650, .y = 300, .width = 100, .height = 10 }, .blocking = 1, .color = rl.GRAY }; + + // Define camera + var camera = rl.Camera2D{ + .target = player.position, + .offset = rl.Vector2{ .x = screenWidth / 2.0, .y = screenHeight / 2.0 }, + .rotation = 0.0, + .zoom = 1.0, + }; + + // Automation events + var aelist = rl.LoadAutomationEventList(0); // Initialize list of automation events to record new events + rl.SetAutomationEventList(&aelist); + var eventRecording = false; + var eventPlaying = false; + + var frameCounter: u32 = 0; + var playFrameCounter: u32 = 0; + var currentPlayFrame: u32 = 0; + + rl.SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { + // Update + //---------------------------------------------------------------------------------- + const deltaTime = 0.015; // rl.GetFrameTime(); + + // Dropped files logic + //---------------------------------------------------------------------------------- + if (rl.IsFileDropped()) { + const droppedFiles = rl.LoadDroppedFiles(); + + // Supports loading .rgs style files (text or binary) and .png style palette images + if (rl.IsFileExtension(droppedFiles.paths[0], ".txt;.rae")) { + rl.UnloadAutomationEventList(aelist); + aelist = rl.LoadAutomationEventList(droppedFiles.paths[0]); + + eventRecording = false; + + // Reset scene state to play + eventPlaying = true; + playFrameCounter = 0; + currentPlayFrame = 0; + + player.position = rl.Vector2{ .x = 400, .y = 280 }; + player.speed = 0; + player.canJump = false; + + camera.target = player.position; + camera.offset = rl.Vector2{ .x = screenWidth / 2.0, .y = screenHeight / 2.0 }; + camera.rotation = 0.0; + camera.zoom = 1.0; + } + + rl.UnloadDroppedFiles(droppedFiles); // Unload filepaths from memory + } + //---------------------------------------------------------------------------------- + + // Update player + //---------------------------------------------------------------------------------- + if (rl.IsKeyDown(rl.KEY_LEFT)) player.position.x -= toFloat(PLAYER_HOR_SPD) * deltaTime; + if (rl.IsKeyDown(rl.KEY_RIGHT)) player.position.x += toFloat(PLAYER_HOR_SPD) * deltaTime; + if (rl.IsKeyDown(rl.KEY_SPACE) and player.canJump) { + player.speed = -PLAYER_JUMP_SPD; + player.canJump = false; + } + + var hitObstacle = false; + for (0..MAX_ENVIRONMENT_ELEMENTS) |i| { + const element = &envElements[i]; + const p = &player.position; + if (element.blocking != 0 and + element.rect.x <= p.x and + element.rect.x + element.rect.width >= p.x and + element.rect.y >= p.y and + element.rect.y <= p.y + player.speed * deltaTime) { + hitObstacle = true; + player.speed = 0.0; + p.y = element.rect.y; + } + } + + if (!hitObstacle) { + player.position.y += player.speed * deltaTime; + player.speed += toFloat(GRAVITY) * deltaTime; + player.canJump = false; + } else { + player.canJump = true; + } + + if (rl.IsKeyPressed(rl.KEY_R)) { + // Reset game state + player.position = rl.Vector2{ .x = 400, .y = 280 }; + player.speed = 0; + player.canJump = false; + + camera.target = player.position; + camera.offset = rl.Vector2{ .x = screenWidth / 2.0, .y = screenHeight / 2.0 }; + camera.rotation = 0.0; + camera.zoom = 1.0; + } + //---------------------------------------------------------------------------------- + + // Events playing + // NOTE: Logic must be before Camera update because it depends on mouse-wheel value, + // that can be set by the played event... but some other inputs could be affected + //---------------------------------------------------------------------------------- + if (eventPlaying) { + // NOTE: Multiple events could be executed in a single frame + while (playFrameCounter == aelist.events[currentPlayFrame].frame) { + rl.PlayAutomationEvent(aelist.events[currentPlayFrame]); + currentPlayFrame += 1; + + if (currentPlayFrame == aelist.count) { + eventPlaying = false; + currentPlayFrame = 0; + playFrameCounter = 0; + + rl.TraceLog(rl.LOG_INFO, "FINISH PLAYING!"); + break; + } + } + + playFrameCounter += 1; + } + //---------------------------------------------------------------------------------- + + // Update camera + //---------------------------------------------------------------------------------- + camera.target = player.position; + camera.offset = rl.Vector2{ .x = screenWidth / 2.0, .y = screenHeight / 2.0 }; + var minX: f32 = 1000.0; + var minY: f32 = 1000.0; + var maxX: f32 = -1000.0; + var maxY: f32 = -1000.0; + + // WARNING: On event replay, mouse-wheel internal value is set + camera.zoom += (rl.GetMouseWheelMove() * 0.05); + if (camera.zoom > 3.0) camera.zoom = 3.0 + else if (camera.zoom < 0.25) camera.zoom = 0.25; + + for (0..MAX_ENVIRONMENT_ELEMENTS) |i| { + const element = &envElements[i]; + minX = @min(element.rect.x, minX); + maxX = @max(element.rect.x + element.rect.width, maxX); + minY = @min(element.rect.y, minY); + maxY = @max(element.rect.y + element.rect.height, maxY); + } + + const max = rl.GetWorldToScreen2D(rl.Vector2{ .x = maxX, .y = maxY }, camera); + const min = rl.GetWorldToScreen2D(rl.Vector2{ .x = minX, .y = minY }, camera); + + if (max.x < screenWidth) camera.offset.x = screenWidth - (max.x - screenWidth / 2.0); + if (max.y < screenHeight) camera.offset.y = screenHeight - (max.y - screenHeight / 2.0); + if (min.x > 0) camera.offset.x = screenWidth / 2.0 - min.x; + if (min.y > 0) camera.offset.y = screenHeight / 2.0 - min.y; + //---------------------------------------------------------------------------------- + + // Events management + if (rl.IsKeyPressed(rl.KEY_S)) { // Toggle events recording + if (!eventPlaying) { + if (eventRecording) { + rl.StopAutomationEventRecording(); + eventRecording = false; + + _ = rl.ExportAutomationEventList(aelist, "automation.rae"); + + rl.TraceLog(rl.LOG_INFO, "RECORDED FRAMES: %i", aelist.count); + } else { + rl.SetAutomationEventBaseFrame(180); + rl.StartAutomationEventRecording(); + eventRecording = true; + } + } + } else if (rl.IsKeyPressed(rl.KEY_A)) { // Toggle events playing (WARNING: Starts next frame) + if (!eventRecording and (aelist.count > 0)) { + // Reset scene state to play + eventPlaying = true; + playFrameCounter = 0; + currentPlayFrame = 0; + + player.position = rl.Vector2{ .x = 400, .y = 280 }; + player.speed = 0; + player.canJump = false; + + camera.target = player.position; + camera.offset = rl.Vector2{ .x = screenWidth / 2.0, .y = screenHeight / 2.0 }; + camera.rotation = 0.0; + camera.zoom = 1.0; + } + } + + if (eventRecording or eventPlaying) frameCounter += 1 + else frameCounter = 0; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.LIGHTGRAY); + + rl.BeginMode2D(camera); + + // Draw environment elements + for (0..MAX_ENVIRONMENT_ELEMENTS) |i| { + rl.DrawRectangleRec(envElements[i].rect, envElements[i].color); + } + + // Draw player rectangle + rl.DrawRectangleRec(rl.Rectangle{ + .x = player.position.x - 20, + .y = player.position.y - 40, + .width = 40, + .height = 40, + }, rl.RED); + + rl.EndMode2D(); + + // Draw game controls + rl.DrawRectangle(10, 10, 290, 145, rl.Fade(rl.SKYBLUE, 0.5)); + rl.DrawRectangleLines(10, 10, 290, 145, rl.Fade(rl.BLUE, 0.8)); + + rl.DrawText("Controls:", 20, 20, 10, rl.DARKGRAY); + rl.DrawText("Arrow keys = Move", 20, 40, 10, rl.DARKGRAY); + rl.DrawText("Space = Jump", 20, 60, 10, rl.DARKGRAY); + rl.DrawText("R = Reset", 20, 80, 10, rl.DARKGRAY); + rl.DrawText("S = Record Event", 20, 100, 10, rl.DARKGRAY); + rl.DrawText("A = Play Event", 20, 120, 10, rl.DARKGRAY); + + rl.EndDrawing(); + //-------------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_basic_screen_manager.zig b/projects/zig_raylib_examples/core/core_basic_screen_manager.zig new file mode 100644 index 0000000..3596bd2 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_basic_screen_manager.zig @@ -0,0 +1,136 @@ +//!zig-autodoc-section: core_basic_screen_manager.Main +//! raylib_examples/core_basic_screen_manager.zig +//! Example - Basic screen manager. +//!* NOTE: This example illustrates a very simple screen manager based on a states machines +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +//------------------------------------------------------------------------------------------ +// Types and Structures Definition +//------------------------------------------------------------------------------------------ +const GameScreen = enum { LOGO, TITLE, GAMEPLAY, ENDING }; + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth: usize = 800; + const screenHeight: usize = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - basic screen manager"); + + var currentScreen: GameScreen = .LOGO; + + // TODO: Initialize all required variables and load all required data here! + + var framesCounter: usize = 0; // Useful to count frames + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + switch (currentScreen) { + .LOGO => { + // TODO: Update LOGO screen variables here! + + framesCounter +%= 1; // Count frames + + // Wait for 2 seconds (120 frames) before jumping to TITLE screen + if (framesCounter > 120) { + currentScreen = .TITLE; + } + }, + .TITLE => { + // TODO: Update TITLE screen variables here! + + // Press enter to change to GAMEPLAY screen + if (rl.IsKeyPressed(rl.KEY_ENTER) or rl.IsGestureDetected(rl.GESTURE_TAP)) { + currentScreen = .GAMEPLAY; + } + }, + .GAMEPLAY => { + // TODO: Update GAMEPLAY screen variables here! + + // Press enter to change to ENDING screen + if (rl.IsKeyPressed(rl.KEY_ENTER) or rl.IsGestureDetected(rl.GESTURE_TAP)) { + currentScreen = .ENDING; + } + }, + .ENDING => { + // TODO: Update ENDING screen variables here! + + // Press enter to return to TITLE screen + if (rl.IsKeyPressed(rl.KEY_ENTER) or rl.IsGestureDetected(rl.GESTURE_TAP)) { + currentScreen = .TITLE; + } + } + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + switch(currentScreen) { + .LOGO => { + // TODO: Draw LOGO screen here! + rl.DrawText("LOGO SCREEN", 20, 20, 40, rl.LIGHTGRAY); + rl.DrawText("WAIT for 2 SECONDS...", 290, 220, 20, rl.GRAY); + + }, + .TITLE => { + // TODO: Draw TITLE screen here! + rl.DrawRectangle(0, 0, screenWidth, screenHeight, rl.GREEN); + rl.DrawText("TITLE SCREEN", 20, 20, 40, rl.DARKGREEN); + rl.DrawText("PRESS ENTER or TAP to JUMP to GAMEPLAY SCREEN", 120, 220, 20, rl.DARKGREEN); + + }, + .GAMEPLAY => { + // TODO: Draw GAMEPLAY screen here! + rl.DrawRectangle(0, 0, screenWidth, screenHeight, rl.PURPLE); + rl.DrawText("GAMEPLAY SCREEN", 20, 20, 40, rl.MAROON); + rl.DrawText("PRESS ENTER or TAP to JUMP to ENDING SCREEN", 130, 220, 20, rl.MAROON); + + }, + .ENDING => { + // TODO: Draw ENDING screen here! + rl.DrawRectangle(0, 0, screenWidth, screenHeight, rl.BLUE); + rl.DrawText("ENDING SCREEN", 20, 20, 40, rl.DARKBLUE); + rl.DrawText("PRESS ENTER or TAP to RETURN to TITLE SCREEN", 120, 220, 20, rl.DARKBLUE); + + } + } + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + + // TODO: Unload all loaded data (textures, fonts, audio) here! + + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_basic_window.zig b/projects/zig_raylib_examples/core/core_basic_window.zig new file mode 100644 index 0000000..b8f17d8 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_basic_window.zig @@ -0,0 +1,55 @@ +//!zig-autodoc-section: core_basic_window.Main +//! raylib_examples/core_basic_window.zig +//! Example - Basic Window. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + const screenWidth: usize = 800; + const screenHeight: usize = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - basic window"); + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + // TODO: Update your variables here + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + rl.DrawText("Congrats! You created your first window!", 190, 200, 20, rl.LIGHTGRAY); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_custom_frame_control.zig b/projects/zig_raylib_examples/core/core_custom_frame_control.zig new file mode 100644 index 0000000..eccc7e1 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_custom_frame_control.zig @@ -0,0 +1,130 @@ +//!zig-autodoc-section: core_custom_frame_control.Main +//! raylib_examples/core_custom_frame_control.zig +//! Example - custom frame control. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + var screenWidth: c_int = 800; + var screenHeight: c_int = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - custom frame control"); + + // Custom timming variables + var previousTime: f64 = rl.GetTime(); // Previous time measure + var currentTime: f64 = 0.0; // Current time measure + var updateDrawTime: f64 = 0.0; // Update + Draw time + var waitTime: f64 = 0.0; // Wait time (if target fps required) + var deltaTime: f64 = 0.0; // Frame time (Update + Draw + Wait time) + var timeCounter: f64 = 0.0; // Accumulative time counter (seconds) + + var position: f32 = 0.0; // Circle position + var pause = false; // Pause control flag + + var targetFPS: c_int = 60; // Our initial target fps + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Helper to avoid keep convering to floats or ints. + screenWidth = rl.GetScreenWidth(); + screenHeight = rl.GetScreenHeight(); + const fScreenWidth: f32 = toFloat(rl.GetScreenWidth()); + const fScreenHeight: f32 = toFloat(rl.GetScreenHeight()); + const iPosition: c_int = toInt(position); + + // Update + //---------------------------------------------------------------------------------- + rl.PollInputEvents(); // Poll input events (SUPPORT_CUSTOM_FRAME_CONTROL) + + if (rl.IsKeyPressed(rl.KEY_SPACE)) pause = !pause; + + if (rl.IsKeyPressed(rl.KEY_UP)) targetFPS += 20 + else if (rl.IsKeyPressed(rl.KEY_DOWN)) targetFPS -= 20; + + if (targetFPS < 0) targetFPS = 0; + + if (!pause) { + position += @floatCast(200.0 * deltaTime); // We move at 200 pixels per second + if (position >= fScreenWidth) position = 0; + timeCounter += deltaTime; // We count time (seconds) + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + for (0..@intCast(@divFloor(screenWidth, 200))) |idx| { + const i: c_int = @intCast(idx); + rl.DrawRectangle(200 * i, 0, 1, screenHeight, rl.SKYBLUE); + } + + rl.DrawCircle(iPosition, toInt(fScreenHeight / 2.0) - 25, 50, rl.RED); + + rl.DrawText(rl.TextFormat("%03.0f ms", timeCounter * 1000.0), iPosition - 40, toInt(fScreenWidth / 2.0) - 100, 20, rl.MAROON); + rl.DrawText(rl.TextFormat("PosX: %03.0f", position), iPosition - 50, toInt(fScreenWidth / 2.0) - 60, 20, rl.BLACK); + + const fdeltaTime: f32 = @floatCast(1.0 / deltaTime); + + rl.DrawText("Circle is moving at a constant 200 pixels/sec,\nindependently of the frame rate.", 10, 10, 20, rl.DARKGRAY); + rl.DrawText("PRESS SPACE to PAUSE MOVEMENT", 10, screenHeight - 60, 20, rl.GRAY); + rl.DrawText("PRESS UP | DOWN to CHANGE TARGET FPS", 10, screenHeight - 30, 20, rl.GRAY); + rl.DrawText(rl.TextFormat("TARGET FPS: %i", targetFPS), screenWidth - 220, 10, 20, rl.LIME); + rl.DrawText(rl.TextFormat("CURRENT FPS: %i", fdeltaTime ), screenWidth - 220, 40, 20, rl.GREEN); + + 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(); // Flip the back buffer to screen (front buffer) + + currentTime = rl.GetTime(); + updateDrawTime = currentTime - previousTime; + + if (targetFPS > 0) { // We want a fixed frame rate + waitTime = @as(f64, @floatCast(1.0 / toFloat(targetFPS))) - updateDrawTime; + if (waitTime > 0.0) { + rl.WaitTime(waitTime); + currentTime = rl.GetTime(); + deltaTime = currentTime - previousTime; + } + } else { + deltaTime = updateDrawTime; // Framerate could be variable + } + + previousTime = currentTime; + //std.debug.print("{d}\n", .{deltaTime}); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_custom_logging.zig b/projects/zig_raylib_examples/core/core_custom_logging.zig new file mode 100644 index 0000000..d2e27ee --- /dev/null +++ b/projects/zig_raylib_examples/core/core_custom_logging.zig @@ -0,0 +1,83 @@ +//!zig-autodoc-section: core_custom_logging.Main +//! raylib_examples/core_custom_logging.zig +//! Example - Custom logging. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +// Custom logging function +fn CustomLog(msgType: i32, text: [*c]const u8, args: [*c]u8) callconv(.C) void { + const stdio = @cImport({ @cInclude("stdio.h"); }); + const time = @cImport({ @cInclude("time.h"); }); + + const now: time.time_t = time.time(null); + const tm_info = time.localtime(&now); + const timeStr_len = 20; + var timeStr: [timeStr_len]u8 = undefined; + _ = time.strftime(&timeStr, timeStr_len, "%Y-%m-%d %H:%M:%S", tm_info); + std.debug.print("[{s}] ", .{timeStr}); + + switch (msgType) { + 1 => std.debug.print("[INFO] : ", .{}), + 2 => std.debug.print("[ERROR]: ", .{}), + 3 => std.debug.print("[WARN] : ", .{}), + 4 => std.debug.print("[DEBUG]: ", .{}), + else => {}, + } + + _ = stdio.vprintf(text, args); + _ = stdio.printf("\n"); +} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + // Set custom logger + rl.SetTraceLogCallback(CustomLog); + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - custom logging"); + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + // TODO: Update your variables here + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + rl.DrawText("Check out the console output to see the custom logger in action!", 60, 200, 20, rl.LIGHTGRAY); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_drop_files copy.zig b/projects/zig_raylib_examples/core/core_drop_files copy.zig new file mode 100644 index 0000000..da2b7b9 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_drop_files copy.zig @@ -0,0 +1,102 @@ +//!zig-autodoc-section: core_drop_files.Main +//! raylib_examples/core_drop_files.zig +//! Example - Windows drop files. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); + @cInclude("stdlib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +const MAX_FILEPATH_RECORDED: c_int = 4096; +const MAX_FILEPATH_SIZE: c_int = 2048; + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + const screenWidth = 800; + const screenHeight = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - drop files"); + + var filePathCounter: i32 = 0; + var filePaths: [MAX_FILEPATH_RECORDED][*c]u8 = undefined; + + // // Allocate space for file paths + for (0..@intCast(filePathCounter)) |idx| { + filePaths[idx] = @ptrCast(rl.RL_CALLOC(MAX_FILEPATH_SIZE, 1)); + } + + // Allocate space for the required file paths + for (0..MAX_FILEPATH_RECORDED) |i| { + filePaths[i] = @ptrCast(std.heap.page_allocator.alloc(u8, MAX_FILEPATH_SIZE) catch unreachable); + } + + rl.SetTargetFPS(60); + + // Main game loop + while (!rl.WindowShouldClose()) { + // Update + if (rl.IsFileDropped()) { + const droppedFiles = rl.LoadDroppedFiles(); + + const offset: usize = @intCast(filePathCounter); + for (0..droppedFiles.count) |idx| { + if (filePathCounter < MAX_FILEPATH_RECORDED - 1) { + _ = rl.TextCopy(filePaths[offset + idx], droppedFiles.paths[idx]); + filePathCounter += 1; + } + } + + rl.UnloadDroppedFiles(droppedFiles); + } + + // Draw + rl.BeginDrawing(); + rl.ClearBackground(rl.RAYWHITE); + + if (filePathCounter == 0) { + rl.DrawText("Drop your files to this window!", 100, 40, 20, rl.DARKGRAY); + } else { + rl.DrawText("Dropped files:", 100, 40, 20, rl.DARKGRAY); + + for (0..@intCast(filePathCounter)) |idx| { + const i: i32 = @intCast(idx); + if (@mod(i, 2) == 0) { + rl.DrawRectangle(0, 85 + 40 * i, screenWidth, 40, rl.Fade(rl.LIGHTGRAY, 0.5)); + } else { + rl.DrawRectangle(0, 85 + 40 * i, screenWidth, 40, rl.Fade(rl.LIGHTGRAY, 0.3)); + } + rl.DrawText(filePaths[idx], 120, 100 + 40 * i, 10, rl.GRAY); + } + + rl.DrawText("Drop new files...", 100, 110 + 40 * filePathCounter, 20, rl.DARKGRAY); + } + + rl.EndDrawing(); + } + + // De-Initialization + // for (0..@intCast(filePathCounter)) |idx| { + // C + // rl.RL_FREE(filePaths[idx]); + // Zig + // std.heap.page_allocator.free(filePaths[idx]); + // } + + rl.CloseWindow(); + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_drop_files.zig b/projects/zig_raylib_examples/core/core_drop_files.zig new file mode 100644 index 0000000..da2b7b9 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_drop_files.zig @@ -0,0 +1,102 @@ +//!zig-autodoc-section: core_drop_files.Main +//! raylib_examples/core_drop_files.zig +//! Example - Windows drop files. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); + @cInclude("stdlib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +const MAX_FILEPATH_RECORDED: c_int = 4096; +const MAX_FILEPATH_SIZE: c_int = 2048; + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + const screenWidth = 800; + const screenHeight = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - drop files"); + + var filePathCounter: i32 = 0; + var filePaths: [MAX_FILEPATH_RECORDED][*c]u8 = undefined; + + // // Allocate space for file paths + for (0..@intCast(filePathCounter)) |idx| { + filePaths[idx] = @ptrCast(rl.RL_CALLOC(MAX_FILEPATH_SIZE, 1)); + } + + // Allocate space for the required file paths + for (0..MAX_FILEPATH_RECORDED) |i| { + filePaths[i] = @ptrCast(std.heap.page_allocator.alloc(u8, MAX_FILEPATH_SIZE) catch unreachable); + } + + rl.SetTargetFPS(60); + + // Main game loop + while (!rl.WindowShouldClose()) { + // Update + if (rl.IsFileDropped()) { + const droppedFiles = rl.LoadDroppedFiles(); + + const offset: usize = @intCast(filePathCounter); + for (0..droppedFiles.count) |idx| { + if (filePathCounter < MAX_FILEPATH_RECORDED - 1) { + _ = rl.TextCopy(filePaths[offset + idx], droppedFiles.paths[idx]); + filePathCounter += 1; + } + } + + rl.UnloadDroppedFiles(droppedFiles); + } + + // Draw + rl.BeginDrawing(); + rl.ClearBackground(rl.RAYWHITE); + + if (filePathCounter == 0) { + rl.DrawText("Drop your files to this window!", 100, 40, 20, rl.DARKGRAY); + } else { + rl.DrawText("Dropped files:", 100, 40, 20, rl.DARKGRAY); + + for (0..@intCast(filePathCounter)) |idx| { + const i: i32 = @intCast(idx); + if (@mod(i, 2) == 0) { + rl.DrawRectangle(0, 85 + 40 * i, screenWidth, 40, rl.Fade(rl.LIGHTGRAY, 0.5)); + } else { + rl.DrawRectangle(0, 85 + 40 * i, screenWidth, 40, rl.Fade(rl.LIGHTGRAY, 0.3)); + } + rl.DrawText(filePaths[idx], 120, 100 + 40 * i, 10, rl.GRAY); + } + + rl.DrawText("Drop new files...", 100, 110 + 40 * filePathCounter, 20, rl.DARKGRAY); + } + + rl.EndDrawing(); + } + + // De-Initialization + // for (0..@intCast(filePathCounter)) |idx| { + // C + // rl.RL_FREE(filePaths[idx]); + // Zig + // std.heap.page_allocator.free(filePaths[idx]); + // } + + rl.CloseWindow(); + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_input_gamepad.zig b/projects/zig_raylib_examples/core/core_input_gamepad.zig new file mode 100644 index 0000000..b840b2e --- /dev/null +++ b/projects/zig_raylib_examples/core/core_input_gamepad.zig @@ -0,0 +1,195 @@ +//!zig-autodoc-section: core_input_gamepad.Main +//! raylib_examples/core_input_gamepad.zig +//! Example - 2D Camera system. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} +inline fn fmt(comptime format: []const u8, args: anytype) []u8 { return std.fmt.allocPrint(std.heap.page_allocator, format, args) catch unreachable; } + +const XBOX_ALIAS_1 = "xbox"; +const XBOX_ALIAS_2 = "x-box"; +const PS_ALIAS = "playstation"; + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + rl.SetConfigFlags(rl.FLAG_MSAA_4X_HINT); // Set MSAA 4X hint before windows creation + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - gamepad input"); + + const cwd = std.process.getCwd(std.heap.page_allocator.alloc(u8, 256) catch unreachable) catch unreachable; + const res1 = fmt("{s}\\core\\{s}", .{ cwd, "resources/ps3.png" }); + const res2 = fmt("{s}\\core\\{s}", .{ cwd, "resources/xbox.png" }); + const texPs3Pad = rl.LoadTexture(res1.ptr); + const texXboxPad = rl.LoadTexture(res2.ptr); + + // Set axis deadzones + const leftStickDeadzoneX = 0.1; + const leftStickDeadzoneY = 0.1; + const rightStickDeadzoneX = 0.1; + const rightStickDeadzoneY = 0.1; + const leftTriggerDeadzone = -0.9; + const rightTriggerDeadzone = -0.9; + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + var gamepad: i32 = 0; // which gamepad to display + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + // ... + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + if (rl.IsKeyPressed(rl.KEY_LEFT) and gamepad > 0) gamepad -= 1; + if (rl.IsKeyPressed(rl.KEY_RIGHT)) gamepad += 1; + + if (rl.IsGamepadAvailable(gamepad)) { + rl.DrawText(rl.TextFormat("GP%d: %s", gamepad, rl.GetGamepadName(gamepad)), 10, 10, 10, rl.BLACK); + + // Get axis values + var leftStickX = rl.GetGamepadAxisMovement(gamepad, rl.GAMEPAD_AXIS_LEFT_X); + var leftStickY = rl.GetGamepadAxisMovement(gamepad, rl.GAMEPAD_AXIS_LEFT_Y); + var rightStickX = rl.GetGamepadAxisMovement(gamepad, rl.GAMEPAD_AXIS_RIGHT_X); + var rightStickY = rl.GetGamepadAxisMovement(gamepad, rl.GAMEPAD_AXIS_RIGHT_Y); + var leftTrigger = rl.GetGamepadAxisMovement(gamepad, rl.GAMEPAD_AXIS_LEFT_TRIGGER); + var rightTrigger = rl.GetGamepadAxisMovement(gamepad, rl.GAMEPAD_AXIS_RIGHT_TRIGGER); + + // Calculate deadzones + if (leftStickX > -leftStickDeadzoneX and leftStickX < leftStickDeadzoneX) leftStickX = 0.0; + if (leftStickY > -leftStickDeadzoneY and leftStickY < leftStickDeadzoneY) leftStickY = 0.0; + if (rightStickX > -rightStickDeadzoneX and rightStickX < rightStickDeadzoneX) rightStickX = 0.0; + if (rightStickY > -rightStickDeadzoneY and rightStickY < rightStickDeadzoneY) rightStickY = 0.0; + if (leftTrigger < leftTriggerDeadzone) leftTrigger = -1.0; + if (rightTrigger < rightTriggerDeadzone) rightTrigger = -1.0; + + if (rl.TextFindIndex(rl.TextToLower(rl.GetGamepadName(gamepad)), XBOX_ALIAS_1) > -1 or rl.TextFindIndex(rl.TextToLower(rl.GetGamepadName(gamepad)), XBOX_ALIAS_2) > -1) { + rl.DrawTexture(texXboxPad, 0, 0, rl.DARKGRAY); + + // Draw buttons: xbox home + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_MIDDLE)) rl.DrawCircle(394, 89, 19, rl.RED); + + // Draw buttons: basic + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_MIDDLE_RIGHT)) rl.DrawCircle(436, 150, 9, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_MIDDLE_LEFT)) rl.DrawCircle(352, 150, 9, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_LEFT)) rl.DrawCircle(501, 151, 15, rl.BLUE); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_DOWN)) rl.DrawCircle(536, 187, 15, rl.LIME); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_RIGHT)) rl.DrawCircle(572, 151, 15, rl.MAROON); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_UP)) rl.DrawCircle(536, 115, 15, rl.GOLD); + + // Draw buttons: d-pad + rl.DrawRectangle(317, 202, 19, 71, rl.BLACK); + rl.DrawRectangle(293, 228, 69, 19, rl.BLACK); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_UP)) rl.DrawRectangle(317, 202, 19, 26, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_DOWN)) rl.DrawRectangle(317, 202 + 45, 19, 26, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_LEFT)) rl.DrawRectangle(292, 228, 25, 19, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_RIGHT)) rl.DrawRectangle(292 + 44, 228, 26, 19, rl.RED); + + // Draw buttons: left-right back + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_LEFT_TRIGGER_1)) rl.DrawCircle(259, 61, 20, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_RIGHT_TRIGGER_1)) rl.DrawCircle(536, 61, 20, rl.RED); + + // Draw axis: left joystick + var leftGamepadColor = rl.BLACK; + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_LEFT_THUMB)) leftGamepadColor = rl.RED; + rl.DrawCircle(259, 152, 39, rl.BLACK); + rl.DrawCircle(259, 152, 34, rl.LIGHTGRAY); + rl.DrawCircle(259 + toInt(leftStickX * 20), 152 + toInt(leftStickY * 20), 25, leftGamepadColor); + + // Draw axis: right joystick + var rightGamepadColor = rl.BLACK; + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_RIGHT_THUMB)) rightGamepadColor = rl.RED; + rl.DrawCircle(461, 237, 38, rl.BLACK); + rl.DrawCircle(461, 237, 33, rl.LIGHTGRAY); + rl.DrawCircle(461 + toInt(rightStickX * 20), 237 + toInt(rightStickY * 20), 25, rightGamepadColor); + + // Draw axis: left-right triggers + rl.DrawRectangle(170, 30, 15, 70, rl.GRAY); + rl.DrawRectangle(604, 30, 15, 70, rl.GRAY); + rl.DrawRectangle(170, 30, 15, toInt(((1.0 + leftTrigger) / 2.0) * 70), rl.RED); + rl.DrawRectangle(604, 30, 15, toInt(((1.0 + rightTrigger) / 2.0) * 70), rl.RED); + } else if (rl.TextFindIndex(rl.TextToLower(rl.GetGamepadName(gamepad)), PS_ALIAS) > -1) { + rl.DrawTexture(texPs3Pad, 0, 0, rl.DARKGRAY); + + // Draw buttons: ps + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_MIDDLE)) rl.DrawCircle(396, 222, 13, rl.RED); + + // Draw buttons: basic + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_MIDDLE_LEFT)) rl.DrawRectangle(328, 170, 32, 13, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_MIDDLE_RIGHT)) rl.DrawTriangle(rl.Vector2{ .x = 436, .y = 168 }, rl.Vector2{ .x = 436, .y = 185 }, rl.Vector2{ .x = 464, .y = 177 }, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_UP)) rl.DrawCircle(557, 144, 13, rl.LIME); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_RIGHT)) rl.DrawCircle(586, 173, 13, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_DOWN)) rl.DrawCircle(557, 203, 13, rl.VIOLET); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_RIGHT_FACE_LEFT)) rl.DrawCircle(527, 173, 13, rl.PINK); + + // Draw buttons: d-pad + rl.DrawRectangle(225, 132, 24, 84, rl.BLACK); + rl.DrawRectangle(195, 161, 84, 25, rl.BLACK); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_UP)) rl.DrawRectangle(225, 132, 24, 29, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_DOWN)) rl.DrawRectangle(225, 132 + 54, 24, 30, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_LEFT)) rl.DrawRectangle(195, 161, 30, 25, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_LEFT_FACE_RIGHT)) rl.DrawRectangle(195 + 54, 161, 30, 25, rl.RED); + + // Draw buttons: left-right back buttons + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_LEFT_TRIGGER_1)) rl.DrawCircle(198, 81, 20, rl.RED); + if (rl.IsGamepadButtonDown(gamepad, rl.GAMEPAD_BUTTON_RIGHT_TRIGGER_1)) rl.DrawCircle(507, 81, 20, rl.RED); + + // Draw axis: left joystick + rl.DrawCircle(227, 206, 38, rl.BLACK); + rl.DrawCircle(227, 206, 33, rl.LIGHTGRAY); + rl.DrawCircle(227 + toInt(leftStickX * 20), 206 + toInt(leftStickY * 20), 25, rl.BLACK); + + // Draw axis: right joystick + rl.DrawCircle(544, 216, 38, rl.BLACK); + rl.DrawCircle(544, 216, 33, rl.LIGHTGRAY); + rl.DrawCircle(544 + toInt(rightStickX * 20), 216 + toInt(rightStickY * 20), 25, rl.BLACK); + + // Draw axis: left-right triggers + rl.DrawRectangle(122, 58, 15, 65, rl.GRAY); + rl.DrawRectangle(603, 58, 15, 65, rl.GRAY); + rl.DrawRectangle(122, 58, 15, toInt(((1 + leftTrigger) / 2) * 65), rl.RED); + rl.DrawRectangle(603, 58, 15, toInt(((1 + rightTrigger) / 2) * 65), rl.RED); + } + } + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.UnloadTexture(texPs3Pad); // Unload texture + rl.UnloadTexture(texXboxPad); // Unload texture + + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/projects/zig_raylib_examples/core/core_input_gamepad_info.zig b/projects/zig_raylib_examples/core/core_input_gamepad_info.zig new file mode 100644 index 0000000..0763aa8 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_input_gamepad_info.zig @@ -0,0 +1,82 @@ +//!zig-autodoc-section: core_input_gamepad_info.Main +//! raylib_examples/core_input_gamepad_info.zig +//! Example - Gamepad information. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + rl.SetConfigFlags(rl.FLAG_MSAA_4X_HINT); // Set MSAA 4X hint before window creation + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - gamepad information"); + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + // TODO: Update your variables here + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + var y: i32 = 5; + for (0..3) |i_| { // MAX_GAMEPADS = 4 + const i: c_int = @intCast(i_); + if (rl.IsGamepadAvailable(i)) { + rl.DrawText(rl.TextFormat("Gamepad name: %s", rl.GetGamepadName(i)), 10, y, 10, rl.BLACK); + y += 11; + rl.DrawText(rl.TextFormat("\tAxis count: %d", rl.GetGamepadAxisCount(i)), 10, y, 10, rl.BLACK); + y += 11; + + const axis_u: usize = @intCast(rl.GetGamepadAxisCount(i)); + for (0..axis_u) |axis_| { + const axis: c_int = @intCast(axis_); + rl.DrawText(rl.TextFormat("\tAxis %d = %f", axis, rl.GetGamepadAxisMovement(i, axis)), 10, y, 10, rl.BLACK); + y += 11; + } + + for (0..32) |button_| { + const button: c_int = @intCast(button_); + rl.DrawText(rl.TextFormat("\tButton %d = %d", button, rl.IsGamepadButtonDown(i, button)), 10, y, 10, rl.BLACK); + y += 11; + } + } + } + + rl.DrawFPS(rl.GetScreenWidth() - 100, 100); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_input_gestures.zig b/projects/zig_raylib_examples/core/core_input_gestures.zig new file mode 100644 index 0000000..8adc56b --- /dev/null +++ b/projects/zig_raylib_examples/core/core_input_gestures.zig @@ -0,0 +1,120 @@ +//!zig-autodoc-section: core_2d_camera.Main +//! raylib_examples/core_2d_camera.zig +//! Example - 2D Camera system. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); + @cInclude("stdlib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth: c_int = 800; + const screenHeight: c_int = 450; + const MAX_GESTURE_STRINGS: usize = 20; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - input gestures"); + + var touchPosition: rl.Vector2 = .{ .x = 0, .y = 0 }; + const touchArea: rl.Rectangle = .{ .x = 220, .y = 10, .width = toFloat(screenWidth) - 230.0, .height = toFloat(screenHeight) - 20.0 }; + + var gesturesCount: usize = 0; + const gestureStrings: [MAX_GESTURE_STRINGS][*c]u8 = std.mem.zeroes([MAX_GESTURE_STRINGS][*c]u8); + + var currentGesture = rl.GESTURE_NONE; + var lastGesture = rl.GESTURE_NONE; + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + lastGesture = currentGesture; + currentGesture = rl.GetGestureDetected(); + touchPosition = rl.GetTouchPosition(0); + + if (rl.CheckCollisionPointRec(touchPosition, touchArea) and currentGesture != rl.GESTURE_NONE) { + if (currentGesture != lastGesture) { + // Store gesture string + switch (currentGesture) { + rl.GESTURE_TAP => { _ = rl.TextCopy(gestureStrings[gesturesCount], "GESTURE TAP"); }, + rl.GESTURE_DOUBLETAP => { _ = rl.TextCopy(gestureStrings[gesturesCount], "GESTURE DOUBLETAP"); }, + rl.GESTURE_HOLD => { _ = rl.TextCopy(gestureStrings[gesturesCount], "GESTURE HOLD"); }, + rl.GESTURE_DRAG => { _ = rl.TextCopy(gestureStrings[gesturesCount], "GESTURE DRAG"); }, + rl.GESTURE_SWIPE_RIGHT => { _ = rl.TextCopy(gestureStrings[gesturesCount], "GESTURE SWIPE RIGHT"); }, + rl.GESTURE_SWIPE_LEFT => { _ = rl.TextCopy(gestureStrings[gesturesCount], "GESTURE SWIPE LEFT"); }, + rl.GESTURE_SWIPE_UP => { _ = rl.TextCopy(gestureStrings[gesturesCount], "GESTURE SWIPE UP"); }, + rl.GESTURE_SWIPE_DOWN => { _ = rl.TextCopy(gestureStrings[gesturesCount], "GESTURE SWIPE DOWN"); }, + rl.GESTURE_PINCH_IN => { _ = rl.TextCopy(gestureStrings[gesturesCount], "GESTURE PINCH IN"); }, + rl.GESTURE_PINCH_OUT => { _ = rl.TextCopy(gestureStrings[gesturesCount], "GESTURE PINCH OUT"); }, + else => {}, + } + + gesturesCount += 1; + + // Reset gestures strings + if (gesturesCount >= MAX_GESTURE_STRINGS) { + for (0..MAX_GESTURE_STRINGS) |i| { + _ = rl.TextCopy(gestureStrings[i], '0'); + } + gesturesCount = 0; + } + } + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + rl.DrawRectangleRec(touchArea, rl.GRAY); + rl.DrawRectangle(225, 15, screenWidth - 240, screenHeight - 30, rl.RAYWHITE); + + rl.DrawText("GESTURES TEST AREA", screenWidth - 270, screenHeight - 40, 20, rl.Fade(rl.GRAY, 0.5)); + + for (0..MAX_GESTURE_STRINGS) |i| { + if (i % 2 == 0) rl.DrawRectangle(10, @intCast(30 + 20 * i), 200, 20, rl.Fade(rl.LIGHTGRAY, 0.5)) + else rl.DrawRectangle(10, @intCast(30 + 20 * i), 200, 20, rl.Fade(rl.LIGHTGRAY, 0.3)); + + if (gesturesCount > 0) { + if (i < gesturesCount - 1) rl.DrawText(gestureStrings[i], 35, @intCast(36 + 20 * i), 10, rl.DARKGRAY) + else rl.DrawText(gestureStrings[i], 35, @intCast(36 + 20 * i), 10, rl.MAROON); + } + } + + rl.DrawRectangleLines(10, 29, 200, screenHeight - 50, rl.GRAY); + rl.DrawText("DETECTED GESTURES", 50, 15, 10, rl.GRAY); + + if (currentGesture != rl.GESTURE_NONE) rl.DrawCircleV(touchPosition, 30, rl.MAROON); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_input_keys.zig b/projects/zig_raylib_examples/core/core_input_keys.zig new file mode 100644 index 0000000..702f071 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_input_keys.zig @@ -0,0 +1,62 @@ +//!zig-autodoc-section: core_input_keys.Main +//! raylib_examples/core_input_keys.zig +//! Example - Keyboard input. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth: i32 = 800; + const screenHeight: i32 = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - keyboard input"); + + var ballPosition = rl.Vector2{ + .x = @as(f32, @floatFromInt(screenWidth)) / 2, + .y = @as(f32, @floatFromInt(screenHeight)) / 2, + }; + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + if (rl.IsKeyDown(rl.KEY_RIGHT)) ballPosition.x += 2.0; + if (rl.IsKeyDown(rl.KEY_LEFT)) ballPosition.x -= 2.0; + if (rl.IsKeyDown(rl.KEY_UP)) ballPosition.y -= 2.0; + if (rl.IsKeyDown(rl.KEY_DOWN)) ballPosition.y += 2.0; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + rl.DrawText("move the ball with arrow keys", 10, 10, 20, rl.DARKGRAY); + rl.DrawCircleV(ballPosition, 50, rl.MAROON); + //---------------------------------------------------------------------------------- + + rl.EndDrawing(); + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_input_mouse.zig b/projects/zig_raylib_examples/core/core_input_mouse.zig new file mode 100644 index 0000000..15322bc --- /dev/null +++ b/projects/zig_raylib_examples/core/core_input_mouse.zig @@ -0,0 +1,72 @@ +//!zig-autodoc-section: core_input_mouse.Main +//! raylib_examples/core_input_mouse.zig +//! Example - Mouse input. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth: i32 = 800; + const screenHeight: i32 = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - mouse input"); + + var ballPosition = rl.Vector2{ + .x = -100.0, + .y = -100.0, + }; + var ballColor = rl.DARKBLUE; + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //--------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + ballPosition = rl.GetMousePosition(); + + if (rl.IsMouseButtonPressed(rl.MOUSE_BUTTON_LEFT)) ballColor = rl.MAROON; + if (rl.IsMouseButtonPressed(rl.MOUSE_BUTTON_MIDDLE)) ballColor = rl.LIME; + if (rl.IsMouseButtonPressed(rl.MOUSE_BUTTON_RIGHT)) ballColor = rl.DARKBLUE; + if (rl.IsMouseButtonPressed(rl.MOUSE_BUTTON_SIDE)) ballColor = rl.PURPLE; + if (rl.IsMouseButtonPressed(rl.MOUSE_BUTTON_EXTRA)) ballColor = rl.YELLOW; + if (rl.IsMouseButtonPressed(rl.MOUSE_BUTTON_FORWARD)) ballColor = rl.ORANGE; + if (rl.IsMouseButtonPressed(rl.MOUSE_BUTTON_BACK)) ballColor = rl.BEIGE; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + rl.DrawCircleV(ballPosition, 40, ballColor); + + rl.DrawText("move ball with mouse and click mouse button to change color", 10, 10, 20, rl.DARKGRAY); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_input_mouse_wheel.zig b/projects/zig_raylib_examples/core/core_input_mouse_wheel.zig new file mode 100644 index 0000000..5c0e25d --- /dev/null +++ b/projects/zig_raylib_examples/core/core_input_mouse_wheel.zig @@ -0,0 +1,66 @@ +//!zig-autodoc-section: core_input_mouse_wheel.Main +//! raylib_examples/core_input_mouse_wheel.zig +//! Example - Mouse wheel input. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth: i32 = 800; + const screenHeight: i32 = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - input mouse wheel"); + + var boxPositionY: i32 = toFloat(screenWidth) / 2.0 - 40.0; + const scrollSpeed: i32 = 4; // Scrolling speed in pixels + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + boxPositionY -= toInt(rl.GetMouseWheelMove()) * scrollSpeed; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + rl.DrawRectangle(toFloat(screenWidth) / 2.0 - 40.0, boxPositionY, 80, 80, rl.MAROON); + + rl.DrawText("Use mouse wheel to move the cube up and down!", 10, 10, 20, rl.GRAY); + rl.DrawText(rl.TextFormat("Box position Y: %03i", boxPositionY), 10, 40, 20, rl.LIGHTGRAY); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_input_multitouch.zig b/projects/zig_raylib_examples/core/core_input_multitouch.zig new file mode 100644 index 0000000..b61e7e7 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_input_multitouch.zig @@ -0,0 +1,77 @@ +//!zig-autodoc-section: core_input_multitouch.Main +//! raylib_examples/core_input_multitouch.zig +//! Example - Input multitouch. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +// Helpers +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +const MAX_TOUCH_POINTS = 10; +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - input multitouch"); + + var touchPositions: [MAX_TOUCH_POINTS]rl.Vector2 = undefined; + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //--------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + var tCount: usize = @as(usize, @intCast(rl.GetTouchPointCount())); + // Clamp touch points available ( set the maximum touch points allowed ) + if (tCount > MAX_TOUCH_POINTS) tCount = MAX_TOUCH_POINTS; + // Get touch points positions + for (0..tCount) |i| { + touchPositions[i] = rl.GetTouchPosition(@as(c_int, @intCast(i))); + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + for (0..tCount) |i| { + // Make sure point is not (0, 0) as this means there is no touch for it + if (touchPositions[i].x > 0 and touchPositions[i].y > 0) { + // Draw circle and touch index number + rl.DrawCircleV(touchPositions[i], 34, rl.ORANGE); + rl.DrawText(rl.TextFormat("{}", i), toInt(touchPositions[i].x - 10.0), toInt(touchPositions[i].y - 70.0), 40, rl.BLACK); + } + } + + rl.DrawText("touch the screen at multiple locations to get multiple balls", 10, 10, 20, rl.DARKGRAY); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_input_virtual_controls.zig b/projects/zig_raylib_examples/core/core_input_virtual_controls.zig new file mode 100644 index 0000000..634977f --- /dev/null +++ b/projects/zig_raylib_examples/core/core_input_virtual_controls.zig @@ -0,0 +1,141 @@ +//!zig-autodoc-section: core_input_virtual_controls.Main +//! raylib_examples/core_input_virtual_controls.zig +//! Example - input virtual controls. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +const BUTTON_NONE: c_int = -1; +const BUTTON_UP: c_int = 0; +const BUTTON_LEFT: c_int = 1; +const BUTTON_RIGHT: c_int = 2; +const BUTTON_DOWN: c_int = 3; +const BUTTON_MAX: usize = 4; + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth: c_int = 800; + const screenHeight: c_int = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - input virtual controls"); + + const padPosition: rl.Vector2 = .{ .x=100.0, .y=350.0 }; + const buttonRadius: f32 = 30.0; + + const buttonPositions: [BUTTON_MAX]rl.Vector2 = .{ + .{ .x = padPosition.x, .y = padPosition.y - buttonRadius * 1.5}, // Up + .{ .x = padPosition.x - buttonRadius * 1.5, .y = padPosition.y}, // Left + .{ .x = padPosition.x + buttonRadius * 1.5, .y = padPosition.y}, // Right + .{ .x = padPosition.x, .y = padPosition.y + buttonRadius * 1.5}, // Down + }; + + const buttonLabels: [BUTTON_MAX][]const u8 = .{ + "Y", // Up + "X", // Left + "B", // Right + "A", // Down + }; + + const buttonLabelColors: [BUTTON_MAX]rl.Color = .{ + rl.YELLOW, // Up + rl.BLUE, // Left + rl.RED, // Right + rl.GREEN, // Down + }; + + var pressedButton: c_int = BUTTON_NONE; + var inputPosition: rl.Vector2 = .{ .x = 0, .y = 0 }; + + var playerPosition: rl.Vector2 = .{ .x = toFloat(screenWidth) / 2.0, .y = toFloat(screenHeight) / 2.0 }; + const playerSpeed: f32 = 75.0; + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //-------------------------------------------------------------------------- + + if (rl.GetTouchPointCount() > 0) { + // Use touch position + inputPosition = rl.GetTouchPosition(0); + } else { + // Use mouse position + inputPosition = rl.GetMousePosition(); + } + + // Reset pressed button to none + pressedButton = BUTTON_NONE; + + // Make sure user is pressing left mouse button if they're from desktop + if (rl.GetTouchPointCount() > 0 or (rl.GetTouchPointCount() == 0 and rl.IsMouseButtonDown(rl.MOUSE_BUTTON_LEFT))) { + // Find nearest D-Pad button to the input position + for (0..BUTTON_MAX) |i| { + const distX = @abs(buttonPositions[i].x - inputPosition.x); + const distY = @abs(buttonPositions[i].y - inputPosition.y); + + if (distX + distY < buttonRadius) { + pressedButton = @intCast(i); + break; + } + } + } + + // Move player according to pressed button + switch (pressedButton) { + BUTTON_UP => playerPosition.y -= playerSpeed * rl.GetFrameTime(), + BUTTON_LEFT => playerPosition.x -= playerSpeed * rl.GetFrameTime(), + BUTTON_RIGHT => playerPosition.x += playerSpeed * rl.GetFrameTime(), + BUTTON_DOWN => playerPosition.y += playerSpeed * rl.GetFrameTime(), + else => {}, + } + //-------------------------------------------------------------------------- + + // Draw + //-------------------------------------------------------------------------- + + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + // Draw world + rl.DrawCircleV(playerPosition, 50, rl.MAROON); + + // Draw GUI + for (0..BUTTON_MAX) |i| { + rl.DrawCircleV(buttonPositions[i], buttonRadius, if (i == pressedButton) rl.DARKGRAY else rl.BLACK); + rl.DrawText(buttonLabels[i].ptr, toInt(buttonPositions[i].x) - 7, toInt(buttonPositions[i].y) - 8, 20, buttonLabelColors[i]); + } + + rl.DrawText("move the player with D-Pad buttons", 10, 10, 20, rl.DARKGRAY); + + rl.EndDrawing(); + //-------------------------------------------------------------------------- + + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_random_values.zig b/projects/zig_raylib_examples/core/core_random_values.zig new file mode 100644 index 0000000..d113317 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_random_values.zig @@ -0,0 +1,70 @@ +//!zig-autodoc-section: core_random_values.Main +//! raylib_examples/core_random_values.zig +//! Example - Generate random values. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth: i32 = 800; + const screenHeight: i32 = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - generate random values"); + + // rl.SetRandomSeed(0xaabbccff); // Set a custom random seed if desired, by default: "time(NULL)" + + var randValue: i32 = rl.GetRandomValue(-8, 5); // Get a random integer number between -8 and 5 (both included) + + var framesCounter: u32 = 0; // Variable used to count frames + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + framesCounter += 1; + + // Every two seconds (120 frames) a new random value is generated + if ((framesCounter / 120) % 2 == 1) { + randValue = rl.GetRandomValue(-8, 5); + framesCounter = 0; + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + rl.DrawText("Every 2 seconds a new random value is generated:", 130, 100, 20, rl.MAROON); + + rl.DrawText(rl.TextFormat("%i", randValue), 360, 180, 80, rl.LIGHTGRAY); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_scissor_test.zig b/projects/zig_raylib_examples/core/core_scissor_test.zig new file mode 100644 index 0000000..4f7c734 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_scissor_test.zig @@ -0,0 +1,79 @@ +//!zig-autodoc-section: core_scissor_test.Main +//! raylib_examples/core_scissor_test.zig +//! Example - Scissor test. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/rl.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - scissor test"); + + var scissorArea = rl.Rectangle{ .x = 0, .y = 0, .width = 300, .height = 300 }; + var scissorMode = true; + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { + // Update + //---------------------------------------------------------------------------------- + if (rl.IsKeyPressed(rl.KEY_S)) scissorMode = !scissorMode; + + // Centre the scissor area around the mouse position + scissorArea.x = toFloat(rl.GetMouseX()) - scissorArea.width / 2.0; + scissorArea.y = toFloat(rl.GetMouseY()) - scissorArea.height / 2.0; + + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + if (scissorMode) + rl.BeginScissorMode(toInt(scissorArea.x), toInt(scissorArea.y), toInt(scissorArea.width), toInt(scissorArea.height)); + + // Draw full screen rectangle and some text + // NOTE: Only part defined by scissor area will be rendered + rl.DrawRectangle(0, 0, rl.GetScreenWidth(), rl.GetScreenHeight(), rl.RED); + rl.DrawText("Move the mouse around to reveal this text!", 190, 200, 20, rl.LIGHTGRAY); + + if (scissorMode) + rl.EndScissorMode(); + + rl.DrawRectangleLinesEx(scissorArea, 1, rl.BLACK); + rl.DrawText("Press S to toggle scissor test", 10, 10, 20, rl.BLACK); + + rl.EndDrawing(); + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_smooth_pixelperfect.zig b/projects/zig_raylib_examples/core/core_smooth_pixelperfect.zig new file mode 100644 index 0000000..3295506 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_smooth_pixelperfect.zig @@ -0,0 +1,121 @@ +//!zig-autodoc-section: core_smooth_pixelperfect.Main +//! raylib_examples/core_smooth_pixelperfect.zig +//! Example - Smooth Pixel-perfect camera. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); + @cInclude("stdlib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth: c_int = 800; + const screenHeight: c_int = 450; + + const virtualScreenWidth: c_int = 160; + const virtualScreenHeight: c_int = 90; + + const virtualRatio: f32 = toFloat(screenWidth) / toFloat(virtualScreenWidth); + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - smooth pixel-perfect camera"); + + var worldSpaceCamera: rl.Camera2D = undefined; // Game world camera + worldSpaceCamera.zoom = 1.0; + + var screenSpaceCamera: rl.Camera2D = undefined; // Smoothing camera + screenSpaceCamera.zoom = 1.0; + + const target = rl.LoadRenderTexture(virtualScreenWidth, virtualScreenHeight); // This is where we'll draw all our objects. + + const rec01: rl.Rectangle = .{ .x=70.0, .y=35.0, .width=20.0, .height=20.0 }; + const rec02: rl.Rectangle = .{ .x=90.0, .y=55.0, .width=30.0, .height=10.0 }; + const rec03: rl.Rectangle = .{ .x=80.0, .y=65.0, .width=15.0, .height=25.0 }; + + // The target's height is flipped (in the source Rectangle), due to OpenGL reasons + const sourceRec: rl.Rectangle = .{ .x=0.0, .y=0.0, .width=toFloat(target.texture.width), .height=toFloat(-target.texture.height)}; + const destRec: rl.Rectangle = .{ .x=-virtualRatio, .y=-virtualRatio, .width=screenWidth + (virtualRatio * 2), .height=screenHeight + (virtualRatio * 2) }; + + const origin: rl.Vector2 = .{ .x=0.0, .y=0.0 }; + + var rotation: f32 = 0.0; + + var cameraX: f32 = 0.0; + var cameraY: f32 = 0.0; + + rl.SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + rotation += 60.0 * rl.GetFrameTime(); // Rotate the rectangles, 60 degrees per second + + // Make the camera move to demonstrate the effect + cameraX = @floatCast((std.math.sin(rl.GetTime()) * 50.0) - 10.0); + cameraY = @floatCast(std.math.cos(rl.GetTime()) * 30.0); + + // Set the camera's target to the values computed above + screenSpaceCamera.target = rl.Vector2{ .x=cameraX, .y=cameraY }; + + // Round worldSpace coordinates, keep decimals into screenSpace coordinates + worldSpaceCamera.target.x = std.math.trunc(screenSpaceCamera.target.x); + screenSpaceCamera.target.x -= worldSpaceCamera.target.x; + screenSpaceCamera.target.x *= virtualRatio; + + worldSpaceCamera.target.y = std.math.trunc(screenSpaceCamera.target.y); + screenSpaceCamera.target.y -= worldSpaceCamera.target.y; + screenSpaceCamera.target.y *= virtualRatio; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginTextureMode(target); + rl.ClearBackground(rl.RAYWHITE); + + rl.BeginMode2D(worldSpaceCamera); + rl.DrawRectanglePro(rec01, origin, rotation, rl.BLACK); + rl.DrawRectanglePro(rec02, origin, -rotation, rl.RED); + rl.DrawRectanglePro(rec03, origin, rotation + 45.0, rl.BLUE); + rl.EndMode2D(); + rl.EndTextureMode(); + + rl.BeginDrawing(); + rl.ClearBackground(rl.RED); + + rl.BeginMode2D(screenSpaceCamera); + rl.DrawTexturePro(target.texture, sourceRec, destRec, origin, 0.0, rl.WHITE); + rl.EndMode2D(); + + rl.DrawText(rl.TextFormat("Screen resolution: %ix%i", screenWidth, screenHeight), 10, 10, 20, rl.DARKBLUE); + rl.DrawText(rl.TextFormat("World resolution: %ix%i", virtualScreenWidth, virtualScreenHeight), 10, 40, 20, rl.DARKGREEN); + rl.DrawFPS(screenWidth - 95, 10); + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.UnloadRenderTexture(target); // Unload render texture + + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_vr_simulator.zig b/projects/zig_raylib_examples/core/core_vr_simulator.zig new file mode 100644 index 0000000..10edb81 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_vr_simulator.zig @@ -0,0 +1,136 @@ +//!zig-autodoc-section: core_vr_simulator.Main +//! raylib_examples/core_vr_simulator.zig +//! Example - VR Simulator (Oculus Rift CV1 parameters). +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +const GLSL_VERSION: c_int = 330; +//if (rl.is_platform_desktop()) 330 else 100; + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + // NOTE: screenWidth/screenHeight should match VR device aspect ratio + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - vr simulator"); + + // VR device parameters definition + const 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 + .lensDistortionValues = .{1.0, 0.22, 0.24, 0.0}, // Lens distortion constants + .chromaAbCorrection = .{0.996, -0.004, 1.014, 0.0}, // Chromatic aberration correction + }; + + // Load VR stereo config for VR device parameters (Oculus Rift CV1 parameters) + const config = rl.LoadVrStereoConfig(device); + + // Distortion shader (uses device lens distortion and chroma) + const distortion = rl.LoadShader(0, rl.TextFormat("resources/distortion%i.fs", GLSL_VERSION)); + + // Update distortion shader with lens and distortion-scale parameters + rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "leftLensCenter"), &config.leftLensCenter, rl.SHADER_UNIFORM_VEC2); + rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "rightLensCenter"), &config.rightLensCenter, rl.SHADER_UNIFORM_VEC2); + rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "leftScreenCenter"), &config.leftScreenCenter, rl.SHADER_UNIFORM_VEC2); + rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "rightScreenCenter"), &config.rightScreenCenter, rl.SHADER_UNIFORM_VEC2); + + rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "scale"), &config.scale, rl.SHADER_UNIFORM_VEC2); + rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "scaleIn"), &config.scaleIn, rl.SHADER_UNIFORM_VEC2); + rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "deviceWarpParam"), &device.lensDistortionValues, rl.SHADER_UNIFORM_VEC4); + rl.SetShaderValue(distortion, rl.GetShaderLocation(distortion, "chromaAbParam"), &device.chromaAbCorrection, rl.SHADER_UNIFORM_VEC4); + + // Initialize framebuffer for stereo rendering + // NOTE: Screen size should match HMD aspect ratio + const target = rl.LoadRenderTexture(device.hResolution, device.vResolution); + + // The target's height is flipped (in the source Rectangle), due to OpenGL reasons + const sourceRec = rl.Rectangle{ .x = 0.0, .y = 0.0, .width = toFloat(target.texture.width), .height = toFloat(-target.texture.height) }; + const destRec = rl.Rectangle{ .x = 0.0, .y = 0.0, .width =toFloat( rl.GetScreenWidth()), .height = toFloat(rl.GetScreenHeight()) }; + + // Define the camera to look into our 3d world + var camera = rl.Camera{ }; + camera.position = rl.Vector3{ .x = 5.0, .y = 2.0, .z = 5.0 }; // Camera position + camera.target = rl.Vector3{ .x = 0.0, .y = 2.0, .z = 0.0 }; // Camera looking at point + camera.up = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }; // Camera up vector + camera.fovy = 60.0; // Camera field-of-view Y + camera.projection = rl.CAMERA_PERSPECTIVE; // Camera projection type + + const cubePosition = rl.Vector3{ .x = 0.0, .y = 0.0, .z = 0.0 }; + + 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 + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + rl.UpdateCamera(&camera, rl.CAMERA_FIRST_PERSON); + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + 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(); + + rl.BeginDrawing(); + rl.ClearBackground(rl.RAYWHITE); + rl.BeginShaderMode(distortion); + rl.DrawTexturePro(target.texture, sourceRec, destRec, rl.Vector2{ .x = 0.0, .y = 0.0 }, 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 + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/projects/zig_raylib_examples/core/core_window_flags.zig b/projects/zig_raylib_examples/core/core_window_flags.zig new file mode 100644 index 0000000..9d8b030 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_window_flags.zig @@ -0,0 +1,185 @@ +//!zig-autodoc-section: core_window_flags.Main +//! rl_examples/core_window_flags.zig +//! Example - window flags. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/rl_examples/lib/rl.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //--------------------------------------------------------- + const screenWidth = 800; + const 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 + // */ + + // Set configuration flags for window creation + // SetConfigFlags(FLAG_VSYNC_HINT | FLAG_MSAA_4X_HINT | FLAG_WINDOW_HIGHDPI); + rl.InitWindow(screenWidth, screenHeight, "rl [core] example - window flags"); + + var ballPosition = rl.Vector2{ .x = toFloat(rl.GetScreenWidth()) / 2.0, .y = toFloat(rl.GetScreenHeight()) / 2.0 }; + var ballSpeed = rl.Vector2{ .x = 5.0, .y = 4.0 }; + const ballRadius = 20.0; + + var framesCounter: i32 = 0; + + // Main game loop + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //----------------------------------------------------- + if (rl.IsKeyPressed(rl.KEY_F)) rl.ToggleFullscreen(); // modifies window size when scaling! + + if (rl.IsKeyPressed(rl.KEY_R)) { + if (rl.IsWindowState(rl.FLAG_WINDOW_RESIZABLE)) rl.ClearWindowState(rl.FLAG_WINDOW_RESIZABLE) + else rl.SetWindowState(rl.FLAG_WINDOW_RESIZABLE); + } + + if (rl.IsKeyPressed(rl.KEY_D)) { + if (rl.IsWindowState(rl.FLAG_WINDOW_UNDECORATED)) rl.ClearWindowState(rl.FLAG_WINDOW_UNDECORATED) + else rl.SetWindowState(rl.FLAG_WINDOW_UNDECORATED); + } + + if (rl.IsKeyPressed(rl.KEY_H)) { + if (!rl.IsWindowState(rl.FLAG_WINDOW_HIDDEN)) rl.SetWindowState(rl.FLAG_WINDOW_HIDDEN); + + framesCounter = 0; + } + + if (rl.IsWindowState(rl.FLAG_WINDOW_HIDDEN)) { + framesCounter += 1; + if (framesCounter >= 240) rl.ClearWindowState(rl.FLAG_WINDOW_HIDDEN); // Show window after 3 seconds + } + + if (rl.IsKeyPressed(rl.KEY_N)) { + if (!rl.IsWindowState(rl.FLAG_WINDOW_MINIMIZED)) rl.MinimizeWindow(); + + framesCounter = 0; + } + + if (rl.IsWindowState(rl.FLAG_WINDOW_MINIMIZED)) { + framesCounter += 1; + if (framesCounter >= 240) rl.RestoreWindow(); // Restore window after 3 seconds + } + + if (rl.IsKeyPressed(rl.KEY_M)) { + // NOTE: Requires FLAG_WINDOW_RESIZABLE enabled! + if (rl.IsWindowState(rl.FLAG_WINDOW_MAXIMIZED)) rl.RestoreWindow() + else rl.MaximizeWindow(); + } + + if (rl.IsKeyPressed(rl.KEY_U)) { + if (rl.IsWindowState(rl.FLAG_WINDOW_UNFOCUSED)) rl.ClearWindowState(rl.FLAG_WINDOW_UNFOCUSED) + else rl.SetWindowState(rl.FLAG_WINDOW_UNFOCUSED); + } + + if (rl.IsKeyPressed(rl.KEY_T)) { + if (rl.IsWindowState(rl.FLAG_WINDOW_TOPMOST)) rl.ClearWindowState(rl.FLAG_WINDOW_TOPMOST) + else rl.SetWindowState(rl.FLAG_WINDOW_TOPMOST); + } + + if (rl.IsKeyPressed(rl.KEY_A)) { + if (rl.IsWindowState(rl.FLAG_WINDOW_ALWAYS_RUN)) rl.ClearWindowState(rl.FLAG_WINDOW_ALWAYS_RUN) + else rl.SetWindowState(rl.FLAG_WINDOW_ALWAYS_RUN); + } + + if (rl.IsKeyPressed(rl.KEY_V)) { + if (rl.IsWindowState(rl.FLAG_VSYNC_HINT)) rl.ClearWindowState(rl.FLAG_VSYNC_HINT) + else rl.SetWindowState(rl.FLAG_VSYNC_HINT); + } + + // Bouncing ball logic + ballPosition.x += ballSpeed.x; + ballPosition.y += ballSpeed.y; + if ((ballPosition.x >= (toFloat(rl.GetScreenWidth()) - ballRadius)) or (ballPosition.x <= ballRadius)) ballSpeed.x *= -1.0; + if ((ballPosition.y >= (toFloat(rl.GetScreenHeight()) - ballRadius)) or (ballPosition.y <= ballRadius)) ballSpeed.y *= -1.0; + //----------------------------------------------------- + + // Draw + //----------------------------------------------------- + rl.BeginDrawing(); + + if (rl.IsWindowState(rl.FLAG_WINDOW_TRANSPARENT)) rl.ClearBackground(rl.BLANK) + else rl.ClearBackground(rl.RAYWHITE); + + rl.DrawCircleV(ballPosition, ballRadius, rl.MAROON); + rl.DrawRectangleLinesEx(rl.Rectangle{ .x = 0, .y = 0, .width = toFloat(rl.GetScreenWidth()), .height = toFloat(rl.GetScreenHeight()) }, 4, rl.RAYWHITE); + + rl.DrawCircleV(rl.GetMousePosition(), 10, rl.DARKBLUE); + + rl.DrawFPS(10, 10); + + rl.DrawText(rl.TextFormat("Screen Size: [%i, %i]", 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.FLAG_FULLSCREEN_MODE)) 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.FLAG_WINDOW_RESIZABLE)) 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.FLAG_WINDOW_UNDECORATED)) 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.FLAG_WINDOW_HIDDEN)) 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.FLAG_WINDOW_MINIMIZED)) 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.FLAG_WINDOW_MAXIMIZED)) 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.FLAG_WINDOW_UNFOCUSED)) 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.FLAG_WINDOW_TOPMOST)) 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.FLAG_WINDOW_ALWAYS_RUN)) 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.FLAG_VSYNC_HINT)) 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.FLAG_WINDOW_HIGHDPI)) 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.FLAG_WINDOW_TRANSPARENT)) 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.FLAG_MSAA_4X_HINT)) 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(); + //----------------------------------------------------- + } + + // De-Initialization + //--------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //--------------------------------------------------------- + + return 0; +} diff --git a/projects/zig_raylib_examples/core/core_window_letterbox.zig b/projects/zig_raylib_examples/core/core_window_letterbox.zig new file mode 100644 index 0000000..725674d --- /dev/null +++ b/projects/zig_raylib_examples/core/core_window_letterbox.zig @@ -0,0 +1,131 @@ +//!zig-autodoc-section: core_window_letterbox.Main +//! raylib_examples/core_window_letterbox.zig +//! Example - window scale letterbox (and virtual mouse). +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); +const rm = @cImport({ + @cInclude("raymath.h"); +}); + +// Helpers +inline fn MAX (a: f32, b: f32) f32 { return if (a > b) a else b; } +inline fn MIN (a: f32, b: f32) f32 { return if (a < b) a else b; } +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} +inline fn toU8(value: c_int) u8 { return @as(u8, @intCast(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + const windowWidth: c_int = 800; + const windowHeight: c_int = 450; + + // Enable config flags for resizable window and vertical synchro + rl.SetConfigFlags(rl.FLAG_WINDOW_RESIZABLE | rl.FLAG_VSYNC_HINT); + rl.InitWindow(windowWidth, windowHeight, "raylib [core] example - window scale letterbox"); + rl.SetWindowMinSize(320, 240); + + const gameScreenWidth: f32 = 640.0; + const gameScreenHeight: f32 = 480.0; + + // Render texture initialization, used to hold the rendering result so we can easily resize it + const target = rl.LoadRenderTexture(gameScreenWidth, gameScreenHeight); + rl.SetTextureFilter(target.texture, rl.TEXTURE_FILTER_BILINEAR); // Texture scale filter to use + + // Initialize random colors for the bars + var colors: [10]rl.Color = undefined; + for (0..colors.len) |i| { + colors[i] = rl.Color{ + .r = toU8(rl.GetRandomValue(100, 250)), + .g = toU8(rl.GetRandomValue(50, 150)), + .b = toU8(rl.GetRandomValue(10, 100)), + .a = 255, + }; + } + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + + // Main game loop + while (!rl.WindowShouldClose()) { + // Update + //---------------------------------------------------------------------------------- + // Compute required framebuffer scaling + const scale: f32 = MIN(toFloat(rl.GetScreenWidth()) / gameScreenWidth, toFloat(rl.GetScreenHeight()) / gameScreenHeight); + + if (rl.IsKeyPressed(rl.KEY_SPACE)) { + // Recalculate random colors for the bars + for (0..colors.len) |i| { + colors[i] = rl.Color{ + .r = toU8(rl.GetRandomValue(100, 250)), + .g = toU8(rl.GetRandomValue(50, 150)), + .b = toU8(rl.GetRandomValue(10, 100)), + .a = 255, + }; + } + } + + // Update virtual mouse (clamped mouse value behind game screen) + const mouse = rl.GetMousePosition(); + var virtualMouse = rm.Vector2{ + .x = (mouse.x - (toFloat(rl.GetScreenWidth()) - (gameScreenWidth * scale)) * 0.5) / scale, + .y = (mouse.y - (toFloat(rl.GetScreenHeight()) - (gameScreenHeight * scale)) * 0.5) / scale, + }; + virtualMouse = rm.Vector2Clamp(virtualMouse, rm.Vector2{ .x = 0, .y = 0 }, rm.Vector2{ .x = gameScreenWidth, .y = gameScreenHeight }); + + // Apply the same transformation as the virtual mouse to the real mouse (i.e. to work with raygui) + //SetMouseOffset(-(GetScreenWidth() - (gameScreenWidth*scale))*0.5f, -(GetScreenHeight() - (gameScreenHeight*scale))*0.5f); + //SetMouseScale(1/scale, 1/scale); + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + // Draw everything in the render texture, note this will not be rendered on screen, yet + rl.BeginTextureMode(target); + rl.ClearBackground(rl.RAYWHITE); // Clear render texture background color + + for (0..colors.len) |i| { + rl.DrawRectangle(0, toInt(gameScreenHeight / 10.0) * @as(c_int, @intCast(i)), toInt(gameScreenWidth), toInt(gameScreenHeight / 10.0), colors[i]); + } + + rl.DrawText("If executed inside a window,\nyou can resize the window,\nand see the screen scaling!", 10, 25, 20, rl.WHITE); + rl.DrawText(rl.TextFormat("Default Mouse: [%i , %i]", toInt(mouse.x), toInt(mouse.y)), 350, 25, 20, rl.GREEN); + rl.DrawText(rl.TextFormat("Virtual Mouse: [%i , %i]", toInt(virtualMouse.x), toInt(virtualMouse.y)), 350, 55, 20, rl.YELLOW); + rl.EndTextureMode(); + + rl.BeginDrawing(); + rl.ClearBackground(rl.BLACK); // Clear screen background + + // Draw render texture to screen, properly scaled + rl.DrawTexturePro(target.texture, + rl.Rectangle{ .x = 0.0, .y = 0.0, + .width = toFloat(target.texture.width), + .height = toFloat(-target.texture.height) }, + rl.Rectangle{ + .x = (toFloat(rl.GetScreenWidth()) - gameScreenWidth * scale) * 0.5, + .y = (toFloat(rl.GetScreenHeight()) - gameScreenHeight * scale) * 0.5, + .width = gameScreenWidth * scale, + .height = gameScreenHeight * scale }, rl.Vector2{ .x = 0, .y = 0 }, 0.0, rl.WHITE); + rl.EndDrawing(); + //-------------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.UnloadRenderTexture(target); // Unload render texture + + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_window_should_close.zig b/projects/zig_raylib_examples/core/core_window_should_close.zig new file mode 100644 index 0000000..0973349 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_window_should_close.zig @@ -0,0 +1,75 @@ +//!zig-autodoc-section: core_window_should_close.Main +//! raylib_examples/core_window_should_close.zig +//! Example - Window should close. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - window should close"); + + rl.SetExitKey(rl.KEY_NULL); // Disable KEY_ESCAPE to close window, X-button still works + + var exitWindowRequested = false; // Flag to request window to exit + var exitWindow = false; // Flag to set window to exit + + rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!exitWindow) { + // Update + //---------------------------------------------------------------------------------- + // Detect if X-button or KEY_ESCAPE have been pressed to close window + if (rl.WindowShouldClose() or rl.IsKeyPressed(rl.KEY_ESCAPE)) exitWindowRequested = true; + + if (exitWindowRequested) { + // A request for close window has been issued, we can save data before closing + // or just show a message asking for confirmation + + if (rl.IsKeyPressed(rl.KEY_Y)) { exitWindow = true; + } else if (rl.IsKeyPressed(rl.KEY_N)) { exitWindowRequested = false; } + } + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + 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 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(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/core_world_screen.zig b/projects/zig_raylib_examples/core/core_world_screen.zig new file mode 100644 index 0000000..297ac74 --- /dev/null +++ b/projects/zig_raylib_examples/core/core_world_screen.zig @@ -0,0 +1,108 @@ +//!zig-autodoc-section: core_world_screen.Main +//! raylib_examples/core_world_screen.zig +//! Example - World to screen. +//! +//! raylib Copyright (c) 2013-2024 Ramon Santamaria (@raysan5) +//! Zig port created by DarknessFX | https://dfx.lv | X @DrkFX + +const std = @import("std"); + +// NOTE ABOUT VSCODE + ZLS: +// Use full path for all cIncludes: +// @cInclude("C:/raylib_examples/lib/raylib.h"); +const rl = @cImport({ + @cInclude("raylib.h"); +}); + +// Helpers +inline fn toFloat(value: i32) f32 { return @as(f32, @floatFromInt(value));} +inline fn toInt(value: f32) i32 { return @as(i32, @intFromFloat(value));} + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +pub fn main() u8 { + // Initialization + //-------------------------------------------------------------------------------------- + const screenWidth = 800; + const screenHeight = 450; + + rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - core world screen"); + + // Define the camera to look into our 3d world + var camera: rl.Camera = undefined; + camera.position = rl.Vector3{ .x = 10.0, .y = 10.0, .z = 10.0 }; // Camera position + camera.target = rl.Vector3{ .x = 0.0, .y = 0.0, .z = 0.0 }; // Camera looking at point + camera.up = rl.Vector3{ .x = 0.0, .y = 1.0, .z = 0.0 }; // Camera up vector (rotation towards target) + camera.fovy = 45.0; // Camera field-of-view Y + camera.projection = rl.CAMERA_PERSPECTIVE; // Camera projection type + + const cubePosition = rl.Vector3{ .x = 0.0, .y = 0.0, .z = 0.0 }; + var cubeScreenPosition = rl.Vector2{ .x = 0.0, .y = 0.0 }; + + 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 + while (!rl.WindowShouldClose()) { // Detect window close button or ESC key + // Update + //---------------------------------------------------------------------------------- + rl.UpdateCamera(&camera, rl.CAMERA_THIRD_PERSON); + + // Calculate cube screen space position (with a little offset to be in top) + cubeScreenPosition = rl.GetWorldToScreen( + rl.Vector3{ .x = cubePosition.x, .y = cubePosition.y + 2.5, .z = cubePosition.z }, + camera, + ); + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl.BeginDrawing(); + + rl.ClearBackground(rl.RAYWHITE); + + 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(10, 1.0); + + rl.EndMode3D(); + + rl.DrawText( + "Enemy: 100 / 100", + toInt(toFloat(toInt(cubeScreenPosition.x) - rl.MeasureText("Enemy: 100/100", 20)) / 2.0), + toInt(cubeScreenPosition.y), + 20, + rl.BLACK, + ); + + rl.DrawText( + rl.TextFormat( + "Cube position in screen space coordinates: [%i, %i]", + toInt(cubeScreenPosition.x), + toInt(cubeScreenPosition.y), + ), + 10, + 10, + 20, + rl.LIME, + ); + + rl.DrawText("Text 2d should be always on top of the cube", 10, 40, 20, rl.GRAY); + + rl.EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl.CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/projects/zig_raylib_examples/core/notes.txt b/projects/zig_raylib_examples/core/notes.txt new file mode 100644 index 0000000..e67bcde --- /dev/null +++ b/projects/zig_raylib_examples/core/notes.txt @@ -0,0 +1,7 @@ +core_basic_window_web, not implemented yet. Depends on emscripten. + +core_custom_frame_control is broken? C source .EXE crashes and zig port have terrible response on input keys. + +core_random_sequence, this one is easier to remake using Zig objects, like ArrayList. + +core_storage_values, same thing, easier to user Writer/Printer to work with files. diff --git a/projects/zig_raylib_examples/core/resources/LICENSE.md b/projects/zig_raylib_examples/core/resources/LICENSE.md new file mode 100644 index 0000000..d7d797a --- /dev/null +++ b/projects/zig_raylib_examples/core/resources/LICENSE.md @@ -0,0 +1,4 @@ +| resource | author | licence | notes | +| :------------ | :---------: | :------ | :---- | +| ps3.png | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | - | +| xbox.png | [@raysan5](https://github.com/raysan5) | [CC0](https://creativecommons.org/publicdomain/zero/1.0/) | - | diff --git a/projects/zig_raylib_examples/core/resources/distortion100.fs b/projects/zig_raylib_examples/core/resources/distortion100.fs new file mode 100644 index 0000000..f72c689 --- /dev/null +++ b/projects/zig_raylib_examples/core/resources/distortion100.fs @@ -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); + } +} diff --git a/projects/zig_raylib_examples/core/resources/distortion330.fs b/projects/zig_raylib_examples/core/resources/distortion330.fs new file mode 100644 index 0000000..97044c4 --- /dev/null +++ b/projects/zig_raylib_examples/core/resources/distortion330.fs @@ -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); + } +} diff --git a/projects/zig_raylib_examples/core/resources/ps3.png b/projects/zig_raylib_examples/core/resources/ps3.png new file mode 100644 index 0000000000000000000000000000000000000000..59c0b35c8f016eb82b5da4e705a75c256931be2a GIT binary patch literal 19280 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 literal 0 HcmV?d00001 diff --git a/projects/zig_raylib_examples/core/resources/xbox.png b/projects/zig_raylib_examples/core/resources/xbox.png new file mode 100644 index 0000000000000000000000000000000000000000..1a57058953cf313e6bfe3c6fa6195a4cc93f45c9 GIT binary patch literal 16112 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 literal 0 HcmV?d00001 diff --git a/projects/zig_raylib_examples/lib/raylib/include/raylib.h b/projects/zig_raylib_examples/lib/raylib/include/raylib.h new file mode 100644 index 0000000..4510912 --- /dev/null +++ b/projects/zig_raylib_examples/lib/raylib/include/raylib.h @@ -0,0 +1,1713 @@ +/********************************************************************************************** +* +* raylib v5.6-dev - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com) +* +* FEATURES: +* - NO external dependencies, all required libraries included with raylib +* - Multiplatform: Windows, Linux, FreeBSD, OpenBSD, NetBSD, DragonFly, +* MacOS, Haiku, Android, Raspberry Pi, DRM native, HTML5. +* - Written in plain C code (C99) in PascalCase/camelCase notation +* - Hardware accelerated with OpenGL (1.1, 2.1, 3.3, 4.3, ES2, ES3 - choose at compile) +* - Unique OpenGL abstraction layer (usable as standalone module): [rlgl] +* - Multiple Fonts formats supported (TTF, OTF, FNT, BDF, Sprite fonts) +* - Outstanding texture formats support, including compressed formats (DXT, ETC, ASTC) +* - Full 3d support for 3d Shapes, Models, Billboards, Heightmaps and more! +* - Flexible Materials system, supporting classic maps and PBR maps +* - Animated 3D models supported (skeletal bones animation) (IQM, M3D, GLTF) +* - Shaders support, including Model shaders and Postprocessing shaders +* - Powerful math module for Vector, Matrix and Quaternion operations: [raymath] +* - Audio loading and playing with streaming support (WAV, OGG, MP3, FLAC, QOA, XM, MOD) +* - VR stereo rendering with configurable HMD device parameters +* - Bindings to multiple programming languages available! +* +* NOTES: +* - One default Font is loaded on InitWindow()->LoadFontDefault() [core, text] +* - One default Texture2D is loaded on rlglInit(), 1x1 white pixel R8G8B8A8 [rlgl] (OpenGL 3.3 or ES2) +* - One default Shader is loaded on rlglInit()->rlLoadShaderDefault() [rlgl] (OpenGL 3.3 or ES2) +* - One default RenderBatch is loaded on rlglInit()->rlLoadRenderBatch() [rlgl] (OpenGL 3.3 or ES2) +* +* DEPENDENCIES (included): +* [rcore][GLFW] rglfw (Camilla Löwy - github.com/glfw/glfw) for window/context management and input +* [rcore][RGFW] rgfw (ColleagueRiley - github.com/ColleagueRiley/RGFW) for window/context management and input +* [rlgl] glad/glad_gles2 (David Herberth - github.com/Dav1dde/glad) for OpenGL 3.3 extensions loading +* [raudio] miniaudio (David Reid - github.com/mackron/miniaudio) for audio device/context management +* +* OPTIONAL DEPENDENCIES (included): +* [rcore] msf_gif (Miles Fogle) for GIF recording +* [rcore] sinfl (Micha Mettke) for DEFLATE decompression algorithm +* [rcore] sdefl (Micha Mettke) for DEFLATE compression algorithm +* [rcore] rprand (Ramon Snatamaria) for pseudo-random numbers generation +* [rtextures] qoi (Dominic Szablewski - https://phoboslab.org) for QOI image manage +* [rtextures] stb_image (Sean Barret) for images loading (BMP, TGA, PNG, JPEG, HDR...) +* [rtextures] stb_image_write (Sean Barret) for image writing (BMP, TGA, PNG, JPG) +* [rtextures] stb_image_resize2 (Sean Barret) for image resizing algorithms +* [rtextures] stb_perlin (Sean Barret) for Perlin Noise image generation +* [rtext] stb_truetype (Sean Barret) for ttf fonts loading +* [rtext] stb_rect_pack (Sean Barret) for rectangles packing +* [rmodels] par_shapes (Philip Rideout) for parametric 3d shapes generation +* [rmodels] tinyobj_loader_c (Syoyo Fujita) for models loading (OBJ, MTL) +* [rmodels] cgltf (Johannes Kuhlmann) for models loading (glTF) +* [rmodels] m3d (bzt) for models loading (M3D, https://bztsrc.gitlab.io/model3d) +* [rmodels] vox_loader (Johann Nadalutti) for models loading (VOX) +* [raudio] dr_wav (David Reid) for WAV audio file loading +* [raudio] dr_flac (David Reid) for FLAC audio file loading +* [raudio] dr_mp3 (David Reid) for MP3 audio file loading +* [raudio] stb_vorbis (Sean Barret) for OGG audio loading +* [raudio] jar_xm (Joshua Reisenauer) for XM audio module loading +* [raudio] jar_mod (Joshua Reisenauer) for MOD audio module loading +* [raudio] qoa (Dominic Szablewski - https://phoboslab.org) for QOA audio manage +* +* +* LICENSE: zlib/libpng +* +* raylib is 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) 2013-2025 Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RAYLIB_H +#define RAYLIB_H + +#include // Required for: va_list - Only used by TraceLogCallback + +#define RAYLIB_VERSION_MAJOR 5 +#define RAYLIB_VERSION_MINOR 6 +#define RAYLIB_VERSION_PATCH 0 +#define RAYLIB_VERSION "5.6-dev" + +// Function specifiers in case library is build/used as a shared library +// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll +// NOTE: visibility("default") attribute makes symbols "visible" when compiled with -fvisibility=hidden +#if defined(_WIN32) + #if defined(__TINYC__) + #define __declspec(x) __attribute__((x)) + #endif + #if defined(BUILD_LIBTYPE_SHARED) + #define RLAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) + #elif defined(USE_LIBTYPE_SHARED) + #define RLAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) + #endif +#else + #if defined(BUILD_LIBTYPE_SHARED) + #define RLAPI __attribute__((visibility("default"))) // We are building as a Unix shared library (.so/.dylib) + #endif +#endif + +#ifndef RLAPI + #define RLAPI // Functions defined as 'extern' by default (implicit specifiers) +#endif + +//---------------------------------------------------------------------------------- +// Some basic Defines +//---------------------------------------------------------------------------------- +#ifndef PI + #define PI 3.14159265358979323846f +#endif +#ifndef DEG2RAD + #define DEG2RAD (PI/180.0f) +#endif +#ifndef RAD2DEG + #define RAD2DEG (180.0f/PI) +#endif + +// Allow custom memory allocators +// NOTE: Require recompiling raylib sources +#ifndef RL_MALLOC + #define RL_MALLOC(sz) malloc(sz) +#endif +#ifndef RL_CALLOC + #define RL_CALLOC(n,sz) calloc(n,sz) +#endif +#ifndef RL_REALLOC + #define RL_REALLOC(ptr,sz) realloc(ptr,sz) +#endif +#ifndef RL_FREE + #define RL_FREE(ptr) free(ptr) +#endif + +// NOTE: MSVC C++ compiler does not support compound literals (C99 feature) +// Plain structures in C++ (without constructors) can be initialized with { } +// This is called aggregate initialization (C++11 feature) +#if defined(__cplusplus) + #define CLITERAL(type) type +#else + #define CLITERAL(type) (type) +#endif + +// Some compilers (mostly macos clang) default to C++98, +// where aggregate initialization can't be used +// So, give a more clear error stating how to fix this +#if !defined(_MSC_VER) && (defined(__cplusplus) && __cplusplus < 201103L) + #error "C++11 or later is required. Add -std=c++11" +#endif + +// NOTE: We set some defines with some data types declared by raylib +// Other modules (raymath, rlgl) also require some of those types, so, +// to be able to use those other modules as standalone (not depending on raylib) +// this defines are very useful for internal check and avoid type (re)definitions +#define RL_COLOR_TYPE +#define RL_RECTANGLE_TYPE +#define RL_VECTOR2_TYPE +#define RL_VECTOR3_TYPE +#define RL_VECTOR4_TYPE +#define RL_QUATERNION_TYPE +#define RL_MATRIX_TYPE + +// Some Basic Colors +// NOTE: Custom raylib color palette for amazing visuals on WHITE background +#define LIGHTGRAY CLITERAL(Color){ 200, 200, 200, 255 } // Light Gray +#define GRAY CLITERAL(Color){ 130, 130, 130, 255 } // Gray +#define DARKGRAY CLITERAL(Color){ 80, 80, 80, 255 } // Dark Gray +#define YELLOW CLITERAL(Color){ 253, 249, 0, 255 } // Yellow +#define GOLD CLITERAL(Color){ 255, 203, 0, 255 } // Gold +#define ORANGE CLITERAL(Color){ 255, 161, 0, 255 } // Orange +#define PINK CLITERAL(Color){ 255, 109, 194, 255 } // Pink +#define RED CLITERAL(Color){ 230, 41, 55, 255 } // Red +#define MAROON CLITERAL(Color){ 190, 33, 55, 255 } // Maroon +#define GREEN CLITERAL(Color){ 0, 228, 48, 255 } // Green +#define LIME CLITERAL(Color){ 0, 158, 47, 255 } // Lime +#define DARKGREEN CLITERAL(Color){ 0, 117, 44, 255 } // Dark Green +#define SKYBLUE CLITERAL(Color){ 102, 191, 255, 255 } // Sky Blue +#define BLUE CLITERAL(Color){ 0, 121, 241, 255 } // Blue +#define DARKBLUE CLITERAL(Color){ 0, 82, 172, 255 } // Dark Blue +#define PURPLE CLITERAL(Color){ 200, 122, 255, 255 } // Purple +#define VIOLET CLITERAL(Color){ 135, 60, 190, 255 } // Violet +#define DARKPURPLE CLITERAL(Color){ 112, 31, 126, 255 } // Dark Purple +#define BEIGE CLITERAL(Color){ 211, 176, 131, 255 } // Beige +#define BROWN CLITERAL(Color){ 127, 106, 79, 255 } // Brown +#define DARKBROWN CLITERAL(Color){ 76, 63, 47, 255 } // Dark Brown + +#define WHITE CLITERAL(Color){ 255, 255, 255, 255 } // White +#define BLACK CLITERAL(Color){ 0, 0, 0, 255 } // Black +#define BLANK CLITERAL(Color){ 0, 0, 0, 0 } // Blank (Transparent) +#define MAGENTA CLITERAL(Color){ 255, 0, 255, 255 } // Magenta +#define RAYWHITE CLITERAL(Color){ 245, 245, 245, 255 } // My own White (raylib logo) + +//---------------------------------------------------------------------------------- +// Structures Definition +//---------------------------------------------------------------------------------- +// Boolean type +#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) || (defined(_MSC_VER) && _MSC_VER >= 1800) + #include +#elif !defined(__cplusplus) && !defined(bool) + typedef enum bool { false = 0, true = !false } bool; + #define RL_BOOL_TYPE +#endif + +// Vector2, 2 components +typedef struct Vector2 { + float x; // Vector x component + float y; // Vector y component +} Vector2; + +// Vector3, 3 components +typedef struct Vector3 { + float x; // Vector x component + float y; // Vector y component + float z; // Vector z component +} Vector3; + +// Vector4, 4 components +typedef struct Vector4 { + float x; // Vector x component + float y; // Vector y component + float z; // Vector z component + float w; // Vector w component +} Vector4; + +// Quaternion, 4 components (Vector4 alias) +typedef Vector4 Quaternion; + +// Matrix, 4x4 components, column major, OpenGL style, right-handed +typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) +} Matrix; + +// Color, 4 components, R8G8B8A8 (32bit) +typedef struct Color { + unsigned char r; // Color red value + unsigned char g; // Color green value + unsigned char b; // Color blue value + unsigned char a; // Color alpha value +} Color; + +// Rectangle, 4 components +typedef struct Rectangle { + float x; // Rectangle top-left corner position x + float y; // Rectangle top-left corner position y + float width; // Rectangle width + float height; // Rectangle height +} Rectangle; + +// Image, pixel data stored in CPU memory (RAM) +typedef struct Image { + void *data; // Image raw data + int width; // Image base width + int height; // Image base height + int mipmaps; // Mipmap levels, 1 by default + int format; // Data format (PixelFormat type) +} Image; + +// Texture, tex data stored in GPU memory (VRAM) +typedef struct Texture { + unsigned int id; // OpenGL texture id + int width; // Texture base width + int height; // Texture base height + int mipmaps; // Mipmap levels, 1 by default + int format; // Data format (PixelFormat type) +} Texture; + +// Texture2D, same as Texture +typedef Texture Texture2D; + +// TextureCubemap, same as Texture +typedef Texture TextureCubemap; + +// RenderTexture, fbo for texture rendering +typedef struct RenderTexture { + unsigned int id; // OpenGL framebuffer object id + Texture texture; // Color buffer attachment texture + Texture depth; // Depth buffer attachment texture +} RenderTexture; + +// RenderTexture2D, same as RenderTexture +typedef RenderTexture RenderTexture2D; + +// NPatchInfo, n-patch layout info +typedef struct NPatchInfo { + Rectangle source; // Texture source rectangle + int left; // Left border offset + int top; // Top border offset + int right; // Right border offset + int bottom; // Bottom border offset + int layout; // Layout of the n-patch: 3x3, 1x3 or 3x1 +} NPatchInfo; + +// GlyphInfo, font characters glyphs info +typedef struct GlyphInfo { + int value; // Character value (Unicode) + int offsetX; // Character offset X when drawing + int offsetY; // Character offset Y when drawing + int advanceX; // Character advance position X + Image image; // Character image data +} GlyphInfo; + +// Font, font texture and GlyphInfo array data +typedef struct Font { + int baseSize; // Base size (default chars height) + int glyphCount; // Number of glyph characters + int glyphPadding; // Padding around the glyph characters + Texture2D texture; // Texture atlas containing the glyphs + Rectangle *recs; // Rectangles in texture for the glyphs + GlyphInfo *glyphs; // Glyphs info data +} Font; + +// Camera, defines position/orientation in 3d space +typedef struct Camera3D { + Vector3 position; // Camera position + Vector3 target; // Camera target it looks-at + Vector3 up; // Camera up vector (rotation over its axis) + float fovy; // Camera field-of-view aperture in Y (degrees) in perspective, used as near plane width in orthographic + int projection; // Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC +} Camera3D; + +typedef Camera3D Camera; // Camera type fallback, defaults to Camera3D + +// Camera2D, defines position/orientation in 2d space +typedef struct Camera2D { + Vector2 offset; // Camera offset (displacement from target) + Vector2 target; // Camera target (rotation and zoom origin) + float rotation; // Camera rotation in degrees + float zoom; // Camera zoom (scaling), should be 1.0f by default +} Camera2D; + +// Mesh, vertex data and vao/vbo +typedef struct Mesh { + int vertexCount; // Number of vertices stored in arrays + int triangleCount; // Number of triangles stored (indexed or not) + + // Vertex attributes data + float *vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) + float *texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) + float *texcoords2; // Vertex texture second coordinates (UV - 2 components per vertex) (shader-location = 5) + float *normals; // Vertex normals (XYZ - 3 components per vertex) (shader-location = 2) + float *tangents; // Vertex tangents (XYZW - 4 components per vertex) (shader-location = 4) + unsigned char *colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) + unsigned short *indices; // Vertex indices (in case vertex data comes indexed) + + // Animation vertex data + float *animVertices; // Animated vertex positions (after bones transformations) + float *animNormals; // Animated normals (after bones transformations) + unsigned char *boneIds; // Vertex bone ids, max 255 bone ids, up to 4 bones influence by vertex (skinning) (shader-location = 6) + float *boneWeights; // Vertex bone weight, up to 4 bones influence by vertex (skinning) (shader-location = 7) + Matrix *boneMatrices; // Bones animated transformation matrices + int boneCount; // Number of bones + + // OpenGL identifiers + unsigned int vaoId; // OpenGL Vertex Array Object id + unsigned int *vboId; // OpenGL Vertex Buffer Objects id (default vertex data) +} Mesh; + +// Shader +typedef struct Shader { + unsigned int id; // Shader program id + int *locs; // Shader locations array (RL_MAX_SHADER_LOCATIONS) +} Shader; + +// MaterialMap +typedef struct MaterialMap { + Texture2D texture; // Material map texture + Color color; // Material map color + float value; // Material map value +} MaterialMap; + +// Material, includes shader and maps +typedef struct Material { + Shader shader; // Material shader + MaterialMap *maps; // Material maps array (MAX_MATERIAL_MAPS) + float params[4]; // Material generic parameters (if required) +} Material; + +// Transform, vertex transformation data +typedef struct Transform { + Vector3 translation; // Translation + Quaternion rotation; // Rotation + Vector3 scale; // Scale +} Transform; + +// Bone, skeletal animation bone +typedef struct BoneInfo { + char name[32]; // Bone name + int parent; // Bone parent +} BoneInfo; + +// Model, meshes, materials and animation data +typedef struct Model { + Matrix transform; // Local transform matrix + + int meshCount; // Number of meshes + int materialCount; // Number of materials + Mesh *meshes; // Meshes array + Material *materials; // Materials array + int *meshMaterial; // Mesh material number + + // Animation data + int boneCount; // Number of bones + BoneInfo *bones; // Bones information (skeleton) + Transform *bindPose; // Bones base transformation (pose) +} Model; + +// ModelAnimation +typedef struct ModelAnimation { + int boneCount; // Number of bones + int frameCount; // Number of animation frames + BoneInfo *bones; // Bones information (skeleton) + Transform **framePoses; // Poses array by frame + char name[32]; // Animation name +} ModelAnimation; + +// Ray, ray for raycasting +typedef struct Ray { + Vector3 position; // Ray position (origin) + Vector3 direction; // Ray direction (normalized) +} Ray; + +// RayCollision, ray hit information +typedef struct RayCollision { + bool hit; // Did the ray hit something? + float distance; // Distance to the nearest hit + Vector3 point; // Point of the nearest hit + Vector3 normal; // Surface normal of hit +} RayCollision; + +// BoundingBox +typedef struct BoundingBox { + Vector3 min; // Minimum vertex box-corner + Vector3 max; // Maximum vertex box-corner +} BoundingBox; + +// Wave, audio wave data +typedef struct Wave { + unsigned int frameCount; // Total number of frames (considering channels) + unsigned int sampleRate; // Frequency (samples per second) + unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + unsigned int channels; // Number of channels (1-mono, 2-stereo, ...) + void *data; // Buffer data pointer +} Wave; + +// Opaque structs declaration +// NOTE: Actual structs are defined internally in raudio module +typedef struct rAudioBuffer rAudioBuffer; +typedef struct rAudioProcessor rAudioProcessor; + +// AudioStream, custom audio stream +typedef struct AudioStream { + rAudioBuffer *buffer; // Pointer to internal data used by the audio system + rAudioProcessor *processor; // Pointer to internal data processor, useful for audio effects + + unsigned int sampleRate; // Frequency (samples per second) + unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + unsigned int channels; // Number of channels (1-mono, 2-stereo, ...) +} AudioStream; + +// Sound +typedef struct Sound { + AudioStream stream; // Audio stream + unsigned int frameCount; // Total number of frames (considering channels) +} Sound; + +// Music, audio stream, anything longer than ~10 seconds should be streamed +typedef struct Music { + AudioStream stream; // Audio stream + unsigned int frameCount; // Total number of frames (considering channels) + bool looping; // Music looping enable + + int ctxType; // Type of music context (audio filetype) + void *ctxData; // Audio context data, depends on type +} Music; + +// VrDeviceInfo, Head-Mounted-Display device parameters +typedef struct VrDeviceInfo { + int hResolution; // Horizontal resolution in pixels + int vResolution; // Vertical resolution in pixels + float hScreenSize; // Horizontal size in meters + float vScreenSize; // Vertical size in meters + float eyeToScreenDistance; // Distance between eye and display in meters + float lensSeparationDistance; // Lens separation distance in meters + float interpupillaryDistance; // IPD (distance between pupils) in meters + float lensDistortionValues[4]; // Lens distortion constant parameters + float chromaAbCorrection[4]; // Chromatic aberration correction parameters +} VrDeviceInfo; + +// VrStereoConfig, VR stereo rendering configuration for simulator +typedef struct VrStereoConfig { + Matrix projection[2]; // VR projection matrices (per eye) + Matrix viewOffset[2]; // VR view offset matrices (per eye) + float leftLensCenter[2]; // VR left lens center + float rightLensCenter[2]; // VR right lens center + float leftScreenCenter[2]; // VR left screen center + float rightScreenCenter[2]; // VR right screen center + float scale[2]; // VR distortion scale + float scaleIn[2]; // VR distortion scale in +} VrStereoConfig; + +// File path list +typedef struct FilePathList { + unsigned int capacity; // Filepaths max entries + unsigned int count; // Filepaths entries count + char **paths; // Filepaths entries +} FilePathList; + +// Automation event +typedef struct AutomationEvent { + unsigned int frame; // Event frame + unsigned int type; // Event type (AutomationEventType) + int params[4]; // Event parameters (if required) +} AutomationEvent; + +// Automation event list +typedef struct AutomationEventList { + unsigned int capacity; // Events max entries (MAX_AUTOMATION_EVENTS) + unsigned int count; // Events entries count + AutomationEvent *events; // Events entries +} AutomationEventList; + +//---------------------------------------------------------------------------------- +// Enumerators Definition +//---------------------------------------------------------------------------------- +// System/Window config flags +// NOTE: Every bit registers one state (use it with bit masks) +// By default all flags are set to 0 +typedef enum { + FLAG_VSYNC_HINT = 0x00000040, // Set to try enabling V-Sync on GPU + FLAG_FULLSCREEN_MODE = 0x00000002, // Set to run program in fullscreen + FLAG_WINDOW_RESIZABLE = 0x00000004, // Set to allow resizable window + FLAG_WINDOW_UNDECORATED = 0x00000008, // Set to disable window decoration (frame and buttons) + FLAG_WINDOW_HIDDEN = 0x00000080, // Set to hide window + FLAG_WINDOW_MINIMIZED = 0x00000200, // Set to minimize window (iconify) + FLAG_WINDOW_MAXIMIZED = 0x00000400, // Set to maximize window (expanded to monitor) + FLAG_WINDOW_UNFOCUSED = 0x00000800, // Set to window non focused + FLAG_WINDOW_TOPMOST = 0x00001000, // Set to window always on top + FLAG_WINDOW_ALWAYS_RUN = 0x00000100, // Set to allow windows running while minimized + FLAG_WINDOW_TRANSPARENT = 0x00000010, // Set to allow transparent framebuffer + FLAG_WINDOW_HIGHDPI = 0x00002000, // Set to support HighDPI + FLAG_WINDOW_MOUSE_PASSTHROUGH = 0x00004000, // Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED + FLAG_BORDERLESS_WINDOWED_MODE = 0x00008000, // Set to run program in borderless windowed mode + FLAG_MSAA_4X_HINT = 0x00000020, // Set to try enabling MSAA 4X + FLAG_INTERLACED_HINT = 0x00010000 // Set to try enabling interlaced video format (for V3D) +} ConfigFlags; + +// Trace log level +// NOTE: Organized by priority level +typedef enum { + LOG_ALL = 0, // Display all logs + LOG_TRACE, // Trace logging, intended for internal use only + LOG_DEBUG, // Debug logging, used for internal debugging, it should be disabled on release builds + LOG_INFO, // Info logging, used for program execution info + LOG_WARNING, // Warning logging, used on recoverable failures + LOG_ERROR, // Error logging, used on unrecoverable failures + LOG_FATAL, // Fatal logging, used to abort program: exit(EXIT_FAILURE) + LOG_NONE // Disable logging +} TraceLogLevel; + +// Keyboard keys (US keyboard layout) +// NOTE: Use GetKeyPressed() to allow redefining +// required keys for alternative layouts +typedef enum { + KEY_NULL = 0, // Key: NULL, used for no key pressed + // Alphanumeric keys + KEY_APOSTROPHE = 39, // Key: ' + KEY_COMMA = 44, // Key: , + KEY_MINUS = 45, // Key: - + KEY_PERIOD = 46, // Key: . + KEY_SLASH = 47, // Key: / + KEY_ZERO = 48, // Key: 0 + KEY_ONE = 49, // Key: 1 + KEY_TWO = 50, // Key: 2 + KEY_THREE = 51, // Key: 3 + KEY_FOUR = 52, // Key: 4 + KEY_FIVE = 53, // Key: 5 + KEY_SIX = 54, // Key: 6 + KEY_SEVEN = 55, // Key: 7 + KEY_EIGHT = 56, // Key: 8 + KEY_NINE = 57, // Key: 9 + KEY_SEMICOLON = 59, // Key: ; + KEY_EQUAL = 61, // Key: = + KEY_A = 65, // Key: A | a + KEY_B = 66, // Key: B | b + KEY_C = 67, // Key: C | c + KEY_D = 68, // Key: D | d + KEY_E = 69, // Key: E | e + KEY_F = 70, // Key: F | f + KEY_G = 71, // Key: G | g + KEY_H = 72, // Key: H | h + KEY_I = 73, // Key: I | i + KEY_J = 74, // Key: J | j + KEY_K = 75, // Key: K | k + KEY_L = 76, // Key: L | l + KEY_M = 77, // Key: M | m + KEY_N = 78, // Key: N | n + KEY_O = 79, // Key: O | o + KEY_P = 80, // Key: P | p + KEY_Q = 81, // Key: Q | q + KEY_R = 82, // Key: R | r + KEY_S = 83, // Key: S | s + KEY_T = 84, // Key: T | t + KEY_U = 85, // Key: U | u + KEY_V = 86, // Key: V | v + KEY_W = 87, // Key: W | w + KEY_X = 88, // Key: X | x + KEY_Y = 89, // Key: Y | y + KEY_Z = 90, // Key: Z | z + KEY_LEFT_BRACKET = 91, // Key: [ + KEY_BACKSLASH = 92, // Key: '\' + KEY_RIGHT_BRACKET = 93, // Key: ] + KEY_GRAVE = 96, // Key: ` + // Function keys + KEY_SPACE = 32, // Key: Space + KEY_ESCAPE = 256, // Key: Esc + KEY_ENTER = 257, // Key: Enter + KEY_TAB = 258, // Key: Tab + KEY_BACKSPACE = 259, // Key: Backspace + KEY_INSERT = 260, // Key: Ins + KEY_DELETE = 261, // Key: Del + KEY_RIGHT = 262, // Key: Cursor right + KEY_LEFT = 263, // Key: Cursor left + KEY_DOWN = 264, // Key: Cursor down + KEY_UP = 265, // Key: Cursor up + KEY_PAGE_UP = 266, // Key: Page up + KEY_PAGE_DOWN = 267, // Key: Page down + KEY_HOME = 268, // Key: Home + KEY_END = 269, // Key: End + KEY_CAPS_LOCK = 280, // Key: Caps lock + KEY_SCROLL_LOCK = 281, // Key: Scroll down + KEY_NUM_LOCK = 282, // Key: Num lock + KEY_PRINT_SCREEN = 283, // Key: Print screen + KEY_PAUSE = 284, // Key: Pause + KEY_F1 = 290, // Key: F1 + KEY_F2 = 291, // Key: F2 + KEY_F3 = 292, // Key: F3 + KEY_F4 = 293, // Key: F4 + KEY_F5 = 294, // Key: F5 + KEY_F6 = 295, // Key: F6 + KEY_F7 = 296, // Key: F7 + KEY_F8 = 297, // Key: F8 + KEY_F9 = 298, // Key: F9 + KEY_F10 = 299, // Key: F10 + KEY_F11 = 300, // Key: F11 + KEY_F12 = 301, // Key: F12 + KEY_LEFT_SHIFT = 340, // Key: Shift left + KEY_LEFT_CONTROL = 341, // Key: Control left + KEY_LEFT_ALT = 342, // Key: Alt left + KEY_LEFT_SUPER = 343, // Key: Super left + KEY_RIGHT_SHIFT = 344, // Key: Shift right + KEY_RIGHT_CONTROL = 345, // Key: Control right + KEY_RIGHT_ALT = 346, // Key: Alt right + KEY_RIGHT_SUPER = 347, // Key: Super right + KEY_KB_MENU = 348, // Key: KB menu + // Keypad keys + KEY_KP_0 = 320, // Key: Keypad 0 + KEY_KP_1 = 321, // Key: Keypad 1 + KEY_KP_2 = 322, // Key: Keypad 2 + KEY_KP_3 = 323, // Key: Keypad 3 + KEY_KP_4 = 324, // Key: Keypad 4 + KEY_KP_5 = 325, // Key: Keypad 5 + KEY_KP_6 = 326, // Key: Keypad 6 + KEY_KP_7 = 327, // Key: Keypad 7 + KEY_KP_8 = 328, // Key: Keypad 8 + KEY_KP_9 = 329, // Key: Keypad 9 + KEY_KP_DECIMAL = 330, // Key: Keypad . + KEY_KP_DIVIDE = 331, // Key: Keypad / + KEY_KP_MULTIPLY = 332, // Key: Keypad * + KEY_KP_SUBTRACT = 333, // Key: Keypad - + KEY_KP_ADD = 334, // Key: Keypad + + KEY_KP_ENTER = 335, // Key: Keypad Enter + KEY_KP_EQUAL = 336, // Key: Keypad = + // Android key buttons + KEY_BACK = 4, // Key: Android back button + KEY_MENU = 5, // Key: Android menu button + KEY_VOLUME_UP = 24, // Key: Android volume up button + KEY_VOLUME_DOWN = 25 // Key: Android volume down button +} KeyboardKey; + +// Add backwards compatibility support for deprecated names +#define MOUSE_LEFT_BUTTON MOUSE_BUTTON_LEFT +#define MOUSE_RIGHT_BUTTON MOUSE_BUTTON_RIGHT +#define MOUSE_MIDDLE_BUTTON MOUSE_BUTTON_MIDDLE + +// Mouse buttons +typedef enum { + MOUSE_BUTTON_LEFT = 0, // Mouse button left + MOUSE_BUTTON_RIGHT = 1, // Mouse button right + MOUSE_BUTTON_MIDDLE = 2, // Mouse button middle (pressed wheel) + MOUSE_BUTTON_SIDE = 3, // Mouse button side (advanced mouse device) + MOUSE_BUTTON_EXTRA = 4, // Mouse button extra (advanced mouse device) + MOUSE_BUTTON_FORWARD = 5, // Mouse button forward (advanced mouse device) + MOUSE_BUTTON_BACK = 6, // Mouse button back (advanced mouse device) +} MouseButton; + +// Mouse cursor +typedef enum { + MOUSE_CURSOR_DEFAULT = 0, // Default pointer shape + MOUSE_CURSOR_ARROW = 1, // Arrow shape + MOUSE_CURSOR_IBEAM = 2, // Text writing cursor shape + MOUSE_CURSOR_CROSSHAIR = 3, // Cross shape + MOUSE_CURSOR_POINTING_HAND = 4, // Pointing hand cursor + MOUSE_CURSOR_RESIZE_EW = 5, // Horizontal resize/move arrow shape + MOUSE_CURSOR_RESIZE_NS = 6, // Vertical resize/move arrow shape + MOUSE_CURSOR_RESIZE_NWSE = 7, // Top-left to bottom-right diagonal resize/move arrow shape + MOUSE_CURSOR_RESIZE_NESW = 8, // The top-right to bottom-left diagonal resize/move arrow shape + MOUSE_CURSOR_RESIZE_ALL = 9, // The omnidirectional resize/move cursor shape + MOUSE_CURSOR_NOT_ALLOWED = 10 // The operation-not-allowed shape +} MouseCursor; + +// Gamepad buttons +typedef enum { + GAMEPAD_BUTTON_UNKNOWN = 0, // Unknown button, just for error checking + GAMEPAD_BUTTON_LEFT_FACE_UP, // Gamepad left DPAD up button + GAMEPAD_BUTTON_LEFT_FACE_RIGHT, // Gamepad left DPAD right button + GAMEPAD_BUTTON_LEFT_FACE_DOWN, // Gamepad left DPAD down button + GAMEPAD_BUTTON_LEFT_FACE_LEFT, // Gamepad left DPAD left button + GAMEPAD_BUTTON_RIGHT_FACE_UP, // Gamepad right button up (i.e. PS3: Triangle, Xbox: Y) + GAMEPAD_BUTTON_RIGHT_FACE_RIGHT, // Gamepad right button right (i.e. PS3: Circle, Xbox: B) + GAMEPAD_BUTTON_RIGHT_FACE_DOWN, // Gamepad right button down (i.e. PS3: Cross, Xbox: A) + GAMEPAD_BUTTON_RIGHT_FACE_LEFT, // Gamepad right button left (i.e. PS3: Square, Xbox: X) + GAMEPAD_BUTTON_LEFT_TRIGGER_1, // Gamepad top/back trigger left (first), it could be a trailing button + GAMEPAD_BUTTON_LEFT_TRIGGER_2, // Gamepad top/back trigger left (second), it could be a trailing button + GAMEPAD_BUTTON_RIGHT_TRIGGER_1, // Gamepad top/back trigger right (first), it could be a trailing button + GAMEPAD_BUTTON_RIGHT_TRIGGER_2, // Gamepad top/back trigger right (second), it could be a trailing button + GAMEPAD_BUTTON_MIDDLE_LEFT, // Gamepad center buttons, left one (i.e. PS3: Select) + GAMEPAD_BUTTON_MIDDLE, // Gamepad center buttons, middle one (i.e. PS3: PS, Xbox: XBOX) + GAMEPAD_BUTTON_MIDDLE_RIGHT, // Gamepad center buttons, right one (i.e. PS3: Start) + GAMEPAD_BUTTON_LEFT_THUMB, // Gamepad joystick pressed button left + GAMEPAD_BUTTON_RIGHT_THUMB // Gamepad joystick pressed button right +} GamepadButton; + +// Gamepad axis +typedef enum { + GAMEPAD_AXIS_LEFT_X = 0, // Gamepad left stick X axis + GAMEPAD_AXIS_LEFT_Y = 1, // Gamepad left stick Y axis + GAMEPAD_AXIS_RIGHT_X = 2, // Gamepad right stick X axis + GAMEPAD_AXIS_RIGHT_Y = 3, // Gamepad right stick Y axis + GAMEPAD_AXIS_LEFT_TRIGGER = 4, // Gamepad back trigger left, pressure level: [1..-1] + GAMEPAD_AXIS_RIGHT_TRIGGER = 5 // Gamepad back trigger right, pressure level: [1..-1] +} GamepadAxis; + +// Material map index +typedef enum { + MATERIAL_MAP_ALBEDO = 0, // Albedo material (same as: MATERIAL_MAP_DIFFUSE) + MATERIAL_MAP_METALNESS, // Metalness material (same as: MATERIAL_MAP_SPECULAR) + MATERIAL_MAP_NORMAL, // Normal material + MATERIAL_MAP_ROUGHNESS, // Roughness material + MATERIAL_MAP_OCCLUSION, // Ambient occlusion material + MATERIAL_MAP_EMISSION, // Emission material + MATERIAL_MAP_HEIGHT, // Heightmap material + MATERIAL_MAP_CUBEMAP, // Cubemap material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_IRRADIANCE, // Irradiance material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_PREFILTER, // Prefilter material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_BRDF // Brdf material +} MaterialMapIndex; + +#define MATERIAL_MAP_DIFFUSE MATERIAL_MAP_ALBEDO +#define MATERIAL_MAP_SPECULAR MATERIAL_MAP_METALNESS + +// Shader location index +typedef enum { + SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position + SHADER_LOC_VERTEX_TEXCOORD01, // Shader location: vertex attribute: texcoord01 + SHADER_LOC_VERTEX_TEXCOORD02, // Shader location: vertex attribute: texcoord02 + SHADER_LOC_VERTEX_NORMAL, // Shader location: vertex attribute: normal + SHADER_LOC_VERTEX_TANGENT, // Shader location: vertex attribute: tangent + SHADER_LOC_VERTEX_COLOR, // Shader location: vertex attribute: color + SHADER_LOC_MATRIX_MVP, // Shader location: matrix uniform: model-view-projection + SHADER_LOC_MATRIX_VIEW, // Shader location: matrix uniform: view (camera transform) + SHADER_LOC_MATRIX_PROJECTION, // Shader location: matrix uniform: projection + SHADER_LOC_MATRIX_MODEL, // Shader location: matrix uniform: model (transform) + SHADER_LOC_MATRIX_NORMAL, // Shader location: matrix uniform: normal + SHADER_LOC_VECTOR_VIEW, // Shader location: vector uniform: view + SHADER_LOC_COLOR_DIFFUSE, // Shader location: vector uniform: diffuse color + SHADER_LOC_COLOR_SPECULAR, // Shader location: vector uniform: specular color + SHADER_LOC_COLOR_AMBIENT, // Shader location: vector uniform: ambient color + SHADER_LOC_MAP_ALBEDO, // Shader location: sampler2d texture: albedo (same as: SHADER_LOC_MAP_DIFFUSE) + SHADER_LOC_MAP_METALNESS, // Shader location: sampler2d texture: metalness (same as: SHADER_LOC_MAP_SPECULAR) + SHADER_LOC_MAP_NORMAL, // Shader location: sampler2d texture: normal + SHADER_LOC_MAP_ROUGHNESS, // Shader location: sampler2d texture: roughness + SHADER_LOC_MAP_OCCLUSION, // Shader location: sampler2d texture: occlusion + SHADER_LOC_MAP_EMISSION, // Shader location: sampler2d texture: emission + SHADER_LOC_MAP_HEIGHT, // Shader location: sampler2d texture: height + SHADER_LOC_MAP_CUBEMAP, // Shader location: samplerCube texture: cubemap + SHADER_LOC_MAP_IRRADIANCE, // Shader location: samplerCube texture: irradiance + SHADER_LOC_MAP_PREFILTER, // Shader location: samplerCube texture: prefilter + SHADER_LOC_MAP_BRDF, // Shader location: sampler2d texture: brdf + SHADER_LOC_VERTEX_BONEIDS, // Shader location: vertex attribute: boneIds + SHADER_LOC_VERTEX_BONEWEIGHTS, // Shader location: vertex attribute: boneWeights + SHADER_LOC_BONE_MATRICES, // Shader location: array of matrices uniform: boneMatrices + SHADER_LOC_VERTEX_INSTANCE_TX // Shader location: vertex attribute: instanceTransform +} ShaderLocationIndex; + +#define SHADER_LOC_MAP_DIFFUSE SHADER_LOC_MAP_ALBEDO +#define SHADER_LOC_MAP_SPECULAR SHADER_LOC_MAP_METALNESS + +// Shader uniform data type +typedef enum { + SHADER_UNIFORM_FLOAT = 0, // Shader uniform type: float + SHADER_UNIFORM_VEC2, // Shader uniform type: vec2 (2 float) + SHADER_UNIFORM_VEC3, // Shader uniform type: vec3 (3 float) + SHADER_UNIFORM_VEC4, // Shader uniform type: vec4 (4 float) + SHADER_UNIFORM_INT, // Shader uniform type: int + SHADER_UNIFORM_IVEC2, // Shader uniform type: ivec2 (2 int) + SHADER_UNIFORM_IVEC3, // Shader uniform type: ivec3 (3 int) + SHADER_UNIFORM_IVEC4, // Shader uniform type: ivec4 (4 int) + SHADER_UNIFORM_UINT, // Shader uniform type: unsigned int + SHADER_UNIFORM_UIVEC2, // Shader uniform type: uivec2 (2 unsigned int) + SHADER_UNIFORM_UIVEC3, // Shader uniform type: uivec3 (3 unsigned int) + SHADER_UNIFORM_UIVEC4, // Shader uniform type: uivec4 (4 unsigned int) + SHADER_UNIFORM_SAMPLER2D // Shader uniform type: sampler2d +} ShaderUniformDataType; + +// Shader attribute data types +typedef enum { + SHADER_ATTRIB_FLOAT = 0, // Shader attribute type: float + SHADER_ATTRIB_VEC2, // Shader attribute type: vec2 (2 float) + SHADER_ATTRIB_VEC3, // Shader attribute type: vec3 (3 float) + SHADER_ATTRIB_VEC4 // Shader attribute type: vec4 (4 float) +} ShaderAttributeDataType; + +// Pixel formats +// NOTE: Support depends on OpenGL version and platform +typedef enum { + PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha) + PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels) + PIXELFORMAT_UNCOMPRESSED_R5G6B5, // 16 bpp + PIXELFORMAT_UNCOMPRESSED_R8G8B8, // 24 bpp + PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, // 16 bpp (1 bit alpha) + PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, // 16 bpp (4 bit alpha) + PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, // 32 bpp + PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float) + PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float) + PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float) + PIXELFORMAT_UNCOMPRESSED_R16, // 16 bpp (1 channel - half float) + PIXELFORMAT_UNCOMPRESSED_R16G16B16, // 16*3 bpp (3 channels - half float) + PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, // 16*4 bpp (4 channels - half float) + PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha) + PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha) + PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_DXT5_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_ETC1_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_ETC2_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_PVRT_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_PVRT_RGBA, // 4 bpp + PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA // 2 bpp +} PixelFormat; + +// Texture parameters: filter mode +// NOTE 1: Filtering considers mipmaps if available in the texture +// NOTE 2: Filter is accordingly set for minification and magnification +typedef enum { + TEXTURE_FILTER_POINT = 0, // No filter, just pixel approximation + TEXTURE_FILTER_BILINEAR, // Linear filtering + TEXTURE_FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps) + TEXTURE_FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x + TEXTURE_FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x + TEXTURE_FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x +} TextureFilter; + +// Texture parameters: wrap mode +typedef enum { + TEXTURE_WRAP_REPEAT = 0, // Repeats texture in tiled mode + TEXTURE_WRAP_CLAMP, // Clamps texture to edge pixel in tiled mode + TEXTURE_WRAP_MIRROR_REPEAT, // Mirrors and repeats the texture in tiled mode + TEXTURE_WRAP_MIRROR_CLAMP // Mirrors and clamps to border the texture in tiled mode +} TextureWrap; + +// Cubemap layouts +typedef enum { + CUBEMAP_LAYOUT_AUTO_DETECT = 0, // Automatically detect layout type + CUBEMAP_LAYOUT_LINE_VERTICAL, // Layout is defined by a vertical line with faces + CUBEMAP_LAYOUT_LINE_HORIZONTAL, // Layout is defined by a horizontal line with faces + CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR, // Layout is defined by a 3x4 cross with cubemap faces + CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE // Layout is defined by a 4x3 cross with cubemap faces +} CubemapLayout; + +// Font type, defines generation method +typedef enum { + FONT_DEFAULT = 0, // Default font generation, anti-aliased + FONT_BITMAP, // Bitmap font generation, no anti-aliasing + FONT_SDF // SDF font generation, requires external shader +} FontType; + +// Color blending modes (pre-defined) +typedef enum { + BLEND_ALPHA = 0, // Blend textures considering alpha (default) + BLEND_ADDITIVE, // Blend textures adding colors + BLEND_MULTIPLIED, // Blend textures multiplying colors + BLEND_ADD_COLORS, // Blend textures adding colors (alternative) + BLEND_SUBTRACT_COLORS, // Blend textures subtracting colors (alternative) + BLEND_ALPHA_PREMULTIPLY, // Blend premultiplied textures considering alpha + BLEND_CUSTOM, // Blend textures using custom src/dst factors (use rlSetBlendFactors()) + BLEND_CUSTOM_SEPARATE // Blend textures using custom rgb/alpha separate src/dst factors (use rlSetBlendFactorsSeparate()) +} BlendMode; + +// Gesture +// NOTE: Provided as bit-wise flags to enable only desired gestures +typedef enum { + GESTURE_NONE = 0, // No gesture + GESTURE_TAP = 1, // Tap gesture + GESTURE_DOUBLETAP = 2, // Double tap gesture + GESTURE_HOLD = 4, // Hold gesture + GESTURE_DRAG = 8, // Drag gesture + GESTURE_SWIPE_RIGHT = 16, // Swipe right gesture + GESTURE_SWIPE_LEFT = 32, // Swipe left gesture + GESTURE_SWIPE_UP = 64, // Swipe up gesture + GESTURE_SWIPE_DOWN = 128, // Swipe down gesture + GESTURE_PINCH_IN = 256, // Pinch in gesture + GESTURE_PINCH_OUT = 512 // Pinch out gesture +} Gesture; + +// Camera system modes +typedef enum { + CAMERA_CUSTOM = 0, // Camera custom, controlled by user (UpdateCamera() does nothing) + CAMERA_FREE, // Camera free mode + CAMERA_ORBITAL, // Camera orbital, around target, zoom supported + CAMERA_FIRST_PERSON, // Camera first person + CAMERA_THIRD_PERSON // Camera third person +} CameraMode; + +// Camera projection +typedef enum { + CAMERA_PERSPECTIVE = 0, // Perspective projection + CAMERA_ORTHOGRAPHIC // Orthographic projection +} CameraProjection; + +// N-patch layout +typedef enum { + NPATCH_NINE_PATCH = 0, // Npatch layout: 3x3 tiles + NPATCH_THREE_PATCH_VERTICAL, // Npatch layout: 1x3 tiles + NPATCH_THREE_PATCH_HORIZONTAL // Npatch layout: 3x1 tiles +} NPatchLayout; + +// Callbacks to hook some internal functions +// WARNING: These callbacks are intended for advanced users +typedef void (*TraceLogCallback)(int logLevel, const char *text, va_list args); // Logging: Redirect trace log messages +typedef unsigned char *(*LoadFileDataCallback)(const char *fileName, int *dataSize); // FileIO: Load binary data +typedef bool (*SaveFileDataCallback)(const char *fileName, void *data, int dataSize); // FileIO: Save binary data +typedef char *(*LoadFileTextCallback)(const char *fileName); // FileIO: Load text data +typedef bool (*SaveFileTextCallback)(const char *fileName, char *text); // FileIO: Save text data + +//------------------------------------------------------------------------------------ +// Global Variables Definition +//------------------------------------------------------------------------------------ +// It's lonely here... + +//------------------------------------------------------------------------------------ +// Window and Graphics Device Functions (Module: core) +//------------------------------------------------------------------------------------ + +#if defined(__cplusplus) +extern "C" { // Prevents name mangling of functions +#endif + +// Window-related functions +RLAPI void InitWindow(int width, int height, const char *title); // Initialize window and OpenGL context +RLAPI void CloseWindow(void); // Close window and unload OpenGL context +RLAPI bool WindowShouldClose(void); // Check if application should close (KEY_ESCAPE pressed or windows close icon clicked) +RLAPI bool IsWindowReady(void); // Check if window has been initialized successfully +RLAPI bool IsWindowFullscreen(void); // Check if window is currently fullscreen +RLAPI bool IsWindowHidden(void); // Check if window is currently hidden +RLAPI bool IsWindowMinimized(void); // Check if window is currently minimized +RLAPI bool IsWindowMaximized(void); // Check if window is currently maximized +RLAPI bool IsWindowFocused(void); // Check if window is currently focused +RLAPI bool IsWindowResized(void); // Check if window has been resized last frame +RLAPI bool IsWindowState(unsigned int flag); // Check if one specific window flag is enabled +RLAPI void SetWindowState(unsigned int flags); // Set window configuration state using flags +RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags +RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed, resizes monitor to match window resolution +RLAPI void ToggleBorderlessWindowed(void); // Toggle window state: borderless windowed, resizes window to match monitor resolution +RLAPI void MaximizeWindow(void); // Set window state: maximized, if resizable +RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable +RLAPI void RestoreWindow(void); // Set window state: not minimized/maximized +RLAPI void SetWindowIcon(Image image); // Set icon for window (single image, RGBA 32bit) +RLAPI void SetWindowIcons(Image *images, int count); // Set icon for window (multiple images, RGBA 32bit) +RLAPI void SetWindowTitle(const char *title); // Set title for window +RLAPI void SetWindowPosition(int x, int y); // Set window position on screen +RLAPI void SetWindowMonitor(int monitor); // Set monitor for the current window +RLAPI void SetWindowMinSize(int width, int height); // Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE) +RLAPI void SetWindowMaxSize(int width, int height); // Set window maximum dimensions (for FLAG_WINDOW_RESIZABLE) +RLAPI void SetWindowSize(int width, int height); // Set window dimensions +RLAPI void SetWindowOpacity(float opacity); // Set window opacity [0.0f..1.0f] +RLAPI void SetWindowFocused(void); // Set window focused +RLAPI void *GetWindowHandle(void); // Get native window handle +RLAPI int GetScreenWidth(void); // Get current screen width +RLAPI int GetScreenHeight(void); // Get current screen height +RLAPI int GetRenderWidth(void); // Get current render width (it considers HiDPI) +RLAPI int GetRenderHeight(void); // Get current render height (it considers HiDPI) +RLAPI int GetMonitorCount(void); // Get number of connected monitors +RLAPI int GetCurrentMonitor(void); // Get current monitor where window is placed +RLAPI Vector2 GetMonitorPosition(int monitor); // Get specified monitor position +RLAPI int GetMonitorWidth(int monitor); // Get specified monitor width (current video mode used by monitor) +RLAPI int GetMonitorHeight(int monitor); // Get specified monitor height (current video mode used by monitor) +RLAPI int GetMonitorPhysicalWidth(int monitor); // Get specified monitor physical width in millimetres +RLAPI int GetMonitorPhysicalHeight(int monitor); // Get specified monitor physical height in millimetres +RLAPI int GetMonitorRefreshRate(int monitor); // Get specified monitor refresh rate +RLAPI Vector2 GetWindowPosition(void); // Get window position XY on monitor +RLAPI Vector2 GetWindowScaleDPI(void); // Get window scale DPI factor +RLAPI const char *GetMonitorName(int monitor); // Get the human-readable, UTF-8 encoded name of the specified monitor +RLAPI void SetClipboardText(const char *text); // Set clipboard text content +RLAPI const char *GetClipboardText(void); // Get clipboard text content +RLAPI Image GetClipboardImage(void); // Get clipboard image content +RLAPI void EnableEventWaiting(void); // Enable waiting for events on EndDrawing(), no automatic event polling +RLAPI void DisableEventWaiting(void); // Disable waiting for events on EndDrawing(), automatic events polling + +// Cursor-related functions +RLAPI void ShowCursor(void); // Shows cursor +RLAPI void HideCursor(void); // Hides cursor +RLAPI bool IsCursorHidden(void); // Check if cursor is not visible +RLAPI void EnableCursor(void); // Enables cursor (unlock cursor) +RLAPI void DisableCursor(void); // Disables cursor (lock cursor) +RLAPI bool IsCursorOnScreen(void); // Check if cursor is on the screen + +// Drawing-related functions +RLAPI void ClearBackground(Color color); // Set background color (framebuffer clear color) +RLAPI void BeginDrawing(void); // Setup canvas (framebuffer) to start drawing +RLAPI void EndDrawing(void); // End canvas drawing and swap buffers (double buffering) +RLAPI void BeginMode2D(Camera2D camera); // Begin 2D mode with custom camera (2D) +RLAPI void EndMode2D(void); // Ends 2D mode with custom camera +RLAPI void BeginMode3D(Camera3D camera); // Begin 3D mode with custom camera (3D) +RLAPI void EndMode3D(void); // Ends 3D mode and returns to default 2D orthographic mode +RLAPI void BeginTextureMode(RenderTexture2D target); // Begin drawing to render texture +RLAPI void EndTextureMode(void); // Ends drawing to render texture +RLAPI void BeginShaderMode(Shader shader); // Begin custom shader drawing +RLAPI void EndShaderMode(void); // End custom shader drawing (use default shader) +RLAPI void BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied, subtract, custom) +RLAPI void EndBlendMode(void); // End blending mode (reset to default: alpha blending) +RLAPI void BeginScissorMode(int x, int y, int width, int height); // Begin scissor mode (define screen area for following drawing) +RLAPI void EndScissorMode(void); // End scissor mode +RLAPI void BeginVrStereoMode(VrStereoConfig config); // Begin stereo rendering (requires VR simulator) +RLAPI void EndVrStereoMode(void); // End stereo rendering (requires VR simulator) + +// VR stereo config functions for VR simulator +RLAPI VrStereoConfig LoadVrStereoConfig(VrDeviceInfo device); // Load VR stereo config for VR simulator device parameters +RLAPI void UnloadVrStereoConfig(VrStereoConfig config); // Unload VR stereo config + +// Shader management functions +// NOTE: Shader functionality is not available on OpenGL 1.1 +RLAPI Shader LoadShader(const char *vsFileName, const char *fsFileName); // Load shader from files and bind default locations +RLAPI Shader LoadShaderFromMemory(const char *vsCode, const char *fsCode); // Load shader from code strings and bind default locations +RLAPI bool IsShaderValid(Shader shader); // Check if a shader is valid (loaded on GPU) +RLAPI int GetShaderLocation(Shader shader, const char *uniformName); // Get shader uniform location +RLAPI int GetShaderLocationAttrib(Shader shader, const char *attribName); // Get shader attribute location +RLAPI void SetShaderValue(Shader shader, int locIndex, const void *value, int uniformType); // Set shader uniform value +RLAPI void SetShaderValueV(Shader shader, int locIndex, const void *value, int uniformType, int count); // Set shader uniform value vector +RLAPI void SetShaderValueMatrix(Shader shader, int locIndex, Matrix mat); // Set shader uniform value (matrix 4x4) +RLAPI void SetShaderValueTexture(Shader shader, int locIndex, Texture2D texture); // Set shader uniform value for texture (sampler2d) +RLAPI void UnloadShader(Shader shader); // Unload shader from GPU memory (VRAM) + +// Screen-space-related functions +#define GetMouseRay GetScreenToWorldRay // Compatibility hack for previous raylib versions +RLAPI Ray GetScreenToWorldRay(Vector2 position, Camera camera); // Get a ray trace from screen position (i.e mouse) +RLAPI Ray GetScreenToWorldRayEx(Vector2 position, Camera camera, int width, int height); // Get a ray trace from screen position (i.e mouse) in a viewport +RLAPI Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Get the screen space position for a 3d world space position +RLAPI Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height); // Get size position for a 3d world space position +RLAPI Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); // Get the screen space position for a 2d camera world space position +RLAPI Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera); // Get the world space position for a 2d camera screen space position +RLAPI Matrix GetCameraMatrix(Camera camera); // Get camera transform matrix (view matrix) +RLAPI Matrix GetCameraMatrix2D(Camera2D camera); // Get camera 2d transform matrix + +// Timing-related functions +RLAPI void SetTargetFPS(int fps); // Set target FPS (maximum) +RLAPI float GetFrameTime(void); // Get time in seconds for last frame drawn (delta time) +RLAPI double GetTime(void); // Get elapsed time in seconds since InitWindow() +RLAPI int GetFPS(void); // Get current FPS + +// Custom frame control functions +// NOTE: Those functions are intended for advanced users that want full control over the frame processing +// By default EndDrawing() does this job: draws everything + SwapScreenBuffer() + manage frame timing + PollInputEvents() +// To avoid that behaviour and control frame processes manually, enable in config.h: SUPPORT_CUSTOM_FRAME_CONTROL +RLAPI void SwapScreenBuffer(void); // Swap back buffer with front buffer (screen drawing) +RLAPI void PollInputEvents(void); // Register all input events +RLAPI void WaitTime(double seconds); // Wait for some time (halt program execution) + +// Random values generation functions +RLAPI void SetRandomSeed(unsigned int seed); // Set the seed for the random number generator +RLAPI int GetRandomValue(int min, int max); // Get a random value between min and max (both included) +RLAPI int *LoadRandomSequence(unsigned int count, int min, int max); // Load random values sequence, no values repeated +RLAPI void UnloadRandomSequence(int *sequence); // Unload random values sequence + +// Misc. functions +RLAPI void TakeScreenshot(const char *fileName); // Takes a screenshot of current screen (filename extension defines format) +RLAPI void SetConfigFlags(unsigned int flags); // Setup init configuration flags (view FLAGS) +RLAPI void OpenURL(const char *url); // Open URL with default system browser (if available) + +// NOTE: Following functions implemented in module [utils] +//------------------------------------------------------------------ +RLAPI void TraceLog(int logLevel, const char *text, ...); // Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...) +RLAPI void SetTraceLogLevel(int logLevel); // Set the current threshold (minimum) log level +RLAPI void *MemAlloc(unsigned int size); // Internal memory allocator +RLAPI void *MemRealloc(void *ptr, unsigned int size); // Internal memory reallocator +RLAPI void MemFree(void *ptr); // Internal memory free + +// Set custom callbacks +// WARNING: Callbacks setup is intended for advanced users +RLAPI void SetTraceLogCallback(TraceLogCallback callback); // Set custom trace log +RLAPI void SetLoadFileDataCallback(LoadFileDataCallback callback); // Set custom file binary data loader +RLAPI void SetSaveFileDataCallback(SaveFileDataCallback callback); // Set custom file binary data saver +RLAPI void SetLoadFileTextCallback(LoadFileTextCallback callback); // Set custom file text data loader +RLAPI void SetSaveFileTextCallback(SaveFileTextCallback callback); // Set custom file text data saver + +// Files management functions +RLAPI unsigned char *LoadFileData(const char *fileName, int *dataSize); // Load file data as byte array (read) +RLAPI void UnloadFileData(unsigned char *data); // Unload file data allocated by LoadFileData() +RLAPI bool SaveFileData(const char *fileName, void *data, int dataSize); // Save data to file from byte array (write), returns true on success +RLAPI bool ExportDataAsCode(const unsigned char *data, int dataSize, const char *fileName); // Export data to code (.h), returns true on success +RLAPI char *LoadFileText(const char *fileName); // Load text data from file (read), returns a '\0' terminated string +RLAPI void UnloadFileText(char *text); // Unload file text data allocated by LoadFileText() +RLAPI bool SaveFileText(const char *fileName, char *text); // Save text data to file (write), string must be '\0' terminated, returns true on success +//------------------------------------------------------------------ + +// File system functions +RLAPI bool FileExists(const char *fileName); // Check if file exists +RLAPI bool DirectoryExists(const char *dirPath); // Check if a directory path exists +RLAPI bool IsFileExtension(const char *fileName, const char *ext); // Check file extension (including point: .png, .wav) +RLAPI int GetFileLength(const char *fileName); // Get file length in bytes (NOTE: GetFileSize() conflicts with windows.h) +RLAPI const char *GetFileExtension(const char *fileName); // Get pointer to extension for a filename string (includes dot: '.png') +RLAPI const char *GetFileName(const char *filePath); // Get pointer to filename for a path string +RLAPI const char *GetFileNameWithoutExt(const char *filePath); // Get filename string without extension (uses static string) +RLAPI const char *GetDirectoryPath(const char *filePath); // Get full path for a given fileName with path (uses static string) +RLAPI const char *GetPrevDirectoryPath(const char *dirPath); // Get previous directory path for a given path (uses static string) +RLAPI const char *GetWorkingDirectory(void); // Get current working directory (uses static string) +RLAPI const char *GetApplicationDirectory(void); // Get the directory of the running application (uses static string) +RLAPI int MakeDirectory(const char *dirPath); // Create directories (including full path requested), returns 0 on success +RLAPI bool ChangeDirectory(const char *dir); // Change working directory, return true on success +RLAPI bool IsPathFile(const char *path); // Check if a given path is a file or a directory +RLAPI bool IsFileNameValid(const char *fileName); // Check if fileName is valid for the platform/OS +RLAPI FilePathList LoadDirectoryFiles(const char *dirPath); // Load directory filepaths +RLAPI FilePathList LoadDirectoryFilesEx(const char *basePath, const char *filter, bool scanSubdirs); // Load directory filepaths with extension filtering and recursive directory scan. Use 'DIR' in the filter string to include directories in the result +RLAPI void UnloadDirectoryFiles(FilePathList files); // Unload filepaths +RLAPI bool IsFileDropped(void); // Check if a file has been dropped into window +RLAPI FilePathList LoadDroppedFiles(void); // Load dropped filepaths +RLAPI void UnloadDroppedFiles(FilePathList files); // Unload dropped filepaths +RLAPI long GetFileModTime(const char *fileName); // Get file modification time (last write time) + +// Compression/Encoding functionality +RLAPI unsigned char *CompressData(const unsigned char *data, int dataSize, int *compDataSize); // Compress data (DEFLATE algorithm), memory must be MemFree() +RLAPI unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // Decompress data (DEFLATE algorithm), memory must be MemFree() +RLAPI char *EncodeDataBase64(const unsigned char *data, int dataSize, int *outputSize); // Encode data to Base64 string, memory must be MemFree() +RLAPI unsigned char *DecodeDataBase64(const unsigned char *data, int *outputSize); // Decode Base64 string data, memory must be MemFree() +RLAPI unsigned int ComputeCRC32(unsigned char *data, int dataSize); // Compute CRC32 hash code +RLAPI unsigned int *ComputeMD5(unsigned char *data, int dataSize); // Compute MD5 hash code, returns static int[4] (16 bytes) +RLAPI unsigned int *ComputeSHA1(unsigned char *data, int dataSize); // Compute SHA1 hash code, returns static int[5] (20 bytes) + +// Automation events functionality +RLAPI AutomationEventList LoadAutomationEventList(const char *fileName); // Load automation events list from file, NULL for empty list, capacity = MAX_AUTOMATION_EVENTS +RLAPI void UnloadAutomationEventList(AutomationEventList list); // Unload automation events list from file +RLAPI bool ExportAutomationEventList(AutomationEventList list, const char *fileName); // Export automation events list as text file +RLAPI void SetAutomationEventList(AutomationEventList *list); // Set automation event list to record to +RLAPI void SetAutomationEventBaseFrame(int frame); // Set automation event internal base frame to start recording +RLAPI void StartAutomationEventRecording(void); // Start recording automation events (AutomationEventList must be set) +RLAPI void StopAutomationEventRecording(void); // Stop recording automation events +RLAPI void PlayAutomationEvent(AutomationEvent event); // Play a recorded automation event + +//------------------------------------------------------------------------------------ +// Input Handling Functions (Module: core) +//------------------------------------------------------------------------------------ + +// Input-related functions: keyboard +RLAPI bool IsKeyPressed(int key); // Check if a key has been pressed once +RLAPI bool IsKeyPressedRepeat(int key); // Check if a key has been pressed again +RLAPI bool IsKeyDown(int key); // Check if a key is being pressed +RLAPI bool IsKeyReleased(int key); // Check if a key has been released once +RLAPI bool IsKeyUp(int key); // Check if a key is NOT being pressed +RLAPI int GetKeyPressed(void); // Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty +RLAPI int GetCharPressed(void); // Get char pressed (unicode), call it multiple times for chars queued, returns 0 when the queue is empty +RLAPI const char *GetKeyName(int key); // Get name of a QWERTY key on the current keyboard layout (eg returns string 'q' for KEY_A on an AZERTY keyboard) +RLAPI void SetExitKey(int key); // Set a custom key to exit program (default is ESC) + +// Input-related functions: gamepads +RLAPI bool IsGamepadAvailable(int gamepad); // Check if a gamepad is available +RLAPI const char *GetGamepadName(int gamepad); // Get gamepad internal name id +RLAPI bool IsGamepadButtonPressed(int gamepad, int button); // Check if a gamepad button has been pressed once +RLAPI bool IsGamepadButtonDown(int gamepad, int button); // Check if a gamepad button is being pressed +RLAPI bool IsGamepadButtonReleased(int gamepad, int button); // Check if a gamepad button has been released once +RLAPI bool IsGamepadButtonUp(int gamepad, int button); // Check if a gamepad button is NOT being pressed +RLAPI int GetGamepadButtonPressed(void); // Get the last gamepad button pressed +RLAPI int GetGamepadAxisCount(int gamepad); // Get gamepad axis count for a gamepad +RLAPI float GetGamepadAxisMovement(int gamepad, int axis); // Get axis movement value for a gamepad axis +RLAPI int SetGamepadMappings(const char *mappings); // Set internal gamepad mappings (SDL_GameControllerDB) +RLAPI void SetGamepadVibration(int gamepad, float leftMotor, float rightMotor, float duration); // Set gamepad vibration for both motors (duration in seconds) + +// Input-related functions: mouse +RLAPI bool IsMouseButtonPressed(int button); // Check if a mouse button has been pressed once +RLAPI bool IsMouseButtonDown(int button); // Check if a mouse button is being pressed +RLAPI bool IsMouseButtonReleased(int button); // Check if a mouse button has been released once +RLAPI bool IsMouseButtonUp(int button); // Check if a mouse button is NOT being pressed +RLAPI int GetMouseX(void); // Get mouse position X +RLAPI int GetMouseY(void); // Get mouse position Y +RLAPI Vector2 GetMousePosition(void); // Get mouse position XY +RLAPI Vector2 GetMouseDelta(void); // Get mouse delta between frames +RLAPI void SetMousePosition(int x, int y); // Set mouse position XY +RLAPI void SetMouseOffset(int offsetX, int offsetY); // Set mouse offset +RLAPI void SetMouseScale(float scaleX, float scaleY); // Set mouse scaling +RLAPI float GetMouseWheelMove(void); // Get mouse wheel movement for X or Y, whichever is larger +RLAPI Vector2 GetMouseWheelMoveV(void); // Get mouse wheel movement for both X and Y +RLAPI void SetMouseCursor(int cursor); // Set mouse cursor + +// Input-related functions: touch +RLAPI int GetTouchX(void); // Get touch position X for touch point 0 (relative to screen size) +RLAPI int GetTouchY(void); // Get touch position Y for touch point 0 (relative to screen size) +RLAPI Vector2 GetTouchPosition(int index); // Get touch position XY for a touch point index (relative to screen size) +RLAPI int GetTouchPointId(int index); // Get touch point identifier for given index +RLAPI int GetTouchPointCount(void); // Get number of touch points + +//------------------------------------------------------------------------------------ +// Gestures and Touch Handling Functions (Module: rgestures) +//------------------------------------------------------------------------------------ +RLAPI void SetGesturesEnabled(unsigned int flags); // Enable a set of gestures using flags +RLAPI bool IsGestureDetected(unsigned int gesture); // Check if a gesture have been detected +RLAPI int GetGestureDetected(void); // Get latest detected gesture +RLAPI float GetGestureHoldDuration(void); // Get gesture hold time in seconds +RLAPI Vector2 GetGestureDragVector(void); // Get gesture drag vector +RLAPI float GetGestureDragAngle(void); // Get gesture drag angle +RLAPI Vector2 GetGesturePinchVector(void); // Get gesture pinch delta +RLAPI float GetGesturePinchAngle(void); // Get gesture pinch angle + +//------------------------------------------------------------------------------------ +// Camera System Functions (Module: rcamera) +//------------------------------------------------------------------------------------ +RLAPI void UpdateCamera(Camera *camera, int mode); // Update camera position for selected mode +RLAPI void UpdateCameraPro(Camera *camera, Vector3 movement, Vector3 rotation, float zoom); // Update camera movement/rotation + +//------------------------------------------------------------------------------------ +// Basic Shapes Drawing Functions (Module: shapes) +//------------------------------------------------------------------------------------ +// Set texture and rectangle to be used on shapes drawing +// NOTE: It can be useful when using basic shapes and one single font, +// defining a font char white rectangle would allow drawing everything in a single draw call +RLAPI void SetShapesTexture(Texture2D texture, Rectangle source); // Set texture and rectangle to be used on shapes drawing +RLAPI Texture2D GetShapesTexture(void); // Get texture that is used for shapes drawing +RLAPI Rectangle GetShapesTextureRectangle(void); // Get texture source rectangle that is used for shapes drawing + +// Basic shapes drawing functions +RLAPI void DrawPixel(int posX, int posY, Color color); // Draw a pixel using geometry [Can be slow, use with care] +RLAPI void DrawPixelV(Vector2 position, Color color); // Draw a pixel using geometry (Vector version) [Can be slow, use with care] +RLAPI void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw a line +RLAPI void DrawLineV(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (using gl lines) +RLAPI void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line (using triangles/quads) +RLAPI void DrawLineStrip(const Vector2 *points, int pointCount, Color color); // Draw lines sequence (using gl lines) +RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw line segment cubic-bezier in-out interpolation +RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle +RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle +RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline +RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color inner, Color outer); // Draw a gradient-filled circle +RLAPI void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version) +RLAPI void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline +RLAPI void DrawCircleLinesV(Vector2 center, float radius, Color color); // Draw circle outline (Vector version) +RLAPI void DrawEllipse(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse +RLAPI void DrawEllipseLines(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse outline +RLAPI void DrawRing(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring +RLAPI void DrawRingLines(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring outline +RLAPI void DrawRectangle(int posX, int posY, int width, int height, Color color); // Draw a color-filled rectangle +RLAPI void DrawRectangleV(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version) +RLAPI void DrawRectangleRec(Rectangle rec, Color color); // Draw a color-filled rectangle +RLAPI void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color); // Draw a color-filled rectangle with pro parameters +RLAPI void DrawRectangleGradientV(int posX, int posY, int width, int height, Color top, Color bottom); // Draw a vertical-gradient-filled rectangle +RLAPI void DrawRectangleGradientH(int posX, int posY, int width, int height, Color left, Color right); // Draw a horizontal-gradient-filled rectangle +RLAPI void DrawRectangleGradientEx(Rectangle rec, Color topLeft, Color bottomLeft, Color topRight, Color bottomRight); // Draw a gradient-filled rectangle with custom vertex colors +RLAPI void DrawRectangleLines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline +RLAPI void DrawRectangleLinesEx(Rectangle rec, float lineThick, Color color); // Draw rectangle outline with extended parameters +RLAPI void DrawRectangleRounded(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle with rounded edges +RLAPI void DrawRectangleRoundedLines(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle lines with rounded edges +RLAPI void DrawRectangleRoundedLinesEx(Rectangle rec, float roundness, int segments, float lineThick, Color color); // Draw rectangle with rounded edges outline +RLAPI void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +RLAPI void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline (vertex in counter-clockwise order!) +RLAPI void DrawTriangleFan(const Vector2 *points, int pointCount, Color color); // Draw a triangle fan defined by points (first vertex is the center) +RLAPI void DrawTriangleStrip(const Vector2 *points, int pointCount, Color color); // Draw a triangle strip defined by points +RLAPI void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a regular polygon (Vector version) +RLAPI void DrawPolyLines(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a polygon outline of n sides +RLAPI void DrawPolyLinesEx(Vector2 center, int sides, float radius, float rotation, float lineThick, Color color); // Draw a polygon outline of n sides with extended parameters + +// Splines drawing functions +RLAPI void DrawSplineLinear(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Linear, minimum 2 points +RLAPI void DrawSplineBasis(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: B-Spline, minimum 4 points +RLAPI void DrawSplineCatmullRom(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Catmull-Rom, minimum 4 points +RLAPI void DrawSplineBezierQuadratic(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Quadratic Bezier, minimum 3 points (1 control point): [p1, c2, p3, c4...] +RLAPI void DrawSplineBezierCubic(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Cubic Bezier, minimum 4 points (2 control points): [p1, c2, c3, p4, c5, c6...] +RLAPI void DrawSplineSegmentLinear(Vector2 p1, Vector2 p2, float thick, Color color); // Draw spline segment: Linear, 2 points +RLAPI void DrawSplineSegmentBasis(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float thick, Color color); // Draw spline segment: B-Spline, 4 points +RLAPI void DrawSplineSegmentCatmullRom(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float thick, Color color); // Draw spline segment: Catmull-Rom, 4 points +RLAPI void DrawSplineSegmentBezierQuadratic(Vector2 p1, Vector2 c2, Vector2 p3, float thick, Color color); // Draw spline segment: Quadratic Bezier, 2 points, 1 control point +RLAPI void DrawSplineSegmentBezierCubic(Vector2 p1, Vector2 c2, Vector2 c3, Vector2 p4, float thick, Color color); // Draw spline segment: Cubic Bezier, 2 points, 2 control points + +// Spline segment point evaluation functions, for a given t [0.0f .. 1.0f] +RLAPI Vector2 GetSplinePointLinear(Vector2 startPos, Vector2 endPos, float t); // Get (evaluate) spline point: Linear +RLAPI Vector2 GetSplinePointBasis(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float t); // Get (evaluate) spline point: B-Spline +RLAPI Vector2 GetSplinePointCatmullRom(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float t); // Get (evaluate) spline point: Catmull-Rom +RLAPI Vector2 GetSplinePointBezierQuad(Vector2 p1, Vector2 c2, Vector2 p3, float t); // Get (evaluate) spline point: Quadratic Bezier +RLAPI Vector2 GetSplinePointBezierCubic(Vector2 p1, Vector2 c2, Vector2 c3, Vector2 p4, float t); // Get (evaluate) spline point: Cubic Bezier + +// Basic shapes collision detection functions +RLAPI bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles +RLAPI bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles +RLAPI bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec); // Check collision between circle and rectangle +RLAPI bool CheckCollisionCircleLine(Vector2 center, float radius, Vector2 p1, Vector2 p2); // Check if circle collides with a line created betweeen two points [p1] and [p2] +RLAPI bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle +RLAPI bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius); // Check if point is inside circle +RLAPI bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); // Check if point is inside a triangle +RLAPI bool CheckCollisionPointLine(Vector2 point, Vector2 p1, Vector2 p2, int threshold); // Check if point belongs to line created between two points [p1] and [p2] with defined margin in pixels [threshold] +RLAPI bool CheckCollisionPointPoly(Vector2 point, const Vector2 *points, int pointCount); // Check if point is within a polygon described by array of vertices +RLAPI bool CheckCollisionLines(Vector2 startPos1, Vector2 endPos1, Vector2 startPos2, Vector2 endPos2, Vector2 *collisionPoint); // Check the collision between two lines defined by two points each, returns collision point by reference +RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2); // Get collision rectangle for two rectangles collision + +//------------------------------------------------------------------------------------ +// Texture Loading and Drawing Functions (Module: textures) +//------------------------------------------------------------------------------------ + +// Image loading functions +// NOTE: These functions do not require GPU access +RLAPI Image LoadImage(const char *fileName); // Load image from file into CPU memory (RAM) +RLAPI Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image from RAW file data +RLAPI Image LoadImageAnim(const char *fileName, int *frames); // Load image sequence from file (frames appended to image.data) +RLAPI Image LoadImageAnimFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int *frames); // Load image sequence from memory buffer +RLAPI Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load image from memory buffer, fileType refers to extension: i.e. '.png' +RLAPI Image LoadImageFromTexture(Texture2D texture); // Load image from GPU texture data +RLAPI Image LoadImageFromScreen(void); // Load image from screen buffer and (screenshot) +RLAPI bool IsImageValid(Image image); // Check if an image is valid (data and parameters) +RLAPI void UnloadImage(Image image); // Unload image from CPU memory (RAM) +RLAPI bool ExportImage(Image image, const char *fileName); // Export image data to file, returns true on success +RLAPI unsigned char *ExportImageToMemory(Image image, const char *fileType, int *fileSize); // Export image to memory buffer +RLAPI bool ExportImageAsCode(Image image, const char *fileName); // Export image as code file defining an array of bytes, returns true on success + +// Image generation functions +RLAPI Image GenImageColor(int width, int height, Color color); // Generate image: plain color +RLAPI Image GenImageGradientLinear(int width, int height, int direction, Color start, Color end); // Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient +RLAPI Image GenImageGradientRadial(int width, int height, float density, Color inner, Color outer); // Generate image: radial gradient +RLAPI Image GenImageGradientSquare(int width, int height, float density, Color inner, Color outer); // Generate image: square gradient +RLAPI Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color col2); // Generate image: checked +RLAPI Image GenImageWhiteNoise(int width, int height, float factor); // Generate image: white noise +RLAPI Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float scale); // Generate image: perlin noise +RLAPI Image GenImageCellular(int width, int height, int tileSize); // Generate image: cellular algorithm, bigger tileSize means bigger cells +RLAPI Image GenImageText(int width, int height, const char *text); // Generate image: grayscale image from text data + +// Image manipulation functions +RLAPI Image ImageCopy(Image image); // Create an image duplicate (useful for transformations) +RLAPI Image ImageFromImage(Image image, Rectangle rec); // Create an image from another image piece +RLAPI Image ImageFromChannel(Image image, int selectedChannel); // Create an image from a selected channel of another image (GRAYSCALE) +RLAPI Image ImageText(const char *text, int fontSize, Color color); // Create an image from text (default font) +RLAPI Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Color tint); // Create an image from text (custom sprite font) +RLAPI void ImageFormat(Image *image, int newFormat); // Convert image data to desired format +RLAPI void ImageToPOT(Image *image, Color fill); // Convert image to POT (power-of-two) +RLAPI void ImageCrop(Image *image, Rectangle crop); // Crop an image to a defined rectangle +RLAPI void ImageAlphaCrop(Image *image, float threshold); // Crop image depending on alpha value +RLAPI void ImageAlphaClear(Image *image, Color color, float threshold); // Clear alpha channel to desired color +RLAPI void ImageAlphaMask(Image *image, Image alphaMask); // Apply alpha mask to image +RLAPI void ImageAlphaPremultiply(Image *image); // Premultiply alpha channel +RLAPI void ImageBlurGaussian(Image *image, int blurSize); // Apply Gaussian blur using a box blur approximation +RLAPI void ImageKernelConvolution(Image *image, const float *kernel, int kernelSize); // Apply custom square convolution kernel to image +RLAPI void ImageResize(Image *image, int newWidth, int newHeight); // Resize image (Bicubic scaling algorithm) +RLAPI void ImageResizeNN(Image *image, int newWidth,int newHeight); // Resize image (Nearest-Neighbor scaling algorithm) +RLAPI void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color fill); // Resize canvas and fill with color +RLAPI void ImageMipmaps(Image *image); // Compute all mipmap levels for a provided image +RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) +RLAPI void ImageFlipVertical(Image *image); // Flip image vertically +RLAPI void ImageFlipHorizontal(Image *image); // Flip image horizontally +RLAPI void ImageRotate(Image *image, int degrees); // Rotate image by input angle in degrees (-359 to 359) +RLAPI void ImageRotateCW(Image *image); // Rotate image clockwise 90deg +RLAPI void ImageRotateCCW(Image *image); // Rotate image counter-clockwise 90deg +RLAPI void ImageColorTint(Image *image, Color color); // Modify image color: tint +RLAPI void ImageColorInvert(Image *image); // Modify image color: invert +RLAPI void ImageColorGrayscale(Image *image); // Modify image color: grayscale +RLAPI void ImageColorContrast(Image *image, float contrast); // Modify image color: contrast (-100 to 100) +RLAPI void ImageColorBrightness(Image *image, int brightness); // Modify image color: brightness (-255 to 255) +RLAPI void ImageColorReplace(Image *image, Color color, Color replace); // Modify image color: replace color +RLAPI Color *LoadImageColors(Image image); // Load color data from image as a Color array (RGBA - 32bit) +RLAPI Color *LoadImagePalette(Image image, int maxPaletteSize, int *colorCount); // Load colors palette from image as a Color array (RGBA - 32bit) +RLAPI void UnloadImageColors(Color *colors); // Unload color data loaded with LoadImageColors() +RLAPI void UnloadImagePalette(Color *colors); // Unload colors palette loaded with LoadImagePalette() +RLAPI Rectangle GetImageAlphaBorder(Image image, float threshold); // Get image alpha border rectangle +RLAPI Color GetImageColor(Image image, int x, int y); // Get image pixel color at (x, y) position + +// Image drawing functions +// NOTE: Image software-rendering functions (CPU) +RLAPI void ImageClearBackground(Image *dst, Color color); // Clear image background with given color +RLAPI void ImageDrawPixel(Image *dst, int posX, int posY, Color color); // Draw pixel within an image +RLAPI void ImageDrawPixelV(Image *dst, Vector2 position, Color color); // Draw pixel within an image (Vector version) +RLAPI void ImageDrawLine(Image *dst, int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw line within an image +RLAPI void ImageDrawLineV(Image *dst, Vector2 start, Vector2 end, Color color); // Draw line within an image (Vector version) +RLAPI void ImageDrawLineEx(Image *dst, Vector2 start, Vector2 end, int thick, Color color); // Draw a line defining thickness within an image +RLAPI void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color color); // Draw a filled circle within an image +RLAPI void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color); // Draw a filled circle within an image (Vector version) +RLAPI void ImageDrawCircleLines(Image *dst, int centerX, int centerY, int radius, Color color); // Draw circle outline within an image +RLAPI void ImageDrawCircleLinesV(Image *dst, Vector2 center, int radius, Color color); // Draw circle outline within an image (Vector version) +RLAPI void ImageDrawRectangle(Image *dst, int posX, int posY, int width, int height, Color color); // Draw rectangle within an image +RLAPI void ImageDrawRectangleV(Image *dst, Vector2 position, Vector2 size, Color color); // Draw rectangle within an image (Vector version) +RLAPI void ImageDrawRectangleRec(Image *dst, Rectangle rec, Color color); // Draw rectangle within an image +RLAPI void ImageDrawRectangleLines(Image *dst, Rectangle rec, int thick, Color color); // Draw rectangle lines within an image +RLAPI void ImageDrawTriangle(Image *dst, Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle within an image +RLAPI void ImageDrawTriangleEx(Image *dst, Vector2 v1, Vector2 v2, Vector2 v3, Color c1, Color c2, Color c3); // Draw triangle with interpolated colors within an image +RLAPI void ImageDrawTriangleLines(Image *dst, Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline within an image +RLAPI void ImageDrawTriangleFan(Image *dst, Vector2 *points, int pointCount, Color color); // Draw a triangle fan defined by points within an image (first vertex is the center) +RLAPI void ImageDrawTriangleStrip(Image *dst, Vector2 *points, int pointCount, Color color); // Draw a triangle strip defined by points within an image +RLAPI void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint); // Draw a source image within a destination image (tint applied to source) +RLAPI void ImageDrawText(Image *dst, const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) within an image (destination) +RLAPI void ImageDrawTextEx(Image *dst, Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text (custom sprite font) within an image (destination) + +// Texture loading functions +// NOTE: These functions require GPU access +RLAPI Texture2D LoadTexture(const char *fileName); // Load texture from file into GPU memory (VRAM) +RLAPI Texture2D LoadTextureFromImage(Image image); // Load texture from image data +RLAPI TextureCubemap LoadTextureCubemap(Image image, int layout); // Load cubemap from image, multiple image cubemap layouts supported +RLAPI RenderTexture2D LoadRenderTexture(int width, int height); // Load texture for rendering (framebuffer) +RLAPI bool IsTextureValid(Texture2D texture); // Check if a texture is valid (loaded in GPU) +RLAPI void UnloadTexture(Texture2D texture); // Unload texture from GPU memory (VRAM) +RLAPI bool IsRenderTextureValid(RenderTexture2D target); // Check if a render texture is valid (loaded in GPU) +RLAPI void UnloadRenderTexture(RenderTexture2D target); // Unload render texture from GPU memory (VRAM) +RLAPI void UpdateTexture(Texture2D texture, const void *pixels); // Update GPU texture with new data +RLAPI void UpdateTextureRec(Texture2D texture, Rectangle rec, const void *pixels); // Update GPU texture rectangle with new data + +// Texture configuration functions +RLAPI void GenTextureMipmaps(Texture2D *texture); // Generate GPU mipmaps for a texture +RLAPI void SetTextureFilter(Texture2D texture, int filter); // Set texture scaling filter mode +RLAPI void SetTextureWrap(Texture2D texture, int wrap); // Set texture wrapping mode + +// Texture drawing functions +RLAPI void DrawTexture(Texture2D texture, int posX, int posY, Color tint); // Draw a Texture2D +RLAPI void DrawTextureV(Texture2D texture, Vector2 position, Color tint); // Draw a Texture2D with position defined as Vector2 +RLAPI void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint); // Draw a Texture2D with extended parameters +RLAPI void DrawTextureRec(Texture2D texture, Rectangle source, Vector2 position, Color tint); // Draw a part of a texture defined by a rectangle +RLAPI void DrawTexturePro(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draw a part of a texture defined by a rectangle with 'pro' parameters +RLAPI void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draws a texture (or part of it) that stretches or shrinks nicely + +// Color/pixel related functions +RLAPI bool ColorIsEqual(Color col1, Color col2); // Check if two colors are equal +RLAPI Color Fade(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f +RLAPI int ColorToInt(Color color); // Get hexadecimal value for a Color (0xRRGGBBAA) +RLAPI Vector4 ColorNormalize(Color color); // Get Color normalized as float [0..1] +RLAPI Color ColorFromNormalized(Vector4 normalized); // Get Color from normalized values [0..1] +RLAPI Vector3 ColorToHSV(Color color); // Get HSV values for a Color, hue [0..360], saturation/value [0..1] +RLAPI Color ColorFromHSV(float hue, float saturation, float value); // Get a Color from HSV values, hue [0..360], saturation/value [0..1] +RLAPI Color ColorTint(Color color, Color tint); // Get color multiplied with another color +RLAPI Color ColorBrightness(Color color, float factor); // Get color with brightness correction, brightness factor goes from -1.0f to 1.0f +RLAPI Color ColorContrast(Color color, float contrast); // Get color with contrast correction, contrast values between -1.0f and 1.0f +RLAPI Color ColorAlpha(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f +RLAPI Color ColorAlphaBlend(Color dst, Color src, Color tint); // Get src alpha-blended into dst color with tint +RLAPI Color ColorLerp(Color color1, Color color2, float factor); // Get color lerp interpolation between two colors, factor [0.0f..1.0f] +RLAPI Color GetColor(unsigned int hexValue); // Get Color structure from hexadecimal value +RLAPI Color GetPixelColor(void *srcPtr, int format); // Get Color from a source pixel pointer of certain format +RLAPI void SetPixelColor(void *dstPtr, Color color, int format); // Set color formatted into destination pixel pointer +RLAPI int GetPixelDataSize(int width, int height, int format); // Get pixel data size in bytes for certain format + +//------------------------------------------------------------------------------------ +// Font Loading and Text Drawing Functions (Module: text) +//------------------------------------------------------------------------------------ + +// Font loading/unloading functions +RLAPI Font GetFontDefault(void); // Get the default Font +RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM) +RLAPI Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // Load font from file with extended parameters, use NULL for codepoints and 0 for codepointCount to load the default character set, font size is provided in pixels height +RLAPI Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style) +RLAPI Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *codepoints, int codepointCount); // Load font from memory buffer, fileType refers to extension: i.e. '.ttf' +RLAPI bool IsFontValid(Font font); // Check if a font is valid (font data loaded, WARNING: GPU texture not checked) +RLAPI GlyphInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *codepoints, int codepointCount, int type); // Load font data for further use +RLAPI Image GenImageFontAtlas(const GlyphInfo *glyphs, Rectangle **glyphRecs, int glyphCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info +RLAPI void UnloadFontData(GlyphInfo *glyphs, int glyphCount); // Unload font chars info data (RAM) +RLAPI void UnloadFont(Font font); // Unload font from GPU memory (VRAM) +RLAPI bool ExportFontAsCode(Font font, const char *fileName); // Export font as code file, returns true on success + +// Text drawing functions +RLAPI void DrawFPS(int posX, int posY); // Draw current FPS +RLAPI void DrawText(const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) +RLAPI void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text using font and additional parameters +RLAPI void DrawTextPro(Font font, const char *text, Vector2 position, Vector2 origin, float rotation, float fontSize, float spacing, Color tint); // Draw text using Font and pro parameters (rotation) +RLAPI void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint); // Draw one character (codepoint) +RLAPI void DrawTextCodepoints(Font font, const int *codepoints, int codepointCount, Vector2 position, float fontSize, float spacing, Color tint); // Draw multiple character (codepoint) + +// Text font info functions +RLAPI void SetTextLineSpacing(int spacing); // Set vertical line spacing when drawing with line-breaks +RLAPI int MeasureText(const char *text, int fontSize); // Measure string width for default font +RLAPI Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // Measure string size for Font +RLAPI int GetGlyphIndex(Font font, int codepoint); // Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found +RLAPI GlyphInfo GetGlyphInfo(Font font, int codepoint); // Get glyph font info data for a codepoint (unicode character), fallback to '?' if not found +RLAPI Rectangle GetGlyphAtlasRec(Font font, int codepoint); // Get glyph rectangle in font atlas for a codepoint (unicode character), fallback to '?' if not found + +// Text codepoints management functions (unicode characters) +RLAPI char *LoadUTF8(const int *codepoints, int length); // Load UTF-8 text encoded from codepoints array +RLAPI void UnloadUTF8(char *text); // Unload UTF-8 text encoded from codepoints array +RLAPI int *LoadCodepoints(const char *text, int *count); // Load all codepoints from a UTF-8 text string, codepoints count returned by parameter +RLAPI void UnloadCodepoints(int *codepoints); // Unload codepoints data from memory +RLAPI int GetCodepointCount(const char *text); // Get total number of codepoints in a UTF-8 encoded string +RLAPI int GetCodepoint(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI int GetCodepointNext(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI int GetCodepointPrevious(const char *text, int *codepointSize); // Get previous codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI const char *CodepointToUTF8(int codepoint, int *utf8Size); // Encode one codepoint into UTF-8 byte array (array length returned as parameter) + +// Text strings management functions (no UTF-8 strings, only byte chars) +// NOTE: Some strings allocate memory internally for returned strings, just be careful! +RLAPI int TextCopy(char *dst, const char *src); // Copy one string to another, returns bytes copied +RLAPI bool TextIsEqual(const char *text1, const char *text2); // Check if two text string are equal +RLAPI unsigned int TextLength(const char *text); // Get text length, checks for '\0' ending +RLAPI const char *TextFormat(const char *text, ...); // Text formatting with variables (sprintf() style) +RLAPI const char *TextSubtext(const char *text, int position, int length); // Get a piece of a text string +RLAPI char *TextReplace(const char *text, const char *replace, const char *by); // Replace text string (WARNING: memory must be freed!) +RLAPI char *TextInsert(const char *text, const char *insert, int position); // Insert text in a position (WARNING: memory must be freed!) +RLAPI const char *TextJoin(const char **textList, int count, const char *delimiter); // Join text strings with delimiter +RLAPI const char **TextSplit(const char *text, char delimiter, int *count); // Split text into multiple strings +RLAPI void TextAppend(char *text, const char *append, int *position); // Append text at specific position and move cursor! +RLAPI int TextFindIndex(const char *text, const char *find); // Find first text occurrence within a string +RLAPI const char *TextToUpper(const char *text); // Get upper case version of provided string +RLAPI const char *TextToLower(const char *text); // Get lower case version of provided string +RLAPI const char *TextToPascal(const char *text); // Get Pascal case notation version of provided string +RLAPI const char *TextToSnake(const char *text); // Get Snake case notation version of provided string +RLAPI const char *TextToCamel(const char *text); // Get Camel case notation version of provided string + +RLAPI int TextToInteger(const char *text); // Get integer value from text +RLAPI float TextToFloat(const char *text); // Get float value from text + +//------------------------------------------------------------------------------------ +// Basic 3d Shapes Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ + +// Basic geometric 3D shapes drawing functions +RLAPI void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space +RLAPI void DrawPoint3D(Vector3 position, Color color); // Draw a point in 3D space, actually a small line +RLAPI void DrawCircle3D(Vector3 center, float radius, Vector3 rotationAxis, float rotationAngle, Color color); // Draw a circle in 3D world space +RLAPI void DrawTriangle3D(Vector3 v1, Vector3 v2, Vector3 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +RLAPI void DrawTriangleStrip3D(const Vector3 *points, int pointCount, Color color); // Draw a triangle strip defined by points +RLAPI void DrawCube(Vector3 position, float width, float height, float length, Color color); // Draw cube +RLAPI void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version) +RLAPI void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); // Draw cube wires +RLAPI void DrawCubeWiresV(Vector3 position, Vector3 size, Color color); // Draw cube wires (Vector version) +RLAPI void DrawSphere(Vector3 centerPos, float radius, Color color); // Draw sphere +RLAPI void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters +RLAPI void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires +RLAPI void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone +RLAPI void DrawCylinderEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder with base at startPos and top at endPos +RLAPI void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires +RLAPI void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder wires with base at startPos and top at endPos +RLAPI void DrawCapsule(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Color color); // Draw a capsule with the center of its sphere caps at startPos and endPos +RLAPI void DrawCapsuleWires(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Color color); // Draw capsule wireframe with the center of its sphere caps at startPos and endPos +RLAPI void DrawPlane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ +RLAPI void DrawRay(Ray ray, Color color); // Draw a ray line +RLAPI void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0)) + +//------------------------------------------------------------------------------------ +// Model 3d Loading and Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ + +// Model management functions +RLAPI Model LoadModel(const char *fileName); // Load model from files (meshes and materials) +RLAPI Model LoadModelFromMesh(Mesh mesh); // Load model from generated mesh (default material) +RLAPI bool IsModelValid(Model model); // Check if a model is valid (loaded in GPU, VAO/VBOs) +RLAPI void UnloadModel(Model model); // Unload model (including meshes) from memory (RAM and/or VRAM) +RLAPI BoundingBox GetModelBoundingBox(Model model); // Compute model bounding box limits (considers all meshes) + +// Model drawing functions +RLAPI void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set) +RLAPI void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters +RLAPI void DrawModelWires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set) +RLAPI void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model wires (with texture if set) with extended parameters +RLAPI void DrawModelPoints(Model model, Vector3 position, float scale, Color tint); // Draw a model as points +RLAPI void DrawModelPointsEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model as points with extended parameters +RLAPI void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires) +RLAPI void DrawBillboard(Camera camera, Texture2D texture, Vector3 position, float scale, Color tint); // Draw a billboard texture +RLAPI void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector2 size, Color tint); // Draw a billboard texture defined by source +RLAPI void DrawBillboardPro(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector3 up, Vector2 size, Vector2 origin, float rotation, Color tint); // Draw a billboard texture defined by source and rotation + +// Mesh management functions +RLAPI void UploadMesh(Mesh *mesh, bool dynamic); // Upload mesh vertex data in GPU and provide VAO/VBO ids +RLAPI void UpdateMeshBuffer(Mesh mesh, int index, const void *data, int dataSize, int offset); // Update mesh vertex data in GPU for a specific buffer index +RLAPI void UnloadMesh(Mesh mesh); // Unload mesh data from CPU and GPU +RLAPI void DrawMesh(Mesh mesh, Material material, Matrix transform); // Draw a 3d mesh with material and transform +RLAPI void DrawMeshInstanced(Mesh mesh, Material material, const Matrix *transforms, int instances); // Draw multiple mesh instances with material and different transforms +RLAPI BoundingBox GetMeshBoundingBox(Mesh mesh); // Compute mesh bounding box limits +RLAPI void GenMeshTangents(Mesh *mesh); // Compute mesh tangents +RLAPI bool ExportMesh(Mesh mesh, const char *fileName); // Export mesh data to file, returns true on success +RLAPI bool ExportMeshAsCode(Mesh mesh, const char *fileName); // Export mesh as code file (.h) defining multiple arrays of vertex attributes + +// Mesh generation functions +RLAPI Mesh GenMeshPoly(int sides, float radius); // Generate polygonal mesh +RLAPI Mesh GenMeshPlane(float width, float length, int resX, int resZ); // Generate plane mesh (with subdivisions) +RLAPI Mesh GenMeshCube(float width, float height, float length); // Generate cuboid mesh +RLAPI Mesh GenMeshSphere(float radius, int rings, int slices); // Generate sphere mesh (standard sphere) +RLAPI Mesh GenMeshHemiSphere(float radius, int rings, int slices); // Generate half-sphere mesh (no bottom cap) +RLAPI Mesh GenMeshCylinder(float radius, float height, int slices); // Generate cylinder mesh +RLAPI Mesh GenMeshCone(float radius, float height, int slices); // Generate cone/pyramid mesh +RLAPI Mesh GenMeshTorus(float radius, float size, int radSeg, int sides); // Generate torus mesh +RLAPI Mesh GenMeshKnot(float radius, float size, int radSeg, int sides); // Generate trefoil knot mesh +RLAPI Mesh GenMeshHeightmap(Image heightmap, Vector3 size); // Generate heightmap mesh from image data +RLAPI Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize); // Generate cubes-based map mesh from image data + +// Material loading/unloading functions +RLAPI Material *LoadMaterials(const char *fileName, int *materialCount); // Load materials from model file +RLAPI Material LoadMaterialDefault(void); // Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps) +RLAPI bool IsMaterialValid(Material material); // Check if a material is valid (shader assigned, map textures loaded in GPU) +RLAPI void UnloadMaterial(Material material); // Unload material from GPU memory (VRAM) +RLAPI void SetMaterialTexture(Material *material, int mapType, Texture2D texture); // Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...) +RLAPI void SetModelMeshMaterial(Model *model, int meshId, int materialId); // Set material for a mesh + +// Model animations loading/unloading functions +RLAPI ModelAnimation *LoadModelAnimations(const char *fileName, int *animCount); // Load model animations from file +RLAPI void UpdateModelAnimation(Model model, ModelAnimation anim, int frame); // Update model animation pose (CPU) +RLAPI void UpdateModelAnimationBones(Model model, ModelAnimation anim, int frame); // Update model animation mesh bone matrices (GPU skinning) +RLAPI void UnloadModelAnimation(ModelAnimation anim); // Unload animation data +RLAPI void UnloadModelAnimations(ModelAnimation *animations, int animCount); // Unload animation array data +RLAPI bool IsModelAnimationValid(Model model, ModelAnimation anim); // Check model animation skeleton match + +// Collision detection functions +RLAPI bool CheckCollisionSpheres(Vector3 center1, float radius1, Vector3 center2, float radius2); // Check collision between two spheres +RLAPI bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); // Check collision between two bounding boxes +RLAPI bool CheckCollisionBoxSphere(BoundingBox box, Vector3 center, float radius); // Check collision between box and sphere +RLAPI RayCollision GetRayCollisionSphere(Ray ray, Vector3 center, float radius); // Get collision info between ray and sphere +RLAPI RayCollision GetRayCollisionBox(Ray ray, BoundingBox box); // Get collision info between ray and box +RLAPI RayCollision GetRayCollisionMesh(Ray ray, Mesh mesh, Matrix transform); // Get collision info between ray and mesh +RLAPI RayCollision GetRayCollisionTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3); // Get collision info between ray and triangle +RLAPI RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4); // Get collision info between ray and quad + +//------------------------------------------------------------------------------------ +// Audio Loading and Playing Functions (Module: audio) +//------------------------------------------------------------------------------------ +typedef void (*AudioCallback)(void *bufferData, unsigned int frames); + +// Audio device management functions +RLAPI void InitAudioDevice(void); // Initialize audio device and context +RLAPI void CloseAudioDevice(void); // Close the audio device and context +RLAPI bool IsAudioDeviceReady(void); // Check if audio device has been initialized successfully +RLAPI void SetMasterVolume(float volume); // Set master volume (listener) +RLAPI float GetMasterVolume(void); // Get master volume (listener) + +// Wave/Sound loading/unloading functions +RLAPI Wave LoadWave(const char *fileName); // Load wave data from file +RLAPI Wave LoadWaveFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load wave from memory buffer, fileType refers to extension: i.e. '.wav' +RLAPI bool IsWaveValid(Wave wave); // Checks if wave data is valid (data loaded and parameters) +RLAPI Sound LoadSound(const char *fileName); // Load sound from file +RLAPI Sound LoadSoundFromWave(Wave wave); // Load sound from wave data +RLAPI Sound LoadSoundAlias(Sound source); // Create a new sound that shares the same sample data as the source sound, does not own the sound data +RLAPI bool IsSoundValid(Sound sound); // Checks if a sound is valid (data loaded and buffers initialized) +RLAPI void UpdateSound(Sound sound, const void *data, int sampleCount); // Update sound buffer with new data +RLAPI void UnloadWave(Wave wave); // Unload wave data +RLAPI void UnloadSound(Sound sound); // Unload sound +RLAPI void UnloadSoundAlias(Sound alias); // Unload a sound alias (does not deallocate sample data) +RLAPI bool ExportWave(Wave wave, const char *fileName); // Export wave data to file, returns true on success +RLAPI bool ExportWaveAsCode(Wave wave, const char *fileName); // Export wave sample data to code (.h), returns true on success + +// Wave/Sound management functions +RLAPI void PlaySound(Sound sound); // Play a sound +RLAPI void StopSound(Sound sound); // Stop playing a sound +RLAPI void PauseSound(Sound sound); // Pause a sound +RLAPI void ResumeSound(Sound sound); // Resume a paused sound +RLAPI bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing +RLAPI void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level) +RLAPI void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level) +RLAPI void SetSoundPan(Sound sound, float pan); // Set pan for a sound (0.5 is center) +RLAPI Wave WaveCopy(Wave wave); // Copy a wave to a new wave +RLAPI void WaveCrop(Wave *wave, int initFrame, int finalFrame); // Crop a wave to defined frames range +RLAPI void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels); // Convert wave data to desired format +RLAPI float *LoadWaveSamples(Wave wave); // Load samples data from wave as a 32bit float data array +RLAPI void UnloadWaveSamples(float *samples); // Unload samples data loaded with LoadWaveSamples() + +// Music management functions +RLAPI Music LoadMusicStream(const char *fileName); // Load music stream from file +RLAPI Music LoadMusicStreamFromMemory(const char *fileType, const unsigned char *data, int dataSize); // Load music stream from data +RLAPI bool IsMusicValid(Music music); // Checks if a music stream is valid (context and buffers initialized) +RLAPI void UnloadMusicStream(Music music); // Unload music stream +RLAPI void PlayMusicStream(Music music); // Start music playing +RLAPI bool IsMusicStreamPlaying(Music music); // Check if music is playing +RLAPI void UpdateMusicStream(Music music); // Updates buffers for music streaming +RLAPI void StopMusicStream(Music music); // Stop music playing +RLAPI void PauseMusicStream(Music music); // Pause music playing +RLAPI void ResumeMusicStream(Music music); // Resume playing paused music +RLAPI void SeekMusicStream(Music music, float position); // Seek music to a position (in seconds) +RLAPI void SetMusicVolume(Music music, float volume); // Set volume for music (1.0 is max level) +RLAPI void SetMusicPitch(Music music, float pitch); // Set pitch for a music (1.0 is base level) +RLAPI void SetMusicPan(Music music, float pan); // Set pan for a music (0.5 is center) +RLAPI float GetMusicTimeLength(Music music); // Get music time length (in seconds) +RLAPI float GetMusicTimePlayed(Music music); // Get current music time played (in seconds) + +// AudioStream management functions +RLAPI AudioStream LoadAudioStream(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels); // Load audio stream (to stream raw audio pcm data) +RLAPI bool IsAudioStreamValid(AudioStream stream); // Checks if an audio stream is valid (buffers initialized) +RLAPI void UnloadAudioStream(AudioStream stream); // Unload audio stream and free memory +RLAPI void UpdateAudioStream(AudioStream stream, const void *data, int frameCount); // Update audio stream buffers with data +RLAPI bool IsAudioStreamProcessed(AudioStream stream); // Check if any audio stream buffers requires refill +RLAPI void PlayAudioStream(AudioStream stream); // Play audio stream +RLAPI void PauseAudioStream(AudioStream stream); // Pause audio stream +RLAPI void ResumeAudioStream(AudioStream stream); // Resume audio stream +RLAPI bool IsAudioStreamPlaying(AudioStream stream); // Check if audio stream is playing +RLAPI void StopAudioStream(AudioStream stream); // Stop audio stream +RLAPI void SetAudioStreamVolume(AudioStream stream, float volume); // Set volume for audio stream (1.0 is max level) +RLAPI void SetAudioStreamPitch(AudioStream stream, float pitch); // Set pitch for audio stream (1.0 is base level) +RLAPI void SetAudioStreamPan(AudioStream stream, float pan); // Set pan for audio stream (0.5 is centered) +RLAPI void SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams +RLAPI void SetAudioStreamCallback(AudioStream stream, AudioCallback callback); // Audio thread callback to request new data + +RLAPI void AttachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Attach audio stream processor to stream, receives the samples as 'float' +RLAPI void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Detach audio stream processor from stream + +RLAPI void AttachAudioMixedProcessor(AudioCallback processor); // Attach audio stream processor to the entire audio pipeline, receives the samples as 'float' +RLAPI void DetachAudioMixedProcessor(AudioCallback processor); // Detach audio stream processor from the entire audio pipeline + +#if defined(__cplusplus) +} +#endif + +#endif // RAYLIB_H diff --git a/projects/zig_raylib_examples/lib/raylib/include/raymath.h b/projects/zig_raylib_examples/lib/raylib/include/raymath.h new file mode 100644 index 0000000..bee21b4 --- /dev/null +++ b/projects/zig_raylib_examples/lib/raylib/include/raymath.h @@ -0,0 +1,2950 @@ +/********************************************************************************************** +* +* raymath v2.0 - Math functions to work with Vector2, Vector3, Matrix and Quaternions +* +* CONVENTIONS: +* - Matrix structure is defined as row-major (memory layout) but parameters naming AND all +* math operations performed by the library consider the structure as it was column-major +* It is like transposed versions of the matrices are used for all the maths +* It benefits some functions making them cache-friendly and also avoids matrix +* transpositions sometimes required by OpenGL +* Example: In memory order, row0 is [m0 m4 m8 m12] but in semantic math row0 is [m0 m1 m2 m3] +* - Functions are always self-contained, no function use another raymath function inside, +* required code is directly re-implemented inside +* - Functions input parameters are always received by value (2 unavoidable exceptions) +* - Functions use always a "result" variable for return (except C++ operators) +* - Functions are always defined inline +* - Angles are always in radians (DEG2RAD/RAD2DEG macros provided for convenience) +* - No compound literals used to make sure libray is compatible with C++ +* +* CONFIGURATION: +* #define RAYMATH_IMPLEMENTATION +* Generates the implementation of the library into the included file. +* If not defined, the library is in header only mode and can be included in other headers +* or source files without problems. But only ONE file should hold the implementation. +* +* #define RAYMATH_STATIC_INLINE +* Define static inline functions code, so #include header suffices for use. +* This may use up lots of memory. +* +* #define RAYMATH_DISABLE_CPP_OPERATORS +* Disables C++ operator overloads for raymath types. +* +* LICENSE: zlib/libpng +* +* Copyright (c) 2015-2025 Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RAYMATH_H +#define RAYMATH_H + +#if defined(RAYMATH_IMPLEMENTATION) && defined(RAYMATH_STATIC_INLINE) + #error "Specifying both RAYMATH_IMPLEMENTATION and RAYMATH_STATIC_INLINE is contradictory" +#endif + +// Function specifiers definition +#if defined(RAYMATH_IMPLEMENTATION) + #if defined(_WIN32) && defined(BUILD_LIBTYPE_SHARED) + #define RMAPI __declspec(dllexport) extern inline // We are building raylib as a Win32 shared library (.dll) + #elif defined(BUILD_LIBTYPE_SHARED) + #define RMAPI __attribute__((visibility("default"))) // We are building raylib as a Unix shared library (.so/.dylib) + #elif defined(_WIN32) && defined(USE_LIBTYPE_SHARED) + #define RMAPI __declspec(dllimport) // We are using raylib as a Win32 shared library (.dll) + #else + #define RMAPI extern inline // Provide external definition + #endif +#elif defined(RAYMATH_STATIC_INLINE) + #define RMAPI static inline // Functions may be inlined, no external out-of-line definition +#else + #if defined(__TINYC__) + #define RMAPI static inline // plain inline not supported by tinycc (See issue #435) + #else + #define RMAPI inline // Functions may be inlined or external definition used + #endif +#endif + + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#ifndef PI + #define PI 3.14159265358979323846f +#endif + +#ifndef EPSILON + #define EPSILON 0.000001f +#endif + +#ifndef DEG2RAD + #define DEG2RAD (PI/180.0f) +#endif + +#ifndef RAD2DEG + #define RAD2DEG (180.0f/PI) +#endif + +// Get float vector for Matrix +#ifndef MatrixToFloat + #define MatrixToFloat(mat) (MatrixToFloatV(mat).v) +#endif + +// Get float vector for Vector3 +#ifndef Vector3ToFloat + #define Vector3ToFloat(vec) (Vector3ToFloatV(vec).v) +#endif + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +#if !defined(RL_VECTOR2_TYPE) +// Vector2 type +typedef struct Vector2 { + float x; + float y; +} Vector2; +#define RL_VECTOR2_TYPE +#endif + +#if !defined(RL_VECTOR3_TYPE) +// Vector3 type +typedef struct Vector3 { + float x; + float y; + float z; +} Vector3; +#define RL_VECTOR3_TYPE +#endif + +#if !defined(RL_VECTOR4_TYPE) +// Vector4 type +typedef struct Vector4 { + float x; + float y; + float z; + float w; +} Vector4; +#define RL_VECTOR4_TYPE +#endif + +#if !defined(RL_QUATERNION_TYPE) +// Quaternion type +typedef Vector4 Quaternion; +#define RL_QUATERNION_TYPE +#endif + +#if !defined(RL_MATRIX_TYPE) +// Matrix type (OpenGL style 4x4 - right handed, column major) +typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) +} Matrix; +#define RL_MATRIX_TYPE +#endif + +// NOTE: Helper types to be used instead of array return types for *ToFloat functions +typedef struct float3 { + float v[3]; +} float3; + +typedef struct float16 { + float v[16]; +} float16; + +#include // Required for: sinf(), cosf(), tan(), atan2f(), sqrtf(), floor(), fminf(), fmaxf(), fabsf() + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Utils math +//---------------------------------------------------------------------------------- + +// Clamp float value +RMAPI float Clamp(float value, float min, float max) +{ + float result = (value < min)? min : value; + + if (result > max) result = max; + + return result; +} + +// Calculate linear interpolation between two floats +RMAPI float Lerp(float start, float end, float amount) +{ + float result = start + amount*(end - start); + + return result; +} + +// Normalize input value within input range +RMAPI float Normalize(float value, float start, float end) +{ + float result = (value - start)/(end - start); + + return result; +} + +// Remap input value within input range to output range +RMAPI float Remap(float value, float inputStart, float inputEnd, float outputStart, float outputEnd) +{ + float result = (value - inputStart)/(inputEnd - inputStart)*(outputEnd - outputStart) + outputStart; + + return result; +} + +// Wrap input value from min to max +RMAPI float Wrap(float value, float min, float max) +{ + float result = value - (max - min)*floorf((value - min)/(max - min)); + + return result; +} + +// Check whether two given floats are almost equal +RMAPI int FloatEquals(float x, float y) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = (fabsf(x - y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(x), fabsf(y)))); + + return result; +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Vector2 math +//---------------------------------------------------------------------------------- + +// Vector with components value 0.0f +RMAPI Vector2 Vector2Zero(void) +{ + Vector2 result = { 0.0f, 0.0f }; + + return result; +} + +// Vector with components value 1.0f +RMAPI Vector2 Vector2One(void) +{ + Vector2 result = { 1.0f, 1.0f }; + + return result; +} + +// Add two vectors (v1 + v2) +RMAPI Vector2 Vector2Add(Vector2 v1, Vector2 v2) +{ + Vector2 result = { v1.x + v2.x, v1.y + v2.y }; + + return result; +} + +// Add vector and float value +RMAPI Vector2 Vector2AddValue(Vector2 v, float add) +{ + Vector2 result = { v.x + add, v.y + add }; + + return result; +} + +// Subtract two vectors (v1 - v2) +RMAPI Vector2 Vector2Subtract(Vector2 v1, Vector2 v2) +{ + Vector2 result = { v1.x - v2.x, v1.y - v2.y }; + + return result; +} + +// Subtract vector by float value +RMAPI Vector2 Vector2SubtractValue(Vector2 v, float sub) +{ + Vector2 result = { v.x - sub, v.y - sub }; + + return result; +} + +// Calculate vector length +RMAPI float Vector2Length(Vector2 v) +{ + float result = sqrtf((v.x*v.x) + (v.y*v.y)); + + return result; +} + +// Calculate vector square length +RMAPI float Vector2LengthSqr(Vector2 v) +{ + float result = (v.x*v.x) + (v.y*v.y); + + return result; +} + +// Calculate two vectors dot product +RMAPI float Vector2DotProduct(Vector2 v1, Vector2 v2) +{ + float result = (v1.x*v2.x + v1.y*v2.y); + + return result; +} + +// Calculate two vectors cross product +RMAPI float Vector2CrossProduct(Vector2 v1, Vector2 v2) +{ + float result = (v1.x*v2.y - v1.y*v2.x); + + return result; +} + +// Calculate distance between two vectors +RMAPI float Vector2Distance(Vector2 v1, Vector2 v2) +{ + float result = sqrtf((v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y)); + + return result; +} + +// Calculate square distance between two vectors +RMAPI float Vector2DistanceSqr(Vector2 v1, Vector2 v2) +{ + float result = ((v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y)); + + return result; +} + +// Calculate the signed angle from v1 to v2, relative to the origin (0, 0) +// NOTE: Coordinate system convention: positive X right, positive Y down, +// positive angles appear clockwise, and negative angles appear counterclockwise +RMAPI float Vector2Angle(Vector2 v1, Vector2 v2) +{ + float result = 0.0f; + + float dot = v1.x*v2.x + v1.y*v2.y; + float det = v1.x*v2.y - v1.y*v2.x; + + result = atan2f(det, dot); + + return result; +} + +// Calculate angle defined by a two vectors line +// NOTE: Parameters need to be normalized +// Current implementation should be aligned with glm::angle +RMAPI float Vector2LineAngle(Vector2 start, Vector2 end) +{ + float result = 0.0f; + + // TODO(10/9/2023): Currently angles move clockwise, determine if this is wanted behavior + result = -atan2f(end.y - start.y, end.x - start.x); + + return result; +} + +// Scale vector (multiply by value) +RMAPI Vector2 Vector2Scale(Vector2 v, float scale) +{ + Vector2 result = { v.x*scale, v.y*scale }; + + return result; +} + +// Multiply vector by vector +RMAPI Vector2 Vector2Multiply(Vector2 v1, Vector2 v2) +{ + Vector2 result = { v1.x*v2.x, v1.y*v2.y }; + + return result; +} + +// Negate vector +RMAPI Vector2 Vector2Negate(Vector2 v) +{ + Vector2 result = { -v.x, -v.y }; + + return result; +} + +// Divide vector by vector +RMAPI Vector2 Vector2Divide(Vector2 v1, Vector2 v2) +{ + Vector2 result = { v1.x/v2.x, v1.y/v2.y }; + + return result; +} + +// Normalize provided vector +RMAPI Vector2 Vector2Normalize(Vector2 v) +{ + Vector2 result = { 0 }; + float length = sqrtf((v.x*v.x) + (v.y*v.y)); + + if (length > 0) + { + float ilength = 1.0f/length; + result.x = v.x*ilength; + result.y = v.y*ilength; + } + + return result; +} + +// Transforms a Vector2 by a given Matrix +RMAPI Vector2 Vector2Transform(Vector2 v, Matrix mat) +{ + Vector2 result = { 0 }; + + float x = v.x; + float y = v.y; + float z = 0; + + result.x = mat.m0*x + mat.m4*y + mat.m8*z + mat.m12; + result.y = mat.m1*x + mat.m5*y + mat.m9*z + mat.m13; + + return result; +} + +// Calculate linear interpolation between two vectors +RMAPI Vector2 Vector2Lerp(Vector2 v1, Vector2 v2, float amount) +{ + Vector2 result = { 0 }; + + result.x = v1.x + amount*(v2.x - v1.x); + result.y = v1.y + amount*(v2.y - v1.y); + + return result; +} + +// Calculate reflected vector to normal +RMAPI Vector2 Vector2Reflect(Vector2 v, Vector2 normal) +{ + Vector2 result = { 0 }; + + float dotProduct = (v.x*normal.x + v.y*normal.y); // Dot product + + result.x = v.x - (2.0f*normal.x)*dotProduct; + result.y = v.y - (2.0f*normal.y)*dotProduct; + + return result; +} + +// Get min value for each pair of components +RMAPI Vector2 Vector2Min(Vector2 v1, Vector2 v2) +{ + Vector2 result = { 0 }; + + result.x = fminf(v1.x, v2.x); + result.y = fminf(v1.y, v2.y); + + return result; +} + +// Get max value for each pair of components +RMAPI Vector2 Vector2Max(Vector2 v1, Vector2 v2) +{ + Vector2 result = { 0 }; + + result.x = fmaxf(v1.x, v2.x); + result.y = fmaxf(v1.y, v2.y); + + return result; +} + +// Rotate vector by angle +RMAPI Vector2 Vector2Rotate(Vector2 v, float angle) +{ + Vector2 result = { 0 }; + + float cosres = cosf(angle); + float sinres = sinf(angle); + + result.x = v.x*cosres - v.y*sinres; + result.y = v.x*sinres + v.y*cosres; + + return result; +} + +// Move Vector towards target +RMAPI Vector2 Vector2MoveTowards(Vector2 v, Vector2 target, float maxDistance) +{ + Vector2 result = { 0 }; + + float dx = target.x - v.x; + float dy = target.y - v.y; + float value = (dx*dx) + (dy*dy); + + if ((value == 0) || ((maxDistance >= 0) && (value <= maxDistance*maxDistance))) return target; + + float dist = sqrtf(value); + + result.x = v.x + dx/dist*maxDistance; + result.y = v.y + dy/dist*maxDistance; + + return result; +} + +// Invert the given vector +RMAPI Vector2 Vector2Invert(Vector2 v) +{ + Vector2 result = { 1.0f/v.x, 1.0f/v.y }; + + return result; +} + +// Clamp the components of the vector between +// min and max values specified by the given vectors +RMAPI Vector2 Vector2Clamp(Vector2 v, Vector2 min, Vector2 max) +{ + Vector2 result = { 0 }; + + result.x = fminf(max.x, fmaxf(min.x, v.x)); + result.y = fminf(max.y, fmaxf(min.y, v.y)); + + return result; +} + +// Clamp the magnitude of the vector between two min and max values +RMAPI Vector2 Vector2ClampValue(Vector2 v, float min, float max) +{ + Vector2 result = v; + + float length = (v.x*v.x) + (v.y*v.y); + if (length > 0.0f) + { + length = sqrtf(length); + + float scale = 1; // By default, 1 as the neutral element. + if (length < min) + { + scale = min/length; + } + else if (length > max) + { + scale = max/length; + } + + result.x = v.x*scale; + result.y = v.y*scale; + } + + return result; +} + +// Check whether two given vectors are almost equal +RMAPI int Vector2Equals(Vector2 p, Vector2 q) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))); + + return result; +} + +// Compute the direction of a refracted ray +// v: normalized direction of the incoming ray +// n: normalized normal vector of the interface of two optical media +// r: ratio of the refractive index of the medium from where the ray comes +// to the refractive index of the medium on the other side of the surface +RMAPI Vector2 Vector2Refract(Vector2 v, Vector2 n, float r) +{ + Vector2 result = { 0 }; + + float dot = v.x*n.x + v.y*n.y; + float d = 1.0f - r*r*(1.0f - dot*dot); + + if (d >= 0.0f) + { + d = sqrtf(d); + v.x = r*v.x - (r*dot + d)*n.x; + v.y = r*v.y - (r*dot + d)*n.y; + + result = v; + } + + return result; +} + + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Vector3 math +//---------------------------------------------------------------------------------- + +// Vector with components value 0.0f +RMAPI Vector3 Vector3Zero(void) +{ + Vector3 result = { 0.0f, 0.0f, 0.0f }; + + return result; +} + +// Vector with components value 1.0f +RMAPI Vector3 Vector3One(void) +{ + Vector3 result = { 1.0f, 1.0f, 1.0f }; + + return result; +} + +// Add two vectors +RMAPI Vector3 Vector3Add(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.x + v2.x, v1.y + v2.y, v1.z + v2.z }; + + return result; +} + +// Add vector and float value +RMAPI Vector3 Vector3AddValue(Vector3 v, float add) +{ + Vector3 result = { v.x + add, v.y + add, v.z + add }; + + return result; +} + +// Subtract two vectors +RMAPI Vector3 Vector3Subtract(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.x - v2.x, v1.y - v2.y, v1.z - v2.z }; + + return result; +} + +// Subtract vector by float value +RMAPI Vector3 Vector3SubtractValue(Vector3 v, float sub) +{ + Vector3 result = { v.x - sub, v.y - sub, v.z - sub }; + + return result; +} + +// Multiply vector by scalar +RMAPI Vector3 Vector3Scale(Vector3 v, float scalar) +{ + Vector3 result = { v.x*scalar, v.y*scalar, v.z*scalar }; + + return result; +} + +// Multiply vector by vector +RMAPI Vector3 Vector3Multiply(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.x*v2.x, v1.y*v2.y, v1.z*v2.z }; + + return result; +} + +// Calculate two vectors cross product +RMAPI Vector3 Vector3CrossProduct(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x }; + + return result; +} + +// Calculate one vector perpendicular vector +RMAPI Vector3 Vector3Perpendicular(Vector3 v) +{ + Vector3 result = { 0 }; + + float min = fabsf(v.x); + Vector3 cardinalAxis = {1.0f, 0.0f, 0.0f}; + + if (fabsf(v.y) < min) + { + min = fabsf(v.y); + Vector3 tmp = {0.0f, 1.0f, 0.0f}; + cardinalAxis = tmp; + } + + if (fabsf(v.z) < min) + { + Vector3 tmp = {0.0f, 0.0f, 1.0f}; + cardinalAxis = tmp; + } + + // Cross product between vectors + result.x = v.y*cardinalAxis.z - v.z*cardinalAxis.y; + result.y = v.z*cardinalAxis.x - v.x*cardinalAxis.z; + result.z = v.x*cardinalAxis.y - v.y*cardinalAxis.x; + + return result; +} + +// Calculate vector length +RMAPI float Vector3Length(const Vector3 v) +{ + float result = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + + return result; +} + +// Calculate vector square length +RMAPI float Vector3LengthSqr(const Vector3 v) +{ + float result = v.x*v.x + v.y*v.y + v.z*v.z; + + return result; +} + +// Calculate two vectors dot product +RMAPI float Vector3DotProduct(Vector3 v1, Vector3 v2) +{ + float result = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + + return result; +} + +// Calculate distance between two vectors +RMAPI float Vector3Distance(Vector3 v1, Vector3 v2) +{ + float result = 0.0f; + + float dx = v2.x - v1.x; + float dy = v2.y - v1.y; + float dz = v2.z - v1.z; + result = sqrtf(dx*dx + dy*dy + dz*dz); + + return result; +} + +// Calculate square distance between two vectors +RMAPI float Vector3DistanceSqr(Vector3 v1, Vector3 v2) +{ + float result = 0.0f; + + float dx = v2.x - v1.x; + float dy = v2.y - v1.y; + float dz = v2.z - v1.z; + result = dx*dx + dy*dy + dz*dz; + + return result; +} + +// Calculate angle between two vectors +RMAPI float Vector3Angle(Vector3 v1, Vector3 v2) +{ + float result = 0.0f; + + Vector3 cross = { v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x }; + float len = sqrtf(cross.x*cross.x + cross.y*cross.y + cross.z*cross.z); + float dot = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + result = atan2f(len, dot); + + return result; +} + +// Negate provided vector (invert direction) +RMAPI Vector3 Vector3Negate(Vector3 v) +{ + Vector3 result = { -v.x, -v.y, -v.z }; + + return result; +} + +// Divide vector by vector +RMAPI Vector3 Vector3Divide(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.x/v2.x, v1.y/v2.y, v1.z/v2.z }; + + return result; +} + +// Normalize provided vector +RMAPI Vector3 Vector3Normalize(Vector3 v) +{ + Vector3 result = v; + + float length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length != 0.0f) + { + float ilength = 1.0f/length; + + result.x *= ilength; + result.y *= ilength; + result.z *= ilength; + } + + return result; +} + +//Calculate the projection of the vector v1 on to v2 +RMAPI Vector3 Vector3Project(Vector3 v1, Vector3 v2) +{ + Vector3 result = { 0 }; + + float v1dv2 = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + float v2dv2 = (v2.x*v2.x + v2.y*v2.y + v2.z*v2.z); + + float mag = v1dv2/v2dv2; + + result.x = v2.x*mag; + result.y = v2.y*mag; + result.z = v2.z*mag; + + return result; +} + +//Calculate the rejection of the vector v1 on to v2 +RMAPI Vector3 Vector3Reject(Vector3 v1, Vector3 v2) +{ + Vector3 result = { 0 }; + + float v1dv2 = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + float v2dv2 = (v2.x*v2.x + v2.y*v2.y + v2.z*v2.z); + + float mag = v1dv2/v2dv2; + + result.x = v1.x - (v2.x*mag); + result.y = v1.y - (v2.y*mag); + result.z = v1.z - (v2.z*mag); + + return result; +} + +// Orthonormalize provided vectors +// Makes vectors normalized and orthogonal to each other +// Gram-Schmidt function implementation +RMAPI void Vector3OrthoNormalize(Vector3 *v1, Vector3 *v2) +{ + float length = 0.0f; + float ilength = 0.0f; + + // Vector3Normalize(*v1); + Vector3 v = *v1; + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + v1->x *= ilength; + v1->y *= ilength; + v1->z *= ilength; + + // Vector3CrossProduct(*v1, *v2) + Vector3 vn1 = { v1->y*v2->z - v1->z*v2->y, v1->z*v2->x - v1->x*v2->z, v1->x*v2->y - v1->y*v2->x }; + + // Vector3Normalize(vn1); + v = vn1; + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + vn1.x *= ilength; + vn1.y *= ilength; + vn1.z *= ilength; + + // Vector3CrossProduct(vn1, *v1) + Vector3 vn2 = { vn1.y*v1->z - vn1.z*v1->y, vn1.z*v1->x - vn1.x*v1->z, vn1.x*v1->y - vn1.y*v1->x }; + + *v2 = vn2; +} + +// Transforms a Vector3 by a given Matrix +RMAPI Vector3 Vector3Transform(Vector3 v, Matrix mat) +{ + Vector3 result = { 0 }; + + float x = v.x; + float y = v.y; + float z = v.z; + + result.x = mat.m0*x + mat.m4*y + mat.m8*z + mat.m12; + result.y = mat.m1*x + mat.m5*y + mat.m9*z + mat.m13; + result.z = mat.m2*x + mat.m6*y + mat.m10*z + mat.m14; + + return result; +} + +// Transform a vector by quaternion rotation +RMAPI Vector3 Vector3RotateByQuaternion(Vector3 v, Quaternion q) +{ + Vector3 result = { 0 }; + + result.x = v.x*(q.x*q.x + q.w*q.w - q.y*q.y - q.z*q.z) + v.y*(2*q.x*q.y - 2*q.w*q.z) + v.z*(2*q.x*q.z + 2*q.w*q.y); + result.y = v.x*(2*q.w*q.z + 2*q.x*q.y) + v.y*(q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z) + v.z*(-2*q.w*q.x + 2*q.y*q.z); + result.z = v.x*(-2*q.w*q.y + 2*q.x*q.z) + v.y*(2*q.w*q.x + 2*q.y*q.z)+ v.z*(q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z); + + return result; +} + +// Rotates a vector around an axis +RMAPI Vector3 Vector3RotateByAxisAngle(Vector3 v, Vector3 axis, float angle) +{ + // Using Euler-Rodrigues Formula + // Ref.: https://en.wikipedia.org/w/index.php?title=Euler%E2%80%93Rodrigues_formula + + Vector3 result = v; + + // Vector3Normalize(axis); + float length = sqrtf(axis.x*axis.x + axis.y*axis.y + axis.z*axis.z); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + axis.x *= ilength; + axis.y *= ilength; + axis.z *= ilength; + + angle /= 2.0f; + float a = sinf(angle); + float b = axis.x*a; + float c = axis.y*a; + float d = axis.z*a; + a = cosf(angle); + Vector3 w = { b, c, d }; + + // Vector3CrossProduct(w, v) + Vector3 wv = { w.y*v.z - w.z*v.y, w.z*v.x - w.x*v.z, w.x*v.y - w.y*v.x }; + + // Vector3CrossProduct(w, wv) + Vector3 wwv = { w.y*wv.z - w.z*wv.y, w.z*wv.x - w.x*wv.z, w.x*wv.y - w.y*wv.x }; + + // Vector3Scale(wv, 2*a) + a *= 2; + wv.x *= a; + wv.y *= a; + wv.z *= a; + + // Vector3Scale(wwv, 2) + wwv.x *= 2; + wwv.y *= 2; + wwv.z *= 2; + + result.x += wv.x; + result.y += wv.y; + result.z += wv.z; + + result.x += wwv.x; + result.y += wwv.y; + result.z += wwv.z; + + return result; +} + +// Move Vector towards target +RMAPI Vector3 Vector3MoveTowards(Vector3 v, Vector3 target, float maxDistance) +{ + Vector3 result = { 0 }; + + float dx = target.x - v.x; + float dy = target.y - v.y; + float dz = target.z - v.z; + float value = (dx*dx) + (dy*dy) + (dz*dz); + + if ((value == 0) || ((maxDistance >= 0) && (value <= maxDistance*maxDistance))) return target; + + float dist = sqrtf(value); + + result.x = v.x + dx/dist*maxDistance; + result.y = v.y + dy/dist*maxDistance; + result.z = v.z + dz/dist*maxDistance; + + return result; +} + +// Calculate linear interpolation between two vectors +RMAPI Vector3 Vector3Lerp(Vector3 v1, Vector3 v2, float amount) +{ + Vector3 result = { 0 }; + + result.x = v1.x + amount*(v2.x - v1.x); + result.y = v1.y + amount*(v2.y - v1.y); + result.z = v1.z + amount*(v2.z - v1.z); + + return result; +} + +// Calculate cubic hermite interpolation between two vectors and their tangents +// as described in the GLTF 2.0 specification: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#interpolation-cubic +RMAPI Vector3 Vector3CubicHermite(Vector3 v1, Vector3 tangent1, Vector3 v2, Vector3 tangent2, float amount) +{ + Vector3 result = { 0 }; + + float amountPow2 = amount*amount; + float amountPow3 = amount*amount*amount; + + result.x = (2*amountPow3 - 3*amountPow2 + 1)*v1.x + (amountPow3 - 2*amountPow2 + amount)*tangent1.x + (-2*amountPow3 + 3*amountPow2)*v2.x + (amountPow3 - amountPow2)*tangent2.x; + result.y = (2*amountPow3 - 3*amountPow2 + 1)*v1.y + (amountPow3 - 2*amountPow2 + amount)*tangent1.y + (-2*amountPow3 + 3*amountPow2)*v2.y + (amountPow3 - amountPow2)*tangent2.y; + result.z = (2*amountPow3 - 3*amountPow2 + 1)*v1.z + (amountPow3 - 2*amountPow2 + amount)*tangent1.z + (-2*amountPow3 + 3*amountPow2)*v2.z + (amountPow3 - amountPow2)*tangent2.z; + + return result; +} + +// Calculate reflected vector to normal +RMAPI Vector3 Vector3Reflect(Vector3 v, Vector3 normal) +{ + Vector3 result = { 0 }; + + // I is the original vector + // N is the normal of the incident plane + // R = I - (2*N*(DotProduct[I, N])) + + float dotProduct = (v.x*normal.x + v.y*normal.y + v.z*normal.z); + + result.x = v.x - (2.0f*normal.x)*dotProduct; + result.y = v.y - (2.0f*normal.y)*dotProduct; + result.z = v.z - (2.0f*normal.z)*dotProduct; + + return result; +} + +// Get min value for each pair of components +RMAPI Vector3 Vector3Min(Vector3 v1, Vector3 v2) +{ + Vector3 result = { 0 }; + + result.x = fminf(v1.x, v2.x); + result.y = fminf(v1.y, v2.y); + result.z = fminf(v1.z, v2.z); + + return result; +} + +// Get max value for each pair of components +RMAPI Vector3 Vector3Max(Vector3 v1, Vector3 v2) +{ + Vector3 result = { 0 }; + + result.x = fmaxf(v1.x, v2.x); + result.y = fmaxf(v1.y, v2.y); + result.z = fmaxf(v1.z, v2.z); + + return result; +} + +// Compute barycenter coordinates (u, v, w) for point p with respect to triangle (a, b, c) +// NOTE: Assumes P is on the plane of the triangle +RMAPI Vector3 Vector3Barycenter(Vector3 p, Vector3 a, Vector3 b, Vector3 c) +{ + Vector3 result = { 0 }; + + Vector3 v0 = { b.x - a.x, b.y - a.y, b.z - a.z }; // Vector3Subtract(b, a) + Vector3 v1 = { c.x - a.x, c.y - a.y, c.z - a.z }; // Vector3Subtract(c, a) + Vector3 v2 = { p.x - a.x, p.y - a.y, p.z - a.z }; // Vector3Subtract(p, a) + float d00 = (v0.x*v0.x + v0.y*v0.y + v0.z*v0.z); // Vector3DotProduct(v0, v0) + float d01 = (v0.x*v1.x + v0.y*v1.y + v0.z*v1.z); // Vector3DotProduct(v0, v1) + float d11 = (v1.x*v1.x + v1.y*v1.y + v1.z*v1.z); // Vector3DotProduct(v1, v1) + float d20 = (v2.x*v0.x + v2.y*v0.y + v2.z*v0.z); // Vector3DotProduct(v2, v0) + float d21 = (v2.x*v1.x + v2.y*v1.y + v2.z*v1.z); // Vector3DotProduct(v2, v1) + + float denom = d00*d11 - d01*d01; + + result.y = (d11*d20 - d01*d21)/denom; + result.z = (d00*d21 - d01*d20)/denom; + result.x = 1.0f - (result.z + result.y); + + return result; +} + +// Projects a Vector3 from screen space into object space +// NOTE: We are avoiding calling other raymath functions despite available +RMAPI Vector3 Vector3Unproject(Vector3 source, Matrix projection, Matrix view) +{ + Vector3 result = { 0 }; + + // Calculate unprojected matrix (multiply view matrix by projection matrix) and invert it + Matrix matViewProj = { // MatrixMultiply(view, projection); + view.m0*projection.m0 + view.m1*projection.m4 + view.m2*projection.m8 + view.m3*projection.m12, + view.m0*projection.m1 + view.m1*projection.m5 + view.m2*projection.m9 + view.m3*projection.m13, + view.m0*projection.m2 + view.m1*projection.m6 + view.m2*projection.m10 + view.m3*projection.m14, + view.m0*projection.m3 + view.m1*projection.m7 + view.m2*projection.m11 + view.m3*projection.m15, + view.m4*projection.m0 + view.m5*projection.m4 + view.m6*projection.m8 + view.m7*projection.m12, + view.m4*projection.m1 + view.m5*projection.m5 + view.m6*projection.m9 + view.m7*projection.m13, + view.m4*projection.m2 + view.m5*projection.m6 + view.m6*projection.m10 + view.m7*projection.m14, + view.m4*projection.m3 + view.m5*projection.m7 + view.m6*projection.m11 + view.m7*projection.m15, + view.m8*projection.m0 + view.m9*projection.m4 + view.m10*projection.m8 + view.m11*projection.m12, + view.m8*projection.m1 + view.m9*projection.m5 + view.m10*projection.m9 + view.m11*projection.m13, + view.m8*projection.m2 + view.m9*projection.m6 + view.m10*projection.m10 + view.m11*projection.m14, + view.m8*projection.m3 + view.m9*projection.m7 + view.m10*projection.m11 + view.m11*projection.m15, + view.m12*projection.m0 + view.m13*projection.m4 + view.m14*projection.m8 + view.m15*projection.m12, + view.m12*projection.m1 + view.m13*projection.m5 + view.m14*projection.m9 + view.m15*projection.m13, + view.m12*projection.m2 + view.m13*projection.m6 + view.m14*projection.m10 + view.m15*projection.m14, + view.m12*projection.m3 + view.m13*projection.m7 + view.m14*projection.m11 + view.m15*projection.m15 }; + + // Calculate inverted matrix -> MatrixInvert(matViewProj); + // Cache the matrix values (speed optimization) + float a00 = matViewProj.m0, a01 = matViewProj.m1, a02 = matViewProj.m2, a03 = matViewProj.m3; + float a10 = matViewProj.m4, a11 = matViewProj.m5, a12 = matViewProj.m6, a13 = matViewProj.m7; + float a20 = matViewProj.m8, a21 = matViewProj.m9, a22 = matViewProj.m10, a23 = matViewProj.m11; + float a30 = matViewProj.m12, a31 = matViewProj.m13, a32 = matViewProj.m14, a33 = matViewProj.m15; + + float b00 = a00*a11 - a01*a10; + float b01 = a00*a12 - a02*a10; + float b02 = a00*a13 - a03*a10; + float b03 = a01*a12 - a02*a11; + float b04 = a01*a13 - a03*a11; + float b05 = a02*a13 - a03*a12; + float b06 = a20*a31 - a21*a30; + float b07 = a20*a32 - a22*a30; + float b08 = a20*a33 - a23*a30; + float b09 = a21*a32 - a22*a31; + float b10 = a21*a33 - a23*a31; + float b11 = a22*a33 - a23*a32; + + // Calculate the invert determinant (inlined to avoid double-caching) + float invDet = 1.0f/(b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06); + + Matrix matViewProjInv = { + (a11*b11 - a12*b10 + a13*b09)*invDet, + (-a01*b11 + a02*b10 - a03*b09)*invDet, + (a31*b05 - a32*b04 + a33*b03)*invDet, + (-a21*b05 + a22*b04 - a23*b03)*invDet, + (-a10*b11 + a12*b08 - a13*b07)*invDet, + (a00*b11 - a02*b08 + a03*b07)*invDet, + (-a30*b05 + a32*b02 - a33*b01)*invDet, + (a20*b05 - a22*b02 + a23*b01)*invDet, + (a10*b10 - a11*b08 + a13*b06)*invDet, + (-a00*b10 + a01*b08 - a03*b06)*invDet, + (a30*b04 - a31*b02 + a33*b00)*invDet, + (-a20*b04 + a21*b02 - a23*b00)*invDet, + (-a10*b09 + a11*b07 - a12*b06)*invDet, + (a00*b09 - a01*b07 + a02*b06)*invDet, + (-a30*b03 + a31*b01 - a32*b00)*invDet, + (a20*b03 - a21*b01 + a22*b00)*invDet }; + + // Create quaternion from source point + Quaternion quat = { source.x, source.y, source.z, 1.0f }; + + // Multiply quat point by unprojecte matrix + Quaternion qtransformed = { // QuaternionTransform(quat, matViewProjInv) + matViewProjInv.m0*quat.x + matViewProjInv.m4*quat.y + matViewProjInv.m8*quat.z + matViewProjInv.m12*quat.w, + matViewProjInv.m1*quat.x + matViewProjInv.m5*quat.y + matViewProjInv.m9*quat.z + matViewProjInv.m13*quat.w, + matViewProjInv.m2*quat.x + matViewProjInv.m6*quat.y + matViewProjInv.m10*quat.z + matViewProjInv.m14*quat.w, + matViewProjInv.m3*quat.x + matViewProjInv.m7*quat.y + matViewProjInv.m11*quat.z + matViewProjInv.m15*quat.w }; + + // Normalized world points in vectors + result.x = qtransformed.x/qtransformed.w; + result.y = qtransformed.y/qtransformed.w; + result.z = qtransformed.z/qtransformed.w; + + return result; +} + +// Get Vector3 as float array +RMAPI float3 Vector3ToFloatV(Vector3 v) +{ + float3 buffer = { 0 }; + + buffer.v[0] = v.x; + buffer.v[1] = v.y; + buffer.v[2] = v.z; + + return buffer; +} + +// Invert the given vector +RMAPI Vector3 Vector3Invert(Vector3 v) +{ + Vector3 result = { 1.0f/v.x, 1.0f/v.y, 1.0f/v.z }; + + return result; +} + +// Clamp the components of the vector between +// min and max values specified by the given vectors +RMAPI Vector3 Vector3Clamp(Vector3 v, Vector3 min, Vector3 max) +{ + Vector3 result = { 0 }; + + result.x = fminf(max.x, fmaxf(min.x, v.x)); + result.y = fminf(max.y, fmaxf(min.y, v.y)); + result.z = fminf(max.z, fmaxf(min.z, v.z)); + + return result; +} + +// Clamp the magnitude of the vector between two values +RMAPI Vector3 Vector3ClampValue(Vector3 v, float min, float max) +{ + Vector3 result = v; + + float length = (v.x*v.x) + (v.y*v.y) + (v.z*v.z); + if (length > 0.0f) + { + length = sqrtf(length); + + float scale = 1; // By default, 1 as the neutral element. + if (length < min) + { + scale = min/length; + } + else if (length > max) + { + scale = max/length; + } + + result.x = v.x*scale; + result.y = v.y*scale; + result.z = v.z*scale; + } + + return result; +} + +// Check whether two given vectors are almost equal +RMAPI int Vector3Equals(Vector3 p, Vector3 q) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && + ((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))); + + return result; +} + +// Compute the direction of a refracted ray +// v: normalized direction of the incoming ray +// n: normalized normal vector of the interface of two optical media +// r: ratio of the refractive index of the medium from where the ray comes +// to the refractive index of the medium on the other side of the surface +RMAPI Vector3 Vector3Refract(Vector3 v, Vector3 n, float r) +{ + Vector3 result = { 0 }; + + float dot = v.x*n.x + v.y*n.y + v.z*n.z; + float d = 1.0f - r*r*(1.0f - dot*dot); + + if (d >= 0.0f) + { + d = sqrtf(d); + v.x = r*v.x - (r*dot + d)*n.x; + v.y = r*v.y - (r*dot + d)*n.y; + v.z = r*v.z - (r*dot + d)*n.z; + + result = v; + } + + return result; +} + + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Vector4 math +//---------------------------------------------------------------------------------- + +RMAPI Vector4 Vector4Zero(void) +{ + Vector4 result = { 0.0f, 0.0f, 0.0f, 0.0f }; + return result; +} + +RMAPI Vector4 Vector4One(void) +{ + Vector4 result = { 1.0f, 1.0f, 1.0f, 1.0f }; + return result; +} + +RMAPI Vector4 Vector4Add(Vector4 v1, Vector4 v2) +{ + Vector4 result = { + v1.x + v2.x, + v1.y + v2.y, + v1.z + v2.z, + v1.w + v2.w + }; + return result; +} + +RMAPI Vector4 Vector4AddValue(Vector4 v, float add) +{ + Vector4 result = { + v.x + add, + v.y + add, + v.z + add, + v.w + add + }; + return result; +} + +RMAPI Vector4 Vector4Subtract(Vector4 v1, Vector4 v2) +{ + Vector4 result = { + v1.x - v2.x, + v1.y - v2.y, + v1.z - v2.z, + v1.w - v2.w + }; + return result; +} + +RMAPI Vector4 Vector4SubtractValue(Vector4 v, float add) +{ + Vector4 result = { + v.x - add, + v.y - add, + v.z - add, + v.w - add + }; + return result; +} + +RMAPI float Vector4Length(Vector4 v) +{ + float result = sqrtf((v.x*v.x) + (v.y*v.y) + (v.z*v.z) + (v.w*v.w)); + return result; +} + +RMAPI float Vector4LengthSqr(Vector4 v) +{ + float result = (v.x*v.x) + (v.y*v.y) + (v.z*v.z) + (v.w*v.w); + return result; +} + +RMAPI float Vector4DotProduct(Vector4 v1, Vector4 v2) +{ + float result = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z + v1.w*v2.w); + return result; +} + +// Calculate distance between two vectors +RMAPI float Vector4Distance(Vector4 v1, Vector4 v2) +{ + float result = sqrtf( + (v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y) + + (v1.z - v2.z)*(v1.z - v2.z) + (v1.w - v2.w)*(v1.w - v2.w)); + return result; +} + +// Calculate square distance between two vectors +RMAPI float Vector4DistanceSqr(Vector4 v1, Vector4 v2) +{ + float result = + (v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y) + + (v1.z - v2.z)*(v1.z - v2.z) + (v1.w - v2.w)*(v1.w - v2.w); + + return result; +} + +RMAPI Vector4 Vector4Scale(Vector4 v, float scale) +{ + Vector4 result = { v.x*scale, v.y*scale, v.z*scale, v.w*scale }; + return result; +} + +// Multiply vector by vector +RMAPI Vector4 Vector4Multiply(Vector4 v1, Vector4 v2) +{ + Vector4 result = { v1.x*v2.x, v1.y*v2.y, v1.z*v2.z, v1.w*v2.w }; + return result; +} + +// Negate vector +RMAPI Vector4 Vector4Negate(Vector4 v) +{ + Vector4 result = { -v.x, -v.y, -v.z, -v.w }; + return result; +} + +// Divide vector by vector +RMAPI Vector4 Vector4Divide(Vector4 v1, Vector4 v2) +{ + Vector4 result = { v1.x/v2.x, v1.y/v2.y, v1.z/v2.z, v1.w/v2.w }; + return result; +} + +// Normalize provided vector +RMAPI Vector4 Vector4Normalize(Vector4 v) +{ + Vector4 result = { 0 }; + float length = sqrtf((v.x*v.x) + (v.y*v.y) + (v.z*v.z) + (v.w*v.w)); + + if (length > 0) + { + float ilength = 1.0f/length; + result.x = v.x*ilength; + result.y = v.y*ilength; + result.z = v.z*ilength; + result.w = v.w*ilength; + } + + return result; +} + +// Get min value for each pair of components +RMAPI Vector4 Vector4Min(Vector4 v1, Vector4 v2) +{ + Vector4 result = { 0 }; + + result.x = fminf(v1.x, v2.x); + result.y = fminf(v1.y, v2.y); + result.z = fminf(v1.z, v2.z); + result.w = fminf(v1.w, v2.w); + + return result; +} + +// Get max value for each pair of components +RMAPI Vector4 Vector4Max(Vector4 v1, Vector4 v2) +{ + Vector4 result = { 0 }; + + result.x = fmaxf(v1.x, v2.x); + result.y = fmaxf(v1.y, v2.y); + result.z = fmaxf(v1.z, v2.z); + result.w = fmaxf(v1.w, v2.w); + + return result; +} + +// Calculate linear interpolation between two vectors +RMAPI Vector4 Vector4Lerp(Vector4 v1, Vector4 v2, float amount) +{ + Vector4 result = { 0 }; + + result.x = v1.x + amount*(v2.x - v1.x); + result.y = v1.y + amount*(v2.y - v1.y); + result.z = v1.z + amount*(v2.z - v1.z); + result.w = v1.w + amount*(v2.w - v1.w); + + return result; +} + +// Move Vector towards target +RMAPI Vector4 Vector4MoveTowards(Vector4 v, Vector4 target, float maxDistance) +{ + Vector4 result = { 0 }; + + float dx = target.x - v.x; + float dy = target.y - v.y; + float dz = target.z - v.z; + float dw = target.w - v.w; + float value = (dx*dx) + (dy*dy) + (dz*dz) + (dw*dw); + + if ((value == 0) || ((maxDistance >= 0) && (value <= maxDistance*maxDistance))) return target; + + float dist = sqrtf(value); + + result.x = v.x + dx/dist*maxDistance; + result.y = v.y + dy/dist*maxDistance; + result.z = v.z + dz/dist*maxDistance; + result.w = v.w + dw/dist*maxDistance; + + return result; +} + +// Invert the given vector +RMAPI Vector4 Vector4Invert(Vector4 v) +{ + Vector4 result = { 1.0f/v.x, 1.0f/v.y, 1.0f/v.z, 1.0f/v.w }; + return result; +} + +// Check whether two given vectors are almost equal +RMAPI int Vector4Equals(Vector4 p, Vector4 q) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && + ((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) && + ((fabsf(p.w - q.w)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.w), fabsf(q.w))))); + return result; +} + + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Matrix math +//---------------------------------------------------------------------------------- + +// Compute matrix determinant +RMAPI float MatrixDeterminant(Matrix mat) +{ + float result = 0.0f; + + // Cache the matrix values (speed optimization) + float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3; + float a10 = mat.m4, a11 = mat.m5, a12 = mat.m6, a13 = mat.m7; + float a20 = mat.m8, a21 = mat.m9, a22 = mat.m10, a23 = mat.m11; + float a30 = mat.m12, a31 = mat.m13, a32 = mat.m14, a33 = mat.m15; + + result = a30*a21*a12*a03 - a20*a31*a12*a03 - a30*a11*a22*a03 + a10*a31*a22*a03 + + a20*a11*a32*a03 - a10*a21*a32*a03 - a30*a21*a02*a13 + a20*a31*a02*a13 + + a30*a01*a22*a13 - a00*a31*a22*a13 - a20*a01*a32*a13 + a00*a21*a32*a13 + + a30*a11*a02*a23 - a10*a31*a02*a23 - a30*a01*a12*a23 + a00*a31*a12*a23 + + a10*a01*a32*a23 - a00*a11*a32*a23 - a20*a11*a02*a33 + a10*a21*a02*a33 + + a20*a01*a12*a33 - a00*a21*a12*a33 - a10*a01*a22*a33 + a00*a11*a22*a33; + + return result; +} + +// Get the trace of the matrix (sum of the values along the diagonal) +RMAPI float MatrixTrace(Matrix mat) +{ + float result = (mat.m0 + mat.m5 + mat.m10 + mat.m15); + + return result; +} + +// Transposes provided matrix +RMAPI Matrix MatrixTranspose(Matrix mat) +{ + Matrix result = { 0 }; + + result.m0 = mat.m0; + result.m1 = mat.m4; + result.m2 = mat.m8; + result.m3 = mat.m12; + result.m4 = mat.m1; + result.m5 = mat.m5; + result.m6 = mat.m9; + result.m7 = mat.m13; + result.m8 = mat.m2; + result.m9 = mat.m6; + result.m10 = mat.m10; + result.m11 = mat.m14; + result.m12 = mat.m3; + result.m13 = mat.m7; + result.m14 = mat.m11; + result.m15 = mat.m15; + + return result; +} + +// Invert provided matrix +RMAPI Matrix MatrixInvert(Matrix mat) +{ + Matrix result = { 0 }; + + // Cache the matrix values (speed optimization) + float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3; + float a10 = mat.m4, a11 = mat.m5, a12 = mat.m6, a13 = mat.m7; + float a20 = mat.m8, a21 = mat.m9, a22 = mat.m10, a23 = mat.m11; + float a30 = mat.m12, a31 = mat.m13, a32 = mat.m14, a33 = mat.m15; + + float b00 = a00*a11 - a01*a10; + float b01 = a00*a12 - a02*a10; + float b02 = a00*a13 - a03*a10; + float b03 = a01*a12 - a02*a11; + float b04 = a01*a13 - a03*a11; + float b05 = a02*a13 - a03*a12; + float b06 = a20*a31 - a21*a30; + float b07 = a20*a32 - a22*a30; + float b08 = a20*a33 - a23*a30; + float b09 = a21*a32 - a22*a31; + float b10 = a21*a33 - a23*a31; + float b11 = a22*a33 - a23*a32; + + // Calculate the invert determinant (inlined to avoid double-caching) + float invDet = 1.0f/(b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06); + + result.m0 = (a11*b11 - a12*b10 + a13*b09)*invDet; + result.m1 = (-a01*b11 + a02*b10 - a03*b09)*invDet; + result.m2 = (a31*b05 - a32*b04 + a33*b03)*invDet; + result.m3 = (-a21*b05 + a22*b04 - a23*b03)*invDet; + result.m4 = (-a10*b11 + a12*b08 - a13*b07)*invDet; + result.m5 = (a00*b11 - a02*b08 + a03*b07)*invDet; + result.m6 = (-a30*b05 + a32*b02 - a33*b01)*invDet; + result.m7 = (a20*b05 - a22*b02 + a23*b01)*invDet; + result.m8 = (a10*b10 - a11*b08 + a13*b06)*invDet; + result.m9 = (-a00*b10 + a01*b08 - a03*b06)*invDet; + result.m10 = (a30*b04 - a31*b02 + a33*b00)*invDet; + result.m11 = (-a20*b04 + a21*b02 - a23*b00)*invDet; + result.m12 = (-a10*b09 + a11*b07 - a12*b06)*invDet; + result.m13 = (a00*b09 - a01*b07 + a02*b06)*invDet; + result.m14 = (-a30*b03 + a31*b01 - a32*b00)*invDet; + result.m15 = (a20*b03 - a21*b01 + a22*b00)*invDet; + + return result; +} + +// Get identity matrix +RMAPI Matrix MatrixIdentity(void) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; + + return result; +} + +// Add two matrices +RMAPI Matrix MatrixAdd(Matrix left, Matrix right) +{ + Matrix result = { 0 }; + + result.m0 = left.m0 + right.m0; + result.m1 = left.m1 + right.m1; + result.m2 = left.m2 + right.m2; + result.m3 = left.m3 + right.m3; + result.m4 = left.m4 + right.m4; + result.m5 = left.m5 + right.m5; + result.m6 = left.m6 + right.m6; + result.m7 = left.m7 + right.m7; + result.m8 = left.m8 + right.m8; + result.m9 = left.m9 + right.m9; + result.m10 = left.m10 + right.m10; + result.m11 = left.m11 + right.m11; + result.m12 = left.m12 + right.m12; + result.m13 = left.m13 + right.m13; + result.m14 = left.m14 + right.m14; + result.m15 = left.m15 + right.m15; + + return result; +} + +// Subtract two matrices (left - right) +RMAPI Matrix MatrixSubtract(Matrix left, Matrix right) +{ + Matrix result = { 0 }; + + result.m0 = left.m0 - right.m0; + result.m1 = left.m1 - right.m1; + result.m2 = left.m2 - right.m2; + result.m3 = left.m3 - right.m3; + result.m4 = left.m4 - right.m4; + result.m5 = left.m5 - right.m5; + result.m6 = left.m6 - right.m6; + result.m7 = left.m7 - right.m7; + result.m8 = left.m8 - right.m8; + result.m9 = left.m9 - right.m9; + result.m10 = left.m10 - right.m10; + result.m11 = left.m11 - right.m11; + result.m12 = left.m12 - right.m12; + result.m13 = left.m13 - right.m13; + result.m14 = left.m14 - right.m14; + result.m15 = left.m15 - right.m15; + + return result; +} + +// Get two matrix multiplication +// NOTE: When multiplying matrices... the order matters! +RMAPI Matrix MatrixMultiply(Matrix left, Matrix right) +{ + Matrix result = { 0 }; + + result.m0 = left.m0*right.m0 + left.m1*right.m4 + left.m2*right.m8 + left.m3*right.m12; + result.m1 = left.m0*right.m1 + left.m1*right.m5 + left.m2*right.m9 + left.m3*right.m13; + result.m2 = left.m0*right.m2 + left.m1*right.m6 + left.m2*right.m10 + left.m3*right.m14; + result.m3 = left.m0*right.m3 + left.m1*right.m7 + left.m2*right.m11 + left.m3*right.m15; + result.m4 = left.m4*right.m0 + left.m5*right.m4 + left.m6*right.m8 + left.m7*right.m12; + result.m5 = left.m4*right.m1 + left.m5*right.m5 + left.m6*right.m9 + left.m7*right.m13; + result.m6 = left.m4*right.m2 + left.m5*right.m6 + left.m6*right.m10 + left.m7*right.m14; + result.m7 = left.m4*right.m3 + left.m5*right.m7 + left.m6*right.m11 + left.m7*right.m15; + result.m8 = left.m8*right.m0 + left.m9*right.m4 + left.m10*right.m8 + left.m11*right.m12; + result.m9 = left.m8*right.m1 + left.m9*right.m5 + left.m10*right.m9 + left.m11*right.m13; + result.m10 = left.m8*right.m2 + left.m9*right.m6 + left.m10*right.m10 + left.m11*right.m14; + result.m11 = left.m8*right.m3 + left.m9*right.m7 + left.m10*right.m11 + left.m11*right.m15; + result.m12 = left.m12*right.m0 + left.m13*right.m4 + left.m14*right.m8 + left.m15*right.m12; + result.m13 = left.m12*right.m1 + left.m13*right.m5 + left.m14*right.m9 + left.m15*right.m13; + result.m14 = left.m12*right.m2 + left.m13*right.m6 + left.m14*right.m10 + left.m15*right.m14; + result.m15 = left.m12*right.m3 + left.m13*right.m7 + left.m14*right.m11 + left.m15*right.m15; + + return result; +} + +// Get translation matrix +RMAPI Matrix MatrixTranslate(float x, float y, float z) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, x, + 0.0f, 1.0f, 0.0f, y, + 0.0f, 0.0f, 1.0f, z, + 0.0f, 0.0f, 0.0f, 1.0f }; + + return result; +} + +// Create rotation matrix from axis and angle +// NOTE: Angle should be provided in radians +RMAPI Matrix MatrixRotate(Vector3 axis, float angle) +{ + Matrix result = { 0 }; + + float x = axis.x, y = axis.y, z = axis.z; + + float lengthSquared = x*x + y*y + z*z; + + if ((lengthSquared != 1.0f) && (lengthSquared != 0.0f)) + { + float ilength = 1.0f/sqrtf(lengthSquared); + x *= ilength; + y *= ilength; + z *= ilength; + } + + float sinres = sinf(angle); + float cosres = cosf(angle); + float t = 1.0f - cosres; + + result.m0 = x*x*t + cosres; + result.m1 = y*x*t + z*sinres; + result.m2 = z*x*t - y*sinres; + result.m3 = 0.0f; + + result.m4 = x*y*t - z*sinres; + result.m5 = y*y*t + cosres; + result.m6 = z*y*t + x*sinres; + result.m7 = 0.0f; + + result.m8 = x*z*t + y*sinres; + result.m9 = y*z*t - x*sinres; + result.m10 = z*z*t + cosres; + result.m11 = 0.0f; + + result.m12 = 0.0f; + result.m13 = 0.0f; + result.m14 = 0.0f; + result.m15 = 1.0f; + + return result; +} + +// Get x-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateX(float angle) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float cosres = cosf(angle); + float sinres = sinf(angle); + + result.m5 = cosres; + result.m6 = sinres; + result.m9 = -sinres; + result.m10 = cosres; + + return result; +} + +// Get y-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateY(float angle) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float cosres = cosf(angle); + float sinres = sinf(angle); + + result.m0 = cosres; + result.m2 = -sinres; + result.m8 = sinres; + result.m10 = cosres; + + return result; +} + +// Get z-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateZ(float angle) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float cosres = cosf(angle); + float sinres = sinf(angle); + + result.m0 = cosres; + result.m1 = sinres; + result.m4 = -sinres; + result.m5 = cosres; + + return result; +} + + +// Get xyz-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateXYZ(Vector3 angle) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float cosz = cosf(-angle.z); + float sinz = sinf(-angle.z); + float cosy = cosf(-angle.y); + float siny = sinf(-angle.y); + float cosx = cosf(-angle.x); + float sinx = sinf(-angle.x); + + result.m0 = cosz*cosy; + result.m1 = (cosz*siny*sinx) - (sinz*cosx); + result.m2 = (cosz*siny*cosx) + (sinz*sinx); + + result.m4 = sinz*cosy; + result.m5 = (sinz*siny*sinx) + (cosz*cosx); + result.m6 = (sinz*siny*cosx) - (cosz*sinx); + + result.m8 = -siny; + result.m9 = cosy*sinx; + result.m10= cosy*cosx; + + return result; +} + +// Get zyx-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateZYX(Vector3 angle) +{ + Matrix result = { 0 }; + + float cz = cosf(angle.z); + float sz = sinf(angle.z); + float cy = cosf(angle.y); + float sy = sinf(angle.y); + float cx = cosf(angle.x); + float sx = sinf(angle.x); + + result.m0 = cz*cy; + result.m4 = cz*sy*sx - cx*sz; + result.m8 = sz*sx + cz*cx*sy; + result.m12 = 0; + + result.m1 = cy*sz; + result.m5 = cz*cx + sz*sy*sx; + result.m9 = cx*sz*sy - cz*sx; + result.m13 = 0; + + result.m2 = -sy; + result.m6 = cy*sx; + result.m10 = cy*cx; + result.m14 = 0; + + result.m3 = 0; + result.m7 = 0; + result.m11 = 0; + result.m15 = 1; + + return result; +} + +// Get scaling matrix +RMAPI Matrix MatrixScale(float x, float y, float z) +{ + Matrix result = { x, 0.0f, 0.0f, 0.0f, + 0.0f, y, 0.0f, 0.0f, + 0.0f, 0.0f, z, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; + + return result; +} + +// Get perspective projection matrix +RMAPI Matrix MatrixFrustum(double left, double right, double bottom, double top, double nearPlane, double farPlane) +{ + Matrix result = { 0 }; + + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(farPlane - nearPlane); + + result.m0 = ((float)nearPlane*2.0f)/rl; + result.m1 = 0.0f; + result.m2 = 0.0f; + result.m3 = 0.0f; + + result.m4 = 0.0f; + result.m5 = ((float)nearPlane*2.0f)/tb; + result.m6 = 0.0f; + result.m7 = 0.0f; + + result.m8 = ((float)right + (float)left)/rl; + result.m9 = ((float)top + (float)bottom)/tb; + result.m10 = -((float)farPlane + (float)nearPlane)/fn; + result.m11 = -1.0f; + + result.m12 = 0.0f; + result.m13 = 0.0f; + result.m14 = -((float)farPlane*(float)nearPlane*2.0f)/fn; + result.m15 = 0.0f; + + return result; +} + +// Get perspective projection matrix +// NOTE: Fovy angle must be provided in radians +RMAPI Matrix MatrixPerspective(double fovY, double aspect, double nearPlane, double farPlane) +{ + Matrix result = { 0 }; + + double top = nearPlane*tan(fovY*0.5); + double bottom = -top; + double right = top*aspect; + double left = -right; + + // MatrixFrustum(-right, right, -top, top, near, far); + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(farPlane - nearPlane); + + result.m0 = ((float)nearPlane*2.0f)/rl; + result.m5 = ((float)nearPlane*2.0f)/tb; + result.m8 = ((float)right + (float)left)/rl; + result.m9 = ((float)top + (float)bottom)/tb; + result.m10 = -((float)farPlane + (float)nearPlane)/fn; + result.m11 = -1.0f; + result.m14 = -((float)farPlane*(float)nearPlane*2.0f)/fn; + + return result; +} + +// Get orthographic projection matrix +RMAPI Matrix MatrixOrtho(double left, double right, double bottom, double top, double nearPlane, double farPlane) +{ + Matrix result = { 0 }; + + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(farPlane - nearPlane); + + result.m0 = 2.0f/rl; + result.m1 = 0.0f; + result.m2 = 0.0f; + result.m3 = 0.0f; + result.m4 = 0.0f; + result.m5 = 2.0f/tb; + result.m6 = 0.0f; + result.m7 = 0.0f; + result.m8 = 0.0f; + result.m9 = 0.0f; + result.m10 = -2.0f/fn; + result.m11 = 0.0f; + result.m12 = -((float)left + (float)right)/rl; + result.m13 = -((float)top + (float)bottom)/tb; + result.m14 = -((float)farPlane + (float)nearPlane)/fn; + result.m15 = 1.0f; + + return result; +} + +// Get camera look-at matrix (view matrix) +RMAPI Matrix MatrixLookAt(Vector3 eye, Vector3 target, Vector3 up) +{ + Matrix result = { 0 }; + + float length = 0.0f; + float ilength = 0.0f; + + // Vector3Subtract(eye, target) + Vector3 vz = { eye.x - target.x, eye.y - target.y, eye.z - target.z }; + + // Vector3Normalize(vz) + Vector3 v = vz; + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + vz.x *= ilength; + vz.y *= ilength; + vz.z *= ilength; + + // Vector3CrossProduct(up, vz) + Vector3 vx = { up.y*vz.z - up.z*vz.y, up.z*vz.x - up.x*vz.z, up.x*vz.y - up.y*vz.x }; + + // Vector3Normalize(x) + v = vx; + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + vx.x *= ilength; + vx.y *= ilength; + vx.z *= ilength; + + // Vector3CrossProduct(vz, vx) + Vector3 vy = { vz.y*vx.z - vz.z*vx.y, vz.z*vx.x - vz.x*vx.z, vz.x*vx.y - vz.y*vx.x }; + + result.m0 = vx.x; + result.m1 = vy.x; + result.m2 = vz.x; + result.m3 = 0.0f; + result.m4 = vx.y; + result.m5 = vy.y; + result.m6 = vz.y; + result.m7 = 0.0f; + result.m8 = vx.z; + result.m9 = vy.z; + result.m10 = vz.z; + result.m11 = 0.0f; + result.m12 = -(vx.x*eye.x + vx.y*eye.y + vx.z*eye.z); // Vector3DotProduct(vx, eye) + result.m13 = -(vy.x*eye.x + vy.y*eye.y + vy.z*eye.z); // Vector3DotProduct(vy, eye) + result.m14 = -(vz.x*eye.x + vz.y*eye.y + vz.z*eye.z); // Vector3DotProduct(vz, eye) + result.m15 = 1.0f; + + return result; +} + +// Get float array of matrix data +RMAPI float16 MatrixToFloatV(Matrix mat) +{ + float16 result = { 0 }; + + result.v[0] = mat.m0; + result.v[1] = mat.m1; + result.v[2] = mat.m2; + result.v[3] = mat.m3; + result.v[4] = mat.m4; + result.v[5] = mat.m5; + result.v[6] = mat.m6; + result.v[7] = mat.m7; + result.v[8] = mat.m8; + result.v[9] = mat.m9; + result.v[10] = mat.m10; + result.v[11] = mat.m11; + result.v[12] = mat.m12; + result.v[13] = mat.m13; + result.v[14] = mat.m14; + result.v[15] = mat.m15; + + return result; +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Quaternion math +//---------------------------------------------------------------------------------- + +// Add two quaternions +RMAPI Quaternion QuaternionAdd(Quaternion q1, Quaternion q2) +{ + Quaternion result = {q1.x + q2.x, q1.y + q2.y, q1.z + q2.z, q1.w + q2.w}; + + return result; +} + +// Add quaternion and float value +RMAPI Quaternion QuaternionAddValue(Quaternion q, float add) +{ + Quaternion result = {q.x + add, q.y + add, q.z + add, q.w + add}; + + return result; +} + +// Subtract two quaternions +RMAPI Quaternion QuaternionSubtract(Quaternion q1, Quaternion q2) +{ + Quaternion result = {q1.x - q2.x, q1.y - q2.y, q1.z - q2.z, q1.w - q2.w}; + + return result; +} + +// Subtract quaternion and float value +RMAPI Quaternion QuaternionSubtractValue(Quaternion q, float sub) +{ + Quaternion result = {q.x - sub, q.y - sub, q.z - sub, q.w - sub}; + + return result; +} + +// Get identity quaternion +RMAPI Quaternion QuaternionIdentity(void) +{ + Quaternion result = { 0.0f, 0.0f, 0.0f, 1.0f }; + + return result; +} + +// Computes the length of a quaternion +RMAPI float QuaternionLength(Quaternion q) +{ + float result = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + + return result; +} + +// Normalize provided quaternion +RMAPI Quaternion QuaternionNormalize(Quaternion q) +{ + Quaternion result = { 0 }; + + float length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + + result.x = q.x*ilength; + result.y = q.y*ilength; + result.z = q.z*ilength; + result.w = q.w*ilength; + + return result; +} + +// Invert provided quaternion +RMAPI Quaternion QuaternionInvert(Quaternion q) +{ + Quaternion result = q; + + float lengthSq = q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w; + + if (lengthSq != 0.0f) + { + float invLength = 1.0f/lengthSq; + + result.x *= -invLength; + result.y *= -invLength; + result.z *= -invLength; + result.w *= invLength; + } + + return result; +} + +// Calculate two quaternion multiplication +RMAPI Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2) +{ + Quaternion result = { 0 }; + + float qax = q1.x, qay = q1.y, qaz = q1.z, qaw = q1.w; + float qbx = q2.x, qby = q2.y, qbz = q2.z, qbw = q2.w; + + result.x = qax*qbw + qaw*qbx + qay*qbz - qaz*qby; + result.y = qay*qbw + qaw*qby + qaz*qbx - qax*qbz; + result.z = qaz*qbw + qaw*qbz + qax*qby - qay*qbx; + result.w = qaw*qbw - qax*qbx - qay*qby - qaz*qbz; + + return result; +} + +// Scale quaternion by float value +RMAPI Quaternion QuaternionScale(Quaternion q, float mul) +{ + Quaternion result = { 0 }; + + result.x = q.x*mul; + result.y = q.y*mul; + result.z = q.z*mul; + result.w = q.w*mul; + + return result; +} + +// Divide two quaternions +RMAPI Quaternion QuaternionDivide(Quaternion q1, Quaternion q2) +{ + Quaternion result = { q1.x/q2.x, q1.y/q2.y, q1.z/q2.z, q1.w/q2.w }; + + return result; +} + +// Calculate linear interpolation between two quaternions +RMAPI Quaternion QuaternionLerp(Quaternion q1, Quaternion q2, float amount) +{ + Quaternion result = { 0 }; + + result.x = q1.x + amount*(q2.x - q1.x); + result.y = q1.y + amount*(q2.y - q1.y); + result.z = q1.z + amount*(q2.z - q1.z); + result.w = q1.w + amount*(q2.w - q1.w); + + return result; +} + +// Calculate slerp-optimized interpolation between two quaternions +RMAPI Quaternion QuaternionNlerp(Quaternion q1, Quaternion q2, float amount) +{ + Quaternion result = { 0 }; + + // QuaternionLerp(q1, q2, amount) + result.x = q1.x + amount*(q2.x - q1.x); + result.y = q1.y + amount*(q2.y - q1.y); + result.z = q1.z + amount*(q2.z - q1.z); + result.w = q1.w + amount*(q2.w - q1.w); + + // QuaternionNormalize(q); + Quaternion q = result; + float length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + + result.x = q.x*ilength; + result.y = q.y*ilength; + result.z = q.z*ilength; + result.w = q.w*ilength; + + return result; +} + +// Calculates spherical linear interpolation between two quaternions +RMAPI Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount) +{ + Quaternion result = { 0 }; + +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + float cosHalfTheta = q1.x*q2.x + q1.y*q2.y + q1.z*q2.z + q1.w*q2.w; + + if (cosHalfTheta < 0) + { + q2.x = -q2.x; q2.y = -q2.y; q2.z = -q2.z; q2.w = -q2.w; + cosHalfTheta = -cosHalfTheta; + } + + if (fabsf(cosHalfTheta) >= 1.0f) result = q1; + else if (cosHalfTheta > 0.95f) result = QuaternionNlerp(q1, q2, amount); + else + { + float halfTheta = acosf(cosHalfTheta); + float sinHalfTheta = sqrtf(1.0f - cosHalfTheta*cosHalfTheta); + + if (fabsf(sinHalfTheta) < EPSILON) + { + result.x = (q1.x*0.5f + q2.x*0.5f); + result.y = (q1.y*0.5f + q2.y*0.5f); + result.z = (q1.z*0.5f + q2.z*0.5f); + result.w = (q1.w*0.5f + q2.w*0.5f); + } + else + { + float ratioA = sinf((1 - amount)*halfTheta)/sinHalfTheta; + float ratioB = sinf(amount*halfTheta)/sinHalfTheta; + + result.x = (q1.x*ratioA + q2.x*ratioB); + result.y = (q1.y*ratioA + q2.y*ratioB); + result.z = (q1.z*ratioA + q2.z*ratioB); + result.w = (q1.w*ratioA + q2.w*ratioB); + } + } + + return result; +} + +// Calculate quaternion cubic spline interpolation using Cubic Hermite Spline algorithm +// as described in the GLTF 2.0 specification: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#interpolation-cubic +RMAPI Quaternion QuaternionCubicHermiteSpline(Quaternion q1, Quaternion outTangent1, Quaternion q2, Quaternion inTangent2, float t) +{ + float t2 = t*t; + float t3 = t2*t; + float h00 = 2*t3 - 3*t2 + 1; + float h10 = t3 - 2*t2 + t; + float h01 = -2*t3 + 3*t2; + float h11 = t3 - t2; + + Quaternion p0 = QuaternionScale(q1, h00); + Quaternion m0 = QuaternionScale(outTangent1, h10); + Quaternion p1 = QuaternionScale(q2, h01); + Quaternion m1 = QuaternionScale(inTangent2, h11); + + Quaternion result = { 0 }; + + result = QuaternionAdd(p0, m0); + result = QuaternionAdd(result, p1); + result = QuaternionAdd(result, m1); + result = QuaternionNormalize(result); + + return result; +} + +// Calculate quaternion based on the rotation from one vector to another +RMAPI Quaternion QuaternionFromVector3ToVector3(Vector3 from, Vector3 to) +{ + Quaternion result = { 0 }; + + float cos2Theta = (from.x*to.x + from.y*to.y + from.z*to.z); // Vector3DotProduct(from, to) + Vector3 cross = { from.y*to.z - from.z*to.y, from.z*to.x - from.x*to.z, from.x*to.y - from.y*to.x }; // Vector3CrossProduct(from, to) + + result.x = cross.x; + result.y = cross.y; + result.z = cross.z; + result.w = 1.0f + cos2Theta; + + // QuaternionNormalize(q); + // NOTE: Normalize to essentially nlerp the original and identity to 0.5 + Quaternion q = result; + float length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + + result.x = q.x*ilength; + result.y = q.y*ilength; + result.z = q.z*ilength; + result.w = q.w*ilength; + + return result; +} + +// Get a quaternion for a given rotation matrix +RMAPI Quaternion QuaternionFromMatrix(Matrix mat) +{ + Quaternion result = { 0 }; + + float fourWSquaredMinus1 = mat.m0 + mat.m5 + mat.m10; + float fourXSquaredMinus1 = mat.m0 - mat.m5 - mat.m10; + float fourYSquaredMinus1 = mat.m5 - mat.m0 - mat.m10; + float fourZSquaredMinus1 = mat.m10 - mat.m0 - mat.m5; + + int biggestIndex = 0; + float fourBiggestSquaredMinus1 = fourWSquaredMinus1; + if (fourXSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourXSquaredMinus1; + biggestIndex = 1; + } + + if (fourYSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourYSquaredMinus1; + biggestIndex = 2; + } + + if (fourZSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourZSquaredMinus1; + biggestIndex = 3; + } + + float biggestVal = sqrtf(fourBiggestSquaredMinus1 + 1.0f)*0.5f; + float mult = 0.25f/biggestVal; + + switch (biggestIndex) + { + case 0: + result.w = biggestVal; + result.x = (mat.m6 - mat.m9)*mult; + result.y = (mat.m8 - mat.m2)*mult; + result.z = (mat.m1 - mat.m4)*mult; + break; + case 1: + result.x = biggestVal; + result.w = (mat.m6 - mat.m9)*mult; + result.y = (mat.m1 + mat.m4)*mult; + result.z = (mat.m8 + mat.m2)*mult; + break; + case 2: + result.y = biggestVal; + result.w = (mat.m8 - mat.m2)*mult; + result.x = (mat.m1 + mat.m4)*mult; + result.z = (mat.m6 + mat.m9)*mult; + break; + case 3: + result.z = biggestVal; + result.w = (mat.m1 - mat.m4)*mult; + result.x = (mat.m8 + mat.m2)*mult; + result.y = (mat.m6 + mat.m9)*mult; + break; + } + + return result; +} + +// Get a matrix for a given quaternion +RMAPI Matrix QuaternionToMatrix(Quaternion q) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float a2 = q.x*q.x; + float b2 = q.y*q.y; + float c2 = q.z*q.z; + float ac = q.x*q.z; + float ab = q.x*q.y; + float bc = q.y*q.z; + float ad = q.w*q.x; + float bd = q.w*q.y; + float cd = q.w*q.z; + + result.m0 = 1 - 2*(b2 + c2); + result.m1 = 2*(ab + cd); + result.m2 = 2*(ac - bd); + + result.m4 = 2*(ab - cd); + result.m5 = 1 - 2*(a2 + c2); + result.m6 = 2*(bc + ad); + + result.m8 = 2*(ac + bd); + result.m9 = 2*(bc - ad); + result.m10 = 1 - 2*(a2 + b2); + + return result; +} + +// Get rotation quaternion for an angle and axis +// NOTE: Angle must be provided in radians +RMAPI Quaternion QuaternionFromAxisAngle(Vector3 axis, float angle) +{ + Quaternion result = { 0.0f, 0.0f, 0.0f, 1.0f }; + + float axisLength = sqrtf(axis.x*axis.x + axis.y*axis.y + axis.z*axis.z); + + if (axisLength != 0.0f) + { + angle *= 0.5f; + + float length = 0.0f; + float ilength = 0.0f; + + // Vector3Normalize(axis) + length = axisLength; + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + axis.x *= ilength; + axis.y *= ilength; + axis.z *= ilength; + + float sinres = sinf(angle); + float cosres = cosf(angle); + + result.x = axis.x*sinres; + result.y = axis.y*sinres; + result.z = axis.z*sinres; + result.w = cosres; + + // QuaternionNormalize(q); + Quaternion q = result; + length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + result.x = q.x*ilength; + result.y = q.y*ilength; + result.z = q.z*ilength; + result.w = q.w*ilength; + } + + return result; +} + +// Get the rotation angle and axis for a given quaternion +RMAPI void QuaternionToAxisAngle(Quaternion q, Vector3 *outAxis, float *outAngle) +{ + if (fabsf(q.w) > 1.0f) + { + // QuaternionNormalize(q); + float length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + + q.x = q.x*ilength; + q.y = q.y*ilength; + q.z = q.z*ilength; + q.w = q.w*ilength; + } + + Vector3 resAxis = { 0.0f, 0.0f, 0.0f }; + float resAngle = 2.0f*acosf(q.w); + float den = sqrtf(1.0f - q.w*q.w); + + if (den > EPSILON) + { + resAxis.x = q.x/den; + resAxis.y = q.y/den; + resAxis.z = q.z/den; + } + else + { + // This occurs when the angle is zero. + // Not a problem: just set an arbitrary normalized axis. + resAxis.x = 1.0f; + } + + *outAxis = resAxis; + *outAngle = resAngle; +} + +// Get the quaternion equivalent to Euler angles +// NOTE: Rotation order is ZYX +RMAPI Quaternion QuaternionFromEuler(float pitch, float yaw, float roll) +{ + Quaternion result = { 0 }; + + float x0 = cosf(pitch*0.5f); + float x1 = sinf(pitch*0.5f); + float y0 = cosf(yaw*0.5f); + float y1 = sinf(yaw*0.5f); + float z0 = cosf(roll*0.5f); + float z1 = sinf(roll*0.5f); + + result.x = x1*y0*z0 - x0*y1*z1; + result.y = x0*y1*z0 + x1*y0*z1; + result.z = x0*y0*z1 - x1*y1*z0; + result.w = x0*y0*z0 + x1*y1*z1; + + return result; +} + +// Get the Euler angles equivalent to quaternion (roll, pitch, yaw) +// NOTE: Angles are returned in a Vector3 struct in radians +RMAPI Vector3 QuaternionToEuler(Quaternion q) +{ + Vector3 result = { 0 }; + + // Roll (x-axis rotation) + float x0 = 2.0f*(q.w*q.x + q.y*q.z); + float x1 = 1.0f - 2.0f*(q.x*q.x + q.y*q.y); + result.x = atan2f(x0, x1); + + // Pitch (y-axis rotation) + float y0 = 2.0f*(q.w*q.y - q.z*q.x); + y0 = y0 > 1.0f ? 1.0f : y0; + y0 = y0 < -1.0f ? -1.0f : y0; + result.y = asinf(y0); + + // Yaw (z-axis rotation) + float z0 = 2.0f*(q.w*q.z + q.x*q.y); + float z1 = 1.0f - 2.0f*(q.y*q.y + q.z*q.z); + result.z = atan2f(z0, z1); + + return result; +} + +// Transform a quaternion given a transformation matrix +RMAPI Quaternion QuaternionTransform(Quaternion q, Matrix mat) +{ + Quaternion result = { 0 }; + + result.x = mat.m0*q.x + mat.m4*q.y + mat.m8*q.z + mat.m12*q.w; + result.y = mat.m1*q.x + mat.m5*q.y + mat.m9*q.z + mat.m13*q.w; + result.z = mat.m2*q.x + mat.m6*q.y + mat.m10*q.z + mat.m14*q.w; + result.w = mat.m3*q.x + mat.m7*q.y + mat.m11*q.z + mat.m15*q.w; + + return result; +} + +// Check whether two given quaternions are almost equal +RMAPI int QuaternionEquals(Quaternion p, Quaternion q) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = (((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && + ((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) && + ((fabsf(p.w - q.w)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.w), fabsf(q.w)))))) || + (((fabsf(p.x + q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y + q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && + ((fabsf(p.z + q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) && + ((fabsf(p.w + q.w)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.w), fabsf(q.w)))))); + + return result; +} + +// Decompose a transformation matrix into its rotational, translational and scaling components +RMAPI void MatrixDecompose(Matrix mat, Vector3 *translation, Quaternion *rotation, Vector3 *scale) +{ + // Extract translation. + translation->x = mat.m12; + translation->y = mat.m13; + translation->z = mat.m14; + + // Extract upper-left for determinant computation + const float a = mat.m0; + const float b = mat.m4; + const float c = mat.m8; + const float d = mat.m1; + const float e = mat.m5; + const float f = mat.m9; + const float g = mat.m2; + const float h = mat.m6; + const float i = mat.m10; + const float A = e*i - f*h; + const float B = f*g - d*i; + const float C = d*h - e*g; + + // Extract scale + const float det = a*A + b*B + c*C; + Vector3 abc = { a, b, c }; + Vector3 def = { d, e, f }; + Vector3 ghi = { g, h, i }; + + float scalex = Vector3Length(abc); + float scaley = Vector3Length(def); + float scalez = Vector3Length(ghi); + Vector3 s = { scalex, scaley, scalez }; + + if (det < 0) s = Vector3Negate(s); + + *scale = s; + + // Remove scale from the matrix if it is not close to zero + Matrix clone = mat; + if (!FloatEquals(det, 0)) + { + clone.m0 /= s.x; + clone.m4 /= s.x; + clone.m8 /= s.x; + clone.m1 /= s.y; + clone.m5 /= s.y; + clone.m9 /= s.y; + clone.m2 /= s.z; + clone.m6 /= s.z; + clone.m10 /= s.z; + + // Extract rotation + *rotation = QuaternionFromMatrix(clone); + } + else + { + // Set to identity if close to zero + *rotation = QuaternionIdentity(); + } +} + +#if defined(__cplusplus) && !defined(RAYMATH_DISABLE_CPP_OPERATORS) + +// Optional C++ math operators +//------------------------------------------------------------------------------- + +// Vector2 operators +static constexpr Vector2 Vector2Zeros = { 0, 0 }; +static constexpr Vector2 Vector2Ones = { 1, 1 }; +static constexpr Vector2 Vector2UnitX = { 1, 0 }; +static constexpr Vector2 Vector2UnitY = { 0, 1 }; + +inline Vector2 operator + (const Vector2& lhs, const Vector2& rhs) +{ + return Vector2Add(lhs, rhs); +} + +inline const Vector2& operator += (Vector2& lhs, const Vector2& rhs) +{ + lhs = Vector2Add(lhs, rhs); + return lhs; +} + +inline Vector2 operator - (const Vector2& lhs, const Vector2& rhs) +{ + return Vector2Subtract(lhs, rhs); +} + +inline const Vector2& operator -= (Vector2& lhs, const Vector2& rhs) +{ + lhs = Vector2Subtract(lhs, rhs); + return lhs; +} + +inline Vector2 operator * (const Vector2& lhs, const float& rhs) +{ + return Vector2Scale(lhs, rhs); +} + +inline const Vector2& operator *= (Vector2& lhs, const float& rhs) +{ + lhs = Vector2Scale(lhs, rhs); + return lhs; +} + +inline Vector2 operator * (const Vector2& lhs, const Vector2& rhs) +{ + return Vector2Multiply(lhs, rhs); +} + +inline const Vector2& operator *= (Vector2& lhs, const Vector2& rhs) +{ + lhs = Vector2Multiply(lhs, rhs); + return lhs; +} + +inline Vector2 operator * (const Vector2& lhs, const Matrix& rhs) +{ + return Vector2Transform(lhs, rhs); +} + +inline const Vector2& operator *= (Vector2& lhs, const Matrix& rhs) +{ + lhs = Vector2Transform(lhs, rhs); + return lhs; +} + +inline Vector2 operator / (const Vector2& lhs, const float& rhs) +{ + return Vector2Scale(lhs, 1.0f/rhs); +} + +inline const Vector2& operator /= (Vector2& lhs, const float& rhs) +{ + lhs = Vector2Scale(lhs, 1.0f/rhs); + return lhs; +} + +inline Vector2 operator / (const Vector2& lhs, const Vector2& rhs) +{ + return Vector2Divide(lhs, rhs); +} + +inline const Vector2& operator /= (Vector2& lhs, const Vector2& rhs) +{ + lhs = Vector2Divide(lhs, rhs); + return lhs; +} + +inline bool operator == (const Vector2& lhs, const Vector2& rhs) +{ + return FloatEquals(lhs.x, rhs.x) && FloatEquals(lhs.y, rhs.y); +} + +inline bool operator != (const Vector2& lhs, const Vector2& rhs) +{ + return !FloatEquals(lhs.x, rhs.x) || !FloatEquals(lhs.y, rhs.y); +} + +// Vector3 operators +static constexpr Vector3 Vector3Zeros = { 0, 0, 0 }; +static constexpr Vector3 Vector3Ones = { 1, 1, 1 }; +static constexpr Vector3 Vector3UnitX = { 1, 0, 0 }; +static constexpr Vector3 Vector3UnitY = { 0, 1, 0 }; +static constexpr Vector3 Vector3UnitZ = { 0, 0, 1 }; + +inline Vector3 operator + (const Vector3& lhs, const Vector3& rhs) +{ + return Vector3Add(lhs, rhs); +} + +inline const Vector3& operator += (Vector3& lhs, const Vector3& rhs) +{ + lhs = Vector3Add(lhs, rhs); + return lhs; +} + +inline Vector3 operator - (const Vector3& lhs, const Vector3& rhs) +{ + return Vector3Subtract(lhs, rhs); +} + +inline const Vector3& operator -= (Vector3& lhs, const Vector3& rhs) +{ + lhs = Vector3Subtract(lhs, rhs); + return lhs; +} + +inline Vector3 operator * (const Vector3& lhs, const float& rhs) +{ + return Vector3Scale(lhs, rhs); +} + +inline const Vector3& operator *= (Vector3& lhs, const float& rhs) +{ + lhs = Vector3Scale(lhs, rhs); + return lhs; +} + +inline Vector3 operator * (const Vector3& lhs, const Vector3& rhs) +{ + return Vector3Multiply(lhs, rhs); +} + +inline const Vector3& operator *= (Vector3& lhs, const Vector3& rhs) +{ + lhs = Vector3Multiply(lhs, rhs); + return lhs; +} + +inline Vector3 operator * (const Vector3& lhs, const Matrix& rhs) +{ + return Vector3Transform(lhs, rhs); +} + +inline const Vector3& operator *= (Vector3& lhs, const Matrix& rhs) +{ + lhs = Vector3Transform(lhs, rhs); + return lhs; +} + +inline Vector3 operator / (const Vector3& lhs, const float& rhs) +{ + return Vector3Scale(lhs, 1.0f/rhs); +} + +inline const Vector3& operator /= (Vector3& lhs, const float& rhs) +{ + lhs = Vector3Scale(lhs, 1.0f/rhs); + return lhs; +} + +inline Vector3 operator / (const Vector3& lhs, const Vector3& rhs) +{ + return Vector3Divide(lhs, rhs); +} + +inline const Vector3& operator /= (Vector3& lhs, const Vector3& rhs) +{ + lhs = Vector3Divide(lhs, rhs); + return lhs; +} + +inline bool operator == (const Vector3& lhs, const Vector3& rhs) +{ + return FloatEquals(lhs.x, rhs.x) && FloatEquals(lhs.y, rhs.y) && FloatEquals(lhs.z, rhs.z); +} + +inline bool operator != (const Vector3& lhs, const Vector3& rhs) +{ + return !FloatEquals(lhs.x, rhs.x) || !FloatEquals(lhs.y, rhs.y) || !FloatEquals(lhs.z, rhs.z); +} + +// Vector4 operators +static constexpr Vector4 Vector4Zeros = { 0, 0, 0, 0 }; +static constexpr Vector4 Vector4Ones = { 1, 1, 1, 1 }; +static constexpr Vector4 Vector4UnitX = { 1, 0, 0, 0 }; +static constexpr Vector4 Vector4UnitY = { 0, 1, 0, 0 }; +static constexpr Vector4 Vector4UnitZ = { 0, 0, 1, 0 }; +static constexpr Vector4 Vector4UnitW = { 0, 0, 0, 1 }; + +inline Vector4 operator + (const Vector4& lhs, const Vector4& rhs) +{ + return Vector4Add(lhs, rhs); +} + +inline const Vector4& operator += (Vector4& lhs, const Vector4& rhs) +{ + lhs = Vector4Add(lhs, rhs); + return lhs; +} + +inline Vector4 operator - (const Vector4& lhs, const Vector4& rhs) +{ + return Vector4Subtract(lhs, rhs); +} + +inline const Vector4& operator -= (Vector4& lhs, const Vector4& rhs) +{ + lhs = Vector4Subtract(lhs, rhs); + return lhs; +} + +inline Vector4 operator * (const Vector4& lhs, const float& rhs) +{ + return Vector4Scale(lhs, rhs); +} + +inline const Vector4& operator *= (Vector4& lhs, const float& rhs) +{ + lhs = Vector4Scale(lhs, rhs); + return lhs; +} + +inline Vector4 operator * (const Vector4& lhs, const Vector4& rhs) +{ + return Vector4Multiply(lhs, rhs); +} + +inline const Vector4& operator *= (Vector4& lhs, const Vector4& rhs) +{ + lhs = Vector4Multiply(lhs, rhs); + return lhs; +} + +inline Vector4 operator / (const Vector4& lhs, const float& rhs) +{ + return Vector4Scale(lhs, 1.0f/rhs); +} + +inline const Vector4& operator /= (Vector4& lhs, const float& rhs) +{ + lhs = Vector4Scale(lhs, 1.0f/rhs); + return lhs; +} + +inline Vector4 operator / (const Vector4& lhs, const Vector4& rhs) +{ + return Vector4Divide(lhs, rhs); +} + +inline const Vector4& operator /= (Vector4& lhs, const Vector4& rhs) +{ + lhs = Vector4Divide(lhs, rhs); + return lhs; +} + +inline bool operator == (const Vector4& lhs, const Vector4& rhs) +{ + return FloatEquals(lhs.x, rhs.x) && FloatEquals(lhs.y, rhs.y) && FloatEquals(lhs.z, rhs.z) && FloatEquals(lhs.w, rhs.w); +} + +inline bool operator != (const Vector4& lhs, const Vector4& rhs) +{ + return !FloatEquals(lhs.x, rhs.x) || !FloatEquals(lhs.y, rhs.y) || !FloatEquals(lhs.z, rhs.z) || !FloatEquals(lhs.w, rhs.w); +} + +// Quaternion operators +static constexpr Quaternion QuaternionZeros = { 0, 0, 0, 0 }; +static constexpr Quaternion QuaternionOnes = { 1, 1, 1, 1 }; +static constexpr Quaternion QuaternionUnitX = { 0, 0, 0, 1 }; + +inline Quaternion operator + (const Quaternion& lhs, const float& rhs) +{ + return QuaternionAddValue(lhs, rhs); +} + +inline const Quaternion& operator += (Quaternion& lhs, const float& rhs) +{ + lhs = QuaternionAddValue(lhs, rhs); + return lhs; +} + +inline Quaternion operator - (const Quaternion& lhs, const float& rhs) +{ + return QuaternionSubtractValue(lhs, rhs); +} + +inline const Quaternion& operator -= (Quaternion& lhs, const float& rhs) +{ + lhs = QuaternionSubtractValue(lhs, rhs); + return lhs; +} + +inline Quaternion operator * (const Quaternion& lhs, const Matrix& rhs) +{ + return QuaternionTransform(lhs, rhs); +} + +inline const Quaternion& operator *= (Quaternion& lhs, const Matrix& rhs) +{ + lhs = QuaternionTransform(lhs, rhs); + return lhs; +} + +// Matrix operators +inline Matrix operator + (const Matrix& lhs, const Matrix& rhs) +{ + return MatrixAdd(lhs, rhs); +} + +inline const Matrix& operator += (Matrix& lhs, const Matrix& rhs) +{ + lhs = MatrixAdd(lhs, rhs); + return lhs; +} + +inline Matrix operator - (const Matrix& lhs, const Matrix& rhs) +{ + return MatrixSubtract(lhs, rhs); +} + +inline const Matrix& operator -= (Matrix& lhs, const Matrix& rhs) +{ + lhs = MatrixSubtract(lhs, rhs); + return lhs; +} + +inline Matrix operator * (const Matrix& lhs, const Matrix& rhs) +{ + return MatrixMultiply(lhs, rhs); +} + +inline const Matrix& operator *= (Matrix& lhs, const Matrix& rhs) +{ + lhs = MatrixMultiply(lhs, rhs); + return lhs; +} +//------------------------------------------------------------------------------- +#endif // C++ operators + +#endif // RAYMATH_H diff --git a/projects/zig_raylib_examples/lib/raylib/include/rcamera.h b/projects/zig_raylib_examples/lib/raylib/include/rcamera.h new file mode 100644 index 0000000..a598e11 --- /dev/null +++ b/projects/zig_raylib_examples/lib/raylib/include/rcamera.h @@ -0,0 +1,555 @@ +/******************************************************************************************* +* +* rcamera - Basic camera system with support for multiple camera modes +* +* CONFIGURATION: +* #define RCAMERA_IMPLEMENTATION +* Generates the implementation of the library into the included file. +* If not defined, the library is in header only mode and can be included in other headers +* or source files without problems. But only ONE file should hold the implementation. +* +* #define RCAMERA_STANDALONE +* If defined, the library can be used as standalone as a camera system but some +* functions must be redefined to manage inputs accordingly. +* +* CONTRIBUTORS: +* Ramon Santamaria: Supervision, review, update and maintenance +* Christoph Wagner: Complete redesign, using raymath (2022) +* Marc Palau: Initial implementation (2014) +* +* +* LICENSE: zlib/libpng +* +* Copyright (c) 2022-2025 Christoph Wagner (@Crydsch) & Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RCAMERA_H +#define RCAMERA_H + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +// Function specifiers definition + +// Function specifiers in case library is build/used as a shared library (Windows) +// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll +#if defined(_WIN32) +#if defined(BUILD_LIBTYPE_SHARED) +#if defined(__TINYC__) +#define __declspec(x) __attribute__((x)) +#endif +#define RLAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) +#elif defined(USE_LIBTYPE_SHARED) +#define RLAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) +#endif +#endif + +#ifndef RLAPI + #define RLAPI // Functions defined as 'extern' by default (implicit specifiers) +#endif + +#if defined(RCAMERA_STANDALONE) + #define CAMERA_CULL_DISTANCE_NEAR 0.01 + #define CAMERA_CULL_DISTANCE_FAR 1000.0 +#else + #define CAMERA_CULL_DISTANCE_NEAR RL_CULL_DISTANCE_NEAR + #define CAMERA_CULL_DISTANCE_FAR RL_CULL_DISTANCE_FAR +#endif + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +// NOTE: Below types are required for standalone usage +//---------------------------------------------------------------------------------- +#if defined(RCAMERA_STANDALONE) + // Vector2, 2 components + typedef struct Vector2 { + float x; // Vector x component + float y; // Vector y component + } Vector2; + + // Vector3, 3 components + typedef struct Vector3 { + float x; // Vector x component + float y; // Vector y component + float z; // Vector z component + } Vector3; + + // Matrix, 4x4 components, column major, OpenGL style, right-handed + typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) + } Matrix; + + // Camera type, defines a camera position/orientation in 3d space + typedef struct Camera3D { + Vector3 position; // Camera position + Vector3 target; // Camera target it looks-at + Vector3 up; // Camera up vector (rotation over its axis) + float fovy; // Camera field-of-view apperture in Y (degrees) in perspective, used as near plane width in orthographic + int projection; // Camera projection type: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC + } Camera3D; + + typedef Camera3D Camera; // Camera type fallback, defaults to Camera3D + + // Camera projection + typedef enum { + CAMERA_PERSPECTIVE = 0, // Perspective projection + CAMERA_ORTHOGRAPHIC // Orthographic projection + } CameraProjection; + + // Camera system modes + typedef enum { + CAMERA_CUSTOM = 0, // Camera custom, controlled by user (UpdateCamera() does nothing) + CAMERA_FREE, // Camera free mode + CAMERA_ORBITAL, // Camera orbital, around target, zoom supported + CAMERA_FIRST_PERSON, // Camera first person + CAMERA_THIRD_PERSON // Camera third person + } CameraMode; +#endif + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +//... + +//---------------------------------------------------------------------------------- +// Module Functions Declaration +//---------------------------------------------------------------------------------- + +#if defined(__cplusplus) +extern "C" { // Prevents name mangling of functions +#endif + +RLAPI Vector3 GetCameraForward(Camera *camera); +RLAPI Vector3 GetCameraUp(Camera *camera); +RLAPI Vector3 GetCameraRight(Camera *camera); + +// Camera movement +RLAPI void CameraMoveForward(Camera *camera, float distance, bool moveInWorldPlane); +RLAPI void CameraMoveUp(Camera *camera, float distance); +RLAPI void CameraMoveRight(Camera *camera, float distance, bool moveInWorldPlane); +RLAPI void CameraMoveToTarget(Camera *camera, float delta); + +// Camera rotation +RLAPI void CameraYaw(Camera *camera, float angle, bool rotateAroundTarget); +RLAPI void CameraPitch(Camera *camera, float angle, bool lockView, bool rotateAroundTarget, bool rotateUp); +RLAPI void CameraRoll(Camera *camera, float angle); + +RLAPI Matrix GetCameraViewMatrix(Camera *camera); +RLAPI Matrix GetCameraProjectionMatrix(Camera *camera, float aspect); + +#if defined(__cplusplus) +} +#endif + +#endif // RCAMERA_H + +/*********************************************************************************** +* +* CAMERA IMPLEMENTATION +* +************************************************************************************/ + +#if defined(RCAMERA_IMPLEMENTATION) + +#include "raymath.h" // Required for vector maths: + // Vector3Add() + // Vector3Subtract() + // Vector3Scale() + // Vector3Normalize() + // Vector3Distance() + // Vector3CrossProduct() + // Vector3RotateByAxisAngle() + // Vector3Angle() + // Vector3Negate() + // MatrixLookAt() + // MatrixPerspective() + // MatrixOrtho() + // MatrixIdentity() + +// raylib required functionality: + // GetMouseDelta() + // GetMouseWheelMove() + // IsKeyDown() + // IsKeyPressed() + // GetFrameTime() + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#define CAMERA_MOVE_SPEED 5.4f // Units per second +#define CAMERA_ROTATION_SPEED 0.03f +#define CAMERA_PAN_SPEED 0.2f + +// Camera mouse movement sensitivity +#define CAMERA_MOUSE_MOVE_SENSITIVITY 0.003f + +// Camera orbital speed in CAMERA_ORBITAL mode +#define CAMERA_ORBITAL_SPEED 0.5f // Radians per second + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +//... + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +//... + +//---------------------------------------------------------------------------------- +// Module specific Functions Declaration +//---------------------------------------------------------------------------------- +//... + +//---------------------------------------------------------------------------------- +// Module Functions Definition +//---------------------------------------------------------------------------------- +// Returns the cameras forward vector (normalized) +Vector3 GetCameraForward(Camera *camera) +{ + return Vector3Normalize(Vector3Subtract(camera->target, camera->position)); +} + +// Returns the cameras up vector (normalized) +// Note: The up vector might not be perpendicular to the forward vector +Vector3 GetCameraUp(Camera *camera) +{ + return Vector3Normalize(camera->up); +} + +// Returns the cameras right vector (normalized) +Vector3 GetCameraRight(Camera *camera) +{ + Vector3 forward = GetCameraForward(camera); + Vector3 up = GetCameraUp(camera); + + return Vector3Normalize(Vector3CrossProduct(forward, up)); +} + +// Moves the camera in its forward direction +void CameraMoveForward(Camera *camera, float distance, bool moveInWorldPlane) +{ + Vector3 forward = GetCameraForward(camera); + + if (moveInWorldPlane) + { + // Project vector onto world plane + forward.y = 0; + forward = Vector3Normalize(forward); + } + + // Scale by distance + forward = Vector3Scale(forward, distance); + + // Move position and target + camera->position = Vector3Add(camera->position, forward); + camera->target = Vector3Add(camera->target, forward); +} + +// Moves the camera in its up direction +void CameraMoveUp(Camera *camera, float distance) +{ + Vector3 up = GetCameraUp(camera); + + // Scale by distance + up = Vector3Scale(up, distance); + + // Move position and target + camera->position = Vector3Add(camera->position, up); + camera->target = Vector3Add(camera->target, up); +} + +// Moves the camera target in its current right direction +void CameraMoveRight(Camera *camera, float distance, bool moveInWorldPlane) +{ + Vector3 right = GetCameraRight(camera); + + if (moveInWorldPlane) + { + // Project vector onto world plane + right.y = 0; + right = Vector3Normalize(right); + } + + // Scale by distance + right = Vector3Scale(right, distance); + + // Move position and target + camera->position = Vector3Add(camera->position, right); + camera->target = Vector3Add(camera->target, right); +} + +// Moves the camera position closer/farther to/from the camera target +void CameraMoveToTarget(Camera *camera, float delta) +{ + float distance = Vector3Distance(camera->position, camera->target); + + // Apply delta + distance += delta; + + // Distance must be greater than 0 + if (distance <= 0) distance = 0.001f; + + // Set new distance by moving the position along the forward vector + Vector3 forward = GetCameraForward(camera); + camera->position = Vector3Add(camera->target, Vector3Scale(forward, -distance)); +} + +// Rotates the camera around its up vector +// Yaw is "looking left and right" +// If rotateAroundTarget is false, the camera rotates around its position +// Note: angle must be provided in radians +void CameraYaw(Camera *camera, float angle, bool rotateAroundTarget) +{ + // Rotation axis + Vector3 up = GetCameraUp(camera); + + // View vector + Vector3 targetPosition = Vector3Subtract(camera->target, camera->position); + + // Rotate view vector around up axis + targetPosition = Vector3RotateByAxisAngle(targetPosition, up, angle); + + if (rotateAroundTarget) + { + // Move position relative to target + camera->position = Vector3Subtract(camera->target, targetPosition); + } + else // rotate around camera.position + { + // Move target relative to position + camera->target = Vector3Add(camera->position, targetPosition); + } +} + +// Rotates the camera around its right vector, pitch is "looking up and down" +// - lockView prevents camera overrotation (aka "somersaults") +// - rotateAroundTarget defines if rotation is around target or around its position +// - rotateUp rotates the up direction as well (typically only usefull in CAMERA_FREE) +// NOTE: angle must be provided in radians +void CameraPitch(Camera *camera, float angle, bool lockView, bool rotateAroundTarget, bool rotateUp) +{ + // Up direction + Vector3 up = GetCameraUp(camera); + + // View vector + Vector3 targetPosition = Vector3Subtract(camera->target, camera->position); + + if (lockView) + { + // In these camera modes we clamp the Pitch angle + // to allow only viewing straight up or down. + + // Clamp view up + float maxAngleUp = Vector3Angle(up, targetPosition); + maxAngleUp -= 0.001f; // avoid numerical errors + if (angle > maxAngleUp) angle = maxAngleUp; + + // Clamp view down + float maxAngleDown = Vector3Angle(Vector3Negate(up), targetPosition); + maxAngleDown *= -1.0f; // downwards angle is negative + maxAngleDown += 0.001f; // avoid numerical errors + if (angle < maxAngleDown) angle = maxAngleDown; + } + + // Rotation axis + Vector3 right = GetCameraRight(camera); + + // Rotate view vector around right axis + targetPosition = Vector3RotateByAxisAngle(targetPosition, right, angle); + + if (rotateAroundTarget) + { + // Move position relative to target + camera->position = Vector3Subtract(camera->target, targetPosition); + } + else // rotate around camera.position + { + // Move target relative to position + camera->target = Vector3Add(camera->position, targetPosition); + } + + if (rotateUp) + { + // Rotate up direction around right axis + camera->up = Vector3RotateByAxisAngle(camera->up, right, angle); + } +} + +// Rotates the camera around its forward vector +// Roll is "turning your head sideways to the left or right" +// Note: angle must be provided in radians +void CameraRoll(Camera *camera, float angle) +{ + // Rotation axis + Vector3 forward = GetCameraForward(camera); + + // Rotate up direction around forward axis + camera->up = Vector3RotateByAxisAngle(camera->up, forward, angle); +} + +// Returns the camera view matrix +Matrix GetCameraViewMatrix(Camera *camera) +{ + return MatrixLookAt(camera->position, camera->target, camera->up); +} + +// Returns the camera projection matrix +Matrix GetCameraProjectionMatrix(Camera *camera, float aspect) +{ + if (camera->projection == CAMERA_PERSPECTIVE) + { + return MatrixPerspective(camera->fovy*DEG2RAD, aspect, CAMERA_CULL_DISTANCE_NEAR, CAMERA_CULL_DISTANCE_FAR); + } + else if (camera->projection == CAMERA_ORTHOGRAPHIC) + { + double top = camera->fovy/2.0; + double right = top*aspect; + + return MatrixOrtho(-right, right, -top, top, CAMERA_CULL_DISTANCE_NEAR, CAMERA_CULL_DISTANCE_FAR); + } + + return MatrixIdentity(); +} + +#if !defined(RCAMERA_STANDALONE) +// Update camera position for selected mode +// Camera mode: CAMERA_FREE, CAMERA_FIRST_PERSON, CAMERA_THIRD_PERSON, CAMERA_ORBITAL or CUSTOM +void UpdateCamera(Camera *camera, int mode) +{ + Vector2 mousePositionDelta = GetMouseDelta(); + + bool moveInWorldPlane = ((mode == CAMERA_FIRST_PERSON) || (mode == CAMERA_THIRD_PERSON)); + bool rotateAroundTarget = ((mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL)); + bool lockView = ((mode == CAMERA_FREE) || (mode == CAMERA_FIRST_PERSON) || (mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL)); + bool rotateUp = false; + + // Camera speeds based on frame time + float cameraMoveSpeed = CAMERA_MOVE_SPEED*GetFrameTime(); + float cameraRotationSpeed = CAMERA_ROTATION_SPEED*GetFrameTime(); + float cameraPanSpeed = CAMERA_PAN_SPEED*GetFrameTime(); + float cameraOrbitalSpeed = CAMERA_ORBITAL_SPEED*GetFrameTime(); + + if (mode == CAMERA_CUSTOM) {} + else if (mode == CAMERA_ORBITAL) + { + // Orbital can just orbit + Matrix rotation = MatrixRotate(GetCameraUp(camera), cameraOrbitalSpeed); + Vector3 view = Vector3Subtract(camera->position, camera->target); + view = Vector3Transform(view, rotation); + camera->position = Vector3Add(camera->target, view); + } + else + { + // Camera rotation + if (IsKeyDown(KEY_DOWN)) CameraPitch(camera, -cameraRotationSpeed, lockView, rotateAroundTarget, rotateUp); + if (IsKeyDown(KEY_UP)) CameraPitch(camera, cameraRotationSpeed, lockView, rotateAroundTarget, rotateUp); + if (IsKeyDown(KEY_RIGHT)) CameraYaw(camera, -cameraRotationSpeed, rotateAroundTarget); + if (IsKeyDown(KEY_LEFT)) CameraYaw(camera, cameraRotationSpeed, rotateAroundTarget); + if (IsKeyDown(KEY_Q)) CameraRoll(camera, -cameraRotationSpeed); + if (IsKeyDown(KEY_E)) CameraRoll(camera, cameraRotationSpeed); + + // Camera movement + // Camera pan (for CAMERA_FREE) + if ((mode == CAMERA_FREE) && (IsMouseButtonDown(MOUSE_BUTTON_MIDDLE))) + { + const Vector2 mouseDelta = GetMouseDelta(); + if (mouseDelta.x > 0.0f) CameraMoveRight(camera, cameraPanSpeed, moveInWorldPlane); + if (mouseDelta.x < 0.0f) CameraMoveRight(camera, -cameraPanSpeed, moveInWorldPlane); + if (mouseDelta.y > 0.0f) CameraMoveUp(camera, -cameraPanSpeed); + if (mouseDelta.y < 0.0f) CameraMoveUp(camera, cameraPanSpeed); + } + else + { + // Mouse support + CameraYaw(camera, -mousePositionDelta.x*CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget); + CameraPitch(camera, -mousePositionDelta.y*CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp); + } + + // Keyboard support + if (IsKeyDown(KEY_W)) CameraMoveForward(camera, cameraMoveSpeed, moveInWorldPlane); + if (IsKeyDown(KEY_A)) CameraMoveRight(camera, -cameraMoveSpeed, moveInWorldPlane); + if (IsKeyDown(KEY_S)) CameraMoveForward(camera, -cameraMoveSpeed, moveInWorldPlane); + if (IsKeyDown(KEY_D)) CameraMoveRight(camera, cameraMoveSpeed, moveInWorldPlane); + + // Gamepad movement + if (IsGamepadAvailable(0)) + { + // Gamepad controller support + CameraYaw(camera, -(GetGamepadAxisMovement(0, GAMEPAD_AXIS_RIGHT_X)*2)*CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget); + CameraPitch(camera, -(GetGamepadAxisMovement(0, GAMEPAD_AXIS_RIGHT_Y)*2)*CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp); + + if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_Y) <= -0.25f) CameraMoveForward(camera, cameraMoveSpeed, moveInWorldPlane); + if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_X) <= -0.25f) CameraMoveRight(camera, -cameraMoveSpeed, moveInWorldPlane); + if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_Y) >= 0.25f) CameraMoveForward(camera, -cameraMoveSpeed, moveInWorldPlane); + if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_X) >= 0.25f) CameraMoveRight(camera, cameraMoveSpeed, moveInWorldPlane); + } + + if (mode == CAMERA_FREE) + { + if (IsKeyDown(KEY_SPACE)) CameraMoveUp(camera, cameraMoveSpeed); + if (IsKeyDown(KEY_LEFT_CONTROL)) CameraMoveUp(camera, -cameraMoveSpeed); + } + } + + if ((mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL) || (mode == CAMERA_FREE)) + { + // Zoom target distance + CameraMoveToTarget(camera, -GetMouseWheelMove()); + if (IsKeyPressed(KEY_KP_SUBTRACT)) CameraMoveToTarget(camera, 2.0f); + if (IsKeyPressed(KEY_KP_ADD)) CameraMoveToTarget(camera, -2.0f); + } +} +#endif // !RCAMERA_STANDALONE + +// Update camera movement, movement/rotation values should be provided by user +void UpdateCameraPro(Camera *camera, Vector3 movement, Vector3 rotation, float zoom) +{ + // Required values + // movement.x - Move forward/backward + // movement.y - Move right/left + // movement.z - Move up/down + // rotation.x - yaw + // rotation.y - pitch + // rotation.z - roll + // zoom - Move towards target + + bool lockView = true; + bool rotateAroundTarget = false; + bool rotateUp = false; + bool moveInWorldPlane = true; + + // Camera rotation + CameraPitch(camera, -rotation.y*DEG2RAD, lockView, rotateAroundTarget, rotateUp); + CameraYaw(camera, -rotation.x*DEG2RAD, rotateAroundTarget); + CameraRoll(camera, rotation.z*DEG2RAD); + + // Camera movement + CameraMoveForward(camera, movement.x, moveInWorldPlane); + CameraMoveRight(camera, movement.y, moveInWorldPlane); + CameraMoveUp(camera, movement.z); + + // Zoom target distance + CameraMoveToTarget(camera, zoom); +} + +#endif // RCAMERA_IMPLEMENTATION diff --git a/projects/zig_raylib_examples/lib/raylib/include/rlgl.h b/projects/zig_raylib_examples/lib/raylib/include/rlgl.h new file mode 100644 index 0000000..0f3a203 --- /dev/null +++ b/projects/zig_raylib_examples/lib/raylib/include/rlgl.h @@ -0,0 +1,5255 @@ +/********************************************************************************************** +* +* rlgl v5.0 - A multi-OpenGL abstraction layer with an immediate-mode style API +* +* DESCRIPTION: +* An abstraction layer for multiple OpenGL versions (1.1, 2.1, 3.3 Core, 4.3 Core, ES 2.0, ES 3.0) +* that provides a pseudo-OpenGL 1.1 immediate-mode style API (rlVertex, rlTranslate, rlRotate...) +* +* ADDITIONAL NOTES: +* When choosing an OpenGL backend different than OpenGL 1.1, some internal buffer are +* initialized on rlglInit() to accumulate vertex data +* +* When an internal state change is required all the stored vertex data is renderer in batch, +* additionally, rlDrawRenderBatchActive() could be called to force flushing of the batch +* +* Some resources are also loaded for convenience, here the complete list: +* - Default batch (RLGL.defaultBatch): RenderBatch system to accumulate vertex data +* - Default texture (RLGL.defaultTextureId): 1x1 white pixel R8G8B8A8 +* - Default shader (RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs) +* +* Internal buffer (and resources) must be manually unloaded calling rlglClose() +* +* CONFIGURATION: +* #define GRAPHICS_API_OPENGL_11 +* #define GRAPHICS_API_OPENGL_21 +* #define GRAPHICS_API_OPENGL_33 +* #define GRAPHICS_API_OPENGL_43 +* #define GRAPHICS_API_OPENGL_ES2 +* #define GRAPHICS_API_OPENGL_ES3 +* Use selected OpenGL graphics backend, should be supported by platform +* Those preprocessor defines are only used on rlgl module, if OpenGL version is +* required by any other module, use rlGetVersion() to check it +* +* #define RLGL_IMPLEMENTATION +* Generates the implementation of the library into the included file +* If not defined, the library is in header only mode and can be included in other headers +* or source files without problems. But only ONE file should hold the implementation +* +* #define RLGL_RENDER_TEXTURES_HINT +* Enable framebuffer objects (fbo) support (enabled by default) +* Some GPUs could not support them despite the OpenGL version +* +* #define RLGL_SHOW_GL_DETAILS_INFO +* Show OpenGL extensions and capabilities detailed logs on init +* +* #define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT +* Enable debug context (only available on OpenGL 4.3) +* +* rlgl capabilities could be customized just defining some internal +* values before library inclusion (default values listed): +* +* #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 8192 // Default internal render batch elements limits +* #define RL_DEFAULT_BATCH_BUFFERS 1 // Default number of batch buffers (multi-buffering) +* #define RL_DEFAULT_BATCH_DRAWCALLS 256 // Default number of batch draw calls (by state changes: mode, texture) +* #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 4 // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture()) +* +* #define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of internal Matrix stack +* #define RL_MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported +* #define RL_CULL_DISTANCE_NEAR 0.01 // Default projection matrix near cull distance +* #define RL_CULL_DISTANCE_FAR 1000.0 // Default projection matrix far cull distance +* +* When loading a shader, the following vertex attributes and uniform +* location names are tried to be set automatically: +* +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS "vertexBoneIds" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS "vertexBoneWeights" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp" // model-view-projection matrix +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView" // view matrix +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection" // projection matrix +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel" // model matrix +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal" // normal matrix (transpose(inverse(matModelView))) +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (base tint color, multiplied by texture color) +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES "boneMatrices" // bone matrices +* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0) +* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1" // texture1 (texture slot active 1) +* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) +* +* DEPENDENCIES: +* - OpenGL libraries (depending on platform and OpenGL version selected) +* - GLAD OpenGL extensions loading library (only for OpenGL 3.3 Core, 4.3 Core) +* +* +* LICENSE: zlib/libpng +* +* Copyright (c) 2014-2025 Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RLGL_H +#define RLGL_H + +#define RLGL_VERSION "5.0" + +// Function specifiers in case library is build/used as a shared library +// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll +// NOTE: visibility(default) attribute makes symbols "visible" when compiled with -fvisibility=hidden +#if defined(_WIN32) && defined(BUILD_LIBTYPE_SHARED) + #define RLAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) +#elif defined(BUILD_LIBTYPE_SHARED) + #define RLAPI __attribute__((visibility("default"))) // We are building the library as a Unix shared library (.so/.dylib) +#elif defined(_WIN32) && defined(USE_LIBTYPE_SHARED) + #define RLAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) +#endif + +// Function specifiers definition +#ifndef RLAPI + #define RLAPI // Functions defined as 'extern' by default (implicit specifiers) +#endif + +// Support TRACELOG macros +#ifndef TRACELOG + #define TRACELOG(level, ...) (void)0 + #define TRACELOGD(...) (void)0 +#endif + +// Allow custom memory allocators +#ifndef RL_MALLOC + #define RL_MALLOC(sz) malloc(sz) +#endif +#ifndef RL_CALLOC + #define RL_CALLOC(n,sz) calloc(n,sz) +#endif +#ifndef RL_REALLOC + #define RL_REALLOC(n,sz) realloc(n,sz) +#endif +#ifndef RL_FREE + #define RL_FREE(p) free(p) +#endif + +// Security check in case no GRAPHICS_API_OPENGL_* defined +#if !defined(GRAPHICS_API_OPENGL_11) && \ + !defined(GRAPHICS_API_OPENGL_21) && \ + !defined(GRAPHICS_API_OPENGL_33) && \ + !defined(GRAPHICS_API_OPENGL_43) && \ + !defined(GRAPHICS_API_OPENGL_ES2) && \ + !defined(GRAPHICS_API_OPENGL_ES3) + #define GRAPHICS_API_OPENGL_33 +#endif + +// Security check in case multiple GRAPHICS_API_OPENGL_* defined +#if defined(GRAPHICS_API_OPENGL_11) + #if defined(GRAPHICS_API_OPENGL_21) + #undef GRAPHICS_API_OPENGL_21 + #endif + #if defined(GRAPHICS_API_OPENGL_33) + #undef GRAPHICS_API_OPENGL_33 + #endif + #if defined(GRAPHICS_API_OPENGL_43) + #undef GRAPHICS_API_OPENGL_43 + #endif + #if defined(GRAPHICS_API_OPENGL_ES2) + #undef GRAPHICS_API_OPENGL_ES2 + #endif +#endif + +// OpenGL 2.1 uses most of OpenGL 3.3 Core functionality +// WARNING: Specific parts are checked with #if defines +#if defined(GRAPHICS_API_OPENGL_21) + #define GRAPHICS_API_OPENGL_33 +#endif + +// OpenGL 4.3 uses OpenGL 3.3 Core functionality +#if defined(GRAPHICS_API_OPENGL_43) + #define GRAPHICS_API_OPENGL_33 +#endif + +// OpenGL ES 3.0 uses OpenGL ES 2.0 functionality (and more) +#if defined(GRAPHICS_API_OPENGL_ES3) + #define GRAPHICS_API_OPENGL_ES2 +#endif + +// Support framebuffer objects by default +// NOTE: Some driver implementation do not support it, despite they should +#define RLGL_RENDER_TEXTURES_HINT + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- + +// Default internal render batch elements limits +#ifndef RL_DEFAULT_BATCH_BUFFER_ELEMENTS + #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // This is the maximum amount of elements (quads) per batch + // NOTE: Be careful with text, every letter maps to a quad + #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 8192 + #endif + #if defined(GRAPHICS_API_OPENGL_ES2) + // We reduce memory sizes for embedded systems (RPI and HTML5) + // NOTE: On HTML5 (emscripten) this is allocated on heap, + // by default it's only 16MB!...just take care... + #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 2048 + #endif +#endif +#ifndef RL_DEFAULT_BATCH_BUFFERS + #define RL_DEFAULT_BATCH_BUFFERS 1 // Default number of batch buffers (multi-buffering) +#endif +#ifndef RL_DEFAULT_BATCH_DRAWCALLS + #define RL_DEFAULT_BATCH_DRAWCALLS 256 // Default number of batch draw calls (by state changes: mode, texture) +#endif +#ifndef RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS + #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 4 // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture()) +#endif + +// Internal Matrix stack +#ifndef RL_MAX_MATRIX_STACK_SIZE + #define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of Matrix stack +#endif + +// Shader limits +#ifndef RL_MAX_SHADER_LOCATIONS + #define RL_MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported +#endif + +// Projection matrix culling +#ifndef RL_CULL_DISTANCE_NEAR + #define RL_CULL_DISTANCE_NEAR 0.01 // Default near cull distance +#endif +#ifndef RL_CULL_DISTANCE_FAR + #define RL_CULL_DISTANCE_FAR 1000.0 // Default far cull distance +#endif + +// Texture parameters (equivalent to OpenGL defines) +#define RL_TEXTURE_WRAP_S 0x2802 // GL_TEXTURE_WRAP_S +#define RL_TEXTURE_WRAP_T 0x2803 // GL_TEXTURE_WRAP_T +#define RL_TEXTURE_MAG_FILTER 0x2800 // GL_TEXTURE_MAG_FILTER +#define RL_TEXTURE_MIN_FILTER 0x2801 // GL_TEXTURE_MIN_FILTER + +#define RL_TEXTURE_FILTER_NEAREST 0x2600 // GL_NEAREST +#define RL_TEXTURE_FILTER_LINEAR 0x2601 // GL_LINEAR +#define RL_TEXTURE_FILTER_MIP_NEAREST 0x2700 // GL_NEAREST_MIPMAP_NEAREST +#define RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR 0x2702 // GL_NEAREST_MIPMAP_LINEAR +#define RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST 0x2701 // GL_LINEAR_MIPMAP_NEAREST +#define RL_TEXTURE_FILTER_MIP_LINEAR 0x2703 // GL_LINEAR_MIPMAP_LINEAR +#define RL_TEXTURE_FILTER_ANISOTROPIC 0x3000 // Anisotropic filter (custom identifier) +#define RL_TEXTURE_MIPMAP_BIAS_RATIO 0x4000 // Texture mipmap bias, percentage ratio (custom identifier) + +#define RL_TEXTURE_WRAP_REPEAT 0x2901 // GL_REPEAT +#define RL_TEXTURE_WRAP_CLAMP 0x812F // GL_CLAMP_TO_EDGE +#define RL_TEXTURE_WRAP_MIRROR_REPEAT 0x8370 // GL_MIRRORED_REPEAT +#define RL_TEXTURE_WRAP_MIRROR_CLAMP 0x8742 // GL_MIRROR_CLAMP_EXT + +// Matrix modes (equivalent to OpenGL) +#define RL_MODELVIEW 0x1700 // GL_MODELVIEW +#define RL_PROJECTION 0x1701 // GL_PROJECTION +#define RL_TEXTURE 0x1702 // GL_TEXTURE + +// Primitive assembly draw modes +#define RL_LINES 0x0001 // GL_LINES +#define RL_TRIANGLES 0x0004 // GL_TRIANGLES +#define RL_QUADS 0x0007 // GL_QUADS + +// GL equivalent data types +#define RL_UNSIGNED_BYTE 0x1401 // GL_UNSIGNED_BYTE +#define RL_FLOAT 0x1406 // GL_FLOAT + +// GL buffer usage hint +#define RL_STREAM_DRAW 0x88E0 // GL_STREAM_DRAW +#define RL_STREAM_READ 0x88E1 // GL_STREAM_READ +#define RL_STREAM_COPY 0x88E2 // GL_STREAM_COPY +#define RL_STATIC_DRAW 0x88E4 // GL_STATIC_DRAW +#define RL_STATIC_READ 0x88E5 // GL_STATIC_READ +#define RL_STATIC_COPY 0x88E6 // GL_STATIC_COPY +#define RL_DYNAMIC_DRAW 0x88E8 // GL_DYNAMIC_DRAW +#define RL_DYNAMIC_READ 0x88E9 // GL_DYNAMIC_READ +#define RL_DYNAMIC_COPY 0x88EA // GL_DYNAMIC_COPY + +// GL Shader type +#define RL_FRAGMENT_SHADER 0x8B30 // GL_FRAGMENT_SHADER +#define RL_VERTEX_SHADER 0x8B31 // GL_VERTEX_SHADER +#define RL_COMPUTE_SHADER 0x91B9 // GL_COMPUTE_SHADER + +// GL blending factors +#define RL_ZERO 0 // GL_ZERO +#define RL_ONE 1 // GL_ONE +#define RL_SRC_COLOR 0x0300 // GL_SRC_COLOR +#define RL_ONE_MINUS_SRC_COLOR 0x0301 // GL_ONE_MINUS_SRC_COLOR +#define RL_SRC_ALPHA 0x0302 // GL_SRC_ALPHA +#define RL_ONE_MINUS_SRC_ALPHA 0x0303 // GL_ONE_MINUS_SRC_ALPHA +#define RL_DST_ALPHA 0x0304 // GL_DST_ALPHA +#define RL_ONE_MINUS_DST_ALPHA 0x0305 // GL_ONE_MINUS_DST_ALPHA +#define RL_DST_COLOR 0x0306 // GL_DST_COLOR +#define RL_ONE_MINUS_DST_COLOR 0x0307 // GL_ONE_MINUS_DST_COLOR +#define RL_SRC_ALPHA_SATURATE 0x0308 // GL_SRC_ALPHA_SATURATE +#define RL_CONSTANT_COLOR 0x8001 // GL_CONSTANT_COLOR +#define RL_ONE_MINUS_CONSTANT_COLOR 0x8002 // GL_ONE_MINUS_CONSTANT_COLOR +#define RL_CONSTANT_ALPHA 0x8003 // GL_CONSTANT_ALPHA +#define RL_ONE_MINUS_CONSTANT_ALPHA 0x8004 // GL_ONE_MINUS_CONSTANT_ALPHA + +// GL blending functions/equations +#define RL_FUNC_ADD 0x8006 // GL_FUNC_ADD +#define RL_MIN 0x8007 // GL_MIN +#define RL_MAX 0x8008 // GL_MAX +#define RL_FUNC_SUBTRACT 0x800A // GL_FUNC_SUBTRACT +#define RL_FUNC_REVERSE_SUBTRACT 0x800B // GL_FUNC_REVERSE_SUBTRACT +#define RL_BLEND_EQUATION 0x8009 // GL_BLEND_EQUATION +#define RL_BLEND_EQUATION_RGB 0x8009 // GL_BLEND_EQUATION_RGB // (Same as BLEND_EQUATION) +#define RL_BLEND_EQUATION_ALPHA 0x883D // GL_BLEND_EQUATION_ALPHA +#define RL_BLEND_DST_RGB 0x80C8 // GL_BLEND_DST_RGB +#define RL_BLEND_SRC_RGB 0x80C9 // GL_BLEND_SRC_RGB +#define RL_BLEND_DST_ALPHA 0x80CA // GL_BLEND_DST_ALPHA +#define RL_BLEND_SRC_ALPHA 0x80CB // GL_BLEND_SRC_ALPHA +#define RL_BLEND_COLOR 0x8005 // GL_BLEND_COLOR + +#define RL_READ_FRAMEBUFFER 0x8CA8 // GL_READ_FRAMEBUFFER +#define RL_DRAW_FRAMEBUFFER 0x8CA9 // GL_DRAW_FRAMEBUFFER + +// Default shader vertex attribute locations +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION 0 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD 1 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL 2 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR 3 +#endif + #ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT +#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT 4 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 5 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES 6 +#endif +#ifdef RL_SUPPORT_MESH_GPU_SKINNING +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS 7 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS 8 +#endif +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCE_TX + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCE_TX 9 +#endif + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) || (defined(_MSC_VER) && _MSC_VER >= 1800) + #include +#elif !defined(__cplusplus) && !defined(bool) && !defined(RL_BOOL_TYPE) + // Boolean type +typedef enum bool { false = 0, true = !false } bool; +#endif + +#if !defined(RL_MATRIX_TYPE) +// Matrix, 4x4 components, column major, OpenGL style, right handed +typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) +} Matrix; +#define RL_MATRIX_TYPE +#endif + +// Dynamic vertex buffers (position + texcoords + colors + indices arrays) +typedef struct rlVertexBuffer { + int elementCount; // Number of elements in the buffer (QUADS) + + float *vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) + float *texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) + float *normals; // Vertex normal (XYZ - 3 components per vertex) (shader-location = 2) + unsigned char *colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + unsigned int *indices; // Vertex indices (in case vertex data comes indexed) (6 indices per quad) +#endif +#if defined(GRAPHICS_API_OPENGL_ES2) + unsigned short *indices; // Vertex indices (in case vertex data comes indexed) (6 indices per quad) +#endif + unsigned int vaoId; // OpenGL Vertex Array Object id + unsigned int vboId[5]; // OpenGL Vertex Buffer Objects id (5 types of vertex data) +} rlVertexBuffer; + +// Draw call type +// NOTE: Only texture changes register a new draw, other state-change-related elements are not +// used at this moment (vaoId, shaderId, matrices), raylib just forces a batch draw call if any +// of those state-change happens (this is done in core module) +typedef struct rlDrawCall { + int mode; // Drawing mode: LINES, TRIANGLES, QUADS + int vertexCount; // Number of vertex of the draw + int vertexAlignment; // Number of vertex required for index alignment (LINES, TRIANGLES) + //unsigned int vaoId; // Vertex array id to be used on the draw -> Using RLGL.currentBatch->vertexBuffer.vaoId + //unsigned int shaderId; // Shader id to be used on the draw -> Using RLGL.currentShaderId + unsigned int textureId; // Texture id to be used on the draw -> Use to create new draw call if changes + + //Matrix projection; // Projection matrix for this draw -> Using RLGL.projection by default + //Matrix modelview; // Modelview matrix for this draw -> Using RLGL.modelview by default +} rlDrawCall; + +// rlRenderBatch type +typedef struct rlRenderBatch { + int bufferCount; // Number of vertex buffers (multi-buffering support) + int currentBuffer; // Current buffer tracking in case of multi-buffering + rlVertexBuffer *vertexBuffer; // Dynamic buffer(s) for vertex data + + rlDrawCall *draws; // Draw calls array, depends on textureId + int drawCounter; // Draw calls counter + float currentDepth; // Current depth value for next draw +} rlRenderBatch; + +// OpenGL version +typedef enum { + RL_OPENGL_11 = 1, // OpenGL 1.1 + RL_OPENGL_21, // OpenGL 2.1 (GLSL 120) + RL_OPENGL_33, // OpenGL 3.3 (GLSL 330) + RL_OPENGL_43, // OpenGL 4.3 (using GLSL 330) + RL_OPENGL_ES_20, // OpenGL ES 2.0 (GLSL 100) + RL_OPENGL_ES_30 // OpenGL ES 3.0 (GLSL 300 es) +} rlGlVersion; + +// Trace log level +// NOTE: Organized by priority level +typedef enum { + RL_LOG_ALL = 0, // Display all logs + RL_LOG_TRACE, // Trace logging, intended for internal use only + RL_LOG_DEBUG, // Debug logging, used for internal debugging, it should be disabled on release builds + RL_LOG_INFO, // Info logging, used for program execution info + RL_LOG_WARNING, // Warning logging, used on recoverable failures + RL_LOG_ERROR, // Error logging, used on unrecoverable failures + RL_LOG_FATAL, // Fatal logging, used to abort program: exit(EXIT_FAILURE) + RL_LOG_NONE // Disable logging +} rlTraceLogLevel; + +// Texture pixel formats +// NOTE: Support depends on OpenGL version +typedef enum { + RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha) + RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels) + RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5, // 16 bpp + RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8, // 24 bpp + RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, // 16 bpp (1 bit alpha) + RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, // 16 bpp (4 bit alpha) + RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, // 32 bpp + RL_PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float) + RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float) + RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float) + RL_PIXELFORMAT_UNCOMPRESSED_R16, // 16 bpp (1 channel - half float) + RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16, // 16*3 bpp (3 channels - half float) + RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, // 16*4 bpp (4 channels - half float) + RL_PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha) + RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha) + RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp + RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA, // 8 bpp + RL_PIXELFORMAT_COMPRESSED_ETC1_RGB, // 4 bpp + RL_PIXELFORMAT_COMPRESSED_ETC2_RGB, // 4 bpp + RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, // 8 bpp + RL_PIXELFORMAT_COMPRESSED_PVRT_RGB, // 4 bpp + RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA, // 4 bpp + RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, // 8 bpp + RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA // 2 bpp +} rlPixelFormat; + +// Texture parameters: filter mode +// NOTE 1: Filtering considers mipmaps if available in the texture +// NOTE 2: Filter is accordingly set for minification and magnification +typedef enum { + RL_TEXTURE_FILTER_POINT = 0, // No filter, just pixel approximation + RL_TEXTURE_FILTER_BILINEAR, // Linear filtering + RL_TEXTURE_FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps) + RL_TEXTURE_FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x + RL_TEXTURE_FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x + RL_TEXTURE_FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x +} rlTextureFilter; + +// Color blending modes (pre-defined) +typedef enum { + RL_BLEND_ALPHA = 0, // Blend textures considering alpha (default) + RL_BLEND_ADDITIVE, // Blend textures adding colors + RL_BLEND_MULTIPLIED, // Blend textures multiplying colors + RL_BLEND_ADD_COLORS, // Blend textures adding colors (alternative) + RL_BLEND_SUBTRACT_COLORS, // Blend textures subtracting colors (alternative) + RL_BLEND_ALPHA_PREMULTIPLY, // Blend premultiplied textures considering alpha + RL_BLEND_CUSTOM, // Blend textures using custom src/dst factors (use rlSetBlendFactors()) + RL_BLEND_CUSTOM_SEPARATE // Blend textures using custom src/dst factors (use rlSetBlendFactorsSeparate()) +} rlBlendMode; + +// Shader location point type +typedef enum { + RL_SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position + RL_SHADER_LOC_VERTEX_TEXCOORD01, // Shader location: vertex attribute: texcoord01 + RL_SHADER_LOC_VERTEX_TEXCOORD02, // Shader location: vertex attribute: texcoord02 + RL_SHADER_LOC_VERTEX_NORMAL, // Shader location: vertex attribute: normal + RL_SHADER_LOC_VERTEX_TANGENT, // Shader location: vertex attribute: tangent + RL_SHADER_LOC_VERTEX_COLOR, // Shader location: vertex attribute: color + RL_SHADER_LOC_MATRIX_MVP, // Shader location: matrix uniform: model-view-projection + RL_SHADER_LOC_MATRIX_VIEW, // Shader location: matrix uniform: view (camera transform) + RL_SHADER_LOC_MATRIX_PROJECTION, // Shader location: matrix uniform: projection + RL_SHADER_LOC_MATRIX_MODEL, // Shader location: matrix uniform: model (transform) + RL_SHADER_LOC_MATRIX_NORMAL, // Shader location: matrix uniform: normal + RL_SHADER_LOC_VECTOR_VIEW, // Shader location: vector uniform: view + RL_SHADER_LOC_COLOR_DIFFUSE, // Shader location: vector uniform: diffuse color + RL_SHADER_LOC_COLOR_SPECULAR, // Shader location: vector uniform: specular color + RL_SHADER_LOC_COLOR_AMBIENT, // Shader location: vector uniform: ambient color + RL_SHADER_LOC_MAP_ALBEDO, // Shader location: sampler2d texture: albedo (same as: RL_SHADER_LOC_MAP_DIFFUSE) + RL_SHADER_LOC_MAP_METALNESS, // Shader location: sampler2d texture: metalness (same as: RL_SHADER_LOC_MAP_SPECULAR) + RL_SHADER_LOC_MAP_NORMAL, // Shader location: sampler2d texture: normal + RL_SHADER_LOC_MAP_ROUGHNESS, // Shader location: sampler2d texture: roughness + RL_SHADER_LOC_MAP_OCCLUSION, // Shader location: sampler2d texture: occlusion + RL_SHADER_LOC_MAP_EMISSION, // Shader location: sampler2d texture: emission + RL_SHADER_LOC_MAP_HEIGHT, // Shader location: sampler2d texture: height + RL_SHADER_LOC_MAP_CUBEMAP, // Shader location: samplerCube texture: cubemap + RL_SHADER_LOC_MAP_IRRADIANCE, // Shader location: samplerCube texture: irradiance + RL_SHADER_LOC_MAP_PREFILTER, // Shader location: samplerCube texture: prefilter + RL_SHADER_LOC_MAP_BRDF // Shader location: sampler2d texture: brdf +} rlShaderLocationIndex; + +#define RL_SHADER_LOC_MAP_DIFFUSE RL_SHADER_LOC_MAP_ALBEDO +#define RL_SHADER_LOC_MAP_SPECULAR RL_SHADER_LOC_MAP_METALNESS + +// Shader uniform data type +typedef enum { + RL_SHADER_UNIFORM_FLOAT = 0, // Shader uniform type: float + RL_SHADER_UNIFORM_VEC2, // Shader uniform type: vec2 (2 float) + RL_SHADER_UNIFORM_VEC3, // Shader uniform type: vec3 (3 float) + RL_SHADER_UNIFORM_VEC4, // Shader uniform type: vec4 (4 float) + RL_SHADER_UNIFORM_INT, // Shader uniform type: int + RL_SHADER_UNIFORM_IVEC2, // Shader uniform type: ivec2 (2 int) + RL_SHADER_UNIFORM_IVEC3, // Shader uniform type: ivec3 (3 int) + RL_SHADER_UNIFORM_IVEC4, // Shader uniform type: ivec4 (4 int) + RL_SHADER_UNIFORM_UINT, // Shader uniform type: unsigned int + RL_SHADER_UNIFORM_UIVEC2, // Shader uniform type: uivec2 (2 unsigned int) + RL_SHADER_UNIFORM_UIVEC3, // Shader uniform type: uivec3 (3 unsigned int) + RL_SHADER_UNIFORM_UIVEC4, // Shader uniform type: uivec4 (4 unsigned int) + RL_SHADER_UNIFORM_SAMPLER2D // Shader uniform type: sampler2d +} rlShaderUniformDataType; + +// Shader attribute data types +typedef enum { + RL_SHADER_ATTRIB_FLOAT = 0, // Shader attribute type: float + RL_SHADER_ATTRIB_VEC2, // Shader attribute type: vec2 (2 float) + RL_SHADER_ATTRIB_VEC3, // Shader attribute type: vec3 (3 float) + RL_SHADER_ATTRIB_VEC4 // Shader attribute type: vec4 (4 float) +} rlShaderAttributeDataType; + +// Framebuffer attachment type +// NOTE: By default up to 8 color channels defined, but it can be more +typedef enum { + RL_ATTACHMENT_COLOR_CHANNEL0 = 0, // Framebuffer attachment type: color 0 + RL_ATTACHMENT_COLOR_CHANNEL1 = 1, // Framebuffer attachment type: color 1 + RL_ATTACHMENT_COLOR_CHANNEL2 = 2, // Framebuffer attachment type: color 2 + RL_ATTACHMENT_COLOR_CHANNEL3 = 3, // Framebuffer attachment type: color 3 + RL_ATTACHMENT_COLOR_CHANNEL4 = 4, // Framebuffer attachment type: color 4 + RL_ATTACHMENT_COLOR_CHANNEL5 = 5, // Framebuffer attachment type: color 5 + RL_ATTACHMENT_COLOR_CHANNEL6 = 6, // Framebuffer attachment type: color 6 + RL_ATTACHMENT_COLOR_CHANNEL7 = 7, // Framebuffer attachment type: color 7 + RL_ATTACHMENT_DEPTH = 100, // Framebuffer attachment type: depth + RL_ATTACHMENT_STENCIL = 200, // Framebuffer attachment type: stencil +} rlFramebufferAttachType; + +// Framebuffer texture attachment type +typedef enum { + RL_ATTACHMENT_CUBEMAP_POSITIVE_X = 0, // Framebuffer texture attachment type: cubemap, +X side + RL_ATTACHMENT_CUBEMAP_NEGATIVE_X = 1, // Framebuffer texture attachment type: cubemap, -X side + RL_ATTACHMENT_CUBEMAP_POSITIVE_Y = 2, // Framebuffer texture attachment type: cubemap, +Y side + RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y = 3, // Framebuffer texture attachment type: cubemap, -Y side + RL_ATTACHMENT_CUBEMAP_POSITIVE_Z = 4, // Framebuffer texture attachment type: cubemap, +Z side + RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z = 5, // Framebuffer texture attachment type: cubemap, -Z side + RL_ATTACHMENT_TEXTURE2D = 100, // Framebuffer texture attachment type: texture2d + RL_ATTACHMENT_RENDERBUFFER = 200, // Framebuffer texture attachment type: renderbuffer +} rlFramebufferAttachTextureType; + +// Face culling mode +typedef enum { + RL_CULL_FACE_FRONT = 0, + RL_CULL_FACE_BACK +} rlCullMode; + +//------------------------------------------------------------------------------------ +// Functions Declaration - Matrix operations +//------------------------------------------------------------------------------------ + +#if defined(__cplusplus) +extern "C" { // Prevents name mangling of functions +#endif + +RLAPI void rlMatrixMode(int mode); // Choose the current matrix to be transformed +RLAPI void rlPushMatrix(void); // Push the current matrix to stack +RLAPI void rlPopMatrix(void); // Pop latest inserted matrix from stack +RLAPI void rlLoadIdentity(void); // Reset current matrix to identity matrix +RLAPI void rlTranslatef(float x, float y, float z); // Multiply the current matrix by a translation matrix +RLAPI void rlRotatef(float angle, float x, float y, float z); // Multiply the current matrix by a rotation matrix +RLAPI void rlScalef(float x, float y, float z); // Multiply the current matrix by a scaling matrix +RLAPI void rlMultMatrixf(const float *matf); // Multiply the current matrix by another matrix +RLAPI void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar); +RLAPI void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar); +RLAPI void rlViewport(int x, int y, int width, int height); // Set the viewport area +RLAPI void rlSetClipPlanes(double nearPlane, double farPlane); // Set clip planes distances +RLAPI double rlGetCullDistanceNear(void); // Get cull plane distance near +RLAPI double rlGetCullDistanceFar(void); // Get cull plane distance far + +//------------------------------------------------------------------------------------ +// Functions Declaration - Vertex level operations +//------------------------------------------------------------------------------------ +RLAPI void rlBegin(int mode); // Initialize drawing mode (how to organize vertex) +RLAPI void rlEnd(void); // Finish vertex providing +RLAPI void rlVertex2i(int x, int y); // Define one vertex (position) - 2 int +RLAPI void rlVertex2f(float x, float y); // Define one vertex (position) - 2 float +RLAPI void rlVertex3f(float x, float y, float z); // Define one vertex (position) - 3 float +RLAPI void rlTexCoord2f(float x, float y); // Define one vertex (texture coordinate) - 2 float +RLAPI void rlNormal3f(float x, float y, float z); // Define one vertex (normal) - 3 float +RLAPI void rlColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a); // Define one vertex (color) - 4 byte +RLAPI void rlColor3f(float x, float y, float z); // Define one vertex (color) - 3 float +RLAPI void rlColor4f(float x, float y, float z, float w); // Define one vertex (color) - 4 float + +//------------------------------------------------------------------------------------ +// Functions Declaration - OpenGL style functions (common to 1.1, 3.3+, ES2) +// NOTE: This functions are used to completely abstract raylib code from OpenGL layer, +// some of them are direct wrappers over OpenGL calls, some others are custom +//------------------------------------------------------------------------------------ + +// Vertex buffers state +RLAPI bool rlEnableVertexArray(unsigned int vaoId); // Enable vertex array (VAO, if supported) +RLAPI void rlDisableVertexArray(void); // Disable vertex array (VAO, if supported) +RLAPI void rlEnableVertexBuffer(unsigned int id); // Enable vertex buffer (VBO) +RLAPI void rlDisableVertexBuffer(void); // Disable vertex buffer (VBO) +RLAPI void rlEnableVertexBufferElement(unsigned int id); // Enable vertex buffer element (VBO element) +RLAPI void rlDisableVertexBufferElement(void); // Disable vertex buffer element (VBO element) +RLAPI void rlEnableVertexAttribute(unsigned int index); // Enable vertex attribute index +RLAPI void rlDisableVertexAttribute(unsigned int index); // Disable vertex attribute index +#if defined(GRAPHICS_API_OPENGL_11) +RLAPI void rlEnableStatePointer(int vertexAttribType, void *buffer); // Enable attribute state pointer +RLAPI void rlDisableStatePointer(int vertexAttribType); // Disable attribute state pointer +#endif + +// Textures state +RLAPI void rlActiveTextureSlot(int slot); // Select and active a texture slot +RLAPI void rlEnableTexture(unsigned int id); // Enable texture +RLAPI void rlDisableTexture(void); // Disable texture +RLAPI void rlEnableTextureCubemap(unsigned int id); // Enable texture cubemap +RLAPI void rlDisableTextureCubemap(void); // Disable texture cubemap +RLAPI void rlTextureParameters(unsigned int id, int param, int value); // Set texture parameters (filter, wrap) +RLAPI void rlCubemapParameters(unsigned int id, int param, int value); // Set cubemap parameters (filter, wrap) + +// Shader state +RLAPI void rlEnableShader(unsigned int id); // Enable shader program +RLAPI void rlDisableShader(void); // Disable shader program + +// Framebuffer state +RLAPI void rlEnableFramebuffer(unsigned int id); // Enable render texture (fbo) +RLAPI void rlDisableFramebuffer(void); // Disable render texture (fbo), return to default framebuffer +RLAPI unsigned int rlGetActiveFramebuffer(void); // Get the currently active render texture (fbo), 0 for default framebuffer +RLAPI void rlActiveDrawBuffers(int count); // Activate multiple draw color buffers +RLAPI void rlBlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight, int bufferMask); // Blit active framebuffer to main framebuffer +RLAPI void rlBindFramebuffer(unsigned int target, unsigned int framebuffer); // Bind framebuffer (FBO) + +// General render state +RLAPI void rlEnableColorBlend(void); // Enable color blending +RLAPI void rlDisableColorBlend(void); // Disable color blending +RLAPI void rlEnableDepthTest(void); // Enable depth test +RLAPI void rlDisableDepthTest(void); // Disable depth test +RLAPI void rlEnableDepthMask(void); // Enable depth write +RLAPI void rlDisableDepthMask(void); // Disable depth write +RLAPI void rlEnableBackfaceCulling(void); // Enable backface culling +RLAPI void rlDisableBackfaceCulling(void); // Disable backface culling +RLAPI void rlColorMask(bool r, bool g, bool b, bool a); // Color mask control +RLAPI void rlSetCullFace(int mode); // Set face culling mode +RLAPI void rlEnableScissorTest(void); // Enable scissor test +RLAPI void rlDisableScissorTest(void); // Disable scissor test +RLAPI void rlScissor(int x, int y, int width, int height); // Scissor test +RLAPI void rlEnableWireMode(void); // Enable wire mode +RLAPI void rlEnablePointMode(void); // Enable point mode +RLAPI void rlDisableWireMode(void); // Disable wire (and point) mode +RLAPI void rlSetLineWidth(float width); // Set the line drawing width +RLAPI float rlGetLineWidth(void); // Get the line drawing width +RLAPI void rlEnableSmoothLines(void); // Enable line aliasing +RLAPI void rlDisableSmoothLines(void); // Disable line aliasing +RLAPI void rlEnableStereoRender(void); // Enable stereo rendering +RLAPI void rlDisableStereoRender(void); // Disable stereo rendering +RLAPI bool rlIsStereoRenderEnabled(void); // Check if stereo render is enabled + +RLAPI void rlClearColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a); // Clear color buffer with color +RLAPI void rlClearScreenBuffers(void); // Clear used screen buffers (color and depth) +RLAPI void rlCheckErrors(void); // Check and log OpenGL error codes +RLAPI void rlSetBlendMode(int mode); // Set blending mode +RLAPI void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation); // Set blending mode factor and equation (using OpenGL factors) +RLAPI void rlSetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha, int glEqRGB, int glEqAlpha); // Set blending mode factors and equations separately (using OpenGL factors) + +//------------------------------------------------------------------------------------ +// Functions Declaration - rlgl functionality +//------------------------------------------------------------------------------------ +// rlgl initialization functions +RLAPI void rlglInit(int width, int height); // Initialize rlgl (buffers, shaders, textures, states) +RLAPI void rlglClose(void); // De-initialize rlgl (buffers, shaders, textures) +RLAPI void rlLoadExtensions(void *loader); // Load OpenGL extensions (loader function required) +RLAPI int rlGetVersion(void); // Get current OpenGL version +RLAPI void rlSetFramebufferWidth(int width); // Set current framebuffer width +RLAPI int rlGetFramebufferWidth(void); // Get default framebuffer width +RLAPI void rlSetFramebufferHeight(int height); // Set current framebuffer height +RLAPI int rlGetFramebufferHeight(void); // Get default framebuffer height + +RLAPI unsigned int rlGetTextureIdDefault(void); // Get default texture id +RLAPI unsigned int rlGetShaderIdDefault(void); // Get default shader id +RLAPI int *rlGetShaderLocsDefault(void); // Get default shader locations + +// Render batch management +// NOTE: rlgl provides a default render batch to behave like OpenGL 1.1 immediate mode +// but this render batch API is exposed in case of custom batches are required +RLAPI rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements); // Load a render batch system +RLAPI void rlUnloadRenderBatch(rlRenderBatch batch); // Unload render batch system +RLAPI void rlDrawRenderBatch(rlRenderBatch *batch); // Draw render batch data (Update->Draw->Reset) +RLAPI void rlSetRenderBatchActive(rlRenderBatch *batch); // Set the active render batch for rlgl (NULL for default internal) +RLAPI void rlDrawRenderBatchActive(void); // Update and draw internal render batch +RLAPI bool rlCheckRenderBatchLimit(int vCount); // Check internal buffer overflow for a given number of vertex + +RLAPI void rlSetTexture(unsigned int id); // Set current texture for render batch and check buffers limits + +//------------------------------------------------------------------------------------------------------------------------ + +// Vertex buffers management +RLAPI unsigned int rlLoadVertexArray(void); // Load vertex array (vao) if supported +RLAPI unsigned int rlLoadVertexBuffer(const void *buffer, int size, bool dynamic); // Load a vertex buffer object +RLAPI unsigned int rlLoadVertexBufferElement(const void *buffer, int size, bool dynamic); // Load vertex buffer elements object +RLAPI void rlUpdateVertexBuffer(unsigned int bufferId, const void *data, int dataSize, int offset); // Update vertex buffer object data on GPU buffer +RLAPI void rlUpdateVertexBufferElements(unsigned int id, const void *data, int dataSize, int offset); // Update vertex buffer elements data on GPU buffer +RLAPI void rlUnloadVertexArray(unsigned int vaoId); // Unload vertex array (vao) +RLAPI void rlUnloadVertexBuffer(unsigned int vboId); // Unload vertex buffer object +RLAPI void rlSetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int stride, int offset); // Set vertex attribute data configuration +RLAPI void rlSetVertexAttributeDivisor(unsigned int index, int divisor); // Set vertex attribute data divisor +RLAPI void rlSetVertexAttributeDefault(int locIndex, const void *value, int attribType, int count); // Set vertex attribute default value, when attribute to provided +RLAPI void rlDrawVertexArray(int offset, int count); // Draw vertex array (currently active vao) +RLAPI void rlDrawVertexArrayElements(int offset, int count, const void *buffer); // Draw vertex array elements +RLAPI void rlDrawVertexArrayInstanced(int offset, int count, int instances); // Draw vertex array (currently active vao) with instancing +RLAPI void rlDrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances); // Draw vertex array elements with instancing + +// Textures management +RLAPI unsigned int rlLoadTexture(const void *data, int width, int height, int format, int mipmapCount); // Load texture data +RLAPI unsigned int rlLoadTextureDepth(int width, int height, bool useRenderBuffer); // Load depth texture/renderbuffer (to be attached to fbo) +RLAPI unsigned int rlLoadTextureCubemap(const void *data, int size, int format, int mipmapCount); // Load texture cubemap data +RLAPI void rlUpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int height, int format, const void *data); // Update texture with new data on GPU +RLAPI void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned int *glFormat, unsigned int *glType); // Get OpenGL internal formats +RLAPI const char *rlGetPixelFormatName(unsigned int format); // Get name string for pixel format +RLAPI void rlUnloadTexture(unsigned int id); // Unload texture from GPU memory +RLAPI void rlGenTextureMipmaps(unsigned int id, int width, int height, int format, int *mipmaps); // Generate mipmap data for selected texture +RLAPI void *rlReadTexturePixels(unsigned int id, int width, int height, int format); // Read texture pixel data +RLAPI unsigned char *rlReadScreenPixels(int width, int height); // Read screen pixel data (color buffer) + +// Framebuffer management (fbo) +RLAPI unsigned int rlLoadFramebuffer(void); // Load an empty framebuffer +RLAPI void rlFramebufferAttach(unsigned int fboId, unsigned int texId, int attachType, int texType, int mipLevel); // Attach texture/renderbuffer to a framebuffer +RLAPI bool rlFramebufferComplete(unsigned int id); // Verify framebuffer is complete +RLAPI void rlUnloadFramebuffer(unsigned int id); // Delete framebuffer from GPU + +// Shaders management +RLAPI unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode); // Load shader from code strings +RLAPI unsigned int rlCompileShader(const char *shaderCode, int type); // Compile custom shader and return shader id (type: RL_VERTEX_SHADER, RL_FRAGMENT_SHADER, RL_COMPUTE_SHADER) +RLAPI unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId); // Load custom shader program +RLAPI void rlUnloadShaderProgram(unsigned int id); // Unload shader program +RLAPI int rlGetLocationUniform(unsigned int shaderId, const char *uniformName); // Get shader location uniform +RLAPI int rlGetLocationAttrib(unsigned int shaderId, const char *attribName); // Get shader location attribute +RLAPI void rlSetUniform(int locIndex, const void *value, int uniformType, int count); // Set shader value uniform +RLAPI void rlSetUniformMatrix(int locIndex, Matrix mat); // Set shader value matrix +RLAPI void rlSetUniformMatrices(int locIndex, const Matrix *mat, int count); // Set shader value matrices +RLAPI void rlSetUniformSampler(int locIndex, unsigned int textureId); // Set shader value sampler +RLAPI void rlSetShader(unsigned int id, int *locs); // Set shader currently active (id and locations) + +// Compute shader management +RLAPI unsigned int rlLoadComputeShaderProgram(unsigned int shaderId); // Load compute shader program +RLAPI void rlComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ); // Dispatch compute shader (equivalent to *draw* for graphics pipeline) + +// Shader buffer storage object management (ssbo) +RLAPI unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHint); // Load shader storage buffer object (SSBO) +RLAPI void rlUnloadShaderBuffer(unsigned int ssboId); // Unload shader storage buffer object (SSBO) +RLAPI void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int offset); // Update SSBO buffer data +RLAPI void rlBindShaderBuffer(unsigned int id, unsigned int index); // Bind SSBO buffer +RLAPI void rlReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsigned int offset); // Read SSBO buffer data (GPU->CPU) +RLAPI void rlCopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, unsigned int srcOffset, unsigned int count); // Copy SSBO data between buffers +RLAPI unsigned int rlGetShaderBufferSize(unsigned int id); // Get SSBO buffer size + +// Buffer management +RLAPI void rlBindImageTexture(unsigned int id, unsigned int index, int format, bool readonly); // Bind image texture + +// Matrix state management +RLAPI Matrix rlGetMatrixModelview(void); // Get internal modelview matrix +RLAPI Matrix rlGetMatrixProjection(void); // Get internal projection matrix +RLAPI Matrix rlGetMatrixTransform(void); // Get internal accumulated transform matrix +RLAPI Matrix rlGetMatrixProjectionStereo(int eye); // Get internal projection matrix for stereo render (selected eye) +RLAPI Matrix rlGetMatrixViewOffsetStereo(int eye); // Get internal view offset matrix for stereo render (selected eye) +RLAPI void rlSetMatrixProjection(Matrix proj); // Set a custom projection matrix (replaces internal projection matrix) +RLAPI void rlSetMatrixModelview(Matrix view); // Set a custom modelview matrix (replaces internal modelview matrix) +RLAPI void rlSetMatrixProjectionStereo(Matrix right, Matrix left); // Set eyes projection matrices for stereo rendering +RLAPI void rlSetMatrixViewOffsetStereo(Matrix right, Matrix left); // Set eyes view offsets matrices for stereo rendering + +// Quick and dirty cube/quad buffers load->draw->unload +RLAPI void rlLoadDrawCube(void); // Load and draw a cube +RLAPI void rlLoadDrawQuad(void); // Load and draw a quad + +#if defined(__cplusplus) +} +#endif + +#endif // RLGL_H + +/*********************************************************************************** +* +* RLGL IMPLEMENTATION +* +************************************************************************************/ + +#if defined(RLGL_IMPLEMENTATION) + +// Expose OpenGL functions from glad in raylib +#if defined(BUILD_LIBTYPE_SHARED) + #define GLAD_API_CALL_EXPORT + #define GLAD_API_CALL_EXPORT_BUILD +#endif + +#if defined(GRAPHICS_API_OPENGL_11) + #if defined(__APPLE__) + #include // OpenGL 1.1 library for OSX + #include // OpenGL extensions library + #else + // APIENTRY for OpenGL function pointer declarations is required + #if !defined(APIENTRY) + #if defined(_WIN32) + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif + #endif + // WINGDIAPI definition. Some Windows OpenGL headers need it + #if !defined(WINGDIAPI) && defined(_WIN32) + #define WINGDIAPI __declspec(dllimport) + #endif + + #include // OpenGL 1.1 library + #endif +#endif + +#if defined(GRAPHICS_API_OPENGL_33) + #define GLAD_MALLOC RL_MALLOC + #define GLAD_FREE RL_FREE + + #define GLAD_GL_IMPLEMENTATION + #include "external/glad.h" // GLAD extensions loading library, includes OpenGL headers +#endif + +#if defined(GRAPHICS_API_OPENGL_ES3) + #include // OpenGL ES 3.0 library + #define GL_GLEXT_PROTOTYPES + #include // OpenGL ES 2.0 extensions library +#elif defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: OpenGL ES 2.0 can be enabled on Desktop platforms, + // in that case, functions are loaded from a custom glad for OpenGL ES 2.0 + #if defined(PLATFORM_DESKTOP_GLFW) || defined(PLATFORM_DESKTOP_SDL) + #define GLAD_GLES2_IMPLEMENTATION + #include "external/glad_gles2.h" + #else + #define GL_GLEXT_PROTOTYPES + //#include // EGL library -> not required, platform layer + #include // OpenGL ES 2.0 library + #include // OpenGL ES 2.0 extensions library + #endif + + // It seems OpenGL ES 2.0 instancing entry points are not defined on Raspberry Pi + // provided headers (despite being defined in official Khronos GLES2 headers) + #if defined(PLATFORM_DRM) + typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); + typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); + typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); + #endif +#endif + +#include // Required for: malloc(), free() +#include // Required for: strcmp(), strlen() [Used in rlglInit(), on extensions loading] +#include // Required for: sqrtf(), sinf(), cosf(), floor(), log() + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#ifndef PI + #define PI 3.14159265358979323846f +#endif +#ifndef DEG2RAD + #define DEG2RAD (PI/180.0f) +#endif +#ifndef RAD2DEG + #define RAD2DEG (180.0f/PI) +#endif + +#ifndef GL_SHADING_LANGUAGE_VERSION + #define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#endif + +#ifndef GL_COMPRESSED_RGB_S3TC_DXT1_EXT + #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#endif +#ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT + #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#endif +#ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT + #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#endif +#ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT + #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif +#ifndef GL_ETC1_RGB8_OES + #define GL_ETC1_RGB8_OES 0x8D64 +#endif +#ifndef GL_COMPRESSED_RGB8_ETC2 + #define GL_COMPRESSED_RGB8_ETC2 0x9274 +#endif +#ifndef GL_COMPRESSED_RGBA8_ETC2_EAC + #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#endif +#ifndef GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG + #define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#endif +#ifndef GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG + #define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#endif +#ifndef GL_COMPRESSED_RGBA_ASTC_4x4_KHR + #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93b0 +#endif +#ifndef GL_COMPRESSED_RGBA_ASTC_8x8_KHR + #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93b7 +#endif + +#ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT + #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif +#ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT + #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#endif + +#ifndef GL_PROGRAM_POINT_SIZE + #define GL_PROGRAM_POINT_SIZE 0x8642 +#endif + +#ifndef GL_LINE_WIDTH + #define GL_LINE_WIDTH 0x0B21 +#endif + +#if defined(GRAPHICS_API_OPENGL_11) + #define GL_UNSIGNED_SHORT_5_6_5 0x8363 + #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 + #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#endif + +#if defined(GRAPHICS_API_OPENGL_21) + #define GL_LUMINANCE 0x1909 + #define GL_LUMINANCE_ALPHA 0x190A +#endif + +#if defined(GRAPHICS_API_OPENGL_ES2) + #define glClearDepth glClearDepthf + #if !defined(GRAPHICS_API_OPENGL_ES3) + #define GL_READ_FRAMEBUFFER GL_FRAMEBUFFER + #define GL_DRAW_FRAMEBUFFER GL_FRAMEBUFFER + #endif +#endif + +// Default shader vertex attribute names to set location points +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION + #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD + #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL + #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR + #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT + #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 + #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS + #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS "vertexBoneIds" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS + #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS "vertexBoneWeights" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCE_TX + #define RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCE_TX "instanceTransform" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCE_TX +#endif + +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MVP + #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp" // model-view-projection matrix +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW + #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView" // view matrix +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION + #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection" // projection matrix +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL + #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel" // model matrix +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL + #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal" // normal matrix (transpose(inverse(matModelView)) +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR + #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (base tint color, multiplied by texture color) +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES + #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONE_MATRICES "boneMatrices" // bone matrices +#endif +#ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 + #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0) +#endif +#ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 + #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1" // texture1 (texture slot active 1) +#endif +#ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 + #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) +#endif + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +typedef struct rlglData { + rlRenderBatch *currentBatch; // Current render batch + rlRenderBatch defaultBatch; // Default internal render batch + + struct { + int vertexCounter; // Current active render batch vertex counter (generic, used for all batches) + float texcoordx, texcoordy; // Current active texture coordinate (added on glVertex*()) + float normalx, normaly, normalz; // Current active normal (added on glVertex*()) + unsigned char colorr, colorg, colorb, colora; // Current active color (added on glVertex*()) + + int currentMatrixMode; // Current matrix mode + Matrix *currentMatrix; // Current matrix pointer + Matrix modelview; // Default modelview matrix + Matrix projection; // Default projection matrix + Matrix transform; // Transform matrix to be used with rlTranslate, rlRotate, rlScale + bool transformRequired; // Require transform matrix application to current draw-call vertex (if required) + Matrix stack[RL_MAX_MATRIX_STACK_SIZE];// Matrix stack for push/pop + int stackCounter; // Matrix stack counter + + unsigned int defaultTextureId; // Default texture used on shapes/poly drawing (required by shader) + unsigned int activeTextureId[RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS]; // Active texture ids to be enabled on batch drawing (0 active by default) + unsigned int defaultVShaderId; // Default vertex shader id (used by default shader program) + unsigned int defaultFShaderId; // Default fragment shader id (used by default shader program) + unsigned int defaultShaderId; // Default shader program id, supports vertex color and diffuse texture + int *defaultShaderLocs; // Default shader locations pointer to be used on rendering + unsigned int currentShaderId; // Current shader id to be used on rendering (by default, defaultShaderId) + int *currentShaderLocs; // Current shader locations pointer to be used on rendering (by default, defaultShaderLocs) + + bool stereoRender; // Stereo rendering flag + Matrix projectionStereo[2]; // VR stereo rendering eyes projection matrices + Matrix viewOffsetStereo[2]; // VR stereo rendering eyes view offset matrices + + // Blending variables + int currentBlendMode; // Blending mode active + int glBlendSrcFactor; // Blending source factor + int glBlendDstFactor; // Blending destination factor + int glBlendEquation; // Blending equation + int glBlendSrcFactorRGB; // Blending source RGB factor + int glBlendDestFactorRGB; // Blending destination RGB factor + int glBlendSrcFactorAlpha; // Blending source alpha factor + int glBlendDestFactorAlpha; // Blending destination alpha factor + int glBlendEquationRGB; // Blending equation for RGB + int glBlendEquationAlpha; // Blending equation for alpha + bool glCustomBlendModeModified; // Custom blending factor and equation modification status + + int framebufferWidth; // Current framebuffer width + int framebufferHeight; // Current framebuffer height + + } State; // Renderer state + struct { + bool vao; // VAO support (OpenGL ES2 could not support VAO extension) (GL_ARB_vertex_array_object) + bool instancing; // Instancing supported (GL_ANGLE_instanced_arrays, GL_EXT_draw_instanced + GL_EXT_instanced_arrays) + bool texNPOT; // NPOT textures full support (GL_ARB_texture_non_power_of_two, GL_OES_texture_npot) + bool texDepth; // Depth textures supported (GL_ARB_depth_texture, GL_OES_depth_texture) + bool texDepthWebGL; // Depth textures supported WebGL specific (GL_WEBGL_depth_texture) + bool texFloat32; // float textures support (32 bit per channel) (GL_OES_texture_float) + bool texFloat16; // half float textures support (16 bit per channel) (GL_OES_texture_half_float) + bool texCompDXT; // DDS texture compression support (GL_EXT_texture_compression_s3tc, GL_WEBGL_compressed_texture_s3tc, GL_WEBKIT_WEBGL_compressed_texture_s3tc) + bool texCompETC1; // ETC1 texture compression support (GL_OES_compressed_ETC1_RGB8_texture, GL_WEBGL_compressed_texture_etc1) + bool texCompETC2; // ETC2/EAC texture compression support (GL_ARB_ES3_compatibility) + bool texCompPVRT; // PVR texture compression support (GL_IMG_texture_compression_pvrtc) + bool texCompASTC; // ASTC texture compression support (GL_KHR_texture_compression_astc_hdr, GL_KHR_texture_compression_astc_ldr) + bool texMirrorClamp; // Clamp mirror wrap mode supported (GL_EXT_texture_mirror_clamp) + bool texAnisoFilter; // Anisotropic texture filtering support (GL_EXT_texture_filter_anisotropic) + bool computeShader; // Compute shaders support (GL_ARB_compute_shader) + bool ssbo; // Shader storage buffer object support (GL_ARB_shader_storage_buffer_object) + + float maxAnisotropyLevel; // Maximum anisotropy level supported (minimum is 2.0f) + int maxDepthBits; // Maximum bits for depth component + + } ExtSupported; // Extensions supported flags +} rlglData; + +typedef void *(*rlglLoadProc)(const char *name); // OpenGL extension functions loader signature (same as GLADloadproc) + +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +static double rlCullDistanceNear = RL_CULL_DISTANCE_NEAR; +static double rlCullDistanceFar = RL_CULL_DISTANCE_FAR; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +static rlglData RLGL = { 0 }; +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + +#if defined(GRAPHICS_API_OPENGL_ES2) && !defined(GRAPHICS_API_OPENGL_ES3) +// NOTE: VAO functionality is exposed through extensions (OES) +static PFNGLGENVERTEXARRAYSOESPROC glGenVertexArrays = NULL; +static PFNGLBINDVERTEXARRAYOESPROC glBindVertexArray = NULL; +static PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArrays = NULL; + +// NOTE: Instancing functionality could also be available through extension +static PFNGLDRAWARRAYSINSTANCEDEXTPROC glDrawArraysInstanced = NULL; +static PFNGLDRAWELEMENTSINSTANCEDEXTPROC glDrawElementsInstanced = NULL; +static PFNGLVERTEXATTRIBDIVISOREXTPROC glVertexAttribDivisor = NULL; +#endif + +//---------------------------------------------------------------------------------- +// Module specific Functions Declaration +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +static void rlLoadShaderDefault(void); // Load default shader +static void rlUnloadShaderDefault(void); // Unload default shader +#if defined(RLGL_SHOW_GL_DETAILS_INFO) +static const char *rlGetCompressedFormatName(int format); // Get compressed format official GL identifier name +#endif // RLGL_SHOW_GL_DETAILS_INFO +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + +static int rlGetPixelDataSize(int width, int height, int format); // Get pixel data size in bytes (image or texture) + +// Auxiliar matrix math functions +typedef struct rl_float16 { + float v[16]; +} rl_float16; +static rl_float16 rlMatrixToFloatV(Matrix mat); // Get float array of matrix data +#define rlMatrixToFloat(mat) (rlMatrixToFloatV(mat).v) // Get float vector for Matrix +static Matrix rlMatrixIdentity(void); // Get identity matrix +static Matrix rlMatrixMultiply(Matrix left, Matrix right); // Multiply two matrices +static Matrix rlMatrixTranspose(Matrix mat); // Transposes provided matrix +static Matrix rlMatrixInvert(Matrix mat); // Invert provided matrix + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Matrix operations +//---------------------------------------------------------------------------------- + +#if defined(GRAPHICS_API_OPENGL_11) +// Fallback to OpenGL 1.1 function calls +//--------------------------------------- +void rlMatrixMode(int mode) +{ + switch (mode) + { + case RL_PROJECTION: glMatrixMode(GL_PROJECTION); break; + case RL_MODELVIEW: glMatrixMode(GL_MODELVIEW); break; + case RL_TEXTURE: glMatrixMode(GL_TEXTURE); break; + default: break; + } +} + +void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar) +{ + glFrustum(left, right, bottom, top, znear, zfar); +} + +void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar) +{ + glOrtho(left, right, bottom, top, znear, zfar); +} + +void rlPushMatrix(void) { glPushMatrix(); } +void rlPopMatrix(void) { glPopMatrix(); } +void rlLoadIdentity(void) { glLoadIdentity(); } +void rlTranslatef(float x, float y, float z) { glTranslatef(x, y, z); } +void rlRotatef(float angle, float x, float y, float z) { glRotatef(angle, x, y, z); } +void rlScalef(float x, float y, float z) { glScalef(x, y, z); } +void rlMultMatrixf(const float *matf) { glMultMatrixf(matf); } +#endif +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +// Choose the current matrix to be transformed +void rlMatrixMode(int mode) +{ + if (mode == RL_PROJECTION) RLGL.State.currentMatrix = &RLGL.State.projection; + else if (mode == RL_MODELVIEW) RLGL.State.currentMatrix = &RLGL.State.modelview; + //else if (mode == RL_TEXTURE) // Not supported + + RLGL.State.currentMatrixMode = mode; +} + +// Push the current matrix into RLGL.State.stack +void rlPushMatrix(void) +{ + if (RLGL.State.stackCounter >= RL_MAX_MATRIX_STACK_SIZE) TRACELOG(RL_LOG_ERROR, "RLGL: Matrix stack overflow (RL_MAX_MATRIX_STACK_SIZE)"); + + if (RLGL.State.currentMatrixMode == RL_MODELVIEW) + { + RLGL.State.transformRequired = true; + RLGL.State.currentMatrix = &RLGL.State.transform; + } + + RLGL.State.stack[RLGL.State.stackCounter] = *RLGL.State.currentMatrix; + RLGL.State.stackCounter++; +} + +// Pop lattest inserted matrix from RLGL.State.stack +void rlPopMatrix(void) +{ + if (RLGL.State.stackCounter > 0) + { + Matrix mat = RLGL.State.stack[RLGL.State.stackCounter - 1]; + *RLGL.State.currentMatrix = mat; + RLGL.State.stackCounter--; + } + + if ((RLGL.State.stackCounter == 0) && (RLGL.State.currentMatrixMode == RL_MODELVIEW)) + { + RLGL.State.currentMatrix = &RLGL.State.modelview; + RLGL.State.transformRequired = false; + } +} + +// Reset current matrix to identity matrix +void rlLoadIdentity(void) +{ + *RLGL.State.currentMatrix = rlMatrixIdentity(); +} + +// Multiply the current matrix by a translation matrix +void rlTranslatef(float x, float y, float z) +{ + Matrix matTranslation = { + 1.0f, 0.0f, 0.0f, x, + 0.0f, 1.0f, 0.0f, y, + 0.0f, 0.0f, 1.0f, z, + 0.0f, 0.0f, 0.0f, 1.0f + }; + + // NOTE: We transpose matrix with multiplication order + *RLGL.State.currentMatrix = rlMatrixMultiply(matTranslation, *RLGL.State.currentMatrix); +} + +// Multiply the current matrix by a rotation matrix +// NOTE: The provided angle must be in degrees +void rlRotatef(float angle, float x, float y, float z) +{ + Matrix matRotation = rlMatrixIdentity(); + + // Axis vector (x, y, z) normalization + float lengthSquared = x*x + y*y + z*z; + if ((lengthSquared != 1.0f) && (lengthSquared != 0.0f)) + { + float inverseLength = 1.0f/sqrtf(lengthSquared); + x *= inverseLength; + y *= inverseLength; + z *= inverseLength; + } + + // Rotation matrix generation + float sinres = sinf(DEG2RAD*angle); + float cosres = cosf(DEG2RAD*angle); + float t = 1.0f - cosres; + + matRotation.m0 = x*x*t + cosres; + matRotation.m1 = y*x*t + z*sinres; + matRotation.m2 = z*x*t - y*sinres; + matRotation.m3 = 0.0f; + + matRotation.m4 = x*y*t - z*sinres; + matRotation.m5 = y*y*t + cosres; + matRotation.m6 = z*y*t + x*sinres; + matRotation.m7 = 0.0f; + + matRotation.m8 = x*z*t + y*sinres; + matRotation.m9 = y*z*t - x*sinres; + matRotation.m10 = z*z*t + cosres; + matRotation.m11 = 0.0f; + + matRotation.m12 = 0.0f; + matRotation.m13 = 0.0f; + matRotation.m14 = 0.0f; + matRotation.m15 = 1.0f; + + // NOTE: We transpose matrix with multiplication order + *RLGL.State.currentMatrix = rlMatrixMultiply(matRotation, *RLGL.State.currentMatrix); +} + +// Multiply the current matrix by a scaling matrix +void rlScalef(float x, float y, float z) +{ + Matrix matScale = { + x, 0.0f, 0.0f, 0.0f, + 0.0f, y, 0.0f, 0.0f, + 0.0f, 0.0f, z, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + + // NOTE: We transpose matrix with multiplication order + *RLGL.State.currentMatrix = rlMatrixMultiply(matScale, *RLGL.State.currentMatrix); +} + +// Multiply the current matrix by another matrix +void rlMultMatrixf(const float *matf) +{ + // Matrix creation from array + Matrix mat = { matf[0], matf[4], matf[8], matf[12], + matf[1], matf[5], matf[9], matf[13], + matf[2], matf[6], matf[10], matf[14], + matf[3], matf[7], matf[11], matf[15] }; + + *RLGL.State.currentMatrix = rlMatrixMultiply(mat, *RLGL.State.currentMatrix); +} + +// Multiply the current matrix by a perspective matrix generated by parameters +void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar) +{ + Matrix matFrustum = { 0 }; + + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(zfar - znear); + + matFrustum.m0 = ((float) znear*2.0f)/rl; + matFrustum.m1 = 0.0f; + matFrustum.m2 = 0.0f; + matFrustum.m3 = 0.0f; + + matFrustum.m4 = 0.0f; + matFrustum.m5 = ((float) znear*2.0f)/tb; + matFrustum.m6 = 0.0f; + matFrustum.m7 = 0.0f; + + matFrustum.m8 = ((float)right + (float)left)/rl; + matFrustum.m9 = ((float)top + (float)bottom)/tb; + matFrustum.m10 = -((float)zfar + (float)znear)/fn; + matFrustum.m11 = -1.0f; + + matFrustum.m12 = 0.0f; + matFrustum.m13 = 0.0f; + matFrustum.m14 = -((float)zfar*(float)znear*2.0f)/fn; + matFrustum.m15 = 0.0f; + + *RLGL.State.currentMatrix = rlMatrixMultiply(*RLGL.State.currentMatrix, matFrustum); +} + +// Multiply the current matrix by an orthographic matrix generated by parameters +void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar) +{ + // NOTE: If left-right and top-botton values are equal it could create a division by zero, + // response to it is platform/compiler dependant + Matrix matOrtho = { 0 }; + + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(zfar - znear); + + matOrtho.m0 = 2.0f/rl; + matOrtho.m1 = 0.0f; + matOrtho.m2 = 0.0f; + matOrtho.m3 = 0.0f; + matOrtho.m4 = 0.0f; + matOrtho.m5 = 2.0f/tb; + matOrtho.m6 = 0.0f; + matOrtho.m7 = 0.0f; + matOrtho.m8 = 0.0f; + matOrtho.m9 = 0.0f; + matOrtho.m10 = -2.0f/fn; + matOrtho.m11 = 0.0f; + matOrtho.m12 = -((float)left + (float)right)/rl; + matOrtho.m13 = -((float)top + (float)bottom)/tb; + matOrtho.m14 = -((float)zfar + (float)znear)/fn; + matOrtho.m15 = 1.0f; + + *RLGL.State.currentMatrix = rlMatrixMultiply(*RLGL.State.currentMatrix, matOrtho); +} +#endif + +// Set the viewport area (transformation from normalized device coordinates to window coordinates) +// NOTE: We store current viewport dimensions +void rlViewport(int x, int y, int width, int height) +{ + glViewport(x, y, width, height); +} + +// Set clip planes distances +void rlSetClipPlanes(double nearPlane, double farPlane) +{ + rlCullDistanceNear = nearPlane; + rlCullDistanceFar = farPlane; +} + +// Get cull plane distance near +double rlGetCullDistanceNear(void) +{ + return rlCullDistanceNear; +} + +// Get cull plane distance far +double rlGetCullDistanceFar(void) +{ + return rlCullDistanceFar; +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Vertex level operations +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_11) +// Fallback to OpenGL 1.1 function calls +//--------------------------------------- +void rlBegin(int mode) +{ + switch (mode) + { + case RL_LINES: glBegin(GL_LINES); break; + case RL_TRIANGLES: glBegin(GL_TRIANGLES); break; + case RL_QUADS: glBegin(GL_QUADS); break; + default: break; + } +} + +void rlEnd(void) { glEnd(); } +void rlVertex2i(int x, int y) { glVertex2i(x, y); } +void rlVertex2f(float x, float y) { glVertex2f(x, y); } +void rlVertex3f(float x, float y, float z) { glVertex3f(x, y, z); } +void rlTexCoord2f(float x, float y) { glTexCoord2f(x, y); } +void rlNormal3f(float x, float y, float z) { glNormal3f(x, y, z); } +void rlColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { glColor4ub(r, g, b, a); } +void rlColor3f(float x, float y, float z) { glColor3f(x, y, z); } +void rlColor4f(float x, float y, float z, float w) { glColor4f(x, y, z, w); } +#endif +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +// Initialize drawing mode (how to organize vertex) +void rlBegin(int mode) +{ + // Draw mode can be RL_LINES, RL_TRIANGLES and RL_QUADS + // NOTE: In all three cases, vertex are accumulated over default internal vertex buffer + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode != mode) + { + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount > 0) + { + // Make sure current RLGL.currentBatch->draws[i].vertexCount is aligned a multiple of 4, + // that way, following QUADS drawing will keep aligned with index processing + // It implies adding some extra alignment vertex at the end of the draw, + // those vertex are not processed but they are considered as an additional offset + // for the next set of vertex to be drawn + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_LINES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount : RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4); + else if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? 1 : (4 - (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4))); + else RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = 0; + + if (!rlCheckRenderBatchLimit(RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment)) + { + RLGL.State.vertexCounter += RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment; + RLGL.currentBatch->drawCounter++; + } + } + + if (RLGL.currentBatch->drawCounter >= RL_DEFAULT_BATCH_DRAWCALLS) rlDrawRenderBatch(RLGL.currentBatch); + + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode = mode; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount = 0; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = RLGL.State.defaultTextureId; + } +} + +// Finish vertex providing +void rlEnd(void) +{ + // NOTE: Depth increment is dependant on rlOrtho(): z-near and z-far values, + // as well as depth buffer bit-depth (16bit or 24bit or 32bit) + // Correct increment formula would be: depthInc = (zfar - znear)/pow(2, bits) + RLGL.currentBatch->currentDepth += (1.0f/20000.0f); +} + +// Define one vertex (position) +// NOTE: Vertex position data is the basic information required for drawing +void rlVertex3f(float x, float y, float z) +{ + float tx = x; + float ty = y; + float tz = z; + + // Transform provided vector if required + if (RLGL.State.transformRequired) + { + tx = RLGL.State.transform.m0*x + RLGL.State.transform.m4*y + RLGL.State.transform.m8*z + RLGL.State.transform.m12; + ty = RLGL.State.transform.m1*x + RLGL.State.transform.m5*y + RLGL.State.transform.m9*z + RLGL.State.transform.m13; + tz = RLGL.State.transform.m2*x + RLGL.State.transform.m6*y + RLGL.State.transform.m10*z + RLGL.State.transform.m14; + } + + // WARNING: We can't break primitives when launching a new batch + // RL_LINES comes in pairs, RL_TRIANGLES come in groups of 3 vertices and RL_QUADS come in groups of 4 vertices + // We must check current draw.mode when a new vertex is required and finish the batch only if the draw.mode draw.vertexCount is %2, %3 or %4 + if (RLGL.State.vertexCounter > (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4 - 4)) + { + if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_LINES) && + (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%2 == 0)) + { + // Reached the maximum number of vertices for RL_LINES drawing + // Launch a draw call but keep current state for next vertices comming + // NOTE: We add +1 vertex to the check for security + rlCheckRenderBatchLimit(2 + 1); + } + else if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) && + (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%3 == 0)) + { + rlCheckRenderBatchLimit(3 + 1); + } + else if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_QUADS) && + (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4 == 0)) + { + rlCheckRenderBatchLimit(4 + 1); + } + } + + // Add vertices + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter] = tx; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 1] = ty; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 2] = tz; + + // Add current texcoord + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter] = RLGL.State.texcoordx; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter + 1] = RLGL.State.texcoordy; + + // Add current normal + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].normals[3*RLGL.State.vertexCounter] = RLGL.State.normalx; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].normals[3*RLGL.State.vertexCounter + 1] = RLGL.State.normaly; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].normals[3*RLGL.State.vertexCounter + 2] = RLGL.State.normalz; + + // Add current color + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter] = RLGL.State.colorr; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 1] = RLGL.State.colorg; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 2] = RLGL.State.colorb; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 3] = RLGL.State.colora; + + RLGL.State.vertexCounter++; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount++; +} + +// Define one vertex (position) +void rlVertex2f(float x, float y) +{ + rlVertex3f(x, y, RLGL.currentBatch->currentDepth); +} + +// Define one vertex (position) +void rlVertex2i(int x, int y) +{ + rlVertex3f((float)x, (float)y, RLGL.currentBatch->currentDepth); +} + +// Define one vertex (texture coordinate) +// NOTE: Texture coordinates are limited to QUADS only +void rlTexCoord2f(float x, float y) +{ + RLGL.State.texcoordx = x; + RLGL.State.texcoordy = y; +} + +// Define one vertex (normal) +// NOTE: Normals limited to TRIANGLES only? +void rlNormal3f(float x, float y, float z) +{ + float normalx = x; + float normaly = y; + float normalz = z; + if (RLGL.State.transformRequired) + { + normalx = RLGL.State.transform.m0*x + RLGL.State.transform.m4*y + RLGL.State.transform.m8*z; + normaly = RLGL.State.transform.m1*x + RLGL.State.transform.m5*y + RLGL.State.transform.m9*z; + normalz = RLGL.State.transform.m2*x + RLGL.State.transform.m6*y + RLGL.State.transform.m10*z; + } + float length = sqrtf(normalx*normalx + normaly*normaly + normalz*normalz); + if (length != 0.0f) + { + float ilength = 1.0f/length; + normalx *= ilength; + normaly *= ilength; + normalz *= ilength; + } + RLGL.State.normalx = normalx; + RLGL.State.normaly = normaly; + RLGL.State.normalz = normalz; +} + +// Define one vertex (color) +void rlColor4ub(unsigned char x, unsigned char y, unsigned char z, unsigned char w) +{ + RLGL.State.colorr = x; + RLGL.State.colorg = y; + RLGL.State.colorb = z; + RLGL.State.colora = w; +} + +// Define one vertex (color) +void rlColor4f(float r, float g, float b, float a) +{ + rlColor4ub((unsigned char)(r*255), (unsigned char)(g*255), (unsigned char)(b*255), (unsigned char)(a*255)); +} + +// Define one vertex (color) +void rlColor3f(float x, float y, float z) +{ + rlColor4ub((unsigned char)(x*255), (unsigned char)(y*255), (unsigned char)(z*255), 255); +} + +#endif + +//-------------------------------------------------------------------------------------- +// Module Functions Definition - OpenGL style functions (common to 1.1, 3.3+, ES2) +//-------------------------------------------------------------------------------------- + +// Set current texture to use +void rlSetTexture(unsigned int id) +{ + if (id == 0) + { +#if defined(GRAPHICS_API_OPENGL_11) + rlDisableTexture(); +#else + // NOTE: If quads batch limit is reached, we force a draw call and next batch starts + if (RLGL.State.vertexCounter >= + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4) + { + rlDrawRenderBatch(RLGL.currentBatch); + } +#endif + } + else + { +#if defined(GRAPHICS_API_OPENGL_11) + rlEnableTexture(id); +#else + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId != id) + { + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount > 0) + { + // Make sure current RLGL.currentBatch->draws[i].vertexCount is aligned a multiple of 4, + // that way, following QUADS drawing will keep aligned with index processing + // It implies adding some extra alignment vertex at the end of the draw, + // those vertex are not processed but they are considered as an additional offset + // for the next set of vertex to be drawn + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_LINES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount : RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4); + else if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? 1 : (4 - (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4))); + else RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = 0; + + if (!rlCheckRenderBatchLimit(RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment)) + { + RLGL.State.vertexCounter += RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment; + + RLGL.currentBatch->drawCounter++; + } + } + + if (RLGL.currentBatch->drawCounter >= RL_DEFAULT_BATCH_DRAWCALLS) rlDrawRenderBatch(RLGL.currentBatch); + + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = id; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount = 0; + } +#endif + } +} + +// Select and active a texture slot +void rlActiveTextureSlot(int slot) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glActiveTexture(GL_TEXTURE0 + slot); +#endif +} + +// Enable texture +void rlEnableTexture(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_11) + glEnable(GL_TEXTURE_2D); +#endif + glBindTexture(GL_TEXTURE_2D, id); +} + +// Disable texture +void rlDisableTexture(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) + glDisable(GL_TEXTURE_2D); +#endif + glBindTexture(GL_TEXTURE_2D, 0); +} + +// Enable texture cubemap +void rlEnableTextureCubemap(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindTexture(GL_TEXTURE_CUBE_MAP, id); +#endif +} + +// Disable texture cubemap +void rlDisableTextureCubemap(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindTexture(GL_TEXTURE_CUBE_MAP, 0); +#endif +} + +// Set texture parameters (wrap mode/filter mode) +void rlTextureParameters(unsigned int id, int param, int value) +{ + glBindTexture(GL_TEXTURE_2D, id); + +#if !defined(GRAPHICS_API_OPENGL_11) + // Reset anisotropy filter, in case it was set + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); +#endif + + switch (param) + { + case RL_TEXTURE_WRAP_S: + case RL_TEXTURE_WRAP_T: + { + if (value == RL_TEXTURE_WRAP_MIRROR_CLAMP) + { +#if !defined(GRAPHICS_API_OPENGL_11) + if (RLGL.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_2D, param, value); + else TRACELOG(RL_LOG_WARNING, "GL: Clamp mirror wrap mode not supported (GL_MIRROR_CLAMP_EXT)"); +#endif + } + else glTexParameteri(GL_TEXTURE_2D, param, value); + + } break; + case RL_TEXTURE_MAG_FILTER: + case RL_TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_2D, param, value); break; + case RL_TEXTURE_FILTER_ANISOTROPIC: + { +#if !defined(GRAPHICS_API_OPENGL_11) + if (value <= RLGL.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + else if (RLGL.ExtSupported.maxAnisotropyLevel > 0.0f) + { + TRACELOG(RL_LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, (int)RLGL.ExtSupported.maxAnisotropyLevel); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + } + else TRACELOG(RL_LOG_WARNING, "GL: Anisotropic filtering not supported"); +#endif + } break; +#if defined(GRAPHICS_API_OPENGL_33) + case RL_TEXTURE_MIPMAP_BIAS_RATIO: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, value/100.0f); +#endif + default: break; + } + + glBindTexture(GL_TEXTURE_2D, 0); +} + +// Set cubemap parameters (wrap mode/filter mode) +void rlCubemapParameters(unsigned int id, int param, int value) +{ +#if !defined(GRAPHICS_API_OPENGL_11) + glBindTexture(GL_TEXTURE_CUBE_MAP, id); + + // Reset anisotropy filter, in case it was set + glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); + + switch (param) + { + case RL_TEXTURE_WRAP_S: + case RL_TEXTURE_WRAP_T: + { + if (value == RL_TEXTURE_WRAP_MIRROR_CLAMP) + { + if (RLGL.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); + else TRACELOG(RL_LOG_WARNING, "GL: Clamp mirror wrap mode not supported (GL_MIRROR_CLAMP_EXT)"); + } + else glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); + + } break; + case RL_TEXTURE_MAG_FILTER: + case RL_TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); break; + case RL_TEXTURE_FILTER_ANISOTROPIC: + { + if (value <= RLGL.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + else if (RLGL.ExtSupported.maxAnisotropyLevel > 0.0f) + { + TRACELOG(RL_LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, (int)RLGL.ExtSupported.maxAnisotropyLevel); + glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + } + else TRACELOG(RL_LOG_WARNING, "GL: Anisotropic filtering not supported"); + } break; +#if defined(GRAPHICS_API_OPENGL_33) + case RL_TEXTURE_MIPMAP_BIAS_RATIO: glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_LOD_BIAS, value/100.0f); +#endif + default: break; + } + + glBindTexture(GL_TEXTURE_CUBE_MAP, 0); +#endif +} + +// Enable shader program +void rlEnableShader(unsigned int id) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + glUseProgram(id); +#endif +} + +// Disable shader program +void rlDisableShader(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + glUseProgram(0); +#endif +} + +// Enable rendering to texture (fbo) +void rlEnableFramebuffer(unsigned int id) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + glBindFramebuffer(GL_FRAMEBUFFER, id); +#endif +} + +// return the active render texture (fbo) +unsigned int rlGetActiveFramebuffer(void) +{ + GLint fboId = 0; +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) && defined(RLGL_RENDER_TEXTURES_HINT) + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &fboId); +#endif + return fboId; +} + +// Disable rendering to texture +void rlDisableFramebuffer(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + glBindFramebuffer(GL_FRAMEBUFFER, 0); +#endif +} + +// Blit active framebuffer to main framebuffer +void rlBlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight, int bufferMask) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) && defined(RLGL_RENDER_TEXTURES_HINT) + glBlitFramebuffer(srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight, bufferMask, GL_NEAREST); +#endif +} + +// Bind framebuffer object (fbo) +void rlBindFramebuffer(unsigned int target, unsigned int framebuffer) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + glBindFramebuffer(target, framebuffer); +#endif +} + +// Activate multiple draw color buffers +// NOTE: One color buffer is always active by default +void rlActiveDrawBuffers(int count) +{ +#if ((defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) && defined(RLGL_RENDER_TEXTURES_HINT)) + // NOTE: Maximum number of draw buffers supported is implementation dependant, + // it can be queried with glGet*() but it must be at least 8 + //GLint maxDrawBuffers = 0; + //glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers); + + if (count > 0) + { + if (count > 8) TRACELOG(LOG_WARNING, "GL: Max color buffers limited to 8"); + else + { + unsigned int buffers[8] = { + GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1, + GL_COLOR_ATTACHMENT2, + GL_COLOR_ATTACHMENT3, + GL_COLOR_ATTACHMENT4, + GL_COLOR_ATTACHMENT5, + GL_COLOR_ATTACHMENT6, + GL_COLOR_ATTACHMENT7, + }; + + glDrawBuffers(count, buffers); + } + } + else TRACELOG(LOG_WARNING, "GL: One color buffer active by default"); +#endif +} + +//---------------------------------------------------------------------------------- +// General render state configuration +//---------------------------------------------------------------------------------- + +// Enable color blending +void rlEnableColorBlend(void) { glEnable(GL_BLEND); } + +// Disable color blending +void rlDisableColorBlend(void) { glDisable(GL_BLEND); } + +// Enable depth test +void rlEnableDepthTest(void) { glEnable(GL_DEPTH_TEST); } + +// Disable depth test +void rlDisableDepthTest(void) { glDisable(GL_DEPTH_TEST); } + +// Enable depth write +void rlEnableDepthMask(void) { glDepthMask(GL_TRUE); } + +// Disable depth write +void rlDisableDepthMask(void) { glDepthMask(GL_FALSE); } + +// Enable backface culling +void rlEnableBackfaceCulling(void) { glEnable(GL_CULL_FACE); } + +// Disable backface culling +void rlDisableBackfaceCulling(void) { glDisable(GL_CULL_FACE); } + +// Set color mask active for screen read/draw +void rlColorMask(bool r, bool g, bool b, bool a) { glColorMask(r, g, b, a); } + +// Set face culling mode +void rlSetCullFace(int mode) +{ + switch (mode) + { + case RL_CULL_FACE_BACK: glCullFace(GL_BACK); break; + case RL_CULL_FACE_FRONT: glCullFace(GL_FRONT); break; + default: break; + } +} + +// Enable scissor test +void rlEnableScissorTest(void) { glEnable(GL_SCISSOR_TEST); } + +// Disable scissor test +void rlDisableScissorTest(void) { glDisable(GL_SCISSOR_TEST); } + +// Scissor test +void rlScissor(int x, int y, int width, int height) { glScissor(x, y, width, height); } + +// Enable wire mode +void rlEnableWireMode(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // NOTE: glPolygonMode() not available on OpenGL ES + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); +#endif +} + +// Enable point mode +void rlEnablePointMode(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // NOTE: glPolygonMode() not available on OpenGL ES + glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); + glEnable(GL_PROGRAM_POINT_SIZE); +#endif +} + +// Disable wire mode +void rlDisableWireMode(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // NOTE: glPolygonMode() not available on OpenGL ES + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +#endif +} + +// Set the line drawing width +void rlSetLineWidth(float width) { glLineWidth(width); } + +// Get the line drawing width +float rlGetLineWidth(void) +{ + float width = 0; + glGetFloatv(GL_LINE_WIDTH, &width); + return width; +} + +// Enable line aliasing +void rlEnableSmoothLines(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_11) + glEnable(GL_LINE_SMOOTH); +#endif +} + +// Disable line aliasing +void rlDisableSmoothLines(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_11) + glDisable(GL_LINE_SMOOTH); +#endif +} + +// Enable stereo rendering +void rlEnableStereoRender(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + RLGL.State.stereoRender = true; +#endif +} + +// Disable stereo rendering +void rlDisableStereoRender(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + RLGL.State.stereoRender = false; +#endif +} + +// Check if stereo render is enabled +bool rlIsStereoRenderEnabled(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + return RLGL.State.stereoRender; +#else + return false; +#endif +} + +// Clear color buffer with color +void rlClearColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + // Color values clamp to 0.0f(0) and 1.0f(255) + float cr = (float)r/255; + float cg = (float)g/255; + float cb = (float)b/255; + float ca = (float)a/255; + + glClearColor(cr, cg, cb, ca); +} + +// Clear used screen buffers (color and depth) +void rlClearScreenBuffers(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear used buffers: Color and Depth (Depth is used for 3D) + //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // Stencil buffer not used... +} + +// Check and log OpenGL error codes +void rlCheckErrors(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + int check = 1; + while (check) + { + const GLenum err = glGetError(); + switch (err) + { + case GL_NO_ERROR: check = 0; break; + case 0x0500: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_ENUM"); break; + case 0x0501: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_VALUE"); break; + case 0x0502: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_OPERATION"); break; + case 0x0503: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_STACK_OVERFLOW"); break; + case 0x0504: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_STACK_UNDERFLOW"); break; + case 0x0505: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_OUT_OF_MEMORY"); break; + case 0x0506: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_FRAMEBUFFER_OPERATION"); break; + default: TRACELOG(RL_LOG_WARNING, "GL: Error detected: Unknown error code: %x", err); break; + } + } +#endif +} + +// Set blend mode +void rlSetBlendMode(int mode) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((RLGL.State.currentBlendMode != mode) || ((mode == RL_BLEND_CUSTOM || mode == RL_BLEND_CUSTOM_SEPARATE) && RLGL.State.glCustomBlendModeModified)) + { + rlDrawRenderBatch(RLGL.currentBatch); + + switch (mode) + { + case RL_BLEND_ALPHA: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_ADDITIVE: glBlendFunc(GL_SRC_ALPHA, GL_ONE); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_MULTIPLIED: glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_ADD_COLORS: glBlendFunc(GL_ONE, GL_ONE); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_SUBTRACT_COLORS: glBlendFunc(GL_ONE, GL_ONE); glBlendEquation(GL_FUNC_SUBTRACT); break; + case RL_BLEND_ALPHA_PREMULTIPLY: glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_CUSTOM: + { + // NOTE: Using GL blend src/dst factors and GL equation configured with rlSetBlendFactors() + glBlendFunc(RLGL.State.glBlendSrcFactor, RLGL.State.glBlendDstFactor); glBlendEquation(RLGL.State.glBlendEquation); + + } break; + case RL_BLEND_CUSTOM_SEPARATE: + { + // NOTE: Using GL blend src/dst factors and GL equation configured with rlSetBlendFactorsSeparate() + glBlendFuncSeparate(RLGL.State.glBlendSrcFactorRGB, RLGL.State.glBlendDestFactorRGB, RLGL.State.glBlendSrcFactorAlpha, RLGL.State.glBlendDestFactorAlpha); + glBlendEquationSeparate(RLGL.State.glBlendEquationRGB, RLGL.State.glBlendEquationAlpha); + + } break; + default: break; + } + + RLGL.State.currentBlendMode = mode; + RLGL.State.glCustomBlendModeModified = false; + } +#endif +} + +// Set blending mode factor and equation +void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((RLGL.State.glBlendSrcFactor != glSrcFactor) || + (RLGL.State.glBlendDstFactor != glDstFactor) || + (RLGL.State.glBlendEquation != glEquation)) + { + RLGL.State.glBlendSrcFactor = glSrcFactor; + RLGL.State.glBlendDstFactor = glDstFactor; + RLGL.State.glBlendEquation = glEquation; + + RLGL.State.glCustomBlendModeModified = true; + } +#endif +} + +// Set blending mode factor and equation separately for RGB and alpha +void rlSetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha, int glEqRGB, int glEqAlpha) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((RLGL.State.glBlendSrcFactorRGB != glSrcRGB) || + (RLGL.State.glBlendDestFactorRGB != glDstRGB) || + (RLGL.State.glBlendSrcFactorAlpha != glSrcAlpha) || + (RLGL.State.glBlendDestFactorAlpha != glDstAlpha) || + (RLGL.State.glBlendEquationRGB != glEqRGB) || + (RLGL.State.glBlendEquationAlpha != glEqAlpha)) + { + RLGL.State.glBlendSrcFactorRGB = glSrcRGB; + RLGL.State.glBlendDestFactorRGB = glDstRGB; + RLGL.State.glBlendSrcFactorAlpha = glSrcAlpha; + RLGL.State.glBlendDestFactorAlpha = glDstAlpha; + RLGL.State.glBlendEquationRGB = glEqRGB; + RLGL.State.glBlendEquationAlpha = glEqAlpha; + + RLGL.State.glCustomBlendModeModified = true; + } +#endif +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - OpenGL Debug +//---------------------------------------------------------------------------------- +#if defined(RLGL_ENABLE_OPENGL_DEBUG_CONTEXT) && defined(GRAPHICS_API_OPENGL_43) +static void GLAPIENTRY rlDebugMessageCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam) +{ + // Ignore non-significant error/warning codes (NVidia drivers) + // NOTE: Here there are the details with a sample output: + // - #131169 - Framebuffer detailed info: The driver allocated storage for renderbuffer 2. (severity: low) + // - #131185 - Buffer detailed info: Buffer object 1 (bound to GL_ELEMENT_ARRAY_BUFFER_ARB, usage hint is GL_ENUM_88e4) + // will use VIDEO memory as the source for buffer object operations. (severity: low) + // - #131218 - Program/shader state performance warning: Vertex shader in program 7 is being recompiled based on GL state. (severity: medium) + // - #131204 - Texture state usage warning: The texture object (0) bound to texture image unit 0 does not have + // a defined base level and cannot be used for texture mapping. (severity: low) + if ((id == 131169) || (id == 131185) || (id == 131218) || (id == 131204)) return; + + const char *msgSource = NULL; + switch (source) + { + case GL_DEBUG_SOURCE_API: msgSource = "API"; break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: msgSource = "WINDOW_SYSTEM"; break; + case GL_DEBUG_SOURCE_SHADER_COMPILER: msgSource = "SHADER_COMPILER"; break; + case GL_DEBUG_SOURCE_THIRD_PARTY: msgSource = "THIRD_PARTY"; break; + case GL_DEBUG_SOURCE_APPLICATION: msgSource = "APPLICATION"; break; + case GL_DEBUG_SOURCE_OTHER: msgSource = "OTHER"; break; + default: break; + } + + const char *msgType = NULL; + switch (type) + { + case GL_DEBUG_TYPE_ERROR: msgType = "ERROR"; break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: msgType = "DEPRECATED_BEHAVIOR"; break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: msgType = "UNDEFINED_BEHAVIOR"; break; + case GL_DEBUG_TYPE_PORTABILITY: msgType = "PORTABILITY"; break; + case GL_DEBUG_TYPE_PERFORMANCE: msgType = "PERFORMANCE"; break; + case GL_DEBUG_TYPE_MARKER: msgType = "MARKER"; break; + case GL_DEBUG_TYPE_PUSH_GROUP: msgType = "PUSH_GROUP"; break; + case GL_DEBUG_TYPE_POP_GROUP: msgType = "POP_GROUP"; break; + case GL_DEBUG_TYPE_OTHER: msgType = "OTHER"; break; + default: break; + } + + const char *msgSeverity = "DEFAULT"; + switch (severity) + { + case GL_DEBUG_SEVERITY_LOW: msgSeverity = "LOW"; break; + case GL_DEBUG_SEVERITY_MEDIUM: msgSeverity = "MEDIUM"; break; + case GL_DEBUG_SEVERITY_HIGH: msgSeverity = "HIGH"; break; + case GL_DEBUG_SEVERITY_NOTIFICATION: msgSeverity = "NOTIFICATION"; break; + default: break; + } + + TRACELOG(LOG_WARNING, "GL: OpenGL debug message: %s", message); + TRACELOG(LOG_WARNING, " > Type: %s", msgType); + TRACELOG(LOG_WARNING, " > Source = %s", msgSource); + TRACELOG(LOG_WARNING, " > Severity = %s", msgSeverity); +} +#endif + +//---------------------------------------------------------------------------------- +// Module Functions Definition - rlgl functionality +//---------------------------------------------------------------------------------- + +// Initialize rlgl: OpenGL extensions, default buffers/shaders/textures, OpenGL states +void rlglInit(int width, int height) +{ + // Enable OpenGL debug context if required +#if defined(RLGL_ENABLE_OPENGL_DEBUG_CONTEXT) && defined(GRAPHICS_API_OPENGL_43) + if ((glDebugMessageCallback != NULL) && (glDebugMessageControl != NULL)) + { + glDebugMessageCallback(rlDebugMessageCallback, 0); + // glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, GL_DEBUG_SEVERITY_HIGH, 0, 0, GL_TRUE); + + // Debug context options: + // - GL_DEBUG_OUTPUT - Faster version but not useful for breakpoints + // - GL_DEBUG_OUTPUT_SYNCHRONUS - Callback is in sync with errors, so a breakpoint can be placed on the callback in order to get a stacktrace for the GL error + glEnable(GL_DEBUG_OUTPUT); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + } +#endif + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Init default white texture + unsigned char pixels[4] = { 255, 255, 255, 255 }; // 1 pixel RGBA (4 bytes) + RLGL.State.defaultTextureId = rlLoadTexture(pixels, 1, 1, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1); + + if (RLGL.State.defaultTextureId != 0) TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Default texture loaded successfully", RLGL.State.defaultTextureId); + else TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load default texture"); + + // Init default Shader (customized for GL 3.3 and ES2) + // Loaded: RLGL.State.defaultShaderId + RLGL.State.defaultShaderLocs + rlLoadShaderDefault(); + RLGL.State.currentShaderId = RLGL.State.defaultShaderId; + RLGL.State.currentShaderLocs = RLGL.State.defaultShaderLocs; + + // Init default vertex arrays buffers + // Simulate that the default shader has the location RL_SHADER_LOC_VERTEX_NORMAL to bind the normal buffer for the default render batch + RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL] = RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL; + RLGL.defaultBatch = rlLoadRenderBatch(RL_DEFAULT_BATCH_BUFFERS, RL_DEFAULT_BATCH_BUFFER_ELEMENTS); + RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL] = -1; + RLGL.currentBatch = &RLGL.defaultBatch; + + // Init stack matrices (emulating OpenGL 1.1) + for (int i = 0; i < RL_MAX_MATRIX_STACK_SIZE; i++) RLGL.State.stack[i] = rlMatrixIdentity(); + + // Init internal matrices + RLGL.State.transform = rlMatrixIdentity(); + RLGL.State.projection = rlMatrixIdentity(); + RLGL.State.modelview = rlMatrixIdentity(); + RLGL.State.currentMatrix = &RLGL.State.modelview; +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + + // Initialize OpenGL default states + //---------------------------------------------------------- + // Init state: Depth test + glDepthFunc(GL_LEQUAL); // Type of depth testing to apply + glDisable(GL_DEPTH_TEST); // Disable depth testing for 2D (only used for 3D) + + // Init state: Blending mode + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Color blending function (how colors are mixed) + glEnable(GL_BLEND); // Enable color blending (required to work with transparencies) + + // Init state: Culling + // NOTE: All shapes/models triangles are drawn CCW + glCullFace(GL_BACK); // Cull the back face (default) + glFrontFace(GL_CCW); // Front face are defined counter clockwise (default) + glEnable(GL_CULL_FACE); // Enable backface culling + + // Init state: Cubemap seamless +#if defined(GRAPHICS_API_OPENGL_33) + glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); // Seamless cubemaps (not supported on OpenGL ES 2.0) +#endif + +#if defined(GRAPHICS_API_OPENGL_11) + // Init state: Color hints (deprecated in OpenGL 3.0+) + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Improve quality of color and texture coordinate interpolation + glShadeModel(GL_SMOOTH); // Smooth shading between vertex (vertex colors interpolation) +#endif + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Store screen size into global variables + RLGL.State.framebufferWidth = width; + RLGL.State.framebufferHeight = height; + + TRACELOG(RL_LOG_INFO, "RLGL: Default OpenGL state initialized successfully"); + //---------------------------------------------------------- +#endif + + // Init state: Color/Depth buffers clear + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set clear color (black) + glClearDepth(1.0f); // Set clear depth value (default) + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear color and depth buffers (depth buffer required for 3D) +} + +// Vertex Buffer Object deinitialization (memory free) +void rlglClose(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + rlUnloadRenderBatch(RLGL.defaultBatch); + + rlUnloadShaderDefault(); // Unload default shader + + glDeleteTextures(1, &RLGL.State.defaultTextureId); // Unload default texture + TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Default texture unloaded successfully", RLGL.State.defaultTextureId); +#endif +} + +// Load OpenGL extensions +// NOTE: External loader function must be provided +void rlLoadExtensions(void *loader) +{ +#if defined(GRAPHICS_API_OPENGL_33) // Also defined for GRAPHICS_API_OPENGL_21 + // NOTE: glad is generated and contains only required OpenGL 3.3 Core extensions (and lower versions) + if (gladLoadGL((GLADloadfunc)loader) == 0) TRACELOG(RL_LOG_WARNING, "GLAD: Cannot load OpenGL extensions"); + else TRACELOG(RL_LOG_INFO, "GLAD: OpenGL extensions loaded successfully"); + + // Get number of supported extensions + GLint numExt = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &numExt); + TRACELOG(RL_LOG_INFO, "GL: Supported extensions count: %i", numExt); + +#if defined(RLGL_SHOW_GL_DETAILS_INFO) + // Get supported extensions list + // WARNING: glGetStringi() not available on OpenGL 2.1 + TRACELOG(RL_LOG_INFO, "GL: OpenGL extensions:"); + for (int i = 0; i < numExt; i++) TRACELOG(RL_LOG_INFO, " %s", glGetStringi(GL_EXTENSIONS, i)); +#endif + +#if defined(GRAPHICS_API_OPENGL_21) + // Register supported extensions flags + // Optional OpenGL 2.1 extensions + RLGL.ExtSupported.vao = GLAD_GL_ARB_vertex_array_object; + RLGL.ExtSupported.instancing = (GLAD_GL_EXT_draw_instanced && GLAD_GL_ARB_instanced_arrays); + RLGL.ExtSupported.texNPOT = GLAD_GL_ARB_texture_non_power_of_two; + RLGL.ExtSupported.texFloat32 = GLAD_GL_ARB_texture_float; + RLGL.ExtSupported.texFloat16 = GLAD_GL_ARB_texture_float; + RLGL.ExtSupported.texDepth = GLAD_GL_ARB_depth_texture; + RLGL.ExtSupported.maxDepthBits = 32; + RLGL.ExtSupported.texAnisoFilter = GLAD_GL_EXT_texture_filter_anisotropic; + RLGL.ExtSupported.texMirrorClamp = GLAD_GL_EXT_texture_mirror_clamp; +#else + // Register supported extensions flags + // OpenGL 3.3 extensions supported by default (core) + RLGL.ExtSupported.vao = true; + RLGL.ExtSupported.instancing = true; + RLGL.ExtSupported.texNPOT = true; + RLGL.ExtSupported.texFloat32 = true; + RLGL.ExtSupported.texFloat16 = true; + RLGL.ExtSupported.texDepth = true; + RLGL.ExtSupported.maxDepthBits = 32; + RLGL.ExtSupported.texAnisoFilter = true; + RLGL.ExtSupported.texMirrorClamp = true; +#endif + + // Optional OpenGL 3.3 extensions + RLGL.ExtSupported.texCompASTC = GLAD_GL_KHR_texture_compression_astc_hdr && GLAD_GL_KHR_texture_compression_astc_ldr; + RLGL.ExtSupported.texCompDXT = GLAD_GL_EXT_texture_compression_s3tc; // Texture compression: DXT + RLGL.ExtSupported.texCompETC2 = GLAD_GL_ARB_ES3_compatibility; // Texture compression: ETC2/EAC + #if defined(GRAPHICS_API_OPENGL_43) + RLGL.ExtSupported.computeShader = GLAD_GL_ARB_compute_shader; + RLGL.ExtSupported.ssbo = GLAD_GL_ARB_shader_storage_buffer_object; + #endif + +#endif // GRAPHICS_API_OPENGL_33 + +#if defined(GRAPHICS_API_OPENGL_ES3) + // Register supported extensions flags + // OpenGL ES 3.0 extensions supported by default (or it should be) + RLGL.ExtSupported.vao = true; + RLGL.ExtSupported.instancing = true; + RLGL.ExtSupported.texNPOT = true; + RLGL.ExtSupported.texFloat32 = true; + RLGL.ExtSupported.texFloat16 = true; + RLGL.ExtSupported.texDepth = true; + RLGL.ExtSupported.texDepthWebGL = true; + RLGL.ExtSupported.maxDepthBits = 24; + RLGL.ExtSupported.texAnisoFilter = true; + RLGL.ExtSupported.texMirrorClamp = true; + // TODO: Check for additional OpenGL ES 3.0 supported extensions: + //RLGL.ExtSupported.texCompDXT = true; + //RLGL.ExtSupported.texCompETC1 = true; + //RLGL.ExtSupported.texCompETC2 = true; + //RLGL.ExtSupported.texCompPVRT = true; + //RLGL.ExtSupported.texCompASTC = true; + //RLGL.ExtSupported.maxAnisotropyLevel = true; + //RLGL.ExtSupported.computeShader = true; + //RLGL.ExtSupported.ssbo = true; + +#elif defined(GRAPHICS_API_OPENGL_ES2) + + #if defined(PLATFORM_DESKTOP_GLFW) || defined(PLATFORM_DESKTOP_SDL) + // TODO: Support GLAD loader for OpenGL ES 3.0 + if (gladLoadGLES2((GLADloadfunc)loader) == 0) TRACELOG(RL_LOG_WARNING, "GLAD: Cannot load OpenGL ES2.0 functions"); + else TRACELOG(RL_LOG_INFO, "GLAD: OpenGL ES 2.0 loaded successfully"); + #endif + + // Get supported extensions list + GLint numExt = 0; + const char **extList = RL_MALLOC(512*sizeof(const char *)); // Allocate 512 strings pointers (2 KB) + const char *extensions = (const char *)glGetString(GL_EXTENSIONS); // One big const string + + // NOTE: We have to duplicate string because glGetString() returns a const string + int size = strlen(extensions) + 1; // Get extensions string size in bytes + char *extensionsDup = (char *)RL_CALLOC(size, sizeof(char)); + strcpy(extensionsDup, extensions); + extList[numExt] = extensionsDup; + + for (int i = 0; i < size; i++) + { + if (extensionsDup[i] == ' ') + { + extensionsDup[i] = '\0'; + numExt++; + extList[numExt] = &extensionsDup[i + 1]; + } + } + + TRACELOG(RL_LOG_INFO, "GL: Supported extensions count: %i", numExt); + +#if defined(RLGL_SHOW_GL_DETAILS_INFO) + TRACELOG(RL_LOG_INFO, "GL: OpenGL extensions:"); + for (int i = 0; i < numExt; i++) TRACELOG(RL_LOG_INFO, " %s", extList[i]); +#endif + + // Check required extensions + for (int i = 0; i < numExt; i++) + { + // Check VAO support + // NOTE: Only check on OpenGL ES, OpenGL 3.3 has VAO support as core feature + if (strcmp(extList[i], (const char *)"GL_OES_vertex_array_object") == 0) + { + // The extension is supported by our hardware and driver, try to get related functions pointers + // NOTE: emscripten does not support VAOs natively, it uses emulation and it reduces overall performance... + glGenVertexArrays = (PFNGLGENVERTEXARRAYSOESPROC)((rlglLoadProc)loader)("glGenVertexArraysOES"); + glBindVertexArray = (PFNGLBINDVERTEXARRAYOESPROC)((rlglLoadProc)loader)("glBindVertexArrayOES"); + glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSOESPROC)((rlglLoadProc)loader)("glDeleteVertexArraysOES"); + //glIsVertexArray = (PFNGLISVERTEXARRAYOESPROC)loader("glIsVertexArrayOES"); // NOTE: Fails in WebGL, omitted + + if ((glGenVertexArrays != NULL) && (glBindVertexArray != NULL) && (glDeleteVertexArrays != NULL)) RLGL.ExtSupported.vao = true; + } + + // Check instanced rendering support + if (strstr(extList[i], (const char*)"instanced_arrays") != NULL) // Broad check for instanced_arrays + { + // Specific check + if (strcmp(extList[i], (const char *)"GL_ANGLE_instanced_arrays") == 0) // ANGLE + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedANGLE"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedANGLE"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)("glVertexAttribDivisorANGLE"); + } + else if (strcmp(extList[i], (const char *)"GL_EXT_instanced_arrays") == 0) // EXT + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedEXT"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedEXT"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)("glVertexAttribDivisorEXT"); + } + else if (strcmp(extList[i], (const char *)"GL_NV_instanced_arrays") == 0) // NVIDIA GLES + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedNV"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedNV"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)("glVertexAttribDivisorNV"); + } + + // The feature will only be marked as supported if the elements from GL_XXX_instanced_arrays are present + if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) RLGL.ExtSupported.instancing = true; + } + else if (strstr(extList[i], (const char *)"draw_instanced") != NULL) + { + // GL_ANGLE_draw_instanced doesn't exist + if (strcmp(extList[i], (const char *)"GL_EXT_draw_instanced") == 0) + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedEXT"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedEXT"); + } + else if (strcmp(extList[i], (const char*)"GL_NV_draw_instanced") == 0) + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedNV"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedNV"); + } + + // But the functions will at least be loaded if only GL_XX_EXT_draw_instanced exist + if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) RLGL.ExtSupported.instancing = true; + } + + // Check NPOT textures support + // NOTE: Only check on OpenGL ES, OpenGL 3.3 has NPOT textures full support as core feature + if (strcmp(extList[i], (const char *)"GL_OES_texture_npot") == 0) RLGL.ExtSupported.texNPOT = true; + + // Check texture float support + if (strcmp(extList[i], (const char *)"GL_OES_texture_float") == 0) RLGL.ExtSupported.texFloat32 = true; + if (strcmp(extList[i], (const char *)"GL_OES_texture_half_float") == 0) RLGL.ExtSupported.texFloat16 = true; + + // Check depth texture support + if (strcmp(extList[i], (const char *)"GL_OES_depth_texture") == 0) RLGL.ExtSupported.texDepth = true; + if (strcmp(extList[i], (const char *)"GL_WEBGL_depth_texture") == 0) RLGL.ExtSupported.texDepthWebGL = true; // WebGL requires unsized internal format + if (RLGL.ExtSupported.texDepthWebGL) RLGL.ExtSupported.texDepth = true; + + if (strcmp(extList[i], (const char *)"GL_OES_depth24") == 0) RLGL.ExtSupported.maxDepthBits = 24; // Not available on WebGL + if (strcmp(extList[i], (const char *)"GL_OES_depth32") == 0) RLGL.ExtSupported.maxDepthBits = 32; // Not available on WebGL + + // Check texture compression support: DXT + if ((strcmp(extList[i], (const char *)"GL_EXT_texture_compression_s3tc") == 0) || + (strcmp(extList[i], (const char *)"GL_WEBGL_compressed_texture_s3tc") == 0) || + (strcmp(extList[i], (const char *)"GL_WEBKIT_WEBGL_compressed_texture_s3tc") == 0)) RLGL.ExtSupported.texCompDXT = true; + + // Check texture compression support: ETC1 + if ((strcmp(extList[i], (const char *)"GL_OES_compressed_ETC1_RGB8_texture") == 0) || + (strcmp(extList[i], (const char *)"GL_WEBGL_compressed_texture_etc1") == 0)) RLGL.ExtSupported.texCompETC1 = true; + + // Check texture compression support: ETC2/EAC + if (strcmp(extList[i], (const char *)"GL_ARB_ES3_compatibility") == 0) RLGL.ExtSupported.texCompETC2 = true; + + // Check texture compression support: PVR + if (strcmp(extList[i], (const char *)"GL_IMG_texture_compression_pvrtc") == 0) RLGL.ExtSupported.texCompPVRT = true; + + // Check texture compression support: ASTC + if (strcmp(extList[i], (const char *)"GL_KHR_texture_compression_astc_hdr") == 0) RLGL.ExtSupported.texCompASTC = true; + + // Check anisotropic texture filter support + if (strcmp(extList[i], (const char *)"GL_EXT_texture_filter_anisotropic") == 0) RLGL.ExtSupported.texAnisoFilter = true; + + // Check clamp mirror wrap mode support + if (strcmp(extList[i], (const char *)"GL_EXT_texture_mirror_clamp") == 0) RLGL.ExtSupported.texMirrorClamp = true; + } + + // Free extensions pointers + RL_FREE(extList); + RL_FREE(extensionsDup); // Duplicated string must be deallocated +#endif // GRAPHICS_API_OPENGL_ES2 + + // Check OpenGL information and capabilities + //------------------------------------------------------------------------------ + // Show current OpenGL and GLSL version + TRACELOG(RL_LOG_INFO, "GL: OpenGL device information:"); + TRACELOG(RL_LOG_INFO, " > Vendor: %s", glGetString(GL_VENDOR)); + TRACELOG(RL_LOG_INFO, " > Renderer: %s", glGetString(GL_RENDERER)); + TRACELOG(RL_LOG_INFO, " > Version: %s", glGetString(GL_VERSION)); + TRACELOG(RL_LOG_INFO, " > GLSL: %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: Anisotropy levels capability is an extension + #ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT + #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + #endif + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &RLGL.ExtSupported.maxAnisotropyLevel); + +#if defined(RLGL_SHOW_GL_DETAILS_INFO) + // Show some OpenGL GPU capabilities + TRACELOG(RL_LOG_INFO, "GL: OpenGL capabilities:"); + GLint capability = 0; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_TEXTURE_SIZE: %i", capability); + glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_CUBE_MAP_TEXTURE_SIZE: %i", capability); + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_TEXTURE_IMAGE_UNITS: %i", capability); + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_VERTEX_ATTRIBS: %i", capability); + #if !defined(GRAPHICS_API_OPENGL_ES2) + glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_UNIFORM_BLOCK_SIZE: %i", capability); + glGetIntegerv(GL_MAX_DRAW_BUFFERS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_DRAW_BUFFERS: %i", capability); + if (RLGL.ExtSupported.texAnisoFilter) TRACELOG(RL_LOG_INFO, " GL_MAX_TEXTURE_MAX_ANISOTROPY: %.0f", RLGL.ExtSupported.maxAnisotropyLevel); + #endif + glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &capability); + TRACELOG(RL_LOG_INFO, " GL_NUM_COMPRESSED_TEXTURE_FORMATS: %i", capability); + GLint *compFormats = (GLint *)RL_CALLOC(capability, sizeof(GLint)); + glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, compFormats); + for (int i = 0; i < capability; i++) TRACELOG(RL_LOG_INFO, " %s", rlGetCompressedFormatName(compFormats[i])); + RL_FREE(compFormats); + +#if defined(GRAPHICS_API_OPENGL_43) + glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_VERTEX_ATTRIB_BINDINGS: %i", capability); + glGetIntegerv(GL_MAX_UNIFORM_LOCATIONS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_UNIFORM_LOCATIONS: %i", capability); +#endif // GRAPHICS_API_OPENGL_43 +#else // RLGL_SHOW_GL_DETAILS_INFO + + // Show some basic info about GL supported features + if (RLGL.ExtSupported.vao) TRACELOG(RL_LOG_INFO, "GL: VAO extension detected, VAO functions loaded successfully"); + else TRACELOG(RL_LOG_WARNING, "GL: VAO extension not found, VAO not supported"); + if (RLGL.ExtSupported.texNPOT) TRACELOG(RL_LOG_INFO, "GL: NPOT textures extension detected, full NPOT textures supported"); + else TRACELOG(RL_LOG_WARNING, "GL: NPOT textures extension not found, limited NPOT support (no-mipmaps, no-repeat)"); + if (RLGL.ExtSupported.texCompDXT) TRACELOG(RL_LOG_INFO, "GL: DXT compressed textures supported"); + if (RLGL.ExtSupported.texCompETC1) TRACELOG(RL_LOG_INFO, "GL: ETC1 compressed textures supported"); + if (RLGL.ExtSupported.texCompETC2) TRACELOG(RL_LOG_INFO, "GL: ETC2/EAC compressed textures supported"); + if (RLGL.ExtSupported.texCompPVRT) TRACELOG(RL_LOG_INFO, "GL: PVRT compressed textures supported"); + if (RLGL.ExtSupported.texCompASTC) TRACELOG(RL_LOG_INFO, "GL: ASTC compressed textures supported"); + if (RLGL.ExtSupported.computeShader) TRACELOG(RL_LOG_INFO, "GL: Compute shaders supported"); + if (RLGL.ExtSupported.ssbo) TRACELOG(RL_LOG_INFO, "GL: Shader storage buffer objects supported"); +#endif // RLGL_SHOW_GL_DETAILS_INFO + +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 +} + +// Get current OpenGL version +int rlGetVersion(void) +{ + int glVersion = 0; +#if defined(GRAPHICS_API_OPENGL_11) + glVersion = RL_OPENGL_11; +#endif +#if defined(GRAPHICS_API_OPENGL_21) + glVersion = RL_OPENGL_21; +#elif defined(GRAPHICS_API_OPENGL_43) + glVersion = RL_OPENGL_43; +#elif defined(GRAPHICS_API_OPENGL_33) + glVersion = RL_OPENGL_33; +#endif +#if defined(GRAPHICS_API_OPENGL_ES3) + glVersion = RL_OPENGL_ES_30; +#elif defined(GRAPHICS_API_OPENGL_ES2) + glVersion = RL_OPENGL_ES_20; +#endif + + return glVersion; +} + +// Set current framebuffer width +void rlSetFramebufferWidth(int width) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.framebufferWidth = width; +#endif +} + +// Set current framebuffer height +void rlSetFramebufferHeight(int height) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.framebufferHeight = height; +#endif +} + +// Get default framebuffer width +int rlGetFramebufferWidth(void) +{ + int width = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + width = RLGL.State.framebufferWidth; +#endif + return width; +} + +// Get default framebuffer height +int rlGetFramebufferHeight(void) +{ + int height = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + height = RLGL.State.framebufferHeight; +#endif + return height; +} + +// Get default internal texture (white texture) +// NOTE: Default texture is a 1x1 pixel UNCOMPRESSED_R8G8B8A8 +unsigned int rlGetTextureIdDefault(void) +{ + unsigned int id = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + id = RLGL.State.defaultTextureId; +#endif + return id; +} + +// Get default shader id +unsigned int rlGetShaderIdDefault(void) +{ + unsigned int id = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + id = RLGL.State.defaultShaderId; +#endif + return id; +} + +// Get default shader locs +int *rlGetShaderLocsDefault(void) +{ + int *locs = NULL; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + locs = RLGL.State.defaultShaderLocs; +#endif + return locs; +} + +// Render batch management +//------------------------------------------------------------------------------------------------ +// Load render batch +rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements) +{ + rlRenderBatch batch = { 0 }; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Initialize CPU (RAM) vertex buffers (position, texcoord, color data and indexes) + //-------------------------------------------------------------------------------------------- + batch.vertexBuffer = (rlVertexBuffer *)RL_MALLOC(numBuffers*sizeof(rlVertexBuffer)); + + for (int i = 0; i < numBuffers; i++) + { + batch.vertexBuffer[i].elementCount = bufferElements; + + batch.vertexBuffer[i].vertices = (float *)RL_MALLOC(bufferElements*3*4*sizeof(float)); // 3 float by vertex, 4 vertex by quad + batch.vertexBuffer[i].texcoords = (float *)RL_MALLOC(bufferElements*2*4*sizeof(float)); // 2 float by texcoord, 4 texcoord by quad + batch.vertexBuffer[i].normals = (float *)RL_MALLOC(bufferElements*3*4*sizeof(float)); // 3 float by vertex, 4 vertex by quad + batch.vertexBuffer[i].colors = (unsigned char *)RL_MALLOC(bufferElements*4*4*sizeof(unsigned char)); // 4 float by color, 4 colors by quad +#if defined(GRAPHICS_API_OPENGL_33) + batch.vertexBuffer[i].indices = (unsigned int *)RL_MALLOC(bufferElements*6*sizeof(unsigned int)); // 6 int by quad (indices) +#endif +#if defined(GRAPHICS_API_OPENGL_ES2) + batch.vertexBuffer[i].indices = (unsigned short *)RL_MALLOC(bufferElements*6*sizeof(unsigned short)); // 6 int by quad (indices) +#endif + + for (int j = 0; j < (3*4*bufferElements); j++) batch.vertexBuffer[i].vertices[j] = 0.0f; + for (int j = 0; j < (2*4*bufferElements); j++) batch.vertexBuffer[i].texcoords[j] = 0.0f; + for (int j = 0; j < (3*4*bufferElements); j++) batch.vertexBuffer[i].normals[j] = 0.0f; + for (int j = 0; j < (4*4*bufferElements); j++) batch.vertexBuffer[i].colors[j] = 0; + + int k = 0; + + // Indices can be initialized right now + for (int j = 0; j < (6*bufferElements); j += 6) + { + batch.vertexBuffer[i].indices[j] = 4*k; + batch.vertexBuffer[i].indices[j + 1] = 4*k + 1; + batch.vertexBuffer[i].indices[j + 2] = 4*k + 2; + batch.vertexBuffer[i].indices[j + 3] = 4*k; + batch.vertexBuffer[i].indices[j + 4] = 4*k + 2; + batch.vertexBuffer[i].indices[j + 5] = 4*k + 3; + + k++; + } + + RLGL.State.vertexCounter = 0; + } + + TRACELOG(RL_LOG_INFO, "RLGL: Render batch vertex buffers loaded successfully in RAM (CPU)"); + //-------------------------------------------------------------------------------------------- + + // Upload to GPU (VRAM) vertex data and initialize VAOs/VBOs + //-------------------------------------------------------------------------------------------- + for (int i = 0; i < numBuffers; i++) + { + if (RLGL.ExtSupported.vao) + { + // Initialize Quads VAO + glGenVertexArrays(1, &batch.vertexBuffer[i].vaoId); + glBindVertexArray(batch.vertexBuffer[i].vaoId); + } + + // Quads - Vertex buffers binding and attributes enable + // Vertex position buffer (shader-location = 0) + glGenBuffers(1, &batch.vertexBuffer[i].vboId[0]); + glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[0]); + glBufferData(GL_ARRAY_BUFFER, bufferElements*3*4*sizeof(float), batch.vertexBuffer[i].vertices, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); + + // Vertex texcoord buffer (shader-location = 1) + glGenBuffers(1, &batch.vertexBuffer[i].vboId[1]); + glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[1]); + glBufferData(GL_ARRAY_BUFFER, bufferElements*2*4*sizeof(float), batch.vertexBuffer[i].texcoords, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); + + // Vertex normal buffer (shader-location = 2) + glGenBuffers(1, &batch.vertexBuffer[i].vboId[2]); + glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[2]); + glBufferData(GL_ARRAY_BUFFER, bufferElements*3*4*sizeof(float), batch.vertexBuffer[i].normals, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL], 3, GL_FLOAT, 0, 0, 0); + + // Vertex color buffer (shader-location = 3) + glGenBuffers(1, &batch.vertexBuffer[i].vboId[3]); + glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[3]); + glBufferData(GL_ARRAY_BUFFER, bufferElements*4*4*sizeof(unsigned char), batch.vertexBuffer[i].colors, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); + + // Fill index buffer + glGenBuffers(1, &batch.vertexBuffer[i].vboId[4]); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[4]); +#if defined(GRAPHICS_API_OPENGL_33) + glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferElements*6*sizeof(int), batch.vertexBuffer[i].indices, GL_STATIC_DRAW); +#endif +#if defined(GRAPHICS_API_OPENGL_ES2) + glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferElements*6*sizeof(short), batch.vertexBuffer[i].indices, GL_STATIC_DRAW); +#endif + } + + TRACELOG(RL_LOG_INFO, "RLGL: Render batch vertex buffers loaded successfully in VRAM (GPU)"); + + // Unbind the current VAO + if (RLGL.ExtSupported.vao) glBindVertexArray(0); + //-------------------------------------------------------------------------------------------- + + // Init draw calls tracking system + //-------------------------------------------------------------------------------------------- + batch.draws = (rlDrawCall *)RL_MALLOC(RL_DEFAULT_BATCH_DRAWCALLS*sizeof(rlDrawCall)); + + for (int i = 0; i < RL_DEFAULT_BATCH_DRAWCALLS; i++) + { + batch.draws[i].mode = RL_QUADS; + batch.draws[i].vertexCount = 0; + batch.draws[i].vertexAlignment = 0; + //batch.draws[i].vaoId = 0; + //batch.draws[i].shaderId = 0; + batch.draws[i].textureId = RLGL.State.defaultTextureId; + //batch.draws[i].RLGL.State.projection = rlMatrixIdentity(); + //batch.draws[i].RLGL.State.modelview = rlMatrixIdentity(); + } + + batch.bufferCount = numBuffers; // Record buffer count + batch.drawCounter = 1; // Reset draws counter + batch.currentDepth = -1.0f; // Reset depth value + //-------------------------------------------------------------------------------------------- +#endif + + return batch; +} + +// Unload default internal buffers vertex data from CPU and GPU +void rlUnloadRenderBatch(rlRenderBatch batch) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Unbind everything + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + // Unload all vertex buffers data + for (int i = 0; i < batch.bufferCount; i++) + { + // Unbind VAO attribs data + if (RLGL.ExtSupported.vao) + { + glBindVertexArray(batch.vertexBuffer[i].vaoId); + glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION); + glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD); + glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL); + glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR); + glBindVertexArray(0); + } + + // Delete VBOs from GPU (VRAM) + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[0]); + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[1]); + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[2]); + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[3]); + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[4]); + + // Delete VAOs from GPU (VRAM) + if (RLGL.ExtSupported.vao) glDeleteVertexArrays(1, &batch.vertexBuffer[i].vaoId); + + // Free vertex arrays memory from CPU (RAM) + RL_FREE(batch.vertexBuffer[i].vertices); + RL_FREE(batch.vertexBuffer[i].texcoords); + RL_FREE(batch.vertexBuffer[i].normals); + RL_FREE(batch.vertexBuffer[i].colors); + RL_FREE(batch.vertexBuffer[i].indices); + } + + // Unload arrays + RL_FREE(batch.vertexBuffer); + RL_FREE(batch.draws); +#endif +} + +// Draw render batch +// NOTE: We require a pointer to reset batch and increase current buffer (multi-buffer) +void rlDrawRenderBatch(rlRenderBatch *batch) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Update batch vertex buffers + //------------------------------------------------------------------------------------------------------------ + // NOTE: If there is not vertex data, buffers doesn't need to be updated (vertexCount > 0) + // TODO: If no data changed on the CPU arrays --> No need to re-update GPU arrays (use a change detector flag?) + if (RLGL.State.vertexCounter > 0) + { + // Activate elements VAO + if (RLGL.ExtSupported.vao) glBindVertexArray(batch->vertexBuffer[batch->currentBuffer].vaoId); + + // Vertex positions buffer + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[0]); + glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*3*sizeof(float), batch->vertexBuffer[batch->currentBuffer].vertices); + //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].vertices, GL_DYNAMIC_DRAW); // Update all buffer + + // Texture coordinates buffer + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[1]); + glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*2*sizeof(float), batch->vertexBuffer[batch->currentBuffer].texcoords); + //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].texcoords, GL_DYNAMIC_DRAW); // Update all buffer + + // Normals buffer + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[2]); + glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*3*sizeof(float), batch->vertexBuffer[batch->currentBuffer].normals); + //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].normals, GL_DYNAMIC_DRAW); // Update all buffer + + // Colors buffer + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[3]); + glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*4*sizeof(unsigned char), batch->vertexBuffer[batch->currentBuffer].colors); + //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].colors, GL_DYNAMIC_DRAW); // Update all buffer + + // NOTE: glMapBuffer() causes sync issue + // If GPU is working with this buffer, glMapBuffer() will wait(stall) until GPU to finish its job + // To avoid waiting (idle), you can call first glBufferData() with NULL pointer before glMapBuffer() + // If you do that, the previous data in PBO will be discarded and glMapBuffer() returns a new + // allocated pointer immediately even if GPU is still working with the previous data + + // Another option: map the buffer object into client's memory + // Probably this code could be moved somewhere else... + // batch->vertexBuffer[batch->currentBuffer].vertices = (float *)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE); + // if (batch->vertexBuffer[batch->currentBuffer].vertices) + // { + // Update vertex data + // } + // glUnmapBuffer(GL_ARRAY_BUFFER); + + // Unbind the current VAO + if (RLGL.ExtSupported.vao) glBindVertexArray(0); + } + //------------------------------------------------------------------------------------------------------------ + + // Draw batch vertex buffers (considering VR stereo if required) + //------------------------------------------------------------------------------------------------------------ + Matrix matProjection = RLGL.State.projection; + Matrix matModelView = RLGL.State.modelview; + + int eyeCount = 1; + if (RLGL.State.stereoRender) eyeCount = 2; + + for (int eye = 0; eye < eyeCount; eye++) + { + if (eyeCount == 2) + { + // Setup current eye viewport (half screen width) + rlViewport(eye*RLGL.State.framebufferWidth/2, 0, RLGL.State.framebufferWidth/2, RLGL.State.framebufferHeight); + + // Set current eye view offset to modelview matrix + rlSetMatrixModelview(rlMatrixMultiply(matModelView, RLGL.State.viewOffsetStereo[eye])); + // Set current eye projection matrix + rlSetMatrixProjection(RLGL.State.projectionStereo[eye]); + } + + // Draw buffers + if (RLGL.State.vertexCounter > 0) + { + // Set current shader and upload current MVP matrix + glUseProgram(RLGL.State.currentShaderId); + + // Create modelview-projection matrix and upload to shader + Matrix matMVP = rlMatrixMultiply(RLGL.State.modelview, RLGL.State.projection); + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MVP], 1, false, rlMatrixToFloat(matMVP)); + + if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_PROJECTION] != -1) + { + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_PROJECTION], 1, false, rlMatrixToFloat(RLGL.State.projection)); + } + + // WARNING: For the following setup of the view, model, and normal matrices, it is expected that + // transformations and rendering occur between rlPushMatrix() and rlPopMatrix() + + if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_VIEW] != -1) + { + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_VIEW], 1, false, rlMatrixToFloat(RLGL.State.modelview)); + } + + if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MODEL] != -1) + { + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MODEL], 1, false, rlMatrixToFloat(RLGL.State.transform)); + } + + if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_NORMAL] != -1) + { + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_NORMAL], 1, false, rlMatrixToFloat(rlMatrixTranspose(rlMatrixInvert(RLGL.State.transform)))); + } + + if (RLGL.ExtSupported.vao) glBindVertexArray(batch->vertexBuffer[batch->currentBuffer].vaoId); + else + { + // Bind vertex attrib: position (shader-location = 0) + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[0]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION]); + + // Bind vertex attrib: texcoord (shader-location = 1) + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[1]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01]); + + // Bind vertex attrib: normal (shader-location = 2) + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[2]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL], 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL]); + + // Bind vertex attrib: color (shader-location = 3) + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[3]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR]); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[4]); + } + + // Setup some default shader values + glUniform4f(RLGL.State.currentShaderLocs[RL_SHADER_LOC_COLOR_DIFFUSE], 1.0f, 1.0f, 1.0f, 1.0f); + glUniform1i(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MAP_DIFFUSE], 0); // Active default sampler2D: texture0 + + // Activate additional sampler textures + // Those additional textures will be common for all draw calls of the batch + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) + { + if (RLGL.State.activeTextureId[i] > 0) + { + glActiveTexture(GL_TEXTURE0 + 1 + i); + glBindTexture(GL_TEXTURE_2D, RLGL.State.activeTextureId[i]); + } + } + + // Activate default sampler2D texture0 (one texture is always active for default batch shader) + // NOTE: Batch system accumulates calls by texture0 changes, additional textures are enabled for all the draw calls + glActiveTexture(GL_TEXTURE0); + + for (int i = 0, vertexOffset = 0; i < batch->drawCounter; i++) + { + // Bind current draw call texture, activated as GL_TEXTURE0 and Bound to sampler2D texture0 by default + glBindTexture(GL_TEXTURE_2D, batch->draws[i].textureId); + + if ((batch->draws[i].mode == RL_LINES) || (batch->draws[i].mode == RL_TRIANGLES)) glDrawArrays(batch->draws[i].mode, vertexOffset, batch->draws[i].vertexCount); + else + { + #if defined(GRAPHICS_API_OPENGL_33) + // We need to define the number of indices to be processed: elementCount*6 + // NOTE: The final parameter tells the GPU the offset in bytes from the + // start of the index buffer to the location of the first index to process + glDrawElements(GL_TRIANGLES, batch->draws[i].vertexCount/4*6, GL_UNSIGNED_INT, (GLvoid *)(vertexOffset/4*6*sizeof(GLuint))); + #endif + #if defined(GRAPHICS_API_OPENGL_ES2) + glDrawElements(GL_TRIANGLES, batch->draws[i].vertexCount/4*6, GL_UNSIGNED_SHORT, (GLvoid *)(vertexOffset/4*6*sizeof(GLushort))); + #endif + } + + vertexOffset += (batch->draws[i].vertexCount + batch->draws[i].vertexAlignment); + } + + if (!RLGL.ExtSupported.vao) + { + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + } + + glBindTexture(GL_TEXTURE_2D, 0); // Unbind textures + } + + if (RLGL.ExtSupported.vao) glBindVertexArray(0); // Unbind VAO + + glUseProgram(0); // Unbind shader program + } + + // Restore viewport to default measures + if (eyeCount == 2) rlViewport(0, 0, RLGL.State.framebufferWidth, RLGL.State.framebufferHeight); + //------------------------------------------------------------------------------------------------------------ + + // Reset batch buffers + //------------------------------------------------------------------------------------------------------------ + // Reset vertex counter for next frame + RLGL.State.vertexCounter = 0; + + // Reset depth for next draw + batch->currentDepth = -1.0f; + + // Restore projection/modelview matrices + RLGL.State.projection = matProjection; + RLGL.State.modelview = matModelView; + + // Reset RLGL.currentBatch->draws array + for (int i = 0; i < RL_DEFAULT_BATCH_DRAWCALLS; i++) + { + batch->draws[i].mode = RL_QUADS; + batch->draws[i].vertexCount = 0; + batch->draws[i].textureId = RLGL.State.defaultTextureId; + } + + // Reset active texture units for next batch + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) RLGL.State.activeTextureId[i] = 0; + + // Reset draws counter to one draw for the batch + batch->drawCounter = 1; + //------------------------------------------------------------------------------------------------------------ + + // Change to next buffer in the list (in case of multi-buffering) + batch->currentBuffer++; + if (batch->currentBuffer >= batch->bufferCount) batch->currentBuffer = 0; +#endif +} + +// Set the active render batch for rlgl +void rlSetRenderBatchActive(rlRenderBatch *batch) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + rlDrawRenderBatch(RLGL.currentBatch); + + if (batch != NULL) RLGL.currentBatch = batch; + else RLGL.currentBatch = &RLGL.defaultBatch; +#endif +} + +// Update and draw internal render batch +void rlDrawRenderBatchActive(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + rlDrawRenderBatch(RLGL.currentBatch); // NOTE: Stereo rendering is checked inside +#endif +} + +// Check internal buffer overflow for a given number of vertex +// and force a rlRenderBatch draw call if required +bool rlCheckRenderBatchLimit(int vCount) +{ + bool overflow = false; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((RLGL.State.vertexCounter + vCount) >= + (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4)) + { + overflow = true; + + // Store current primitive drawing mode and texture id + int currentMode = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode; + int currentTexture = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId; + + rlDrawRenderBatch(RLGL.currentBatch); // NOTE: Stereo rendering is checked inside + + // Restore state of last batch so we can continue adding vertices + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode = currentMode; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = currentTexture; + } +#endif + + return overflow; +} + +// Textures data management +//----------------------------------------------------------------------------------------- +// Convert image data to OpenGL texture (returns OpenGL valid Id) +unsigned int rlLoadTexture(const void *data, int width, int height, int format, int mipmapCount) +{ + unsigned int id = 0; + + glBindTexture(GL_TEXTURE_2D, 0); // Free any old binding + + // Check texture format support by OpenGL 1.1 (compressed textures not supported) +#if defined(GRAPHICS_API_OPENGL_11) + if (format >= RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) + { + TRACELOG(RL_LOG_WARNING, "GL: OpenGL 1.1 does not support GPU compressed texture formats"); + return id; + } +#else + if ((!RLGL.ExtSupported.texCompDXT) && ((format == RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA) || + (format == RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA) || (format == RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA))) + { + TRACELOG(RL_LOG_WARNING, "GL: DXT compressed texture format not supported"); + return id; + } +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((!RLGL.ExtSupported.texCompETC1) && (format == RL_PIXELFORMAT_COMPRESSED_ETC1_RGB)) + { + TRACELOG(RL_LOG_WARNING, "GL: ETC1 compressed texture format not supported"); + return id; + } + + if ((!RLGL.ExtSupported.texCompETC2) && ((format == RL_PIXELFORMAT_COMPRESSED_ETC2_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA))) + { + TRACELOG(RL_LOG_WARNING, "GL: ETC2 compressed texture format not supported"); + return id; + } + + if ((!RLGL.ExtSupported.texCompPVRT) && ((format == RL_PIXELFORMAT_COMPRESSED_PVRT_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA))) + { + TRACELOG(RL_LOG_WARNING, "GL: PVRT compressed texture format not supported"); + return id; + } + + if ((!RLGL.ExtSupported.texCompASTC) && ((format == RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA) || (format == RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA))) + { + TRACELOG(RL_LOG_WARNING, "GL: ASTC compressed texture format not supported"); + return id; + } +#endif +#endif // GRAPHICS_API_OPENGL_11 + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glGenTextures(1, &id); // Generate texture id + + glBindTexture(GL_TEXTURE_2D, id); + + int mipWidth = width; + int mipHeight = height; + int mipOffset = 0; // Mipmap data offset, only used for tracelog + + // NOTE: Added pointer math separately from function to avoid UBSAN complaining + unsigned char *dataPtr = NULL; + if (data != NULL) dataPtr = (unsigned char *)data; + + // Load the different mipmap levels + for (int i = 0; i < mipmapCount; i++) + { + unsigned int mipSize = rlGetPixelDataSize(mipWidth, mipHeight, format); + + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + + TRACELOGD("TEXTURE: Load mipmap level %i (%i x %i), size: %i, offset: %i", i, mipWidth, mipHeight, mipSize, mipOffset); + + if (glInternalFormat != 0) + { + if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) glTexImage2D(GL_TEXTURE_2D, i, glInternalFormat, mipWidth, mipHeight, 0, glFormat, glType, dataPtr); +#if !defined(GRAPHICS_API_OPENGL_11) + else glCompressedTexImage2D(GL_TEXTURE_2D, i, glInternalFormat, mipWidth, mipHeight, 0, mipSize, dataPtr); +#endif + +#if defined(GRAPHICS_API_OPENGL_33) + if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE) + { + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } + else if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA) + { +#if defined(GRAPHICS_API_OPENGL_21) + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA }; +#elif defined(GRAPHICS_API_OPENGL_33) + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; +#endif + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } +#endif + } + + mipWidth /= 2; + mipHeight /= 2; + mipOffset += mipSize; // Increment offset position to next mipmap + if (data != NULL) dataPtr += mipSize; // Increment data pointer to next mipmap + + // Security check for NPOT textures + if (mipWidth < 1) mipWidth = 1; + if (mipHeight < 1) mipHeight = 1; + } + + // Texture parameters configuration + // NOTE: glTexParameteri does NOT affect texture uploading, just the way it's used +#if defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: OpenGL ES 2.0 with no GL_OES_texture_npot support (i.e. WebGL) has limited NPOT support, so CLAMP_TO_EDGE must be used + if (RLGL.ExtSupported.texNPOT) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // Set texture to repeat on x-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Set texture to repeat on y-axis + } + else + { + // NOTE: If using negative texture coordinates (LoadOBJ()), it does not work! + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // Set texture to clamp on x-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // Set texture to clamp on y-axis + } +#else + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // Set texture to repeat on x-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Set texture to repeat on y-axis +#endif + + // Magnification and minification filters + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // Alternative: GL_LINEAR + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // Alternative: GL_LINEAR + +#if defined(GRAPHICS_API_OPENGL_33) + if (mipmapCount > 1) + { + // Activate Trilinear filtering if mipmaps are available + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, mipmapCount); // user defined mip count would break without this. + } +#endif + + // At this point we have the texture loaded in GPU and texture parameters configured + + // NOTE: If mipmaps were not in data, they are not generated automatically + + // Unbind current texture + glBindTexture(GL_TEXTURE_2D, 0); + + if (id > 0) TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Texture loaded successfully (%ix%i | %s | %i mipmaps)", id, width, height, rlGetPixelFormatName(format), mipmapCount); + else TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load texture"); + + return id; +} + +// Load depth texture/renderbuffer (to be attached to fbo) +// WARNING: OpenGL ES 2.0 requires GL_OES_depth_texture and WebGL requires WEBGL_depth_texture extensions +unsigned int rlLoadTextureDepth(int width, int height, bool useRenderBuffer) +{ + unsigned int id = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // In case depth textures not supported, we force renderbuffer usage + if (!RLGL.ExtSupported.texDepth) useRenderBuffer = true; + + // NOTE: We let the implementation to choose the best bit-depth + // Possible formats: GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32 and GL_DEPTH_COMPONENT32F + unsigned int glInternalFormat = GL_DEPTH_COMPONENT; + +#if (defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_ES3)) + // WARNING: WebGL platform requires unsized internal format definition (GL_DEPTH_COMPONENT) + // while other platforms using OpenGL ES 2.0 require/support sized internal formats depending on the GPU capabilities + if (!RLGL.ExtSupported.texDepthWebGL || useRenderBuffer) + { + if (RLGL.ExtSupported.maxDepthBits == 32) glInternalFormat = GL_DEPTH_COMPONENT32_OES; + else if (RLGL.ExtSupported.maxDepthBits == 24) glInternalFormat = GL_DEPTH_COMPONENT24_OES; + else glInternalFormat = GL_DEPTH_COMPONENT16; + } +#endif + + if (!useRenderBuffer && RLGL.ExtSupported.texDepth) + { + glGenTextures(1, &id); + glBindTexture(GL_TEXTURE_2D, id); + glTexImage2D(GL_TEXTURE_2D, 0, glInternalFormat, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glBindTexture(GL_TEXTURE_2D, 0); + + TRACELOG(RL_LOG_INFO, "TEXTURE: Depth texture loaded successfully"); + } + else + { + // Create the renderbuffer that will serve as the depth attachment for the framebuffer + // NOTE: A renderbuffer is simpler than a texture and could offer better performance on embedded devices + glGenRenderbuffers(1, &id); + glBindRenderbuffer(GL_RENDERBUFFER, id); + glRenderbufferStorage(GL_RENDERBUFFER, glInternalFormat, width, height); + + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Depth renderbuffer loaded successfully (%i bits)", id, (RLGL.ExtSupported.maxDepthBits >= 24)? RLGL.ExtSupported.maxDepthBits : 16); + } +#endif + + return id; +} + +// Load texture cubemap +// NOTE: Cubemap data is expected to be 6 images in a single data array (one after the other), +// expected the following convention: +X, -X, +Y, -Y, +Z, -Z +unsigned int rlLoadTextureCubemap(const void *data, int size, int format, int mipmapCount) +{ + unsigned int id = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + int mipSize = size; + + // NOTE: Added pointer math separately from function to avoid UBSAN complaining + unsigned char *dataPtr = NULL; + if (data != NULL) dataPtr = (unsigned char *)data; + + unsigned int dataSize = rlGetPixelDataSize(size, size, format); + + glGenTextures(1, &id); + glBindTexture(GL_TEXTURE_CUBE_MAP, id); + + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + + if (glInternalFormat != 0) + { + // Load cubemap faces/mipmaps + for (int i = 0; i < 6*mipmapCount; i++) + { + int mipmapLevel = i/6; + int face = i%6; + + if (data == NULL) + { + if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) + { + if ((format == RL_PIXELFORMAT_UNCOMPRESSED_R32) || + (format == RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32) || + (format == RL_PIXELFORMAT_UNCOMPRESSED_R16) || + (format == RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16)) TRACELOG(RL_LOG_WARNING, "TEXTURES: Cubemap requested format not supported"); + else glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, mipmapLevel, glInternalFormat, mipSize, mipSize, 0, glFormat, glType, NULL); + } + else TRACELOG(RL_LOG_WARNING, "TEXTURES: Empty cubemap creation does not support compressed format"); + } + else + { + if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, mipmapLevel, glInternalFormat, mipSize, mipSize, 0, glFormat, glType, (unsigned char *)dataPtr + face*dataSize); + else glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, mipmapLevel, glInternalFormat, mipSize, mipSize, 0, dataSize, (unsigned char *)dataPtr + face*dataSize); + } + +#if defined(GRAPHICS_API_OPENGL_33) + if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE) + { + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; + glTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } + else if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA) + { +#if defined(GRAPHICS_API_OPENGL_21) + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA }; +#elif defined(GRAPHICS_API_OPENGL_33) + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; +#endif + glTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } +#endif + if (face == 5) + { + mipSize /= 2; + if (data != NULL) dataPtr += dataSize*6; // Increment data pointer to next mipmap + + // Security check for NPOT textures + if (mipSize < 1) mipSize = 1; + + dataSize = rlGetPixelDataSize(mipSize, mipSize, format); + } + } + } + + // Set cubemap texture sampling parameters + if (mipmapCount > 1) glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + else glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +#if defined(GRAPHICS_API_OPENGL_33) + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); // Flag not supported on OpenGL ES 2.0 +#endif + + glBindTexture(GL_TEXTURE_CUBE_MAP, 0); +#endif + + if (id > 0) TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Cubemap texture loaded successfully (%ix%i)", id, size, size); + else TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load cubemap texture"); + + return id; +} + +// Update already loaded texture in GPU with new data +// NOTE: We don't know safely if internal texture format is the expected one... +void rlUpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int height, int format, const void *data) +{ + glBindTexture(GL_TEXTURE_2D, id); + + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + + if ((glInternalFormat != 0) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)) + { + glTexSubImage2D(GL_TEXTURE_2D, 0, offsetX, offsetY, width, height, glFormat, glType, data); + } + else TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Failed to update for current texture format (%i)", id, format); +} + +// Get OpenGL internal formats and data type from raylib PixelFormat +void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned int *glFormat, unsigned int *glType) +{ + *glInternalFormat = 0; + *glFormat = 0; + *glType = 0; + + switch (format) + { + #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_21) || defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: on OpenGL ES 2.0 (WebGL), internalFormat must match format and options allowed are: GL_LUMINANCE, GL_RGB, GL_RGBA + case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: *glInternalFormat = GL_LUMINANCE_ALPHA; *glFormat = GL_LUMINANCE_ALPHA; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_UNSIGNED_SHORT_5_6_5; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_5_5_5_1; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_4_4_4_4; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_BYTE; break; + #if !defined(GRAPHICS_API_OPENGL_11) + #if defined(GRAPHICS_API_OPENGL_ES3) + case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_R32F_EXT; *glFormat = GL_RED_EXT; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F_EXT; *glFormat = GL_RGB; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F_EXT; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_R16F_EXT; *glFormat = GL_RED_EXT; *glType = GL_HALF_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F_EXT; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F_EXT; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT; break; + #else + case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float + #if defined(GRAPHICS_API_OPENGL_21) + case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_ARB; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_ARB; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT_ARB; break; + #else // defined(GRAPHICS_API_OPENGL_ES2) + case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float + #endif + #endif + #endif + #elif defined(GRAPHICS_API_OPENGL_33) + case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_R8; *glFormat = GL_RED; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: *glInternalFormat = GL_RG8; *glFormat = GL_RG; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: *glInternalFormat = GL_RGB565; *glFormat = GL_RGB; *glType = GL_UNSIGNED_SHORT_5_6_5; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: *glInternalFormat = GL_RGB8; *glFormat = GL_RGB; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: *glInternalFormat = GL_RGB5_A1; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_5_5_5_1; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: *glInternalFormat = GL_RGBA4; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_4_4_4_4; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: *glInternalFormat = GL_RGBA8; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_R32F; *glFormat = GL_RED; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F; *glFormat = GL_RGB; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_R16F; *glFormat = GL_RED; *glType = GL_HALF_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT; break; + #endif + #if !defined(GRAPHICS_API_OPENGL_11) + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break; + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break; + case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break; + case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break; + case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB: if (RLGL.ExtSupported.texCompETC1) *glInternalFormat = GL_ETC1_RGB8_OES; break; // NOTE: Requires OpenGL ES 2.0 or OpenGL 4.3 + case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB: if (RLGL.ExtSupported.texCompETC2) *glInternalFormat = GL_COMPRESSED_RGB8_ETC2; break; // NOTE: Requires OpenGL ES 3.0 or OpenGL 4.3 + case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: if (RLGL.ExtSupported.texCompETC2) *glInternalFormat = GL_COMPRESSED_RGBA8_ETC2_EAC; break; // NOTE: Requires OpenGL ES 3.0 or OpenGL 4.3 + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB: if (RLGL.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; break; // NOTE: Requires PowerVR GPU + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: if (RLGL.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; break; // NOTE: Requires PowerVR GPU + case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: if (RLGL.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3 + case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: if (RLGL.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3 + #endif + default: TRACELOG(RL_LOG_WARNING, "TEXTURE: Current format not supported (%i)", format); break; + } +} + +// Unload texture from GPU memory +void rlUnloadTexture(unsigned int id) +{ + glDeleteTextures(1, &id); +} + +// Generate mipmap data for selected texture +// NOTE: Only supports GPU mipmap generation +void rlGenTextureMipmaps(unsigned int id, int width, int height, int format, int *mipmaps) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindTexture(GL_TEXTURE_2D, id); + + // Check if texture is power-of-two (POT) + bool texIsPOT = false; + + if (((width > 0) && ((width & (width - 1)) == 0)) && + ((height > 0) && ((height & (height - 1)) == 0))) texIsPOT = true; + + if ((texIsPOT) || (RLGL.ExtSupported.texNPOT)) + { + //glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE); // Hint for mipmaps generation algorithm: GL_FASTEST, GL_NICEST, GL_DONT_CARE + glGenerateMipmap(GL_TEXTURE_2D); // Generate mipmaps automatically + + #define MIN(a,b) (((a)<(b))? (a):(b)) + #define MAX(a,b) (((a)>(b))? (a):(b)) + + *mipmaps = 1 + (int)floor(log(MAX(width, height))/log(2)); + TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Mipmaps generated automatically, total: %i", id, *mipmaps); + } + else TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Failed to generate mipmaps", id); + + glBindTexture(GL_TEXTURE_2D, 0); +#else + TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] GPU mipmap generation not supported", id); +#endif +} + +// Read texture pixel data +void *rlReadTexturePixels(unsigned int id, int width, int height, int format) +{ + void *pixels = NULL; + +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + glBindTexture(GL_TEXTURE_2D, id); + + // NOTE: Using texture id, we can retrieve some texture info (but not on OpenGL ES 2.0) + // Possible texture info: GL_TEXTURE_RED_SIZE, GL_TEXTURE_GREEN_SIZE, GL_TEXTURE_BLUE_SIZE, GL_TEXTURE_ALPHA_SIZE + //int width, height, format; + //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width); + //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height); + //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &format); + + // NOTE: Each row written to or read from by OpenGL pixel operations like glGetTexImage are aligned to a 4 byte boundary by default, which may add some padding + // Use glPixelStorei to modify padding with the GL_[UN]PACK_ALIGNMENT setting + // GL_PACK_ALIGNMENT affects operations that read from OpenGL memory (glReadPixels, glGetTexImage, etc.) + // GL_UNPACK_ALIGNMENT affects operations that write to OpenGL memory (glTexImage, etc.) + glPixelStorei(GL_PACK_ALIGNMENT, 1); + + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + unsigned int size = rlGetPixelDataSize(width, height, format); + + if ((glInternalFormat != 0) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)) + { + pixels = RL_MALLOC(size); + glGetTexImage(GL_TEXTURE_2D, 0, glFormat, glType, pixels); + } + else TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Data retrieval not suported for pixel format (%i)", id, format); + + glBindTexture(GL_TEXTURE_2D, 0); +#endif + +#if defined(GRAPHICS_API_OPENGL_ES2) + // glGetTexImage() is not available on OpenGL ES 2.0 + // Texture width and height are required on OpenGL ES 2.0, there is no way to get it from texture id + // Two possible Options: + // 1 - Bind texture to color fbo attachment and glReadPixels() + // 2 - Create an fbo, activate it, render quad with texture, glReadPixels() + // We are using Option 1, just need to care for texture format on retrieval + // NOTE: This behaviour could be conditioned by graphic driver... + unsigned int fboId = rlLoadFramebuffer(); + + glBindFramebuffer(GL_FRAMEBUFFER, fboId); + glBindTexture(GL_TEXTURE_2D, 0); + + // Attach our texture to FBO + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, id, 0); + + // We read data as RGBA because FBO texture is configured as RGBA, despite binding another texture format + pixels = (unsigned char *)RL_MALLOC(rlGetPixelDataSize(width, height, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8)); + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + // Clean up temporal fbo + rlUnloadFramebuffer(fboId); +#endif + + return pixels; +} + +// Read screen pixel data (color buffer) +unsigned char *rlReadScreenPixels(int width, int height) +{ + unsigned char *screenData = (unsigned char *)RL_CALLOC(width*height*4, sizeof(unsigned char)); + + // NOTE 1: glReadPixels returns image flipped vertically -> (0,0) is the bottom left corner of the framebuffer + // NOTE 2: We are getting alpha channel! Be careful, it can be transparent if not cleared properly! + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, screenData); + + // Flip image vertically! + unsigned char *imgData = (unsigned char *)RL_MALLOC(width*height*4*sizeof(unsigned char)); + + for (int y = height - 1; y >= 0; y--) + { + for (int x = 0; x < (width*4); x++) + { + imgData[((height - 1) - y)*width*4 + x] = screenData[(y*width*4) + x]; // Flip line + + // Set alpha component value to 255 (no trasparent image retrieval) + // NOTE: Alpha value has already been applied to RGB in framebuffer, we don't need it! + if (((x + 1)%4) == 0) imgData[((height - 1) - y)*width*4 + x] = 255; + } + } + + RL_FREE(screenData); + + return imgData; // NOTE: image data should be freed +} + +// Framebuffer management (fbo) +//----------------------------------------------------------------------------------------- +// Load a framebuffer to be used for rendering +// NOTE: No textures attached +unsigned int rlLoadFramebuffer(void) +{ + unsigned int fboId = 0; + +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + glGenFramebuffers(1, &fboId); // Create the framebuffer object + glBindFramebuffer(GL_FRAMEBUFFER, 0); // Unbind any framebuffer +#endif + + return fboId; +} + +// Attach color buffer texture to an fbo (unloads previous attachment) +// NOTE: Attach type: 0-Color, 1-Depth renderbuffer, 2-Depth texture +void rlFramebufferAttach(unsigned int fboId, unsigned int texId, int attachType, int texType, int mipLevel) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + glBindFramebuffer(GL_FRAMEBUFFER, fboId); + + switch (attachType) + { + case RL_ATTACHMENT_COLOR_CHANNEL0: + case RL_ATTACHMENT_COLOR_CHANNEL1: + case RL_ATTACHMENT_COLOR_CHANNEL2: + case RL_ATTACHMENT_COLOR_CHANNEL3: + case RL_ATTACHMENT_COLOR_CHANNEL4: + case RL_ATTACHMENT_COLOR_CHANNEL5: + case RL_ATTACHMENT_COLOR_CHANNEL6: + case RL_ATTACHMENT_COLOR_CHANNEL7: + { + if (texType == RL_ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_TEXTURE_2D, texId, mipLevel); + else if (texType == RL_ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_RENDERBUFFER, texId); + else if (texType >= RL_ATTACHMENT_CUBEMAP_POSITIVE_X) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_TEXTURE_CUBE_MAP_POSITIVE_X + texType, texId, mipLevel); + + } break; + case RL_ATTACHMENT_DEPTH: + { + if (texType == RL_ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texId, mipLevel); + else if (texType == RL_ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, texId); + + } break; + case RL_ATTACHMENT_STENCIL: + { + if (texType == RL_ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texId, mipLevel); + else if (texType == RL_ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, texId); + + } break; + default: break; + } + + glBindFramebuffer(GL_FRAMEBUFFER, 0); +#endif +} + +// Verify render texture is complete +bool rlFramebufferComplete(unsigned int id) +{ + bool result = false; + +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + glBindFramebuffer(GL_FRAMEBUFFER, id); + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + if (status != GL_FRAMEBUFFER_COMPLETE) + { + switch (status) + { + case GL_FRAMEBUFFER_UNSUPPORTED: TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer is unsupported", id); break; + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer has incomplete attachment", id); break; +#if defined(GRAPHICS_API_OPENGL_ES2) + case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer has incomplete dimensions", id); break; +#endif + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer has a missing attachment", id); break; + default: break; + } + } + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + result = (status == GL_FRAMEBUFFER_COMPLETE); +#endif + + return result; +} + +// Unload framebuffer from GPU memory +// NOTE: All attached textures/cubemaps/renderbuffers are also deleted +void rlUnloadFramebuffer(unsigned int id) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) + // Query depth attachment to automatically delete texture/renderbuffer + int depthType = 0, depthId = 0; + glBindFramebuffer(GL_FRAMEBUFFER, id); // Bind framebuffer to query depth texture type + glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &depthType); + + // TODO: Review warning retrieving object name in WebGL + // WARNING: WebGL: INVALID_ENUM: getFramebufferAttachmentParameter: invalid parameter name + // https://registry.khronos.org/webgl/specs/latest/1.0/ + glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &depthId); + + unsigned int depthIdU = (unsigned int)depthId; + if (depthType == GL_RENDERBUFFER) glDeleteRenderbuffers(1, &depthIdU); + else if (depthType == GL_TEXTURE) glDeleteTextures(1, &depthIdU); + + // NOTE: If a texture object is deleted while its image is attached to the *currently bound* framebuffer, + // the texture image is automatically detached from the currently bound framebuffer + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glDeleteFramebuffers(1, &id); + + TRACELOG(RL_LOG_INFO, "FBO: [ID %i] Unloaded framebuffer from VRAM (GPU)", id); +#endif +} + +// Vertex data management +//----------------------------------------------------------------------------------------- +// Load a new attributes buffer +unsigned int rlLoadVertexBuffer(const void *buffer, int size, bool dynamic) +{ + unsigned int id = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glGenBuffers(1, &id); + glBindBuffer(GL_ARRAY_BUFFER, id); + glBufferData(GL_ARRAY_BUFFER, size, buffer, dynamic? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); +#endif + + return id; +} + +// Load a new attributes element buffer +unsigned int rlLoadVertexBufferElement(const void *buffer, int size, bool dynamic) +{ + unsigned int id = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glGenBuffers(1, &id); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, buffer, dynamic? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); +#endif + + return id; +} + +// Enable vertex buffer (VBO) +void rlEnableVertexBuffer(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ARRAY_BUFFER, id); +#endif +} + +// Disable vertex buffer (VBO) +void rlDisableVertexBuffer(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ARRAY_BUFFER, 0); +#endif +} + +// Enable vertex buffer element (VBO element) +void rlEnableVertexBufferElement(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); +#endif +} + +// Disable vertex buffer element (VBO element) +void rlDisableVertexBufferElement(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); +#endif +} + +// Update vertex buffer with new data +// NOTE: dataSize and offset must be provided in bytes +void rlUpdateVertexBuffer(unsigned int id, const void *data, int dataSize, int offset) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ARRAY_BUFFER, id); + glBufferSubData(GL_ARRAY_BUFFER, offset, dataSize, data); +#endif +} + +// Update vertex buffer elements with new data +// NOTE: dataSize and offset must be provided in bytes +void rlUpdateVertexBufferElements(unsigned int id, const void *data, int dataSize, int offset) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, dataSize, data); +#endif +} + +// Enable vertex array object (VAO) +bool rlEnableVertexArray(unsigned int vaoId) +{ + bool result = false; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.ExtSupported.vao) + { + glBindVertexArray(vaoId); + result = true; + } +#endif + return result; +} + +// Disable vertex array object (VAO) +void rlDisableVertexArray(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.ExtSupported.vao) glBindVertexArray(0); +#endif +} + +// Enable vertex attribute index +void rlEnableVertexAttribute(unsigned int index) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glEnableVertexAttribArray(index); +#endif +} + +// Disable vertex attribute index +void rlDisableVertexAttribute(unsigned int index) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glDisableVertexAttribArray(index); +#endif +} + +// Draw vertex array +void rlDrawVertexArray(int offset, int count) +{ + glDrawArrays(GL_TRIANGLES, offset, count); +} + +// Draw vertex array elements +void rlDrawVertexArrayElements(int offset, int count, const void *buffer) +{ + // NOTE: Added pointer math separately from function to avoid UBSAN complaining + unsigned short *bufferPtr = (unsigned short *)buffer; + if (offset > 0) bufferPtr += offset; + + glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (const unsigned short *)bufferPtr); +} + +// Draw vertex array instanced +void rlDrawVertexArrayInstanced(int offset, int count, int instances) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glDrawArraysInstanced(GL_TRIANGLES, offset, count, instances); +#endif +} + +// Draw vertex array elements instanced +void rlDrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: Added pointer math separately from function to avoid UBSAN complaining + unsigned short *bufferPtr = (unsigned short *)buffer; + if (offset > 0) bufferPtr += offset; + + glDrawElementsInstanced(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (const unsigned short *)bufferPtr, instances); +#endif +} + +#if defined(GRAPHICS_API_OPENGL_11) +// Enable vertex state pointer +void rlEnableStatePointer(int vertexAttribType, void *buffer) +{ + if (buffer != NULL) glEnableClientState(vertexAttribType); + switch (vertexAttribType) + { + case GL_VERTEX_ARRAY: glVertexPointer(3, GL_FLOAT, 0, buffer); break; + case GL_TEXTURE_COORD_ARRAY: glTexCoordPointer(2, GL_FLOAT, 0, buffer); break; + case GL_NORMAL_ARRAY: if (buffer != NULL) glNormalPointer(GL_FLOAT, 0, buffer); break; + case GL_COLOR_ARRAY: if (buffer != NULL) glColorPointer(4, GL_UNSIGNED_BYTE, 0, buffer); break; + //case GL_INDEX_ARRAY: if (buffer != NULL) glIndexPointer(GL_SHORT, 0, buffer); break; // Indexed colors + default: break; + } +} + +// Disable vertex state pointer +void rlDisableStatePointer(int vertexAttribType) +{ + glDisableClientState(vertexAttribType); +} +#endif + +// Load vertex array object (VAO) +unsigned int rlLoadVertexArray(void) +{ + unsigned int vaoId = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.ExtSupported.vao) + { + glGenVertexArrays(1, &vaoId); + } +#endif + return vaoId; +} + +// Set vertex attribute +void rlSetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int stride, int offset) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: Data type could be: GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT + // Additional types (depends on OpenGL version or extensions): + // - GL_HALF_FLOAT, GL_FLOAT, GL_DOUBLE, GL_FIXED, + // - GL_INT_2_10_10_10_REV, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_10F_11F_11F_REV + + size_t offsetNative = offset; + glVertexAttribPointer(index, compSize, type, normalized, stride, (void *)offsetNative); +#endif +} + +// Set vertex attribute divisor +void rlSetVertexAttributeDivisor(unsigned int index, int divisor) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glVertexAttribDivisor(index, divisor); +#endif +} + +// Unload vertex array object (VAO) +void rlUnloadVertexArray(unsigned int vaoId) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.ExtSupported.vao) + { + glBindVertexArray(0); + glDeleteVertexArrays(1, &vaoId); + TRACELOG(RL_LOG_INFO, "VAO: [ID %i] Unloaded vertex array data from VRAM (GPU)", vaoId); + } +#endif +} + +// Unload vertex buffer (VBO) +void rlUnloadVertexBuffer(unsigned int vboId) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glDeleteBuffers(1, &vboId); + //TRACELOG(RL_LOG_INFO, "VBO: Unloaded vertex data from VRAM (GPU)"); +#endif +} + +// Shaders management +//----------------------------------------------------------------------------------------------- +// Load shader from code strings +// NOTE: If shader string is NULL, using default vertex/fragment shaders +unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode) +{ + unsigned int id = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + unsigned int vertexShaderId = 0; + unsigned int fragmentShaderId = 0; + + // Compile vertex shader (if provided) + // NOTE: If not vertex shader is provided, use default one + if (vsCode != NULL) vertexShaderId = rlCompileShader(vsCode, GL_VERTEX_SHADER); + else vertexShaderId = RLGL.State.defaultVShaderId; + + // Compile fragment shader (if provided) + // NOTE: If not vertex shader is provided, use default one + if (fsCode != NULL) fragmentShaderId = rlCompileShader(fsCode, GL_FRAGMENT_SHADER); + else fragmentShaderId = RLGL.State.defaultFShaderId; + + // In case vertex and fragment shader are the default ones, no need to recompile, we can just assign the default shader program id + if ((vertexShaderId == RLGL.State.defaultVShaderId) && (fragmentShaderId == RLGL.State.defaultFShaderId)) id = RLGL.State.defaultShaderId; + else if ((vertexShaderId > 0) && (fragmentShaderId > 0)) + { + // One of or both shader are new, we need to compile a new shader program + id = rlLoadShaderProgram(vertexShaderId, fragmentShaderId); + + // We can detach and delete vertex/fragment shaders (if not default ones) + // NOTE: We detach shader before deletion to make sure memory is freed + if (vertexShaderId != RLGL.State.defaultVShaderId) + { + // WARNING: Shader program linkage could fail and returned id is 0 + if (id > 0) glDetachShader(id, vertexShaderId); + glDeleteShader(vertexShaderId); + } + if (fragmentShaderId != RLGL.State.defaultFShaderId) + { + // WARNING: Shader program linkage could fail and returned id is 0 + if (id > 0) glDetachShader(id, fragmentShaderId); + glDeleteShader(fragmentShaderId); + } + + // In case shader program loading failed, we assign default shader + if (id == 0) + { + // In case shader loading fails, we return the default shader + TRACELOG(RL_LOG_WARNING, "SHADER: Failed to load custom shader code, using default shader"); + id = RLGL.State.defaultShaderId; + } + /* + else + { + // Get available shader uniforms + // NOTE: This information is useful for debug... + int uniformCount = -1; + glGetProgramiv(id, GL_ACTIVE_UNIFORMS, &uniformCount); + + for (int i = 0; i < uniformCount; i++) + { + int namelen = -1; + int num = -1; + char name[256] = { 0 }; // Assume no variable names longer than 256 + GLenum type = GL_ZERO; + + // Get the name of the uniforms + glGetActiveUniform(id, i, sizeof(name) - 1, &namelen, &num, &type, name); + + name[namelen] = 0; + TRACELOGD("SHADER: [ID %i] Active uniform (%s) set at location: %i", id, name, glGetUniformLocation(id, name)); + } + } + */ + } +#endif + + return id; +} + +// Compile custom shader and return shader id +unsigned int rlCompileShader(const char *shaderCode, int type) +{ + unsigned int shader = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + shader = glCreateShader(type); + glShaderSource(shader, 1, &shaderCode, NULL); + + GLint success = 0; + glCompileShader(shader); + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + + if (success == GL_FALSE) + { + switch (type) + { + case GL_VERTEX_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile vertex shader code", shader); break; + case GL_FRAGMENT_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile fragment shader code", shader); break; + //case GL_GEOMETRY_SHADER: + #if defined(GRAPHICS_API_OPENGL_43) + case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile compute shader code", shader); break; + #elif defined(GRAPHICS_API_OPENGL_33) + case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43", shader); break; + #endif + default: break; + } + + int maxLength = 0; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength); + + if (maxLength > 0) + { + int length = 0; + char *log = (char *)RL_CALLOC(maxLength, sizeof(char)); + glGetShaderInfoLog(shader, maxLength, &length, log); + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Compile error: %s", shader, log); + RL_FREE(log); + } + + shader = 0; + } + else + { + switch (type) + { + case GL_VERTEX_SHADER: TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Vertex shader compiled successfully", shader); break; + case GL_FRAGMENT_SHADER: TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Fragment shader compiled successfully", shader); break; + //case GL_GEOMETRY_SHADER: + #if defined(GRAPHICS_API_OPENGL_43) + case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Compute shader compiled successfully", shader); break; + #elif defined(GRAPHICS_API_OPENGL_33) + case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43", shader); break; + #endif + default: break; + } + } +#endif + + return shader; +} + +// Load custom shader strings and return program id +unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId) +{ + unsigned int program = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + GLint success = 0; + program = glCreateProgram(); + + glAttachShader(program, vShaderId); + glAttachShader(program, fShaderId); + + // NOTE: Default attribute shader locations must be Bound before linking + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION, RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL, RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR, RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT, RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCE_TX, RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCE_TX); + +#ifdef RL_SUPPORT_MESH_GPU_SKINNING + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEIDS, RL_DEFAULT_SHADER_ATTRIB_NAME_BONEIDS); + glBindAttribLocation(program, RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS, RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS); +#endif + + // NOTE: If some attrib name is no found on the shader, it locations becomes -1 + + glLinkProgram(program); + + // NOTE: All uniform variables are intitialised to 0 when a program links + + glGetProgramiv(program, GL_LINK_STATUS, &success); + + if (success == GL_FALSE) + { + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to link shader program", program); + + int maxLength = 0; + glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength); + + if (maxLength > 0) + { + int length = 0; + char *log = (char *)RL_CALLOC(maxLength, sizeof(char)); + glGetProgramInfoLog(program, maxLength, &length, log); + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Link error: %s", program, log); + RL_FREE(log); + } + + glDeleteProgram(program); + + program = 0; + } + else + { + // Get the size of compiled shader program (not available on OpenGL ES 2.0) + // NOTE: If GL_LINK_STATUS is GL_FALSE, program binary length is zero + //GLint binarySize = 0; + //glGetProgramiv(id, GL_PROGRAM_BINARY_LENGTH, &binarySize); + + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Program shader loaded successfully", program); + } +#endif + return program; +} + +// Unload shader program +void rlUnloadShaderProgram(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glDeleteProgram(id); + + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Unloaded shader program data from VRAM (GPU)", id); +#endif +} + +// Get shader location uniform +int rlGetLocationUniform(unsigned int shaderId, const char *uniformName) +{ + int location = -1; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + location = glGetUniformLocation(shaderId, uniformName); + + //if (location == -1) TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to find shader uniform: %s", shaderId, uniformName); + //else TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Shader uniform (%s) set at location: %i", shaderId, uniformName, location); +#endif + return location; +} + +// Get shader location attribute +int rlGetLocationAttrib(unsigned int shaderId, const char *attribName) +{ + int location = -1; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + location = glGetAttribLocation(shaderId, attribName); + + //if (location == -1) TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to find shader attribute: %s", shaderId, attribName); + //else TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Shader attribute (%s) set at location: %i", shaderId, attribName, location); +#endif + return location; +} + +// Set shader value uniform +void rlSetUniform(int locIndex, const void *value, int uniformType, int count) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + switch (uniformType) + { + case RL_SHADER_UNIFORM_FLOAT: glUniform1fv(locIndex, count, (float *)value); break; + case RL_SHADER_UNIFORM_VEC2: glUniform2fv(locIndex, count, (float *)value); break; + case RL_SHADER_UNIFORM_VEC3: glUniform3fv(locIndex, count, (float *)value); break; + case RL_SHADER_UNIFORM_VEC4: glUniform4fv(locIndex, count, (float *)value); break; + case RL_SHADER_UNIFORM_INT: glUniform1iv(locIndex, count, (int *)value); break; + case RL_SHADER_UNIFORM_IVEC2: glUniform2iv(locIndex, count, (int *)value); break; + case RL_SHADER_UNIFORM_IVEC3: glUniform3iv(locIndex, count, (int *)value); break; + case RL_SHADER_UNIFORM_IVEC4: glUniform4iv(locIndex, count, (int *)value); break; + #if !defined(GRAPHICS_API_OPENGL_ES2) + case RL_SHADER_UNIFORM_UINT: glUniform1uiv(locIndex, count, (unsigned int *)value); break; + case RL_SHADER_UNIFORM_UIVEC2: glUniform2uiv(locIndex, count, (unsigned int *)value); break; + case RL_SHADER_UNIFORM_UIVEC3: glUniform3uiv(locIndex, count, (unsigned int *)value); break; + case RL_SHADER_UNIFORM_UIVEC4: glUniform4uiv(locIndex, count, (unsigned int *)value); break; + #endif + case RL_SHADER_UNIFORM_SAMPLER2D: glUniform1iv(locIndex, count, (int *)value); break; + default: TRACELOG(RL_LOG_WARNING, "SHADER: Failed to set uniform value, data type not recognized"); + + // TODO: Support glUniform1uiv(), glUniform2uiv(), glUniform3uiv(), glUniform4uiv() + } +#endif +} + +// Set shader value attribute +void rlSetVertexAttributeDefault(int locIndex, const void *value, int attribType, int count) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + switch (attribType) + { + case RL_SHADER_ATTRIB_FLOAT: if (count == 1) glVertexAttrib1fv(locIndex, (float *)value); break; + case RL_SHADER_ATTRIB_VEC2: if (count == 2) glVertexAttrib2fv(locIndex, (float *)value); break; + case RL_SHADER_ATTRIB_VEC3: if (count == 3) glVertexAttrib3fv(locIndex, (float *)value); break; + case RL_SHADER_ATTRIB_VEC4: if (count == 4) glVertexAttrib4fv(locIndex, (float *)value); break; + default: TRACELOG(RL_LOG_WARNING, "SHADER: Failed to set attrib default value, data type not recognized"); + } +#endif +} + +// Set shader value uniform matrix +void rlSetUniformMatrix(int locIndex, Matrix mat) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + float matfloat[16] = { + mat.m0, mat.m1, mat.m2, mat.m3, + mat.m4, mat.m5, mat.m6, mat.m7, + mat.m8, mat.m9, mat.m10, mat.m11, + mat.m12, mat.m13, mat.m14, mat.m15 + }; + glUniformMatrix4fv(locIndex, 1, false, matfloat); +#endif +} + +// Set shader value uniform matrix +void rlSetUniformMatrices(int locIndex, const Matrix *matrices, int count) +{ +#if defined(GRAPHICS_API_OPENGL_33) + glUniformMatrix4fv(locIndex, count, true, (const float *)matrices); +#elif defined(GRAPHICS_API_OPENGL_ES2) + // WARNING: WebGL does not support Matrix transpose ("true" parameter) + // REF: https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/uniformMatrix + glUniformMatrix4fv(locIndex, count, false, (const float *)matrices); +#endif +} + +// Set shader value uniform sampler +void rlSetUniformSampler(int locIndex, unsigned int textureId) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Check if texture is already active + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) + { + if (RLGL.State.activeTextureId[i] == textureId) + { + glUniform1i(locIndex, 1 + i); + return; + } + } + + // Register a new active texture for the internal batch system + // NOTE: Default texture is always activated as GL_TEXTURE0 + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) + { + if (RLGL.State.activeTextureId[i] == 0) + { + glUniform1i(locIndex, 1 + i); // Activate new texture unit + RLGL.State.activeTextureId[i] = textureId; // Save texture id for binding on drawing + break; + } + } +#endif +} + +// Set shader currently active (id and locations) +void rlSetShader(unsigned int id, int *locs) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.State.currentShaderId != id) + { + rlDrawRenderBatch(RLGL.currentBatch); + RLGL.State.currentShaderId = id; + RLGL.State.currentShaderLocs = locs; + } +#endif +} + +// Load compute shader program +unsigned int rlLoadComputeShaderProgram(unsigned int shaderId) +{ + unsigned int program = 0; + +#if defined(GRAPHICS_API_OPENGL_43) + GLint success = 0; + program = glCreateProgram(); + glAttachShader(program, shaderId); + glLinkProgram(program); + + // NOTE: All uniform variables are intitialised to 0 when a program links + + glGetProgramiv(program, GL_LINK_STATUS, &success); + + if (success == GL_FALSE) + { + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to link compute shader program", program); + + int maxLength = 0; + glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength); + + if (maxLength > 0) + { + int length = 0; + char *log = (char *)RL_CALLOC(maxLength, sizeof(char)); + glGetProgramInfoLog(program, maxLength, &length, log); + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Link error: %s", program, log); + RL_FREE(log); + } + + glDeleteProgram(program); + + program = 0; + } + else + { + // Get the size of compiled shader program (not available on OpenGL ES 2.0) + // NOTE: If GL_LINK_STATUS is GL_FALSE, program binary length is zero + //GLint binarySize = 0; + //glGetProgramiv(id, GL_PROGRAM_BINARY_LENGTH, &binarySize); + + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Compute shader program loaded successfully", program); + } +#else + TRACELOG(RL_LOG_WARNING, "SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43"); +#endif + + return program; +} + +// Dispatch compute shader (equivalent to *draw* for graphics pilepine) +void rlComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glDispatchCompute(groupX, groupY, groupZ); +#endif +} + +// Load shader storage buffer object (SSBO) +unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHint) +{ + unsigned int ssbo = 0; + +#if defined(GRAPHICS_API_OPENGL_43) + glGenBuffers(1, &ssbo); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo); + glBufferData(GL_SHADER_STORAGE_BUFFER, size, data, usageHint? usageHint : RL_STREAM_COPY); + if (data == NULL) glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, NULL); // Clear buffer data to 0 + glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); +#else + TRACELOG(RL_LOG_WARNING, "SSBO: SSBO not enabled. Define GRAPHICS_API_OPENGL_43"); +#endif + + return ssbo; +} + +// Unload shader storage buffer object (SSBO) +void rlUnloadShaderBuffer(unsigned int ssboId) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glDeleteBuffers(1, &ssboId); +#else + TRACELOG(RL_LOG_WARNING, "SSBO: SSBO not enabled. Define GRAPHICS_API_OPENGL_43"); +#endif + +} + +// Update SSBO buffer data +void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int offset) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glBindBuffer(GL_SHADER_STORAGE_BUFFER, id); + glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset, dataSize, data); +#endif +} + +// Get SSBO buffer size +unsigned int rlGetShaderBufferSize(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_43) + GLint64 size = 0; + glBindBuffer(GL_SHADER_STORAGE_BUFFER, id); + glGetBufferParameteri64v(GL_SHADER_STORAGE_BUFFER, GL_BUFFER_SIZE, &size); + return (size > 0)? (unsigned int)size : 0; +#else + return 0; +#endif +} + +// Read SSBO buffer data (GPU->CPU) +void rlReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsigned int offset) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glBindBuffer(GL_SHADER_STORAGE_BUFFER, id); + glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, offset, count, dest); +#endif +} + +// Bind SSBO buffer +void rlBindShaderBuffer(unsigned int id, unsigned int index) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, id); +#endif +} + +// Copy SSBO buffer data +void rlCopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, unsigned int srcOffset, unsigned int count) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glBindBuffer(GL_COPY_READ_BUFFER, srcId); + glBindBuffer(GL_COPY_WRITE_BUFFER, destId); + glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, srcOffset, destOffset, count); +#endif +} + +// Bind image texture +void rlBindImageTexture(unsigned int id, unsigned int index, int format, bool readonly) +{ +#if defined(GRAPHICS_API_OPENGL_43) + unsigned int glInternalFormat = 0, glFormat = 0, glType = 0; + + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + glBindImageTexture(index, id, 0, 0, 0, readonly? GL_READ_ONLY : GL_READ_WRITE, glInternalFormat); +#else + TRACELOG(RL_LOG_WARNING, "TEXTURE: Image texture binding not enabled. Define GRAPHICS_API_OPENGL_43"); +#endif +} + +// Matrix state management +//----------------------------------------------------------------------------------------- +// Get internal modelview matrix +Matrix rlGetMatrixModelview(void) +{ + Matrix matrix = rlMatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_11) + float mat[16]; + glGetFloatv(GL_MODELVIEW_MATRIX, mat); + matrix.m0 = mat[0]; + matrix.m1 = mat[1]; + matrix.m2 = mat[2]; + matrix.m3 = mat[3]; + matrix.m4 = mat[4]; + matrix.m5 = mat[5]; + matrix.m6 = mat[6]; + matrix.m7 = mat[7]; + matrix.m8 = mat[8]; + matrix.m9 = mat[9]; + matrix.m10 = mat[10]; + matrix.m11 = mat[11]; + matrix.m12 = mat[12]; + matrix.m13 = mat[13]; + matrix.m14 = mat[14]; + matrix.m15 = mat[15]; +#else + matrix = RLGL.State.modelview; +#endif + return matrix; +} + +// Get internal projection matrix +Matrix rlGetMatrixProjection(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) + float mat[16]; + glGetFloatv(GL_PROJECTION_MATRIX,mat); + Matrix m; + m.m0 = mat[0]; + m.m1 = mat[1]; + m.m2 = mat[2]; + m.m3 = mat[3]; + m.m4 = mat[4]; + m.m5 = mat[5]; + m.m6 = mat[6]; + m.m7 = mat[7]; + m.m8 = mat[8]; + m.m9 = mat[9]; + m.m10 = mat[10]; + m.m11 = mat[11]; + m.m12 = mat[12]; + m.m13 = mat[13]; + m.m14 = mat[14]; + m.m15 = mat[15]; + return m; +#else + return RLGL.State.projection; +#endif +} + +// Get internal accumulated transform matrix +Matrix rlGetMatrixTransform(void) +{ + Matrix mat = rlMatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // TODO: Consider possible transform matrices in the RLGL.State.stack + // Is this the right order? or should we start with the first stored matrix instead of the last one? + //Matrix matStackTransform = rlMatrixIdentity(); + //for (int i = RLGL.State.stackCounter; i > 0; i--) matStackTransform = rlMatrixMultiply(RLGL.State.stack[i], matStackTransform); + mat = RLGL.State.transform; +#endif + return mat; +} + +// Get internal projection matrix for stereo render (selected eye) +Matrix rlGetMatrixProjectionStereo(int eye) +{ + Matrix mat = rlMatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + mat = RLGL.State.projectionStereo[eye]; +#endif + return mat; +} + +// Get internal view offset matrix for stereo render (selected eye) +Matrix rlGetMatrixViewOffsetStereo(int eye) +{ + Matrix mat = rlMatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + mat = RLGL.State.viewOffsetStereo[eye]; +#endif + return mat; +} + +// Set a custom modelview matrix (replaces internal modelview matrix) +void rlSetMatrixModelview(Matrix view) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.modelview = view; +#endif +} + +// Set a custom projection matrix (replaces internal projection matrix) +void rlSetMatrixProjection(Matrix projection) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.projection = projection; +#endif +} + +// Set eyes projection matrices for stereo rendering +void rlSetMatrixProjectionStereo(Matrix right, Matrix left) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.projectionStereo[0] = right; + RLGL.State.projectionStereo[1] = left; +#endif +} + +// Set eyes view offsets matrices for stereo rendering +void rlSetMatrixViewOffsetStereo(Matrix right, Matrix left) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.viewOffsetStereo[0] = right; + RLGL.State.viewOffsetStereo[1] = left; +#endif +} + +// Load and draw a quad in NDC +void rlLoadDrawQuad(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + unsigned int quadVAO = 0; + unsigned int quadVBO = 0; + + float vertices[] = { + // Positions Texcoords + -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, + }; + + // Gen VAO to contain VBO + glGenVertexArrays(1, &quadVAO); + glBindVertexArray(quadVAO); + + // Gen and fill vertex buffer (VBO) + glGenBuffers(1, &quadVBO); + glBindBuffer(GL_ARRAY_BUFFER, quadVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), &vertices, GL_STATIC_DRAW); + + // Bind vertex attributes (position, texcoords) + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void *)0); // Positions + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void *)(3*sizeof(float))); // Texcoords + + // Draw quad + glBindVertexArray(quadVAO); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glBindVertexArray(0); + + // Delete buffers (VBO and VAO) + glDeleteBuffers(1, &quadVBO); + glDeleteVertexArrays(1, &quadVAO); +#endif +} + +// Load and draw a cube in NDC +void rlLoadDrawCube(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + unsigned int cubeVAO = 0; + unsigned int cubeVBO = 0; + + float vertices[] = { + // Positions Normals Texcoords + -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, + 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, + 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, + 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, + -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, + -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, + 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, + -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, + -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, + -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, + -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, + -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f + }; + + // Gen VAO to contain VBO + glGenVertexArrays(1, &cubeVAO); + glBindVertexArray(cubeVAO); + + // Gen and fill vertex buffer (VBO) + glGenBuffers(1, &cubeVBO); + glBindBuffer(GL_ARRAY_BUFFER, cubeVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + // Bind vertex attributes (position, normals, texcoords) + glBindVertexArray(cubeVAO); + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void *)0); // Positions + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void *)(3*sizeof(float))); // Normals + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void *)(6*sizeof(float))); // Texcoords + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + + // Draw cube + glBindVertexArray(cubeVAO); + glDrawArrays(GL_TRIANGLES, 0, 36); + glBindVertexArray(0); + + // Delete VBO and VAO + glDeleteBuffers(1, &cubeVBO); + glDeleteVertexArrays(1, &cubeVAO); +#endif +} + +// Get name string for pixel format +const char *rlGetPixelFormatName(unsigned int format) +{ + switch (format) + { + case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: return "GRAYSCALE"; break; // 8 bit per pixel (no alpha) + case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: return "GRAY_ALPHA"; break; // 8*2 bpp (2 channels) + case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: return "R5G6B5"; break; // 16 bpp + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: return "R8G8B8"; break; // 24 bpp + case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: return "R5G5B5A1"; break; // 16 bpp (1 bit alpha) + case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: return "R4G4B4A4"; break; // 16 bpp (4 bit alpha) + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: return "R8G8B8A8"; break; // 32 bpp + case RL_PIXELFORMAT_UNCOMPRESSED_R32: return "R32"; break; // 32 bpp (1 channel - float) + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: return "R32G32B32"; break; // 32*3 bpp (3 channels - float) + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: return "R32G32B32A32"; break; // 32*4 bpp (4 channels - float) + case RL_PIXELFORMAT_UNCOMPRESSED_R16: return "R16"; break; // 16 bpp (1 channel - half float) + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: return "R16G16B16"; break; // 16*3 bpp (3 channels - half float) + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: return "R16G16B16A16"; break; // 16*4 bpp (4 channels - half float) + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: return "DXT1_RGB"; break; // 4 bpp (no alpha) + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: return "DXT1_RGBA"; break; // 4 bpp (1 bit alpha) + case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: return "DXT3_RGBA"; break; // 8 bpp + case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA: return "DXT5_RGBA"; break; // 8 bpp + case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB: return "ETC1_RGB"; break; // 4 bpp + case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB: return "ETC2_RGB"; break; // 4 bpp + case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: return "ETC2_RGBA"; break; // 8 bpp + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB: return "PVRT_RGB"; break; // 4 bpp + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: return "PVRT_RGBA"; break; // 4 bpp + case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: return "ASTC_4x4_RGBA"; break; // 8 bpp + case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: return "ASTC_8x8_RGBA"; break; // 2 bpp + default: return "UNKNOWN"; break; + } +} + +//---------------------------------------------------------------------------------- +// Module specific Functions Definition +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +// Load default shader (just vertex positioning and texture coloring) +// NOTE: This shader program is used for internal buffers +// NOTE: Loaded: RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs +static void rlLoadShaderDefault(void) +{ + RLGL.State.defaultShaderLocs = (int *)RL_CALLOC(RL_MAX_SHADER_LOCATIONS, sizeof(int)); + + // NOTE: All locations must be reseted to -1 (no location) + for (int i = 0; i < RL_MAX_SHADER_LOCATIONS; i++) RLGL.State.defaultShaderLocs[i] = -1; + + // Vertex shader directly defined, no external file required + const char *defaultVShaderCode = +#if defined(GRAPHICS_API_OPENGL_21) + "#version 120 \n" + "attribute vec3 vertexPosition; \n" + "attribute vec2 vertexTexCoord; \n" + "attribute vec4 vertexColor; \n" + "varying vec2 fragTexCoord; \n" + "varying vec4 fragColor; \n" +#elif defined(GRAPHICS_API_OPENGL_33) + "#version 330 \n" + "in vec3 vertexPosition; \n" + "in vec2 vertexTexCoord; \n" + "in vec4 vertexColor; \n" + "out vec2 fragTexCoord; \n" + "out vec4 fragColor; \n" +#endif + +#if defined(GRAPHICS_API_OPENGL_ES3) + "#version 300 es \n" + "precision mediump float; \n" // Precision required for OpenGL ES3 (WebGL 2) (on some browsers) + "in vec3 vertexPosition; \n" + "in vec2 vertexTexCoord; \n" + "in vec4 vertexColor; \n" + "out vec2 fragTexCoord; \n" + "out vec4 fragColor; \n" +#elif defined(GRAPHICS_API_OPENGL_ES2) + "#version 100 \n" + "precision mediump float; \n" // Precision required for OpenGL ES2 (WebGL) (on some browsers) + "attribute vec3 vertexPosition; \n" + "attribute vec2 vertexTexCoord; \n" + "attribute vec4 vertexColor; \n" + "varying vec2 fragTexCoord; \n" + "varying vec4 fragColor; \n" +#endif + + "uniform mat4 mvp; \n" + "void main() \n" + "{ \n" + " fragTexCoord = vertexTexCoord; \n" + " fragColor = vertexColor; \n" + " gl_Position = mvp*vec4(vertexPosition, 1.0); \n" + "} \n"; + + // Fragment shader directly defined, no external file required + const char *defaultFShaderCode = +#if defined(GRAPHICS_API_OPENGL_21) + "#version 120 \n" + "varying vec2 fragTexCoord; \n" + "varying vec4 fragColor; \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + "void main() \n" + "{ \n" + " vec4 texelColor = texture2D(texture0, fragTexCoord); \n" + " gl_FragColor = texelColor*colDiffuse*fragColor; \n" + "} \n"; +#elif defined(GRAPHICS_API_OPENGL_33) + "#version 330 \n" + "in vec2 fragTexCoord; \n" + "in vec4 fragColor; \n" + "out vec4 finalColor; \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + "void main() \n" + "{ \n" + " vec4 texelColor = texture(texture0, fragTexCoord); \n" + " finalColor = texelColor*colDiffuse*fragColor; \n" + "} \n"; +#endif + +#if defined(GRAPHICS_API_OPENGL_ES3) + "#version 300 es \n" + "precision mediump float; \n" // Precision required for OpenGL ES3 (WebGL 2) + "in vec2 fragTexCoord; \n" + "in vec4 fragColor; \n" + "out vec4 finalColor; \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + "void main() \n" + "{ \n" + " vec4 texelColor = texture(texture0, fragTexCoord); \n" + " finalColor = texelColor*colDiffuse*fragColor; \n" + "} \n"; +#elif defined(GRAPHICS_API_OPENGL_ES2) + "#version 100 \n" + "precision mediump float; \n" // Precision required for OpenGL ES2 (WebGL) + "varying vec2 fragTexCoord; \n" + "varying vec4 fragColor; \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + "void main() \n" + "{ \n" + " vec4 texelColor = texture2D(texture0, fragTexCoord); \n" + " gl_FragColor = texelColor*colDiffuse*fragColor; \n" + "} \n"; +#endif + + // NOTE: Compiled vertex/fragment shaders are not deleted, + // they are kept for re-use as default shaders in case some shader loading fails + RLGL.State.defaultVShaderId = rlCompileShader(defaultVShaderCode, GL_VERTEX_SHADER); // Compile default vertex shader + RLGL.State.defaultFShaderId = rlCompileShader(defaultFShaderCode, GL_FRAGMENT_SHADER); // Compile default fragment shader + + RLGL.State.defaultShaderId = rlLoadShaderProgram(RLGL.State.defaultVShaderId, RLGL.State.defaultFShaderId); + + if (RLGL.State.defaultShaderId > 0) + { + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Default shader loaded successfully", RLGL.State.defaultShaderId); + + // Set default shader locations: attributes locations + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_POSITION] = glGetAttribLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION); + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01] = glGetAttribLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD); + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_COLOR] = glGetAttribLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR); + + // Set default shader locations: uniform locations + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_MATRIX_MVP] = glGetUniformLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_UNIFORM_NAME_MVP); + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_COLOR_DIFFUSE] = glGetUniformLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR); + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_MAP_DIFFUSE] = glGetUniformLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0); + } + else TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to load default shader", RLGL.State.defaultShaderId); +} + +// Unload default shader +// NOTE: Unloads: RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs +static void rlUnloadShaderDefault(void) +{ + glUseProgram(0); + + glDetachShader(RLGL.State.defaultShaderId, RLGL.State.defaultVShaderId); + glDetachShader(RLGL.State.defaultShaderId, RLGL.State.defaultFShaderId); + glDeleteShader(RLGL.State.defaultVShaderId); + glDeleteShader(RLGL.State.defaultFShaderId); + + glDeleteProgram(RLGL.State.defaultShaderId); + + RL_FREE(RLGL.State.defaultShaderLocs); + + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Default shader unloaded successfully", RLGL.State.defaultShaderId); +} + +#if defined(RLGL_SHOW_GL_DETAILS_INFO) +// Get compressed format official GL identifier name +static const char *rlGetCompressedFormatName(int format) +{ + switch (format) + { + // GL_EXT_texture_compression_s3tc + case 0x83F0: return "GL_COMPRESSED_RGB_S3TC_DXT1_EXT"; break; + case 0x83F1: return "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT"; break; + case 0x83F2: return "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT"; break; + case 0x83F3: return "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT"; break; + // GL_3DFX_texture_compression_FXT1 + case 0x86B0: return "GL_COMPRESSED_RGB_FXT1_3DFX"; break; + case 0x86B1: return "GL_COMPRESSED_RGBA_FXT1_3DFX"; break; + // GL_IMG_texture_compression_pvrtc + case 0x8C00: return "GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG"; break; + case 0x8C01: return "GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG"; break; + case 0x8C02: return "GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG"; break; + case 0x8C03: return "GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG"; break; + // GL_OES_compressed_ETC1_RGB8_texture + case 0x8D64: return "GL_ETC1_RGB8_OES"; break; + // GL_ARB_texture_compression_rgtc + case 0x8DBB: return "GL_COMPRESSED_RED_RGTC1"; break; + case 0x8DBC: return "GL_COMPRESSED_SIGNED_RED_RGTC1"; break; + case 0x8DBD: return "GL_COMPRESSED_RG_RGTC2"; break; + case 0x8DBE: return "GL_COMPRESSED_SIGNED_RG_RGTC2"; break; + // GL_ARB_texture_compression_bptc + case 0x8E8C: return "GL_COMPRESSED_RGBA_BPTC_UNORM_ARB"; break; + case 0x8E8D: return "GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB"; break; + case 0x8E8E: return "GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB"; break; + case 0x8E8F: return "GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB"; break; + // GL_ARB_ES3_compatibility + case 0x9274: return "GL_COMPRESSED_RGB8_ETC2"; break; + case 0x9275: return "GL_COMPRESSED_SRGB8_ETC2"; break; + case 0x9276: return "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"; break; + case 0x9277: return "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"; break; + case 0x9278: return "GL_COMPRESSED_RGBA8_ETC2_EAC"; break; + case 0x9279: return "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"; break; + case 0x9270: return "GL_COMPRESSED_R11_EAC"; break; + case 0x9271: return "GL_COMPRESSED_SIGNED_R11_EAC"; break; + case 0x9272: return "GL_COMPRESSED_RG11_EAC"; break; + case 0x9273: return "GL_COMPRESSED_SIGNED_RG11_EAC"; break; + // GL_KHR_texture_compression_astc_hdr + case 0x93B0: return "GL_COMPRESSED_RGBA_ASTC_4x4_KHR"; break; + case 0x93B1: return "GL_COMPRESSED_RGBA_ASTC_5x4_KHR"; break; + case 0x93B2: return "GL_COMPRESSED_RGBA_ASTC_5x5_KHR"; break; + case 0x93B3: return "GL_COMPRESSED_RGBA_ASTC_6x5_KHR"; break; + case 0x93B4: return "GL_COMPRESSED_RGBA_ASTC_6x6_KHR"; break; + case 0x93B5: return "GL_COMPRESSED_RGBA_ASTC_8x5_KHR"; break; + case 0x93B6: return "GL_COMPRESSED_RGBA_ASTC_8x6_KHR"; break; + case 0x93B7: return "GL_COMPRESSED_RGBA_ASTC_8x8_KHR"; break; + case 0x93B8: return "GL_COMPRESSED_RGBA_ASTC_10x5_KHR"; break; + case 0x93B9: return "GL_COMPRESSED_RGBA_ASTC_10x6_KHR"; break; + case 0x93BA: return "GL_COMPRESSED_RGBA_ASTC_10x8_KHR"; break; + case 0x93BB: return "GL_COMPRESSED_RGBA_ASTC_10x10_KHR"; break; + case 0x93BC: return "GL_COMPRESSED_RGBA_ASTC_12x10_KHR"; break; + case 0x93BD: return "GL_COMPRESSED_RGBA_ASTC_12x12_KHR"; break; + case 0x93D0: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR"; break; + case 0x93D1: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR"; break; + case 0x93D2: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR"; break; + case 0x93D3: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR"; break; + case 0x93D4: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR"; break; + case 0x93D5: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR"; break; + case 0x93D6: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR"; break; + case 0x93D7: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR"; break; + case 0x93D8: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR"; break; + case 0x93D9: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR"; break; + case 0x93DA: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR"; break; + case 0x93DB: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR"; break; + case 0x93DC: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR"; break; + case 0x93DD: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR"; break; + default: return "GL_COMPRESSED_UNKNOWN"; break; + } +} +#endif // RLGL_SHOW_GL_DETAILS_INFO + +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + +// Get pixel data size in bytes (image or texture) +// NOTE: Size depends on pixel format +static int rlGetPixelDataSize(int width, int height, int format) +{ + int dataSize = 0; // Size in bytes + int bpp = 0; // Bits per pixel + + switch (format) + { + case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8; break; + case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: + case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: + case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: + case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32: bpp = 32; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: bpp = 32*3; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: bpp = 32*4; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16: bpp = 16; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: bpp = 16*3; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: bpp = 16*4; break; + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: + case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB: + case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB: + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB: + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4; break; + case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: + case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA: + case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: + case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: bpp = 8; break; + case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: bpp = 2; break; + default: break; + } + + double bytesPerPixel = (double)bpp/8.0; + dataSize = (int)(bytesPerPixel*width*height); // Total data size in bytes + + // Most compressed formats works on 4x4 blocks, + // if texture is smaller, minimum dataSize is 8 or 16 + if ((width < 4) && (height < 4)) + { + if ((format >= RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) && (format < RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA)) dataSize = 8; + else if ((format >= RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA) && (format < RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA)) dataSize = 16; + } + + return dataSize; +} + +// Auxiliar math functions + +// Get float array of matrix data +static rl_float16 rlMatrixToFloatV(Matrix mat) +{ + rl_float16 result = { 0 }; + + result.v[0] = mat.m0; + result.v[1] = mat.m1; + result.v[2] = mat.m2; + result.v[3] = mat.m3; + result.v[4] = mat.m4; + result.v[5] = mat.m5; + result.v[6] = mat.m6; + result.v[7] = mat.m7; + result.v[8] = mat.m8; + result.v[9] = mat.m9; + result.v[10] = mat.m10; + result.v[11] = mat.m11; + result.v[12] = mat.m12; + result.v[13] = mat.m13; + result.v[14] = mat.m14; + result.v[15] = mat.m15; + + return result; +} + +// Get identity matrix +static Matrix rlMatrixIdentity(void) +{ + Matrix result = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + + return result; +} + +// Get two matrix multiplication +// NOTE: When multiplying matrices... the order matters! +static Matrix rlMatrixMultiply(Matrix left, Matrix right) +{ + Matrix result = { 0 }; + + result.m0 = left.m0*right.m0 + left.m1*right.m4 + left.m2*right.m8 + left.m3*right.m12; + result.m1 = left.m0*right.m1 + left.m1*right.m5 + left.m2*right.m9 + left.m3*right.m13; + result.m2 = left.m0*right.m2 + left.m1*right.m6 + left.m2*right.m10 + left.m3*right.m14; + result.m3 = left.m0*right.m3 + left.m1*right.m7 + left.m2*right.m11 + left.m3*right.m15; + result.m4 = left.m4*right.m0 + left.m5*right.m4 + left.m6*right.m8 + left.m7*right.m12; + result.m5 = left.m4*right.m1 + left.m5*right.m5 + left.m6*right.m9 + left.m7*right.m13; + result.m6 = left.m4*right.m2 + left.m5*right.m6 + left.m6*right.m10 + left.m7*right.m14; + result.m7 = left.m4*right.m3 + left.m5*right.m7 + left.m6*right.m11 + left.m7*right.m15; + result.m8 = left.m8*right.m0 + left.m9*right.m4 + left.m10*right.m8 + left.m11*right.m12; + result.m9 = left.m8*right.m1 + left.m9*right.m5 + left.m10*right.m9 + left.m11*right.m13; + result.m10 = left.m8*right.m2 + left.m9*right.m6 + left.m10*right.m10 + left.m11*right.m14; + result.m11 = left.m8*right.m3 + left.m9*right.m7 + left.m10*right.m11 + left.m11*right.m15; + result.m12 = left.m12*right.m0 + left.m13*right.m4 + left.m14*right.m8 + left.m15*right.m12; + result.m13 = left.m12*right.m1 + left.m13*right.m5 + left.m14*right.m9 + left.m15*right.m13; + result.m14 = left.m12*right.m2 + left.m13*right.m6 + left.m14*right.m10 + left.m15*right.m14; + result.m15 = left.m12*right.m3 + left.m13*right.m7 + left.m14*right.m11 + left.m15*right.m15; + + return result; +} + +// Transposes provided matrix +static Matrix rlMatrixTranspose(Matrix mat) +{ + Matrix result = { 0 }; + + result.m0 = mat.m0; + result.m1 = mat.m4; + result.m2 = mat.m8; + result.m3 = mat.m12; + result.m4 = mat.m1; + result.m5 = mat.m5; + result.m6 = mat.m9; + result.m7 = mat.m13; + result.m8 = mat.m2; + result.m9 = mat.m6; + result.m10 = mat.m10; + result.m11 = mat.m14; + result.m12 = mat.m3; + result.m13 = mat.m7; + result.m14 = mat.m11; + result.m15 = mat.m15; + + return result; +} + +// Invert provided matrix +static Matrix rlMatrixInvert(Matrix mat) +{ + Matrix result = { 0 }; + + // Cache the matrix values (speed optimization) + float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3; + float a10 = mat.m4, a11 = mat.m5, a12 = mat.m6, a13 = mat.m7; + float a20 = mat.m8, a21 = mat.m9, a22 = mat.m10, a23 = mat.m11; + float a30 = mat.m12, a31 = mat.m13, a32 = mat.m14, a33 = mat.m15; + + float b00 = a00*a11 - a01*a10; + float b01 = a00*a12 - a02*a10; + float b02 = a00*a13 - a03*a10; + float b03 = a01*a12 - a02*a11; + float b04 = a01*a13 - a03*a11; + float b05 = a02*a13 - a03*a12; + float b06 = a20*a31 - a21*a30; + float b07 = a20*a32 - a22*a30; + float b08 = a20*a33 - a23*a30; + float b09 = a21*a32 - a22*a31; + float b10 = a21*a33 - a23*a31; + float b11 = a22*a33 - a23*a32; + + // Calculate the invert determinant (inlined to avoid double-caching) + float invDet = 1.0f/(b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06); + + result.m0 = (a11*b11 - a12*b10 + a13*b09)*invDet; + result.m1 = (-a01*b11 + a02*b10 - a03*b09)*invDet; + result.m2 = (a31*b05 - a32*b04 + a33*b03)*invDet; + result.m3 = (-a21*b05 + a22*b04 - a23*b03)*invDet; + result.m4 = (-a10*b11 + a12*b08 - a13*b07)*invDet; + result.m5 = (a00*b11 - a02*b08 + a03*b07)*invDet; + result.m6 = (-a30*b05 + a32*b02 - a33*b01)*invDet; + result.m7 = (a20*b05 - a22*b02 + a23*b01)*invDet; + result.m8 = (a10*b10 - a11*b08 + a13*b06)*invDet; + result.m9 = (-a00*b10 + a01*b08 - a03*b06)*invDet; + result.m10 = (a30*b04 - a31*b02 + a33*b00)*invDet; + result.m11 = (-a20*b04 + a21*b02 - a23*b00)*invDet; + result.m12 = (-a10*b09 + a11*b07 - a12*b06)*invDet; + result.m13 = (a00*b09 - a01*b07 + a02*b06)*invDet; + result.m14 = (-a30*b03 + a31*b01 - a32*b00)*invDet; + result.m15 = (a20*b03 - a21*b01 + a22*b00)*invDet; + + return result; +} + +#endif // RLGL_IMPLEMENTATION diff --git a/projects/zig_raylib_examples/lib/raylib/raylib.lib b/projects/zig_raylib_examples/lib/raylib/raylib.lib new file mode 100644 index 0000000000000000000000000000000000000000..4f0b3e5de239a073db3dbc0c3aaffce25782957d GIT binary patch literal 1919234 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"B@DqnOa3QxqK9ywH7Hxd~5p9w#r7-6ZPT~;H4 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

Fa8fC%b+rId^ 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

$ge1K@nwOPfQG2X?7-wd~=Sy;-`f*{bRxG$3_v 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�>nGX^2? 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Ⓢ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

^0xxS9o#(9VTR|gEI3wJX3>PIBkq37Vu>XC=c+& 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%0DijE1W1s4)1BGhuhRS2|Ps4E1wQlJ{4 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

k& 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ⓈPhMwlw zXBg+yNf7)8XaW8po1n%mWM~n`(u|RQ4bEbQXyz#2bs0x9NSSUa$I?tv;=&BIa%>0V zZf9sE$96MrEkk`A8)e)OL&F@qiE&#PN^tBr6S*d2^}h@qVv`zYgf zG4vS6?q=K`hW2voKE~~5=m5taWZWT!4s-0|j61^6QI0*vxZ@0+;MkLlJH^lw9DAB^ zXBaxmu}?DY979iW?9+^Uh9Re3b50{5$r}q8TF9}B7_d#($@$qhY9GemM$L5#0MQTnA47{c_Ik!G zW@rh=x{M>skj!N%$C8Ce;=&BIa%>0VZf9sE$96MrEkk`A8)e)OL&F@qiE&#PN^tBr z6S*d2^}h@qVv`zYgfG4vS6?q=K`hW2voKE~~5=m5taWZWT!4s-0| zj61^6QI0*vxZ@0+;MkLlJH^lw9DAB^XBaxmu}?DY979iW?9+^Uh9Tz)&2^1{ByW(- zOhQ=LRFZHJJt)9So7>O^$Rc8Q0CwT8`~w zT$G_9jvZ#)CWf|fY=Uv)45c|X%eVqV(;Rz0<90Cg5XbIh+@lQb;@HO+x0|6o9J`ls z`xx5Ku?HA;kfB2ydzf*LGjxPwk23BUL&rJx1mjLJbc$o2VBBej&T#Bm#y!ceg>$XaOME`ee0~ys?O(>p6BY_s#_eS2 zQI6fkxW^dU&9QqJx0j)P9J`-!2N*iYv4$r(EMu2&tjoBY z7$Tdq%sIrkFhgX8ma!d-yPctx9NW#fwG5G^TD}`)+z>;<9J`5eTNonCwtRP-acPFK z99v-AG(-1u><-2~#L!NTeUx##7f}8M=vMmohHIP?%#|8P~zk?Hs$3aor59<=8&PMHw36*kQ(PVrUD; zCKxx)P?}@2jHA^FS>I`ny`OPA7oK6%eZ|E?dRA7j62BC zA&x!FxW^ef!m&pgcZ{Lq9D9OsCmA}$u}?7WG(%@N_AKL`Wau2nKE=4F8G43e^?|gQ ze_#be(s=u5{6uky@_#48KM;&`EHnTw30)=2B(8#X+=lk zRx;Ghv1=LE$551GhZr}^&?b)E!ng!O;~bl2T$Z5%$4)cueuj2%>_d#($@$pWu)ZW)npVvuZ!BQkLWXD^O~zi&xWx?7%9@OI8Fv#ywALnL zLyQYEM5}Kywu5oEGqjRpyBW8Zp+1g{GH!?=TECMyZ(`gQh7ue*&bTx~S&pTZKS`l! zhVJLs9gKU3p`9H2DC2f9^cctPX51cz_Hyh##_eb50LLC=+#!YzbL``cJHpUWjy=Y> z;|!hP*prMq#n2NRdzx`)7&^>|d| z%BPH7%(1irDse7Dv=S$*p-ayW@s(P((0+qFUrsm#||@Y z6GK}#Ho>@YhSD6HWn6)wX^y?0aXT1#h+}s$?oozzaqMG^+s)7(j@`?+eGKjA*aM6^ z$j~8oV1Fzz%%XE^pO- zFUH@6x-Ay~lAJ>;$FhAFF?2o0(ps{Nh4ZX}T#nVN%MH#_jty~am~pKPb#UzMj9bZ2 zH^;7JTpvSGjvZp$FhiR-b_?SY42^SansHf%3LHDlxceE}!Lbi9ZYM*Ja_la~J;u;( zj@`q!y$tQ+*!_$4k` ziwzGpysP2ihMf)XZFr>N(T4Xm{9FA88a~+Y!}{F~zt-@fhCK}*ZurfHy$v5}_-Mm# zH~db+#~RMn|8B!48vdZ+lMSD0IMndR4WDi}-0+!(KW+G4!(TNVZ}>kAUupPi!-k+P^WqK!GEZGL>iZtWlb8Isp2*((rrsS)>v1Yh4jI*w5|Ay4{3`13*d)4ht$|w#qd0Z#|AG%}vH9 zvWya#bQ0cc`X}=_`Sa3e-Q@h|z>w#mA(X zhO_V#N?-_{x)we({1!?W&(8SMd<3mXD{-bgccV>d9nN4LP&A}>5rN;>4I&W#NX$Q= zgyAMhKS{$4fi$0fvHz_f1~8|ubA%5u z(8653NbWZ<-}-u>?suRTwBNv_`3W$z>%d@s$BirZ3}{1p63knTC=cy$ zAWVZpmjY(u`WYdSCGHFsM9xK8>_k*hB2XDUh8c>Y9hYjW%C=2Z+FqmbY ztYw+o(aQQKG1r1K^-p3};#;&g!{qZ_^d0?^X}$}JQD>&VB<3n`FL_|oTe7{L0L2Ox zeI5a?(vA+3^NT?-+S6e$U&qU&zZlH5_>1;<7|e3?INI@HFmcr4gBIqSc#C#}m^42E z&(q!zgZU}mqFo{elR-^suZY2X>}7K2h{3!CHKjcy26Hzsw3EbO+E7c{Phv1jAarS0 ziNxgTGNe(tw}dc~V%_*U?JzNK?XqM7$rg|BQzkPV^nxuVOIUk%o4y7!1u_Xzz-|KpxUbsr)g?2`Tgo+Ph-jBHtF;;bJiV zhq=-7g07S@0?Cfgy~fAbcawA035J_m}@ zej9`NE?SRv-53mMc(nJ%V7386J8%rk_?k0ozEl2>`<76=RfzGtk$zWa&4DEX|81luVT~7wH2W6(cPX_Z# zc#C#G84P*c(LN}Hxfzm%c0(D=b->V`D1-SRIDvLX8O#H~(Ecccc_aED?UFK>E?{V{ zl)+@KlRKsi=BqD7E4O*mECBz|?kSVzF{GhAR0cDId}t??!Mp?*+D~OLpTt|VtIA-$ z2Mq14GMF3jE!tsaFh2k%&^{}J`3^9&+sa^G44$VwR|fMPU})!+!Sr1#_g@*zZHv(G z9o{rk;MGMI=FdT~sD*hD`E0Q;A3{D^3-hbcH$H7)dcX-sEzBTlae^^4R_3#lD3JV# znSvLA(GzJ3IK@{dQRC@9;p?=2%+$+8Z=zjfgaH}wyB-+Yzhp3l-9$;v%n!#+jM($WMm=6I%d({jk0u1d~Gnf!~_4U18%#Gko+P!Ad zd<1D|51YZN4&0Gnn7R*J;0>!DP_M zY1f~@96|r0J%9$Y>=wBL&|uyMIi`QI7F{>Voq;CJ7tvGnPp0`abWHt|nBM`N^-p5{ z<7T<5(ByO1jdE|H!HlDX`X}G|Af%1{Nz5?HL%R^oTbn>t{gY|#M;h9lXwuy9I=M&D zV6Fs)b}AaobxU+ETF3q)P@Z=3P#TaEzt08Avp<0OVx2#quc3b(|3jP%f(V&UC_u5} z0nERE6ZB8k>pOuo8PtOI$C+Au;q`LYrNQLDWBMoaSsB2*KTzhk1gP;Vs0Ho2GdceQ zzCL!Z7xOuArvAxqC8^TtCo#wI7VZBu`FuW5o(~1``Rg};c3Zt~-669Rc}wtNj1II5 zj&hcCz7M?m>SGoLX=rzxNwYq{&s)%@w9C$<`FU{WHY=a+gU8;GmTBbI(@W8tEX=h? zLpxecP5(D)`p19f&G{yzp`ETK&DEHD>7UH`yEn?6uqMqK69d`G4%DC>zb4IFK*L=h@%FeV#|HC_fF#+D z7NlLtCe3bOXwRy_{1{wEJC+T`2}p@7zD_%tO`45?-u=VC*Xxlp?RhqDeHy$c5k>i+5% z>2GV!jMw=whXVQN-AI&DmbtId|JGLmn3e$MEm!&9`T%q!{gXNWIsV-Kq_6XR^T@Mc<+Q$p-TQU}%@J!Tbq$p7w7W%oDEM zF>Wyb1`O>RH<(X@$7rWBVPxxk7L?y~#EUtAw`fswZu_dy!dE@+d_*8{C{ zHF^QE^bO{% zc#HPx8_e$n+H^&|!#@dr)AsO<_UTtBn z576hA15)Axfi%B&1rt^E+@0VtI@iE_>*J7Ybh?4T{4Fqa)`7v$Dun*YkGu{vJY%I9 zz*|4GFz*VCUtdHT=a;=X|3B27&Qmbo%DeJZ1%r9})%x37{@jMI)2Rz4%{!5X_Wu(` z^2Yn|t$(-Dd*0`*Eb9lOjx-eF2Vo1U02oButw3qo#DGgu#42FcP`Q zd54weXDIVd3-e*5p))B=KCPfLolIdc_gVDW9?ut9oTpPS%(q^Qk($oDFqkW^@=}bx?pcUXz2INKKXeL)dF$s<3pxwKU>1O4`X_mw z{8L`D*PDhsrtY&a*9Cf<-b+Mz$$T0>c{&4vz9s8^OW>^!qo#B=gh}&tVCaMhgZVBn zbWVi9907(-i!hieVCc*UgZUV~PNzi}%&)vmo+Du}ok&BcNEpmEVCXCfgLxM)bh3oO zB!HnaCJg51fuWNo4CdpIBy^U9!F&%GI$6SC{sWkwT9_Nr%0II(Cz0kqEzJJ}hEAq1 z`F#BbqPhG@%Ac_~lVWapiAsP#rdfbdM*k${9f1+#g8|GZWJ8J<>N&z?B><*sOVGIUkeYO-pTBg zO4*D1)Nt>sWAJw-IWrG9l$uE9kP$AloQ$jF`bKtq)*mgtD=xi{CUdw)Y$7%pPny@K z$cGAl<3>t(Z`M#QHkr@jhBwNb>W4gWg zo!ToZu%gi78o{-cNPa$5;6I|7e4%F|TbL2GQkkHGfU`5WzFT7HtvfQfE*qDRtMZ7P z#MSYVtcu7g0~Q$QM)4$FW~m}%3*k~jf5adz%1urVW#oO|Dz)Sdk{Z2}30%w@*V%L@ z)5$_|{m8ur#W~Y8-{xyFKM!vG=qP*$JqVQ5^H;RcJL&lok+{e)nFhN}#B{b@;~BJC z5Ra}Yu41)fh<4q$wO8jLTL4_43A&c@B`itKHL;0_SZ6L5o5@RLCpoMIupSN)ec6y* z{wY419F0w-mE@)NRymS8p!}0k8HN@u8pUPDlE1~D+>V3j+kNQa$Rv)N#34I%@ns_* zZz(VGW0WH*+mCOja1lMn)7Ru5h8%hE6*QgB4a8tvG?$5YCKBL(ojVeGk(47)y_5L@ zNqldVEKSek)P$1iN|15p*58A;S8>(UDDLFcUkYOIA=x3jVp*mnk8J2hHo*uX3&Awh zX^@lbr5=PTj(CfzB^nrg3hq-n74k6%&f1_9H4H+g!Pg8*rP0)0HB~6!hEv@LB!|$; z5}Ker)42JRZfIBa^^J)`X&)XX4B+tj08VymMsHrTp|^YUz&ko|5w&D`g_#LprVU0= zNLR$5<*WDj5qJ9$!v@hUJ4(O2TT>N*dI`E+G8;>91W|8;P$r7Spr)ocNn|5B1ZdJ1 zo578#3EAeI`l4W+0I!uwAQcz+-e6%S&6$$q@5I%{*}`flaom0zF-~Usag%o*p01b4$?5ISA5H+#{d+ylumy7)F{k74*!vH(R5AMuob5Ff?%h1M>T7 zFqM_&az=BhiC7MqfX11eY;uo8(|95`cOEYiB$GtZNTW|`%xJ1G1X9QkU}z!D%lkQ! zwH89iS&dQM1RrT>);RTzR6(SSQNbyhQpaQ$(;`6q#T;P$jS(s9NiI8sLd0WPT$P(t zf8oYsx_evwm7MhaL7$dy4np=NV!4D$Wk}JJ%Mo!!YYHaAKrc|Lb}F9!>W`%+hs2f6 zRti!7&IHPYi*;p2el5ET8W_b=F5Ffd@<~W7j5sQS+shw;HxzmOF?gj!4BpY*tjJ5n zq6|qSje11E1XfEl>g{4yp+%wA4%3;O92o3~ZgjnI6(KT`VrMXo9w>=HIc}UvZ;eg% zWnzT%lwv%l$tecORWpU;Q06YY+9hI$mYd-km6*zU-s;X}@TX|aRdn;W>;XfWA)poY zg_v%TTM`v-oS0K;6Bo?5}OWMe$OYN*b?2twzC8whEhpI)il*0|{54ZKsr*JXX`&}B<{QvJIVMh%EdEQ-jO4$K5n|m& zi7`nqB4jo`s=AqEH=;jm8C|h-dIYm29f`q_QHkWXR9q>*jI=Tl+IsOQsD1tjDZYwD zKyJ{G%r8vHv5x;%A5|ii(Sj60WPilVvjBv?L%QCpWuasmG-g%fFTt5cJy z{J3Bo`8v(Y2BAbvj!FJTr;_~|ICt@$KuZR|><0}1;!P!$bOQ#dC5Cz-{tzmON<%1*wDm>_r9kTsPrvdq28 zHoGyEPeK0=aI@%3O3dgg$c&4{Xrb?sO^T3YsZqqyJV=)DG@6RhRBq4QtUERVQaW;G zD#wFfff4lBj7g_%C9pG*Mf0E-%>{yTM77Zbkdu>fOjq^CGaDvT;%`MPHU1)jdMAM3 zX{)4>lqd#CuSu0iaotpI6!u7+9c;UU3L^u0_Kb-)7fNBR#+fp(?Dqy zdtc>W7@=TS)PzsxMHjW&%8TjE3vDMZDucczGncb^O-u{NeUHrtuz;%U@jjE2EP?u~ zel*M&gNuQGE;m!46mr5u0E_&fp5MyvmFVR_Gb+F`@!t1BqwK&`}ScwoZeSE zn9-wYkWc#bucKbb8KYx!%rKQku^}hiyhKDax8L+uIjza!Q*a5=jA#j~TS=1; znm^9>zYfG~8+V4{g2WymrO9($+jXYrtA&o_9UO#wYCjA{e@BXZG?R7jFp>gyCNfPqUPl79YEzY`xyuI7*56*iw!)@QQVzRQuikL z?<*&yvTwI|(0TW7yY1<^>kvk;-J>JdFnU32i;uZt?lRaEwk`-6x)0sTgF8%IklMZl zEoH<#(vVTmTE>_wGRmNoQ4o^Rhc07qhm3;MG74&Urr#B!ZQGHg_{sEPe!HCB-HgW5 zr@F2(BiHb%W<$y|0r{Z$4|+x*anCq%QW5fKbJRGIu1jyj|y;-zJ5_s zm_w65n@oVzk1E9!kP3S+DTi7pKY89VgVY$!ZM<8xmDS_Q|vu61v>uCOmh# z3Ct}z31QK5CK?{@IfuHOM!T4%i<`*ZULsIhlfRDO2PKorJA@l+k75w5kfkIrw-X7B zjhA#tn~Fpg7IU`}2K$i+CcFZ{aZ)PS)+lkTqW44zW0ec=<(3!;A-ZuhW8uO`TSRRn zSt7z*5GEp6#zO-hMI_}6nhX`#YMuIc1(r-u^At#XkoeG5Yer)iXvRZXG*{1aHC18U zht!H7uH^Sq#ezY3IeZClw7SJ&_?F^27R@uEIGwM-!M5O#WC%) literal 0 HcmV?d00001 diff --git a/projects/zig_raylib_examples/lib/raylib/raylib_gles3.lib b/projects/zig_raylib_examples/lib/raylib/raylib_gles3.lib new file mode 100644 index 0000000000000000000000000000000000000000..7e0f4c735fe3fbcb47c47f67e7e887ceebc973b0 GIT binary patch literal 1701270 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�%-EOl6*o6VBnn0M! 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�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 z
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