From 36ebbfe29b0a0dbc5e3432df4576c2a859c0021b Mon Sep 17 00:00:00 2001 From: Ed_ Date: Sun, 19 Nov 2023 00:01:35 -0500 Subject: [PATCH] Got refactored raylib working in the vis_ast binary Now to make that debugger... --- .vscode/launch.json | 9 + project/auxillary/vis_ast/build.ps1 | 24 +- project/auxillary/vis_ast/clean.ps1 | 22 + .../vis_ast/code/platform/win32/launch.cpp | 37 + .../vis_ast/code/vis_ast_windows.cpp | 4 + .../dependencies/raylib/include/config.h | 67 +- .../dependencies/raylib/include/raylib.h | 2296 +++++++-------- .../dependencies/raylib/include/raymath.h | 674 ++--- .../dependencies/raylib/include/rcamera.h | 398 +-- .../dependencies/raylib/include/rgestures.h | 332 ++- .../dependencies/raylib/include/rlgl.h | 2500 +++++++++-------- .../dependencies/raylib/include/utils.h | 6 +- .../dependencies/raylib/lib/raylib.exp | Bin 0 -> 165744 bytes .../dependencies/raylib/raylib_c.refactor | 1340 --------- .../dependencies/raylib/raylib_c_gl.refactor | 34 - .../dependencies/raylib/raylib_cpp.refactor | 1019 +++++++ .../raylib/raylib_cpp_gl.refactor | 242 ++ project/auxillary/vis_ast/update_deps.ps1 | 42 +- scripts/helpers/vendor_toolchain.ps1 | 4 +- 19 files changed, 4581 insertions(+), 4469 deletions(-) create mode 100644 project/auxillary/vis_ast/dependencies/raylib/lib/raylib.exp delete mode 100644 project/auxillary/vis_ast/dependencies/raylib/raylib_c.refactor delete mode 100644 project/auxillary/vis_ast/dependencies/raylib/raylib_c_gl.refactor create mode 100644 project/auxillary/vis_ast/dependencies/raylib/raylib_cpp.refactor create mode 100644 project/auxillary/vis_ast/dependencies/raylib/raylib_cpp_gl.refactor diff --git a/.vscode/launch.json b/.vscode/launch.json index 0790fd6..4b13ea2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -49,6 +49,15 @@ "args": [], "cwd": "${workspaceFolder}/project/auxillary/vis_ast/dependencies/temp/raylib-master/src/", "visualizerFile": "${workspaceFolder}/scripts/gencpp.natvis" + }, + { + "type": "cppvsdbg", + "request": "launch", + "name": "Debug VIS AST", + "program": "${workspaceFolder}/project/auxillary/vis_ast/binaries/vis_ast.exe", + "args": [], + "cwd": "${workspaceFolder}/project/auxillary/vis_ast/binaries/", + "visualizerFile": "${workspaceFolder}/scripts/gencpp.natvis" } ] } diff --git a/project/auxillary/vis_ast/build.ps1 b/project/auxillary/vis_ast/build.ps1 index 9cb2028..0a127f7 100644 --- a/project/auxillary/vis_ast/build.ps1 +++ b/project/auxillary/vis_ast/build.ps1 @@ -15,6 +15,7 @@ $path_vis_root = Join-Path $path_aux 'vis_ast' $path_binaries = Join-Path $path_vis_root 'binaries' $path_build = Join-Path $path_vis_root 'build' $path_code = Join-Path $path_vis_root 'code' +$path_deps = Join-Path $path_vis_root 'dependencies' $path_win32 = Join-Path $path_code 'win32' Import-Module $target_arch @@ -66,10 +67,26 @@ if ( (Test-Path $path_binaries) -eq $false ) { New-Item $path_binaries -ItemType Directory } +$path_raylib = join-path $path_deps 'raylib' +$path_raylib_inc = join-path $path_raylib 'include' +$path_raylib_lib = join-path $path_raylib 'lib' + +$path_raylib_dll = join-path $path_raylib_lib 'raylib.dll' +$path_raylib_dll_bin = join-path $path_binaries 'raylib.dll' + +Copy-Item $path_raylib_dll $path_raylib_dll_bin -Force + $includes = @( - $paht_code + $path_code, + $path_deps ) +write-host $path_code + +foreach ( $include in $includes ) { + Write-Host 'include: ' $include +} + # Microsoft $lib_gdi32 = 'Gdi32.lib' $lib_xinput = 'Xinput.lib' @@ -82,6 +99,7 @@ $compiler_args = @( ($flag_define + 'UNICODE'), ($flag_define + '_UNICODE') ( $flag_define + 'INTELLISENSE_DIRECTIVES=0'), + ( $flag_define + 'RL_USE_LIBTYPE_SHARED') # ($flag_set_stack_size + $stack_size) $flag_wall $flag_warnings_as_errors @@ -97,7 +115,9 @@ else { $linker_args = @( $flag_link_win_subsystem_windows, - $flag_link_optiiize_references + $flag_link_optiiize_references, + + ( join-path $path_raylib_lib 'raylib.lib' ) ) $unit = join-path $path_code 'vis_ast_windows.cpp' diff --git a/project/auxillary/vis_ast/clean.ps1 b/project/auxillary/vis_ast/clean.ps1 index e69de29..3eec3fe 100644 --- a/project/auxillary/vis_ast/clean.ps1 +++ b/project/auxillary/vis_ast/clean.ps1 @@ -0,0 +1,22 @@ +$path_root = git rev-parse --show-toplevel +$path_scripts = Join-Path $path_root 'scripts' + +$target_arch = Join-Path $path_scripts 'helpers/target_arch.psm1' +$devshell = Join-Path $path_scripts 'helpers/devshell.ps1' +$format_cpp = Join-Path $path_scripts 'helpers/format_cpp.psm1' +$incremental_checks = Join-Path $path_scripts 'helpers/incremental_checks.ps1' +$vendor_toolchain = Join-Path $path_scripts 'helpers/vendor_toolchain.ps1' + +$path_project = Join-Path $path_root 'project' +$path_aux = Join-Path $path_project 'auxillary' +$path_vis_root = Join-Path $path_aux 'vis_ast' +$path_binaries = Join-Path $path_vis_root 'binaries' +$path_build = Join-Path $path_vis_root 'build' + +if ( test-path $path_build ) { + remove-item $path_build -Recurse +} + +if ( test-path $path_binaries ) { + remove-item $path_binaries -recurse +} diff --git a/project/auxillary/vis_ast/code/platform/win32/launch.cpp b/project/auxillary/vis_ast/code/platform/win32/launch.cpp index deb5982..5769333 100644 --- a/project/auxillary/vis_ast/code/platform/win32/launch.cpp +++ b/project/auxillary/vis_ast/code/platform/win32/launch.cpp @@ -1,8 +1,45 @@ #if INTELLISENSE_DIRECTIVES #include "win32.hpp" +#include "raylib/include/raylib.h" #endif int __stdcall WinMain( HINSTANCE instance, HINSTANCE prev_instance, char* commandline, int num_cmd_show) { + // Initialization + //-------------------------------------------------------------------------------------- + const int screenWidth = 800; + const int screenHeight = 450; + + rl::init_window(screenWidth, screenHeight, "raylib [core] example - basic window"); + + rl::set_target_fps(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!rl::window_should_close()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + // TODO: Update your variables here + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + rl::begin_drawing(); + + rl::clear_background(RL_RAYWHITE); + + rl::draw_text("Congrats! You created your first window!", 190, 200, 20, RL_LIGHTGRAY); + + rl::end_drawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + rl::close_window(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + return 0; } + diff --git a/project/auxillary/vis_ast/code/vis_ast_windows.cpp b/project/auxillary/vis_ast/code/vis_ast_windows.cpp index 5ff9902..906451b 100644 --- a/project/auxillary/vis_ast/code/vis_ast_windows.cpp +++ b/project/auxillary/vis_ast/code/vis_ast_windows.cpp @@ -1,3 +1,5 @@ + + #include "platform/vendor/arch.hpp" #include "platform/vendor/compiler.hpp" #include "platform/vendor/compiler_ignores.hpp" @@ -7,4 +9,6 @@ #include "platform/win32/types.hpp" +#include "raylib/include/raylib.h" + #include "platform/win32/launch.cpp" diff --git a/project/auxillary/vis_ast/dependencies/raylib/include/config.h b/project/auxillary/vis_ast/dependencies/raylib/include/config.h index af4d3c0..3cd07f3 100644 --- a/project/auxillary/vis_ast/dependencies/raylib/include/config.h +++ b/project/auxillary/vis_ast/dependencies/raylib/include/config.h @@ -25,12 +25,12 @@ * **********************************************************************************************/ -#ifndef RL_CONFIG_H -#define RL_CONFIG_H +#ifndef CONFIG_H +#define CONFIG_H //------------------------------------------------------------------------------------ // Module selection - Some modules could be avoided -// Mandatory modules: rcore, RLGL_, utils +// Mandatory modules: rcore, rlgl, utils //------------------------------------------------------------------------------------ #define RL_SUPPORT_MODULE_RSHAPES 1 #define RL_SUPPORT_MODULE_RTEXTURES 1 @@ -41,12 +41,12 @@ //------------------------------------------------------------------------------------ // Module: rcore - Configuration Flags //------------------------------------------------------------------------------------ -// RL_Camera module is included (rcamera.h) and multiple predefined cameras are available: free, 1st/3rd person, orbital +// Camera module is included (rcamera.h) and multiple predefined cameras are available: free, 1st/3rd person, orbital #define RL_SUPPORT_CAMERA_SYSTEM 1 // Gestures module is included (rgestures.h) to support gestures detection: tap, hold, swipe, drag #define RL_SUPPORT_GESTURES_SYSTEM 1 // Include pseudo-random numbers generator (rprand.h), based on Xoshiro128** and SplitMix64 -#define SUPPORT_RPRAND_GENERATOR 1 +#define RL_SUPPORT_RPRAND_GENERATOR 1 // Mouse gestures are directly mapped like touches and processed by gestures system #define RL_SUPPORT_MOUSE_GESTURES 1 // Reconfigure standard input to receive key inputs, works with SSH connection. @@ -55,21 +55,21 @@ // However, it can also reduce overall system performance, because the thread scheduler switches tasks more often. #define RL_SUPPORT_WINMM_HIGHRES_TIMER 1 // Use busy wait loop for timing sync, if not defined, a high-resolution timer is set up and used -//#define SUPPORT_BUSY_WAIT_LOOP 1 +//#define RL_SUPPORT_BUSY_WAIT_LOOP 1 // Use a partial-busy wait loop, in this case frame sleeps for most of the time, but then runs a busy loop at the end for accuracy #define RL_SUPPORT_PARTIALBUSY_WAIT_LOOP 1 // Allow automatic screen capture of current screen pressing F12, defined in KeyCallback() #define RL_SUPPORT_SCREEN_CAPTURE 1 // Allow automatic gif recording of current screen pressing CTRL+F12, defined in KeyCallback() #define RL_SUPPORT_GIF_RECORDING 1 -// Support RL_CompressData() and RL_DecompressData() functions +// Support CompressData() and DecompressData() functions #define RL_SUPPORT_COMPRESSION_API 1 // Support automatic generated events, loading and recording of those events when required #define RL_SUPPORT_AUTOMATION_EVENTS 1 // Support custom frame control, only for advance users -// By default RL_EndDrawing() does this job: draws everything + RL_SwapScreenBuffer() + manage frame timing + RL_PollInputEvents() +// By default end_drawing() does this job: draws everything + swap_screen_buffer() + manage frame timing + poll_input_events() // Enabling this flag allows manual control of the frame processes, use at your own risk -//#define SUPPORT_CUSTOM_FRAME_CONTROL 1 +//#define RL_SUPPORT_CUSTOM_FRAME_CONTROL 1 // rcore: Configuration values //------------------------------------------------------------------------------------ @@ -90,7 +90,7 @@ #define RL_MAX_AUTOMATION_EVENTS 16384 // Maximum number of automation events to record //------------------------------------------------------------------------------------ -// Module: RLGL_ - Configuration values +// Module: rlgl - Configuration values //------------------------------------------------------------------------------------ // Enable OpenGL Debug Context (only available on OpenGL 4.3) @@ -102,9 +102,9 @@ //#define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 4096 // 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 (RL_SetShaderValueTexture()) +#define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 4 // Maximum number of textures units that can be activated on batch drawing (set_shader_value_texture()) -#define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of internal RL_Matrix stack +#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 @@ -168,7 +168,7 @@ // Support procedural image generation functionality (gradient, spot, perlin-noise, cellular) #define RL_SUPPORT_IMAGE_GENERATION 1 // Support multiple image editing functions to scale, adjust colors, flip, draw on images, crop... -// If not defined, still some functions are supported: RL_ImageFormat(), RL_ImageCrop(), RL_ImageToPOT() +// If not defined, still some functions are supported: image_format(), image_crop(), image_to_pot() #define RL_SUPPORT_IMAGE_MANIPULATION 1 @@ -183,18 +183,18 @@ #define RL_SUPPORT_FILEFORMAT_TTF 1 // Support text management functions -// If not defined, still some functions are supported: RL_TextLength(), RL_TextFormat() +// If not defined, still some functions are supported: text_length(), TextFormat() #define RL_SUPPORT_TEXT_MANIPULATION 1 -// On font atlas image generation [RL_GenImageFontAtlas()], add a 3x3 pixels white rectangle +// On font atlas image generation [gen_image_font_atlas()], add a 3x3 pixels white rectangle // at the bottom-right corner of the atlas. It can be useful to for shapes drawing, to allow -// drawing text and shapes with a single draw call [RL_SetShapesTexture()]. +// drawing text and shapes with a single draw call [set_shapes_texture()]. #define RL_SUPPORT_FONT_ATLAS_WHITE_REC 1 // rtext: Configuration values //------------------------------------------------------------------------------------ -#define RL_MAX_TEXT_BUFFER_LENGTH 1024 // RL_Size of internal static buffers used on some functions: - // RL_TextFormat(), RL_TextSubtext(), RL_TextToUpper(), RL_TextToLower(), RL_TextToPascal(), TextSplit() +#define RL_MAX_TEXT_BUFFER_LENGTH 1024 // Size of internal static buffers used on some functions: + // TextFormat(), TextSubtext(), TextToUpper(), TextToLower(), TextToPascal(), TextSplit() #define RL_MAX_TEXTSPLIT_COUNT 128 // Maximum number of substrings to split: TextSplit() @@ -243,7 +243,7 @@ // Standard file io library (stdio.h) included #define RL_SUPPORT_STANDARD_FILEIO 1 // Show RL_TRACELOG() output messages -// NOTE: By default RL_LOG_DEBUG traces not shown +// NOTE: By default LOG_DEBUG traces not shown #define RL_SUPPORT_TRACELOG 1 //#define RL_SUPPORT_TRACELOG_DEBUG 1 @@ -251,12 +251,35 @@ //------------------------------------------------------------------------------------ #define RL_MAX_TRACELOG_MSG_LENGTH 256 // Max length of one trace-log message -#endif // RL_CONFIG_H +#endif // CONFIG_H -#if defined(__cplusplus) - #define RL_NS_BEGIN namespace raylib { +// Indicates of raylib has been refactored +#ifndef RL_REFACTORED_CPP +#define RL_REFACTORED_CPP +#endif + +#define RL_USE_CPP_NAMESPACE 1 +#define RL_USE_CPP_MANGLING 1 + +#if RL_USE_CPP_NAMESPACE && defined(__cplusplus) + #pragma message("USING CPP NAMESPACE") + #define RL_NS_BEGIN namespace rl { #define RL_NS_END } #else #define RL_NS_BEGIN #define RL_NS_END #endif + +#if RL_USE_CPP_MANGLING && defined(__cplusplus) + #pragma message("USING CPP MANGLING") + #define RL_EXTERN_C_BEGIN + #define RL_EXTERN_C_END +#else + #ifdef __cplusplus + #define RL_EXTERN_C_BEGIN extern "C" { + #define RL_EXTERN_C_END } + #else + #define RL_EXTERN_C_BEGIN + #define RL_EXTERN_C_END + #endif +#endif \ No newline at end of file diff --git a/project/auxillary/vis_ast/dependencies/raylib/include/raylib.h b/project/auxillary/vis_ast/dependencies/raylib/include/raylib.h index 4504fc2..62f58a2 100644 --- a/project/auxillary/vis_ast/dependencies/raylib/include/raylib.h +++ b/project/auxillary/vis_ast/dependencies/raylib/include/raylib.h @@ -1,6 +1,6 @@ /********************************************************************************************** * -* raylib v5.0 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com) +* raylib v5.1-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 @@ -8,27 +8,27 @@ * 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 or ES2 - choose at compile) -* - Unique OpenGL abstraction layer (usable as standalone module): [RLGL_] +* - Unique OpenGL abstraction layer (usable as standalone module): [rlgl] * - Multiple Fonts formats supported (TTF, XNA fonts, AngelCode 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) -* - Shaders support, including RL_Model shaders and Postprocessing shaders -* - Powerful math module for Vector, RL_Matrix and RL_Quaternion operations: [raymath] +* - 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, XM, MOD) * - VR stereo rendering with configurable HMD device parameters * - Bindings to multiple programming languages available! * * NOTES: -* - One default RL_Font is loaded on RL_InitWindow()->LoadFontDefault() [core, text] -* - One default RL_Texture2D is loaded on RLGL_Init(), 1x1 white pixel R8G8B8A8 [RLGL_] (OpenGL 3.3 or ES2) -* - One default RL_Shader is loaded on RLGL_Init()->RLGL_LoadShaderDefault() [RLGL_] (OpenGL 3.3 or ES2) -* - One default RenderBatch is loaded on RLGL_Init()->RLGL_LoadRenderBatch() [RLGL_] (OpenGL 3.3 or ES2) +* - One default Font is loaded on init_window()->LoadFontDefault() [core, text] +* - One default Texture2d is loaded on init(), 1x1 white pixel R8G8B8A8 [rlgl] (OpenGL 3.3 or ES2) +* - One default Shader is loaded on init()->load_shader_default() [rlgl] (OpenGL 3.3 or ES2) +* - One default RenderBatch is loaded on init()->load_render_batch() [rlgl] (OpenGL 3.3 or ES2) * * DEPENDENCIES (included): * [rcore] rglfw (Camilla Löwy - github.com/glfw/glfw) for window/context management and input (PLATFORM_DESKTOP) -* [RLGL_] glad (David Herberth - github.com/Dav1dde/glad) for OpenGL 3.3 extensions loading (PLATFORM_DESKTOP) +* [rlgl] glad (David Herberth - github.com/Dav1dde/glad) for OpenGL 3.3 extensions loading (PLATFORM_DESKTOP) * [raudio] miniaudio (David Reid - github.com/mackron/miniaudio) for audio device/context management * * OPTIONAL DEPENDENCIES (included): @@ -79,12 +79,12 @@ #ifndef RAYLIB_H #define RAYLIB_H -#include // Required for: va_list - Only used by RL_TraceLogCallback +#include // Required for: va_list - Only used by TraceLogCallback #define RAYLIB_VERSION_MAJOR 5 -#define RAYLIB_VERSION_MINOR 0 +#define RAYLIB_VERSION_MINOR 1 #define RAYLIB_VERSION_PATCH 0 -#define RAYLIB_VERSION "5.0" +#define RAYLIB_VERSION "5.1-dev" // 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 @@ -93,8 +93,10 @@ #if defined(__TINYC__) #define __declspec(x) __attribute__((x)) #endif + #pragma message("RLAPI: _declspec(dllexport)") #define RLAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) #elif defined(RL_USE_LIBTYPE_SHARED) + #pragma message("RLAPI: _declspec(dllimport)") #define RLAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) #endif #endif @@ -140,6 +142,16 @@ #define RL_CLITERAL(type) (type) #endif +// Used for initializer nonsense on cpp. +#if __cplusplus +#define CAST(type) type +#define RL_NS(id) rl::id +#else +#define CAST(type) (type) +#define RL_NS(id) id +#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 @@ -148,7 +160,7 @@ #endif // NOTE: We set some defines with some data types declared by raylib -// Other modules (raymath, RLGL_) also require some of those types, so, +// 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 @@ -161,33 +173,33 @@ // Some Basic Colors // NOTE: Custom raylib color palette for amazing visuals on RL_WHITE background -#define RL_LIGHTGRAY RL_CLITERAL(RL_Color){ 200, 200, 200, 255 } // Light Gray -#define RL_GRAY RL_CLITERAL(RL_Color){ 130, 130, 130, 255 } // Gray -#define RL_DARKGRAY RL_CLITERAL(RL_Color){ 80, 80, 80, 255 } // Dark Gray -#define RL_YELLOW RL_CLITERAL(RL_Color){ 253, 249, 0, 255 } // Yellow -#define RL_GOLD RL_CLITERAL(RL_Color){ 255, 203, 0, 255 } // Gold -#define RL_ORANGE RL_CLITERAL(RL_Color){ 255, 161, 0, 255 } // Orange -#define RL_PINK RL_CLITERAL(RL_Color){ 255, 109, 194, 255 } // Pink -#define RL_RED RL_CLITERAL(RL_Color){ 230, 41, 55, 255 } // Red -#define RL_MAROON RL_CLITERAL(RL_Color){ 190, 33, 55, 255 } // Maroon -#define RL_GREEN RL_CLITERAL(RL_Color){ 0, 228, 48, 255 } // Green -#define RL_LIME RL_CLITERAL(RL_Color){ 0, 158, 47, 255 } // Lime -#define RL_DARKGREEN RL_CLITERAL(RL_Color){ 0, 117, 44, 255 } // Dark Green -#define RL_SKYBLUE RL_CLITERAL(RL_Color){ 102, 191, 255, 255 } // Sky Blue -#define RL_BLUE RL_CLITERAL(RL_Color){ 0, 121, 241, 255 } // Blue -#define RL_DARKBLUE RL_CLITERAL(RL_Color){ 0, 82, 172, 255 } // Dark Blue -#define RL_PURPLE RL_CLITERAL(RL_Color){ 200, 122, 255, 255 } // Purple -#define RL_VIOLET RL_CLITERAL(RL_Color){ 135, 60, 190, 255 } // Violet -#define RL_DARKPURPLE RL_CLITERAL(RL_Color){ 112, 31, 126, 255 } // Dark Purple -#define RL_BEIGE RL_CLITERAL(RL_Color){ 211, 176, 131, 255 } // Beige -#define RL_BROWN RL_CLITERAL(RL_Color){ 127, 106, 79, 255 } // Brown -#define RL_DARKBROWN RL_CLITERAL(RL_Color){ 76, 63, 47, 255 } // Dark Brown +#define RL_LIGHTGRAY RL_CLITERAL(RL_NS(Color)){ 200, 200, 200, 255 } // Light Gray +#define RL_GRAY RL_CLITERAL(RL_NS(Color)){ 130, 130, 130, 255 } // Gray +#define RL_DARKGRAY RL_CLITERAL(RL_NS(Color)){ 80, 80, 80, 255 } // Dark Gray +#define RL_YELLOW RL_CLITERAL(RL_NS(Color)){ 253, 249, 0, 255 } // Yellow +#define RL_GOLD RL_CLITERAL(RL_NS(Color)){ 255, 203, 0, 255 } // Gold +#define RL_ORANGE RL_CLITERAL(RL_NS(Color)){ 255, 161, 0, 255 } // Orange +#define RL_PINK RL_CLITERAL(RL_NS(Color)){ 255, 109, 194, 255 } // Pink +#define RL_RED RL_CLITERAL(RL_NS(Color)){ 230, 41, 55, 255 } // Red +#define RL_MAROON RL_CLITERAL(RL_NS(Color)){ 190, 33, 55, 255 } // Maroon +#define RL_GREEN RL_CLITERAL(RL_NS(Color)){ 0, 228, 48, 255 } // Green +#define RL_LIME RL_CLITERAL(RL_NS(Color)){ 0, 158, 47, 255 } // Lime +#define RL_DARKGREEN RL_CLITERAL(RL_NS(Color)){ 0, 117, 44, 255 } // Dark Green +#define RL_SKYBLUE RL_CLITERAL(RL_NS(Color)){ 102, 191, 255, 255 } // Sky Blue +#define RL_BLUE RL_CLITERAL(RL_NS(Color)){ 0, 121, 241, 255 } // Blue +#define RL_DARKBLUE RL_CLITERAL(RL_NS(Color)){ 0, 82, 172, 255 } // Dark Blue +#define RL_PURPLE RL_CLITERAL(RL_NS(Color)){ 200, 122, 255, 255 } // Purple +#define RL_VIOLET RL_CLITERAL(RL_NS(Color)){ 135, 60, 190, 255 } // Violet +#define RL_DARKPURPLE RL_CLITERAL(RL_NS(Color)){ 112, 31, 126, 255 } // Dark Purple +#define RL_BEIGE RL_CLITERAL(RL_NS(Color)){ 211, 176, 131, 255 } // Beige +#define RL_BROWN RL_CLITERAL(RL_NS(Color)){ 127, 106, 79, 255 } // Brown +#define RL_DARKBROWN RL_CLITERAL(RL_NS(Color)){ 76, 63, 47, 255 } // Dark Brown -#define RL_WHITE RL_CLITERAL(RL_Color){ 255, 255, 255, 255 } // White -#define RL_BLACK RL_CLITERAL(RL_Color){ 0, 0, 0, 255 } // Black -#define RL_BLANK RL_CLITERAL(RL_Color){ 0, 0, 0, 0 } // Blank (Transparent) -#define RL_MAGENTA RL_CLITERAL(RL_Color){ 255, 0, 255, 255 } // Magenta -#define RL_RAYWHITE RL_CLITERAL(RL_Color){ 245, 245, 245, 255 } // My own White (raylib logo) +#define RL_WHITE RL_CLITERAL(RL_NS(Color)){ 255, 255, 255, 255 } // White +#define RL_BLACK RL_CLITERAL(RL_NS(Color)){ 0, 0, 0, 255 } // Black +#define RL_BLANK RL_CLITERAL(RL_NS(Color)){ 0, 0, 0, 0 } // Blank (Transparent) +#define RL_MAGENTA RL_CLITERAL(RL_NS(Color)){ 255, 0, 255, 255 } // Magenta +#define RL_RAYWHITE RL_CLITERAL(RL_NS(Color)){ 245, 245, 245, 255 } // My own White (raylib logo) //---------------------------------------------------------------------------------- // Structures Definition @@ -200,138 +212,142 @@ #define RL_BOOL_TYPE #endif -// RL_Vector2, 2 components -typedef struct RL_Vector2 { +#include "config.h" + +RL_NS_BEGIN + +// Vector2, 2 components +typedef struct Vector2 { float x; // Vector x component float y; // Vector y component -} RL_Vector2; +} Vector2; -// RL_Vector3, 3 components -typedef struct RL_Vector3 { +// Vector3, 3 components +typedef struct Vector3 { float x; // Vector x component float y; // Vector y component float z; // Vector z component -} RL_Vector3; +} Vector3; -// RL_Vector4, 4 components -typedef struct RL_Vector4 { +// 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 -} RL_Vector4; +} Vector4; -// RL_Quaternion, 4 components (RL_Vector4 alias) -typedef RL_Vector4 RL_Quaternion; +// Quaternion, 4 components (Vector4 alias) +typedef Vector4 Quaternion; -// RL_Matrix, 4x4 components, column major, OpenGL style, right-handed -typedef struct RL_Matrix { - float m0, m4, m8, m12; // RL_Matrix first row (4 components) - float m1, m5, m9, m13; // RL_Matrix second row (4 components) - float m2, m6, m10, m14; // RL_Matrix third row (4 components) - float m3, m7, m11, m15; // RL_Matrix fourth row (4 components) -} RL_Matrix; +// 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; -// RL_Color, 4 components, R8G8B8A8 (32bit) -typedef struct RL_Color { - unsigned char r; // RL_Color red value - unsigned char g; // RL_Color green value - unsigned char b; // RL_Color blue value - unsigned char a; // RL_Color alpha value -} RL_Color; +// 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; -// RL_Rectangle, 4 components -typedef struct RL_Rectangle { - float x; // RL_Rectangle top-left corner position x - float y; // RL_Rectangle top-left corner position y - float width; // RL_Rectangle width - float height; // RL_Rectangle height -} RL_Rectangle; +// 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; -// RL_Image, pixel data stored in CPU memory (RAM) -typedef struct RL_Image { - void *data; // RL_Image raw data - int width; // RL_Image base width - int height; // RL_Image base height +// 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 (RL_PixelFormat type) -} RL_Image; + int format; // Data format (PixelFormat type) +} Image; -// RL_Texture, tex data stored in GPU memory (VRAM) -typedef struct RL_Texture { +// Texture, tex data stored in GPU memory (VRAM) +typedef struct Texture { unsigned int id; // OpenGL texture id - int width; // RL_Texture base width - int height; // RL_Texture base height + int width; // Texture base width + int height; // Texture base height int mipmaps; // Mipmap levels, 1 by default - int format; // Data format (RL_PixelFormat type) -} RL_Texture; + int format; // Data format (PixelFormat type) +} Texture; -// RL_Texture2D, same as RL_Texture -typedef RL_Texture RL_Texture2D; +// Texture2d, same as Texture +typedef Texture Texture2d; -// RL_TextureCubemap, same as RL_Texture -typedef RL_Texture RL_TextureCubemap; +// Texture_Cubemap, same as Texture +typedef Texture Texture_Cubemap; -// RL_RenderTexture, fbo for texture rendering -typedef struct RL_RenderTexture { +// Render_Texture, fbo for texture rendering +typedef struct Render_Texture { unsigned int id; // OpenGL framebuffer object id - RL_Texture texture; // RL_Color buffer attachment texture - RL_Texture depth; // Depth buffer attachment texture -} RL_RenderTexture; + Texture texture; // Color buffer attachment texture + Texture depth; // Depth buffer attachment texture +} Render_Texture; -// RL_RenderTexture2D, same as RL_RenderTexture -typedef RL_RenderTexture RL_RenderTexture2D; +// Render_Texture2D, same as Render_Texture +typedef Render_Texture Render_Texture2D; -// RL_NPatchInfo, n-patch layout info -typedef struct RL_NPatchInfo { - RL_Rectangle source; // RL_Texture source rectangle +// N_Patch_Info, n-patch layout info +typedef struct N_Patch_Info { + 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 -} RL_NPatchInfo; +} N_Patch_Info; -// RL_GlyphInfo, font characters glyphs info -typedef struct RL_GlyphInfo { +// Glyph_Info, font characters glyphs info +typedef struct Glyph_Info { 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 - RL_Image image; // Character image data -} RL_GlyphInfo; + Image image; // Character image data +} Glyph_Info; -// RL_Font, font texture and RL_GlyphInfo array data -typedef struct RL_Font { +// Font, font texture and Glyph_Info 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 - RL_Texture2D texture; // RL_Texture atlas containing the glyphs - RL_Rectangle *recs; // Rectangles in texture for the glyphs - RL_GlyphInfo *glyphs; // Glyphs info data -} RL_Font; + Texture2d texture; // Texture atlas containing the glyphs + Rectangle *recs; // Rectangles in texture for the glyphs + Glyph_Info *glyphs; // Glyphs info data +} Font; -// RL_Camera, defines position/orientation in 3d space -typedef struct RL_Camera3D { - RL_Vector3 position; // RL_Camera position - RL_Vector3 target; // RL_Camera target it looks-at - RL_Vector3 up; // RL_Camera up vector (rotation over its axis) - float fovy; // RL_Camera field-of-view aperture in Y (degrees) in perspective, used as near plane width in orthographic - int projection; // RL_Camera projection: RL_CAMERA_PERSPECTIVE or RL_CAMERA_ORTHOGRAPHIC -} RL_Camera3D; +// 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 RL_Camera3D RL_Camera; // RL_Camera type fallback, defaults to RL_Camera3D +typedef Camera3D Camera; // Camera type fallback, defaults to Camera3D -// RL_Camera2D, defines position/orientation in 2d space -typedef struct RL_Camera2D { - RL_Vector2 offset; // RL_Camera offset (displacement from target) - RL_Vector2 target; // RL_Camera target (rotation and zoom origin) - float rotation; // RL_Camera rotation in degrees - float zoom; // RL_Camera zoom (scaling), should be 1.0f by default -} RL_Camera2D; +// 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; -// RL_Mesh, vertex data and vao/vbo -typedef struct RL_Mesh { +// 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) @@ -353,128 +369,128 @@ typedef struct RL_Mesh { // OpenGL identifiers unsigned int vaoId; // OpenGL Vertex Array Object id unsigned int *vboId; // OpenGL Vertex Buffer Objects id (default vertex data) -} RL_Mesh; +} Mesh; -// RL_Shader -typedef struct RL_Shader { - unsigned int id; // RL_Shader program id - int *locs; // RL_Shader locations array (RL_MAX_SHADER_LOCATIONS) -} RL_Shader; +// Shader +typedef struct Shader { + unsigned int id; // Shader program id + int *locs; // Shader locations array (RL_MAX_SHADER_LOCATIONS) +} Shader; -// RL_MaterialMap -typedef struct RL_MaterialMap { - RL_Texture2D texture; // RL_Material map texture - RL_Color color; // RL_Material map color - float value; // RL_Material map value -} RL_MaterialMap; +// Material_Map +typedef struct Material_Map { + Texture2d texture; // Material map texture + Color color; // Material map color + float value; // Material map value +} Material_Map; -// RL_Material, includes shader and maps -typedef struct RL_Material { - RL_Shader shader; // RL_Material shader - RL_MaterialMap *maps; // RL_Material maps array (RL_MAX_MATERIAL_MAPS) - float params[4]; // RL_Material generic parameters (if required) -} RL_Material; +// Material, includes shader and maps +typedef struct Material { + Shader shader; // Material shader + Material_Map *maps; // Material maps array (RL_MAX_MATERIAL_MAPS) + float params[4]; // Material generic parameters (if required) +} Material; -// RL_Transform, vertex transformation data -typedef struct RL_Transform { - RL_Vector3 translation; // Translation - RL_Quaternion rotation; // Rotation - RL_Vector3 scale; // Scale -} RL_Transform; +// Transform, vertex transformation data +typedef struct Transform { + Vector3 translation; // Translation + Quaternion rotation; // Rotation + Vector3 scale; // Scale +} Transform; // Bone, skeletal animation bone -typedef struct RL_BoneInfo { +typedef struct Bone_Info { char name[32]; // Bone name int parent; // Bone parent -} RL_BoneInfo; +} Bone_Info; -// RL_Model, meshes, materials and animation data -typedef struct RL_Model { - RL_Matrix transform; // Local transform matrix +// Model, meshes, materials and animation data +typedef struct Model { + Matrix transform; // Local transform matrix int meshCount; // Number of meshes int materialCount; // Number of materials - RL_Mesh *meshes; // Meshes array - RL_Material *materials; // Materials array - int *meshMaterial; // RL_Mesh material number + Mesh *meshes; // Meshes array + Material *materials; // Materials array + int *meshMaterial; // Mesh material number // Animation data int boneCount; // Number of bones - RL_BoneInfo *bones; // Bones information (skeleton) - RL_Transform *bindPose; // Bones base transformation (pose) -} RL_Model; + Bone_Info *bones; // Bones information (skeleton) + Transform *bindPose; // Bones base transformation (pose) +} Model; -// RL_ModelAnimation -typedef struct RL_ModelAnimation { +// Model_Animation +typedef struct Model_Animation { int boneCount; // Number of bones int frameCount; // Number of animation frames - RL_BoneInfo *bones; // Bones information (skeleton) - RL_Transform **framePoses; // Poses array by frame + Bone_Info *bones; // Bones information (skeleton) + Transform **framePoses; // Poses array by frame char name[32]; // Animation name -} RL_ModelAnimation; +} Model_Animation; -// RL_Ray, ray for raycasting -typedef struct RL_Ray { - RL_Vector3 position; // RL_Ray position (origin) - RL_Vector3 direction; // RL_Ray direction -} RL_Ray; +// Ray, ray for raycasting +typedef struct Ray { + Vector3 position; // Ray position (origin) + Vector3 direction; // Ray direction +} Ray; -// RL_RayCollision, ray hit information -typedef struct RL_RayCollision { +// Ray_Collision, ray hit information +typedef struct Ray_Collision { bool hit; // Did the ray hit something? float distance; // Distance to the nearest hit - RL_Vector3 point; // RL_Point of the nearest hit - RL_Vector3 normal; // Surface normal of hit -} RL_RayCollision; + Vector3 point; // Point of the nearest hit + Vector3 normal; // Surface normal of hit +} Ray_Collision; -// RL_BoundingBox -typedef struct RL_BoundingBox { - RL_Vector3 min; // Minimum vertex box-corner - RL_Vector3 max; // Maximum vertex box-corner -} RL_BoundingBox; +// Bounding_box +typedef struct Bounding_box { + Vector3 min; // Minimum vertex box-corner + Vector3 max; // Maximum vertex box-corner +} Bounding_box; -// RL_Wave, audio wave data -typedef struct RL_Wave { +// 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 -} RL_Wave; +} Wave; // Opaque structs declaration // NOTE: Actual structs are defined internally in raudio module -typedef struct RL_AudioBuffer RL_AudioBuffer; -typedef struct RL_AudioProcessor RL_AudioProcessor; +typedef struct Audio_Buffer Audio_Buffer; +typedef struct Audio_Processor Audio_Processor; -// RL_AudioStream, custom audio stream -typedef struct RL_AudioStream { - RL_AudioBuffer *buffer; // Pointer to internal data used by the audio system - RL_AudioProcessor *processor; // Pointer to internal data processor, useful for audio effects +// Audio_Stream, custom audio stream +typedef struct Audio_Stream { + Audio_Buffer *buffer; // Pointer to internal data used by the audio system + Audio_Processor *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, ...) -} RL_AudioStream; +} Audio_Stream; -// RL_Sound -typedef struct RL_Sound { - RL_AudioStream stream; // Audio stream +// Sound +typedef struct Sound { + Audio_Stream stream; // Audio stream unsigned int frameCount; // Total number of frames (considering channels) -} RL_Sound; +} Sound; -// RL_Music, audio stream, anything longer than ~10 seconds should be streamed -typedef struct RL_Music { - RL_AudioStream stream; // Audio stream +// Music, audio stream, anything longer than ~10 seconds should be streamed +typedef struct Music { + Audio_Stream stream; // Audio stream unsigned int frameCount; // Total number of frames (considering channels) - bool looping; // RL_Music looping enable + bool looping; // Music looping enable int ctxType; // Type of music context (audio filetype) void *ctxData; // Audio context data, depends on type -} RL_Music; +} Music; -// RL_VrDeviceInfo, Head-Mounted-Display device parameters -typedef struct RL_VrDeviceInfo { +// VR_Device_Info, Head-Mounted-Display device parameters +typedef struct VR_Device_Info { int hResolution; // Horizontal resolution in pixels int vResolution; // Vertical resolution in pixels float hScreenSize; // Horizontal size in meters @@ -485,40 +501,40 @@ typedef struct RL_VrDeviceInfo { float interpupillaryDistance; // IPD (distance between pupils) in meters float lensDistortionValues[4]; // Lens distortion constant parameters float chromaAbCorrection[4]; // Chromatic aberration correction parameters -} RL_VrDeviceInfo; +} VR_Device_Info; -// RL_VrStereoConfig, VR stereo rendering configuration for simulator -typedef struct RL_VrStereoConfig { - RL_Matrix projection[2]; // VR projection matrices (per eye) - RL_Matrix viewOffset[2]; // VR view offset matrices (per eye) +// VR_Stereo_Config, VR stereo rendering configuration for simulator +typedef struct VR_Stereo_Config { + 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 -} RL_VrStereoConfig; +} VR_Stereo_Config; // File path list -typedef struct RL_FilePathList { +typedef struct File_Path_List { unsigned int capacity; // Filepaths max entries unsigned int count; // Filepaths entries count char **paths; // Filepaths entries -} RL_FilePathList; +} File_Path_List; // Automation event -typedef struct RL_AutomationEvent { +typedef struct Automation_Event { unsigned int frame; // Event frame unsigned int type; // Event type (AutomationEventType) int params[4]; // Event parameters (if required) -} RL_AutomationEvent; +} Automation_Event; // Automation event list -typedef struct RL_AutomationEventList { +typedef struct Automation_Event_List { unsigned int capacity; // Events max entries (RL_MAX_AUTOMATION_EVENTS) unsigned int count; // Events entries count - RL_AutomationEvent *events; // Events entries -} RL_AutomationEventList; + Automation_Event *events; // Events entries +} Automation_Event_List; //---------------------------------------------------------------------------------- // Enumerators Definition @@ -527,415 +543,415 @@ typedef struct RL_AutomationEventList { // NOTE: Every bit registers one state (use it with bit masks) // By default all flags are set to 0 typedef enum { - RL_FLAG_VSYNC_HINT = 0x00000040, // Set to try enabling V-Sync on GPU - RL_FLAG_FULLSCREEN_MODE = 0x00000002, // Set to run program in fullscreen - RL_FLAG_WINDOW_RESIZABLE = 0x00000004, // Set to allow resizable window - RL_FLAG_WINDOW_UNDECORATED = 0x00000008, // Set to disable window decoration (frame and buttons) - RL_FLAG_WINDOW_HIDDEN = 0x00000080, // Set to hide window - RL_FLAG_WINDOW_MINIMIZED = 0x00000200, // Set to minimize window (iconify) - RL_FLAG_WINDOW_MAXIMIZED = 0x00000400, // Set to maximize window (expanded to monitor) - RL_FLAG_WINDOW_UNFOCUSED = 0x00000800, // Set to window non focused - RL_FLAG_WINDOW_TOPMOST = 0x00001000, // Set to window always on top - RL_FLAG_WINDOW_ALWAYS_RUN = 0x00000100, // Set to allow windows running while minimized - RL_FLAG_WINDOW_TRANSPARENT = 0x00000010, // Set to allow transparent framebuffer - RL_FLAG_WINDOW_HIGHDPI = 0x00002000, // Set to support HighDPI - RL_FLAG_WINDOW_MOUSE_PASSTHROUGH = 0x00004000, // Set to support mouse passthrough, only supported when RL_FLAG_WINDOW_UNDECORATED - RL_FLAG_BORDERLESS_WINDOWED_MODE = 0x00008000, // Set to run program in borderless windowed mode - RL_FLAG_MSAA_4X_HINT = 0x00000020, // Set to try enabling MSAA 4X - RL_FLAG_INTERLACED_HINT = 0x00010000 // Set to try enabling interlaced video format (for V3D) -} RL_ConfigFlags; + 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 { - 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 -} RL_TraceLogLevel; + 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 RL_GetKeyPressed() to allow redefining +// NOTE: Use get_key_pressed() to allow redefining // required keys for alternative layouts typedef enum { - RL_KEY_NULL = 0, // Key: NULL, used for no key pressed + KEY_NULL = 0, // Key: NULL, used for no key pressed // Alphanumeric keys - RL_KEY_APOSTROPHE = 39, // Key: ' - RL_KEY_COMMA = 44, // Key: , - RL_KEY_MINUS = 45, // Key: - - RL_KEY_PERIOD = 46, // Key: . - RL_KEY_SLASH = 47, // Key: / - RL_KEY_ZERO = 48, // Key: 0 - RL_KEY_ONE = 49, // Key: 1 - RL_KEY_TWO = 50, // Key: 2 - RL_KEY_THREE = 51, // Key: 3 - RL_KEY_FOUR = 52, // Key: 4 - RL_KEY_FIVE = 53, // Key: 5 - RL_KEY_SIX = 54, // Key: 6 - RL_KEY_SEVEN = 55, // Key: 7 - RL_KEY_EIGHT = 56, // Key: 8 - RL_KEY_NINE = 57, // Key: 9 - RL_KEY_SEMICOLON = 59, // Key: ; - RL_KEY_EQUAL = 61, // Key: = - RL_KEY_A = 65, // Key: A | a - RL_KEY_B = 66, // Key: B | b - RL_KEY_C = 67, // Key: C | c - RL_KEY_D = 68, // Key: D | d - RL_KEY_E = 69, // Key: E | e - RL_KEY_F = 70, // Key: F | f - RL_KEY_G = 71, // Key: G | g - RL_KEY_H = 72, // Key: H | h - RL_KEY_I = 73, // Key: I | i - RL_KEY_J = 74, // Key: J | j - RL_KEY_K = 75, // Key: K | k - RL_KEY_L = 76, // Key: L | l - RL_KEY_M = 77, // Key: M | m - RL_KEY_N = 78, // Key: N | n - RL_KEY_O = 79, // Key: O | o - RL_KEY_P = 80, // Key: P | p - RL_KEY_Q = 81, // Key: Q | q - RL_KEY_R = 82, // Key: R | r - RL_KEY_S = 83, // Key: S | s - RL_KEY_T = 84, // Key: T | t - RL_KEY_U = 85, // Key: U | u - RL_KEY_V = 86, // Key: V | v - RL_KEY_W = 87, // Key: W | w - RL_KEY_X = 88, // Key: X | x - RL_KEY_Y = 89, // Key: Y | y - RL_KEY_Z = 90, // Key: Z | z - RL_KEY_LEFT_BRACKET = 91, // Key: [ + 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: ] - RL_KEY_GRAVE = 96, // Key: ` + KEY_GRAVE = 96, // Key: ` // Function keys - RL_KEY_SPACE = 32, // Key: Space - RL_KEY_ESCAPE = 256, // Key: Esc - RL_KEY_ENTER = 257, // Key: Enter - RL_KEY_TAB = 258, // Key: Tab - RL_KEY_BACKSPACE = 259, // Key: Backspace - RL_KEY_INSERT = 260, // Key: Ins - RL_KEY_DELETE = 261, // Key: Del - RL_KEY_RIGHT = 262, // Key: Cursor right - RL_KEY_LEFT = 263, // Key: Cursor left - RL_KEY_DOWN = 264, // Key: Cursor down - RL_KEY_UP = 265, // Key: Cursor up - RL_KEY_PAGE_UP = 266, // Key: Page up - RL_KEY_PAGE_DOWN = 267, // Key: Page down - RL_KEY_HOME = 268, // Key: Home - RL_KEY_END = 269, // Key: End - RL_KEY_CAPS_LOCK = 280, // Key: Caps lock - RL_KEY_SCROLL_LOCK = 281, // Key: Scroll down - RL_KEY_NUM_LOCK = 282, // Key: Num lock - RL_KEY_PRINT_SCREEN = 283, // Key: Print screen - RL_KEY_PAUSE = 284, // Key: Pause - RL_KEY_F1 = 290, // Key: F1 - RL_KEY_F2 = 291, // Key: F2 - RL_KEY_F3 = 292, // Key: F3 - RL_KEY_F4 = 293, // Key: F4 - RL_KEY_F5 = 294, // Key: F5 - RL_KEY_F6 = 295, // Key: F6 - RL_KEY_F7 = 296, // Key: F7 - RL_KEY_F8 = 297, // Key: F8 - RL_KEY_F9 = 298, // Key: F9 - RL_KEY_F10 = 299, // Key: F10 - RL_KEY_F11 = 300, // Key: F11 - RL_KEY_F12 = 301, // Key: F12 - RL_KEY_LEFT_SHIFT = 340, // Key: Shift left - RL_KEY_LEFT_CONTROL = 341, // Key: Control left - RL_KEY_LEFT_ALT = 342, // Key: Alt left - RL_KEY_LEFT_SUPER = 343, // Key: Super left - RL_KEY_RIGHT_SHIFT = 344, // Key: Shift right - RL_KEY_RIGHT_CONTROL = 345, // Key: Control right - RL_KEY_RIGHT_ALT = 346, // Key: Alt right - RL_KEY_RIGHT_SUPER = 347, // Key: Super right - RL_KEY_KB_MENU = 348, // Key: KB menu + 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 - RL_KEY_KP_0 = 320, // Key: Keypad 0 - RL_KEY_KP_1 = 321, // Key: Keypad 1 - RL_KEY_KP_2 = 322, // Key: Keypad 2 - RL_KEY_KP_3 = 323, // Key: Keypad 3 - RL_KEY_KP_4 = 324, // Key: Keypad 4 - RL_KEY_KP_5 = 325, // Key: Keypad 5 - RL_KEY_KP_6 = 326, // Key: Keypad 6 - RL_KEY_KP_7 = 327, // Key: Keypad 7 - RL_KEY_KP_8 = 328, // Key: Keypad 8 - RL_KEY_KP_9 = 329, // Key: Keypad 9 - RL_KEY_KP_DECIMAL = 330, // Key: Keypad . - RL_KEY_KP_DIVIDE = 331, // Key: Keypad / - RL_KEY_KP_MULTIPLY = 332, // Key: Keypad * - RL_KEY_KP_SUBTRACT = 333, // Key: Keypad - - RL_KEY_KP_ADD = 334, // Key: Keypad + - RL_KEY_KP_ENTER = 335, // Key: Keypad Enter - RL_KEY_KP_EQUAL = 336, // Key: Keypad = + 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 - RL_KEY_BACK = 4, // Key: Android back button - RL_KEY_MENU = 82, // Key: Android menu button - RL_KEY_VOLUME_UP = 24, // Key: Android volume up button - RL_KEY_VOLUME_DOWN = 25 // Key: Android volume down button -} RL_KeyboardKey; + KEY_BACK = 4, // Key: Android back button + KEY_MENU = 82, // 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 RL_MOUSE_LEFT_BUTTON RL_MOUSE_BUTTON_LEFT -#define RL_MOUSE_RIGHT_BUTTON RL_MOUSE_BUTTON_RIGHT -#define RL_MOUSE_MIDDLE_BUTTON RL_MOUSE_BUTTON_MIDDLE +#define MOUSE_LEFT_BUTTON RL_NS(MOUSE_BUTTON_LEFT) +#define MOUSE_RIGHT_BUTTON RL_NS(MOUSE_BUTTON_RIGHT) +#define MOUSE_MIDDLE_BUTTON RL_NS(MOUSE_BUTTON_MIDDLE) // Mouse buttons typedef enum { - RL_MOUSE_BUTTON_LEFT = 0, // Mouse button left - RL_MOUSE_BUTTON_RIGHT = 1, // Mouse button right - RL_MOUSE_BUTTON_MIDDLE = 2, // Mouse button middle (pressed wheel) - RL_MOUSE_BUTTON_SIDE = 3, // Mouse button side (advanced mouse device) - RL_MOUSE_BUTTON_EXTRA = 4, // Mouse button extra (advanced mouse device) - RL_MOUSE_BUTTON_FORWARD = 5, // Mouse button forward (advanced mouse device) - RL_MOUSE_BUTTON_BACK = 6, // Mouse button back (advanced mouse device) -} RL_MouseButton; + 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 { - RL_MOUSE_CURSOR_DEFAULT = 0, // Default pointer shape - RL_MOUSE_CURSOR_ARROW = 1, // Arrow shape - RL_MOUSE_CURSOR_IBEAM = 2, // Text writing cursor shape - RL_MOUSE_CURSOR_CROSSHAIR = 3, // Cross shape - RL_MOUSE_CURSOR_POINTING_HAND = 4, // Pointing hand cursor - RL_MOUSE_CURSOR_RESIZE_EW = 5, // Horizontal resize/move arrow shape - RL_MOUSE_CURSOR_RESIZE_NS = 6, // Vertical resize/move arrow shape - RL_MOUSE_CURSOR_RESIZE_NWSE = 7, // Top-left to bottom-right diagonal resize/move arrow shape - RL_MOUSE_CURSOR_RESIZE_NESW = 8, // The top-right to bottom-left diagonal resize/move arrow shape - RL_MOUSE_CURSOR_RESIZE_ALL = 9, // The omnidirectional resize/move cursor shape - RL_MOUSE_CURSOR_NOT_ALLOWED = 10 // The operation-not-allowed shape -} RL_MouseCursor; + 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 { - RL_GAMEPAD_BUTTON_UNKNOWN = 0, // Unknown button, just for error checking - RL_GAMEPAD_BUTTON_LEFT_FACE_UP, // Gamepad left DPAD up button - RL_GAMEPAD_BUTTON_LEFT_FACE_RIGHT, // Gamepad left DPAD right button - RL_GAMEPAD_BUTTON_LEFT_FACE_DOWN, // Gamepad left DPAD down button - RL_GAMEPAD_BUTTON_LEFT_FACE_LEFT, // Gamepad left DPAD left button - RL_GAMEPAD_BUTTON_RIGHT_FACE_UP, // Gamepad right button up (i.e. PS3: Triangle, Xbox: Y) - RL_GAMEPAD_BUTTON_RIGHT_FACE_RIGHT, // Gamepad right button right (i.e. PS3: Square, Xbox: X) - RL_GAMEPAD_BUTTON_RIGHT_FACE_DOWN, // Gamepad right button down (i.e. PS3: Cross, Xbox: A) - RL_GAMEPAD_BUTTON_RIGHT_FACE_LEFT, // Gamepad right button left (i.e. PS3: Circle, Xbox: B) - RL_GAMEPAD_BUTTON_LEFT_TRIGGER_1, // Gamepad top/back trigger left (first), it could be a trailing button - RL_GAMEPAD_BUTTON_LEFT_TRIGGER_2, // Gamepad top/back trigger left (second), it could be a trailing button - RL_GAMEPAD_BUTTON_RIGHT_TRIGGER_1, // Gamepad top/back trigger right (one), it could be a trailing button - RL_GAMEPAD_BUTTON_RIGHT_TRIGGER_2, // Gamepad top/back trigger right (second), it could be a trailing button - RL_GAMEPAD_BUTTON_MIDDLE_LEFT, // Gamepad center buttons, left one (i.e. PS3: Select) - RL_GAMEPAD_BUTTON_MIDDLE, // Gamepad center buttons, middle one (i.e. PS3: PS, Xbox: XBOX) - RL_GAMEPAD_BUTTON_MIDDLE_RIGHT, // Gamepad center buttons, right one (i.e. PS3: Start) - RL_GAMEPAD_BUTTON_LEFT_THUMB, // Gamepad joystick pressed button left - RL_GAMEPAD_BUTTON_RIGHT_THUMB // Gamepad joystick pressed button right -} RL_GamepadButton; + 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: Square, Xbox: X) + 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: Circle, Xbox: B) + 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 (one), 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 { - RL_GAMEPAD_AXIS_LEFT_X = 0, // Gamepad left stick X axis - RL_GAMEPAD_AXIS_LEFT_Y = 1, // Gamepad left stick Y axis - RL_GAMEPAD_AXIS_RIGHT_X = 2, // Gamepad right stick X axis - RL_GAMEPAD_AXIS_RIGHT_Y = 3, // Gamepad right stick Y axis - RL_GAMEPAD_AXIS_LEFT_TRIGGER = 4, // Gamepad back trigger left, pressure level: [1..-1] - RL_GAMEPAD_AXIS_RIGHT_TRIGGER = 5 // Gamepad back trigger right, pressure level: [1..-1] -} RL_GamepadAxis; + 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; -// RL_Material map index +// Material map index typedef enum { - RL_MATERIAL_MAP_ALBEDO = 0, // Albedo material (same as: RL_MATERIAL_MAP_DIFFUSE) - RL_MATERIAL_MAP_METALNESS, // Metalness material (same as: RL_MATERIAL_MAP_SPECULAR) - RL_MATERIAL_MAP_NORMAL, // Normal material - RL_MATERIAL_MAP_ROUGHNESS, // Roughness material - RL_MATERIAL_MAP_OCCLUSION, // Ambient occlusion material - RL_MATERIAL_MAP_EMISSION, // Emission material - RL_MATERIAL_MAP_HEIGHT, // Heightmap material - RL_MATERIAL_MAP_CUBEMAP, // Cubemap material (NOTE: Uses GL_TEXTURE_CUBE_MAP) - RL_MATERIAL_MAP_IRRADIANCE, // Irradiance material (NOTE: Uses GL_TEXTURE_CUBE_MAP) - RL_MATERIAL_MAP_PREFILTER, // Prefilter material (NOTE: Uses GL_TEXTURE_CUBE_MAP) - RL_MATERIAL_MAP_BRDF // Brdf material -} RL_MaterialMapIndex; + 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 RL_MATERIAL_MAP_DIFFUSE RL_MATERIAL_MAP_ALBEDO -#define RL_MATERIAL_MAP_SPECULAR RL_MATERIAL_MAP_METALNESS +#define MATERIAL_MAP_DIFFUSE RL_NS(MATERIAL_MAP_ALBEDO) +#define MATERIAL_MAP_SPECULAR RL_NS(MATERIAL_MAP_METALNESS) -// RL_Shader location index +// Shader location index typedef enum { - RL_SHADER_LOC_VERTEX_POSITION = 0, // RL_Shader location: vertex attribute: position - RL_SHADER_LOC_VERTEX_TEXCOORD01, // RL_Shader location: vertex attribute: texcoord01 - RL_SHADER_LOC_VERTEX_TEXCOORD02, // RL_Shader location: vertex attribute: texcoord02 - RL_SHADER_LOC_VERTEX_NORMAL, // RL_Shader location: vertex attribute: normal - RL_SHADER_LOC_VERTEX_TANGENT, // RL_Shader location: vertex attribute: tangent - RL_SHADER_LOC_VERTEX_COLOR, // RL_Shader location: vertex attribute: color - RL_SHADER_LOC_MATRIX_MVP, // RL_Shader location: matrix uniform: model-view-projection - RL_SHADER_LOC_MATRIX_VIEW, // RL_Shader location: matrix uniform: view (camera transform) - RL_SHADER_LOC_MATRIX_PROJECTION, // RL_Shader location: matrix uniform: projection - RL_SHADER_LOC_MATRIX_MODEL, // RL_Shader location: matrix uniform: model (transform) - RL_SHADER_LOC_MATRIX_NORMAL, // RL_Shader location: matrix uniform: normal - RL_SHADER_LOC_VECTOR_VIEW, // RL_Shader location: vector uniform: view - RL_SHADER_LOC_COLOR_DIFFUSE, // RL_Shader location: vector uniform: diffuse color - RL_SHADER_LOC_COLOR_SPECULAR, // RL_Shader location: vector uniform: specular color - RL_SHADER_LOC_COLOR_AMBIENT, // RL_Shader location: vector uniform: ambient color - RL_SHADER_LOC_MAP_ALBEDO, // RL_Shader location: sampler2d texture: albedo (same as: RL_SHADER_LOC_MAP_DIFFUSE) - RL_SHADER_LOC_MAP_METALNESS, // RL_Shader location: sampler2d texture: metalness (same as: RL_SHADER_LOC_MAP_SPECULAR) - RL_SHADER_LOC_MAP_NORMAL, // RL_Shader location: sampler2d texture: normal - RL_SHADER_LOC_MAP_ROUGHNESS, // RL_Shader location: sampler2d texture: roughness - RL_SHADER_LOC_MAP_OCCLUSION, // RL_Shader location: sampler2d texture: occlusion - RL_SHADER_LOC_MAP_EMISSION, // RL_Shader location: sampler2d texture: emission - RL_SHADER_LOC_MAP_HEIGHT, // RL_Shader location: sampler2d texture: height - RL_SHADER_LOC_MAP_CUBEMAP, // RL_Shader location: samplerCube texture: cubemap - RL_SHADER_LOC_MAP_IRRADIANCE, // RL_Shader location: samplerCube texture: irradiance - RL_SHADER_LOC_MAP_PREFILTER, // RL_Shader location: samplerCube texture: prefilter - RL_SHADER_LOC_MAP_BRDF // RL_Shader location: sampler2d texture: brdf -} RL_ShaderLocationIndex; + 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 +} ShaderLocationIndex; -#define RL_SHADER_LOC_MAP_DIFFUSE RL_SHADER_LOC_MAP_ALBEDO -#define RL_SHADER_LOC_MAP_SPECULAR RL_SHADER_LOC_MAP_METALNESS +#define SHADER_LOC_MAP_DIFFUSE RL_NS(SHADER_LOC_MAP_ALBEDO) +#define SHADER_LOC_MAP_SPECULAR RL_NS(SHADER_LOC_MAP_METALNESS) -// RL_Shader uniform data type +// Shader uniform data type typedef enum { - RL_SHADER_UNIFORM_FLOAT = 0, // RL_Shader uniform type: float - RL_SHADER_UNIFORM_VEC2, // RL_Shader uniform type: vec2 (2 float) - RL_SHADER_UNIFORM_VEC3, // RL_Shader uniform type: vec3 (3 float) - RL_SHADER_UNIFORM_VEC4, // RL_Shader uniform type: vec4 (4 float) - RL_SHADER_UNIFORM_INT, // RL_Shader uniform type: int - RL_SHADER_UNIFORM_IVEC2, // RL_Shader uniform type: ivec2 (2 int) - RL_SHADER_UNIFORM_IVEC3, // RL_Shader uniform type: ivec3 (3 int) - RL_SHADER_UNIFORM_IVEC4, // RL_Shader uniform type: ivec4 (4 int) - RL_SHADER_UNIFORM_SAMPLER2D // RL_Shader uniform type: sampler2d -} RL_ShaderUniformDataType; + 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_SAMPLER2D // Shader uniform type: sampler2d +} ShaderUniformDataType; -// RL_Shader attribute data types +// Shader attribute data types typedef enum { - RL_SHADER_ATTRIB_FLOAT = 0, // RL_Shader attribute type: float - RL_SHADER_ATTRIB_VEC2, // RL_Shader attribute type: vec2 (2 float) - RL_SHADER_ATTRIB_VEC3, // RL_Shader attribute type: vec3 (3 float) - RL_SHADER_ATTRIB_VEC4 // RL_Shader attribute type: vec4 (4 float) -} RL_ShaderAttributeDataType; + 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 { - 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 -} RL_PixelFormat; + 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; -// RL_Texture parameters: filter mode +// 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 -} RL_TextureFilter; + 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; -// RL_Texture parameters: wrap mode +// Texture parameters: wrap mode typedef enum { - RL_TEXTURE_WRAP_REPEAT = 0, // Repeats texture in tiled mode - RL_TEXTURE_WRAP_CLAMP, // Clamps texture to edge pixel in tiled mode - RL_TEXTURE_WRAP_MIRROR_REPEAT, // Mirrors and repeats the texture in tiled mode - RL_TEXTURE_WRAP_MIRROR_CLAMP // Mirrors and clamps to border the texture in tiled mode -} RL_TextureWrap; + 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 { - RL_CUBEMAP_LAYOUT_AUTO_DETECT = 0, // Automatically detect layout type - RL_CUBEMAP_LAYOUT_LINE_VERTICAL, // Layout is defined by a vertical line with faces - RL_CUBEMAP_LAYOUT_LINE_HORIZONTAL, // Layout is defined by a horizontal line with faces - RL_CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR, // Layout is defined by a 3x4 cross with cubemap faces - RL_CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE, // Layout is defined by a 4x3 cross with cubemap faces - RL_CUBEMAP_LAYOUT_PANORAMA // Layout is defined by a panorama image (equirrectangular map) -} RL_CubemapLayout; + 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 + CUBEMAP_LAYOUT_PANORAMA // Layout is defined by a panorama image (equirrectangular map) +} CubemapLayout; -// RL_Font type, defines generation method +// Font type, defines generation method typedef enum { - RL_FONT_DEFAULT = 0, // Default font generation, anti-aliased - RL_FONT_BITMAP, // Bitmap font generation, no anti-aliasing - RL_FONT_SDF // SDF font generation, requires external shader -} RL_FontType; + 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; -// RL_Color blending modes (pre-defined) +// 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 RLGL_SetBlendFactors()) - RL_BLEND_CUSTOM_SEPARATE // Blend textures using custom rgb/alpha separate src/dst factors (use RLGL_SetBlendFactorsSeparate()) -} RL_BlendMode; + 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 set_blend_factors()) + BLEND_CUSTOM_SEPARATE // Blend textures using custom rgb/alpha separate src/dst factors (use set_blend_factors_separate()) +} BlendMode; -// RL_Gesture +// Gesture // NOTE: Provided as bit-wise flags to enable only desired gestures typedef enum { - RL_GESTURE_NONE = 0, // No gesture - RL_GESTURE_TAP = 1, // Tap gesture - RL_GESTURE_DOUBLETAP = 2, // Double tap gesture - RL_GESTURE_HOLD = 4, // Hold gesture - RL_GESTURE_DRAG = 8, // Drag gesture - RL_GESTURE_SWIPE_RIGHT = 16, // Swipe right gesture - RL_GESTURE_SWIPE_LEFT = 32, // Swipe left gesture - RL_GESTURE_SWIPE_UP = 64, // Swipe up gesture - RL_GESTURE_SWIPE_DOWN = 128, // Swipe down gesture - RL_GESTURE_PINCH_IN = 256, // Pinch in gesture - RL_GESTURE_PINCH_OUT = 512 // Pinch out gesture -} RL_Gesture; + 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; -// RL_Camera system modes +// Camera system modes typedef enum { - RL_CAMERA_CUSTOM = 0, // Custom camera - RL_CAMERA_FREE, // Free camera - RL_CAMERA_ORBITAL, // Orbital camera - RL_CAMERA_FIRST_PERSON, // First person camera - RL_CAMERA_THIRD_PERSON // Third person camera -} RL_CameraMode; + CAMERA_CUSTOM = 0, // Custom camera + CAMERA_FREE, // Free camera + CAMERA_ORBITAL, // Orbital camera + CAMERA_FIRST_PERSON, // First person camera + CAMERA_THIRD_PERSON // Third person camera +} CameraMode; -// RL_Camera projection +// Camera projection typedef enum { - RL_CAMERA_PERSPECTIVE = 0, // Perspective projection - RL_CAMERA_ORTHOGRAPHIC // Orthographic projection -} RL_CameraProjection; + CAMERA_PERSPECTIVE = 0, // Perspective projection + CAMERA_ORTHOGRAPHIC // Orthographic projection +} CameraProjection; // N-patch layout typedef enum { - RL_NPATCH_NINE_PATCH = 0, // Npatch layout: 3x3 tiles - RL_NPATCH_THREE_PATCH_VERTICAL, // Npatch layout: 1x3 tiles - RL_NPATCH_THREE_PATCH_HORIZONTAL // Npatch layout: 3x1 tiles -} RL_NPatchLayout; + 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 advance users -typedef void (*RL_TraceLogCallback)(int logLevel, const char *text, va_list args); // Logging: Redirect trace log messages -typedef unsigned char *(*RL_LoadFileDataCallback)(const char *fileName, int *dataSize); // FileIO: Load binary data -typedef bool (*RL_SaveFileDataCallback)(const char *fileName, void *data, int dataSize); // FileIO: Save binary data -typedef char *(*RL_LoadFileTextCallback)(const char *fileName); // FileIO: Load text data -typedef bool (*RL_SaveFileTextCallback)(const char *fileName, char *text); // FileIO: Save text data +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 @@ -946,268 +962,266 @@ typedef bool (*RL_SaveFileTextCallback)(const char *fileName, char *text); // Fi // Window and Graphics Device Functions (Module: core) //------------------------------------------------------------------------------------ -#if defined(__cplusplus) -extern "C" { // Prevents name mangling of functions -#endif +RL_EXTERN_C_BEGIN // Window-related functions -RLAPI void RL_InitWindow(int width, int height, const char *title); // Initialize window and OpenGL context -RLAPI void RL_CloseWindow(void); // Close window and unload OpenGL context -RLAPI bool RL_WindowShouldClose(void); // Check if application should close (RL_KEY_ESCAPE pressed or windows close icon clicked) -RLAPI bool RL_IsWindowReady(void); // Check if window has been initialized successfully -RLAPI bool RL_IsWindowFullscreen(void); // Check if window is currently fullscreen -RLAPI bool RL_IsWindowHidden(void); // Check if window is currently hidden (only PLATFORM_DESKTOP) -RLAPI bool RL_IsWindowMinimized(void); // Check if window is currently minimized (only PLATFORM_DESKTOP) -RLAPI bool RL_IsWindowMaximized(void); // Check if window is currently maximized (only PLATFORM_DESKTOP) -RLAPI bool RL_IsWindowFocused(void); // Check if window is currently focused (only PLATFORM_DESKTOP) -RLAPI bool RL_IsWindowResized(void); // Check if window has been resized last frame -RLAPI bool RL_IsWindowState(unsigned int flag); // Check if one specific window flag is enabled -RLAPI void RL_SetWindowState(unsigned int flags); // Set window configuration state using flags (only PLATFORM_DESKTOP) -RLAPI void RL_ClearWindowState(unsigned int flags); // Clear window configuration state flags -RLAPI void RL_ToggleFullscreen(void); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP) -RLAPI void RL_ToggleBorderlessWindowed(void); // Toggle window state: borderless windowed (only PLATFORM_DESKTOP) -RLAPI void RL_MaximizeWindow(void); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP) -RLAPI void RL_MinimizeWindow(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP) -RLAPI void RL_RestoreWindow(void); // Set window state: not minimized/maximized (only PLATFORM_DESKTOP) -RLAPI void RL_SetWindowIcon(RL_Image image); // Set icon for window (single image, RGBA 32bit, only PLATFORM_DESKTOP) -RLAPI void RL_SetWindowIcons(RL_Image *images, int count); // Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP) -RLAPI void RL_SetWindowTitle(const char *title); // Set title for window (only PLATFORM_DESKTOP and PLATFORM_WEB) -RLAPI void RL_SetWindowPosition(int x, int y); // Set window position on screen (only PLATFORM_DESKTOP) -RLAPI void RL_SetWindowMonitor(int monitor); // Set monitor for the current window -RLAPI void RL_SetWindowMinSize(int width, int height); // Set window minimum dimensions (for RL_FLAG_WINDOW_RESIZABLE) -RLAPI void RL_SetWindowMaxSize(int width, int height); // Set window maximum dimensions (for RL_FLAG_WINDOW_RESIZABLE) -RLAPI void RL_SetWindowSize(int width, int height); // Set window dimensions -RLAPI void RL_SetWindowOpacity(float opacity); // Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP) -RLAPI void RL_SetWindowFocused(void); // Set window focused (only PLATFORM_DESKTOP) -RLAPI void *RL_GetWindowHandle(void); // Get native window handle -RLAPI int RL_GetScreenWidth(void); // Get current screen width -RLAPI int RL_GetScreenHeight(void); // Get current screen height -RLAPI int RL_GetRenderWidth(void); // Get current render width (it considers HiDPI) -RLAPI int RL_GetRenderHeight(void); // Get current render height (it considers HiDPI) -RLAPI int RL_GetMonitorCount(void); // Get number of connected monitors -RLAPI int RL_GetCurrentMonitor(void); // Get current connected monitor -RLAPI RL_Vector2 RL_GetMonitorPosition(int monitor); // Get specified monitor position -RLAPI int RL_GetMonitorWidth(int monitor); // Get specified monitor width (current video mode used by monitor) -RLAPI int RL_GetMonitorHeight(int monitor); // Get specified monitor height (current video mode used by monitor) -RLAPI int RL_GetMonitorPhysicalWidth(int monitor); // Get specified monitor physical width in millimetres -RLAPI int RL_GetMonitorPhysicalHeight(int monitor); // Get specified monitor physical height in millimetres -RLAPI int RL_GetMonitorRefreshRate(int monitor); // Get specified monitor refresh rate -RLAPI RL_Vector2 RL_GetWindowPosition(void); // Get window position XY on monitor -RLAPI RL_Vector2 RL_GetWindowScaleDPI(void); // Get window scale DPI factor -RLAPI const char *RL_GetMonitorName(int monitor); // Get the human-readable, UTF-8 encoded name of the specified monitor -RLAPI void RL_SetClipboardText(const char *text); // Set clipboard text content -RLAPI const char *RL_GetClipboardText(void); // Get clipboard text content -RLAPI void RL_EnableEventWaiting(void); // Enable waiting for events on RL_EndDrawing(), no automatic event polling -RLAPI void RL_DisableEventWaiting(void); // Disable waiting for events on RL_EndDrawing(), automatic events polling +RLAPI void init_window(int width, int height, const char *title); // Initialize window and OpenGL context +RLAPI void close_window(void); // Close window and unload OpenGL context +RLAPI bool window_should_close(void); // Check if application should close (KEY_ESCAPE pressed or windows close icon clicked) +RLAPI bool is_window_ready(void); // Check if window has been initialized successfully +RLAPI bool is_window_fullscreen(void); // Check if window is currently fullscreen +RLAPI bool is_window_hidden(void); // Check if window is currently hidden (only PLATFORM_DESKTOP) +RLAPI bool is_window_minimized(void); // Check if window is currently minimized (only PLATFORM_DESKTOP) +RLAPI bool is_window_maximized(void); // Check if window is currently maximized (only PLATFORM_DESKTOP) +RLAPI bool is_window_focused(void); // Check if window is currently focused (only PLATFORM_DESKTOP) +RLAPI bool is_window_resized(void); // Check if window has been resized last frame +RLAPI bool is_window_state(unsigned int flag); // Check if one specific window flag is enabled +RLAPI void set_window_state(unsigned int flags); // Set window configuration state using flags (only PLATFORM_DESKTOP) +RLAPI void clear_window_state(unsigned int flags); // Clear window configuration state flags +RLAPI void toggle_fullscreen(void); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP) +RLAPI void toggle_borderless_windowed(void); // Toggle window state: borderless windowed (only PLATFORM_DESKTOP) +RLAPI void maximize_window(void); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP) +RLAPI void minimize_window(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP) +RLAPI void restore_window(void); // Set window state: not minimized/maximized (only PLATFORM_DESKTOP) +RLAPI void set_window_icon(Image image); // Set icon for window (single image, RGBA 32bit, only PLATFORM_DESKTOP) +RLAPI void set_window_icons(Image *images, int count); // Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP) +RLAPI void set_window_title(const char *title); // Set title for window (only PLATFORM_DESKTOP and PLATFORM_WEB) +RLAPI void set_window_position(int x, int y); // Set window position on screen (only PLATFORM_DESKTOP) +RLAPI void set_window_monitor(int monitor); // Set monitor for the current window +RLAPI void set_window_min_size(int width, int height); // Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE) +RLAPI void set_window_max_size(int width, int height); // Set window maximum dimensions (for FLAG_WINDOW_RESIZABLE) +RLAPI void set_window_size(int width, int height); // Set window dimensions +RLAPI void set_window_opacity(float opacity); // Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP) +RLAPI void set_window_focused(void); // Set window focused (only PLATFORM_DESKTOP) +RLAPI void *GetWindowHandle(void); // Get native window handle +RLAPI int get_screen_width(void); // Get current screen width +RLAPI int get_screen_height(void); // Get current screen height +RLAPI int get_render_width(void); // Get current render width (it considers HiDPI) +RLAPI int get_render_height(void); // Get current render height (it considers HiDPI) +RLAPI int get_monitor_count(void); // Get number of connected monitors +RLAPI int get_current_monitor(void); // Get current connected monitor +RLAPI Vector2 get_monitor_position(int monitor); // Get specified monitor position +RLAPI int get_monitor_width(int monitor); // Get specified monitor width (current video mode used by monitor) +RLAPI int get_monitor_height(int monitor); // Get specified monitor height (current video mode used by monitor) +RLAPI int get_monitor_physical_width(int monitor); // Get specified monitor physical width in millimetres +RLAPI int get_monitor_physical_height(int monitor); // Get specified monitor physical height in millimetres +RLAPI int get_monitor_refresh_rate(int monitor); // Get specified monitor refresh rate +RLAPI Vector2 get_window_position(void); // Get window position XY on monitor +RLAPI Vector2 get_window_scale_dpi(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 set_clipboard_text(const char *text); // Set clipboard text content +RLAPI const char *GetClipboardText(void); // Get clipboard text content +RLAPI void enable_event_waiting(void); // Enable waiting for events on end_drawing(), no automatic event polling +RLAPI void disable_event_waiting(void); // Disable waiting for events on end_drawing(), automatic events polling // Cursor-related functions -RLAPI void RL_ShowCursor(void); // Shows cursor -RLAPI void RL_HideCursor(void); // Hides cursor -RLAPI bool RL_IsCursorHidden(void); // Check if cursor is not visible -RLAPI void RL_EnableCursor(void); // Enables cursor (unlock cursor) -RLAPI void RL_DisableCursor(void); // Disables cursor (lock cursor) -RLAPI bool RL_IsCursorOnScreen(void); // Check if cursor is on the screen +RLAPI void show_cursor(void); // Shows cursor +RLAPI void hide_cursor(void); // Hides cursor +RLAPI bool is_cursor_hidden(void); // Check if cursor is not visible +RLAPI void enable_cursor(void); // Enables cursor (unlock cursor) +RLAPI void disable_cursor(void); // Disables cursor (lock cursor) +RLAPI bool is_cursor_on_screen(void); // Check if cursor is on the screen // Drawing-related functions -RLAPI void RL_ClearBackground(RL_Color color); // Set background color (framebuffer clear color) -RLAPI void RL_BeginDrawing(void); // Setup canvas (framebuffer) to start drawing -RLAPI void RL_EndDrawing(void); // End canvas drawing and swap buffers (double buffering) -RLAPI void RL_BeginMode2D(RL_Camera2D camera); // Begin 2D mode with custom camera (2D) -RLAPI void RL_EndMode2D(void); // Ends 2D mode with custom camera -RLAPI void RL_BeginMode3D(RL_Camera3D camera); // Begin 3D mode with custom camera (3D) -RLAPI void RL_EndMode3D(void); // Ends 3D mode and returns to default 2D orthographic mode -RLAPI void RL_BeginTextureMode(RL_RenderTexture2D target); // Begin drawing to render texture -RLAPI void RL_EndTextureMode(void); // Ends drawing to render texture -RLAPI void RL_BeginShaderMode(RL_Shader shader); // Begin custom shader drawing -RLAPI void RL_EndShaderMode(void); // End custom shader drawing (use default shader) -RLAPI void RL_BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied, subtract, custom) -RLAPI void RL_EndBlendMode(void); // End blending mode (reset to default: alpha blending) -RLAPI void RL_BeginScissorMode(int x, int y, int width, int height); // Begin scissor mode (define screen area for following drawing) -RLAPI void RL_EndScissorMode(void); // End scissor mode -RLAPI void RL_BeginVrStereoMode(RL_VrStereoConfig config); // Begin stereo rendering (requires VR simulator) -RLAPI void RL_EndVrStereoMode(void); // End stereo rendering (requires VR simulator) +RLAPI void clear_background(Color color); // Set background color (framebuffer clear color) +RLAPI void begin_drawing(void); // Setup canvas (framebuffer) to start drawing +RLAPI void end_drawing(void); // End canvas drawing and swap buffers (double buffering) +RLAPI void begin_mode2d(Camera2D camera); // Begin 2D mode with custom camera (2D) +RLAPI void end_mode2_d(void); // Ends 2D mode with custom camera +RLAPI void begin_mode3d(Camera3D camera); // Begin 3D mode with custom camera (3D) +RLAPI void end_mode3d(void); // Ends 3D mode and returns to default 2D orthographic mode +RLAPI void begin_texture_mode(Render_Texture2D target); // Begin drawing to render texture +RLAPI void end_texture_mode(void); // Ends drawing to render texture +RLAPI void begin_shader_mode(Shader shader); // Begin custom shader drawing +RLAPI void end_shader_mode(void); // End custom shader drawing (use default shader) +RLAPI void begin_blend_mode(int mode); // Begin blending mode (alpha, additive, multiplied, subtract, custom) +RLAPI void end_blend_mode(void); // End blending mode (reset to default: alpha blending) +RLAPI void begin_scissor_mode(int x, int y, int width, int height); // Begin scissor mode (define screen area for following drawing) +RLAPI void end_scissor_mode(void); // End scissor mode +RLAPI void begin_vr_stereo_mode(VR_Stereo_Config config); // Begin stereo rendering (requires VR simulator) +RLAPI void end_vr_stereo_mode(void); // End stereo rendering (requires VR simulator) // VR stereo config functions for VR simulator -RLAPI RL_VrStereoConfig RL_LoadVrStereoConfig(RL_VrDeviceInfo device); // Load VR stereo config for VR simulator device parameters -RLAPI void RL_UnloadVrStereoConfig(RL_VrStereoConfig config); // Unload VR stereo config +RLAPI VR_Stereo_Config load_vr_stereo_config(VR_Device_Info device); // Load VR stereo config for VR simulator device parameters +RLAPI void unload_vr_stereo_config(VR_Stereo_Config config); // Unload VR stereo config -// RL_Shader management functions -// NOTE: RL_Shader functionality is not available on OpenGL 1.1 -RLAPI RL_Shader RL_LoadShader(const char *vsFileName, const char *fsFileName); // Load shader from files and bind default locations -RLAPI RL_Shader RL_LoadShaderFromMemory(const char *vsCode, const char *fsCode); // Load shader from code strings and bind default locations -RLAPI bool RL_IsShaderReady(RL_Shader shader); // Check if a shader is ready -RLAPI int RL_GetShaderLocation(RL_Shader shader, const char *uniformName); // Get shader uniform location -RLAPI int RL_GetShaderLocationAttrib(RL_Shader shader, const char *attribName); // Get shader attribute location -RLAPI void RL_SetShaderValue(RL_Shader shader, int locIndex, const void *value, int uniformType); // Set shader uniform value -RLAPI void RL_SetShaderValueV(RL_Shader shader, int locIndex, const void *value, int uniformType, int count); // Set shader uniform value vector -RLAPI void RL_SetShaderValueMatrix(RL_Shader shader, int locIndex, RL_Matrix mat); // Set shader uniform value (matrix 4x4) -RLAPI void RL_SetShaderValueTexture(RL_Shader shader, int locIndex, RL_Texture2D texture); // Set shader uniform value for texture (sampler2d) -RLAPI void RL_UnloadShader(RL_Shader shader); // Unload shader from GPU memory (VRAM) +// Shader management functions +// NOTE: Shader functionality is not available on OpenGL 1.1 +RLAPI Shader load_shader(const char *vsFileName, const char *fsFileName); // Load shader from files and bind default locations +RLAPI Shader load_shader_from_memory(const char *vsCode, const char *fsCode); // Load shader from code strings and bind default locations +RLAPI bool is_shader_ready(Shader shader); // Check if a shader is ready +RLAPI int get_shader_location(Shader shader, const char *uniformName); // Get shader uniform location +RLAPI int get_shader_location_attrib(Shader shader, const char *attribName); // Get shader attribute location +RLAPI void set_shader_value(Shader shader, int locIndex, const void *value, int uniformType); // Set shader uniform value +RLAPI void set_shader_value_v(Shader shader, int locIndex, const void *value, int uniformType, int count); // Set shader uniform value vector +RLAPI void set_shader_value_matrix(Shader shader, int locIndex, Matrix mat); // Set shader uniform value (matrix 4x4) +RLAPI void set_shader_value_texture(Shader shader, int locIndex, Texture2d texture); // Set shader uniform value for texture (sampler2d) +RLAPI void unload_shader(Shader shader); // Unload shader from GPU memory (VRAM) // Screen-space-related functions -RLAPI RL_Ray RL_GetMouseRay(RL_Vector2 mousePosition, RL_Camera camera); // Get a ray trace from mouse position -RLAPI RL_Matrix RL_GetCameraMatrix(RL_Camera camera); // Get camera transform matrix (view matrix) -RLAPI RL_Matrix RL_GetCameraMatrix2D(RL_Camera2D camera); // Get camera 2d transform matrix -RLAPI RL_Vector2 RL_GetWorldToScreen(RL_Vector3 position, RL_Camera camera); // Get the screen space position for a 3d world space position -RLAPI RL_Vector2 RL_GetScreenToWorld2D(RL_Vector2 position, RL_Camera2D camera); // Get the world space position for a 2d camera screen space position -RLAPI RL_Vector2 RL_GetWorldToScreenEx(RL_Vector3 position, RL_Camera camera, int width, int height); // Get size position for a 3d world space position -RLAPI RL_Vector2 RL_GetWorldToScreen2D(RL_Vector2 position, RL_Camera2D camera); // Get the screen space position for a 2d camera world space position +RLAPI Ray get_mouse_ray(Vector2 mousePosition, Camera camera); // Get a ray trace from mouse position +RLAPI Matrix get_camera_matrix(Camera camera); // Get camera transform matrix (view matrix) +RLAPI Matrix get_camera_matrix2d(Camera2D camera); // Get camera 2d transform matrix +RLAPI Vector2 get_world_to_screen(Vector3 position, Camera camera); // Get the screen space position for a 3d world space position +RLAPI Vector2 get_screen_to_world2d(Vector2 position, Camera2D camera); // Get the world space position for a 2d camera screen space position +RLAPI Vector2 get_world_to_screen_ex(Vector3 position, Camera camera, int width, int height); // Get size position for a 3d world space position +RLAPI Vector2 get_world_to_screen2d(Vector2 position, Camera2D camera); // Get the screen space position for a 2d camera world space position // Timing-related functions -RLAPI void RL_SetTargetFPS(int fps); // Set target FPS (maximum) -RLAPI float RL_GetFrameTime(void); // Get time in seconds for last frame drawn (delta time) -RLAPI double RL_GetTime(void); // Get elapsed time in seconds since RL_InitWindow() -RLAPI int RL_GetFPS(void); // Get current FPS +RLAPI void set_target_fps(int fps); // Set target FPS (maximum) +RLAPI float get_frame_time(void); // Get time in seconds for last frame drawn (delta time) +RLAPI double get_time(void); // Get elapsed time in seconds since init_window() +RLAPI int get_fps(void); // Get current FPS // Custom frame control functions // NOTE: Those functions are intended for advance users that want full control over the frame processing -// By default RL_EndDrawing() does this job: draws everything + RL_SwapScreenBuffer() + manage frame timing + RL_PollInputEvents() -// To avoid that behaviour and control frame processes manually, enable in config.h: SUPPORT_CUSTOM_FRAME_CONTROL -RLAPI void RL_SwapScreenBuffer(void); // Swap back buffer with front buffer (screen drawing) -RLAPI void RL_PollInputEvents(void); // Register all input events -RLAPI void RL_WaitTime(double seconds); // Wait for some time (halt program execution) +// By default end_drawing() does this job: draws everything + swap_screen_buffer() + manage frame timing + poll_input_events() +// To avoid that behaviour and control frame processes manually, enable in config.h: RL_SUPPORT_CUSTOM_FRAME_CONTROL +RLAPI void swap_screen_buffer(void); // Swap back buffer with front buffer (screen drawing) +RLAPI void poll_input_events(void); // Register all input events +RLAPI void wait_time(double seconds); // Wait for some time (halt program execution) // Random values generation functions -RLAPI void RL_SetRandomSeed(unsigned int seed); // Set the seed for the random number generator -RLAPI int RL_GetRandomValue(int min, int max); // Get a random value between min and max (both included) +RLAPI void set_random_seed(unsigned int seed); // Set the seed for the random number generator +RLAPI int get_random_value(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 +RLAPI void unload_random_sequence(int *sequence); // Unload random values sequence // Misc. functions -RLAPI void RL_TakeScreenshot(const char *fileName); // Takes a screenshot of current screen (filename extension defines format) -RLAPI void RL_SetConfigFlags(unsigned int flags); // Setup init configuration flags (view FLAGS) -RLAPI void RL_OpenURL(const char *url); // Open URL with default system browser (if available) +RLAPI void take_screenshot(const char *fileName); // Takes a screenshot of current screen (filename extension defines format) +RLAPI void set_config_flags(unsigned int flags); // Setup init configuration flags (view FLAGS) +RLAPI void open_url(const char *url); // Open URL with default system browser (if available) // NOTE: Following functions implemented in module [utils] //------------------------------------------------------------------ -RLAPI void RL_TraceLog(int logLevel, const char *text, ...); // Show trace log messages (RL_LOG_DEBUG, RL_LOG_INFO, RL_LOG_WARNING, RL_LOG_ERROR...) -RLAPI void RL_SetTraceLogLevel(int logLevel); // Set the current threshold (minimum) log level -RLAPI void *RL_MemAlloc(unsigned int size); // Internal memory allocator -RLAPI void *RL_MemRealloc(void *ptr, unsigned int size); // Internal memory reallocator -RLAPI void RL_MemFree(void *ptr); // Internal memory free +RLAPI void trace_log(int logLevel, const char *text, ...); // Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...) +RLAPI void set_trace_log_level(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 mem_free(void *ptr); // Internal memory free // Set custom callbacks // WARNING: Callbacks setup is intended for advance users -RLAPI void RL_SetTraceLogCallback(RL_TraceLogCallback callback); // Set custom trace log -RLAPI void RL_SetLoadFileDataCallback(RL_LoadFileDataCallback callback); // Set custom file binary data loader -RLAPI void RL_SetSaveFileDataCallback(RL_SaveFileDataCallback callback); // Set custom file binary data saver -RLAPI void RL_SetLoadFileTextCallback(RL_LoadFileTextCallback callback); // Set custom file text data loader -RLAPI void RL_SetSaveFileTextCallback(RL_SaveFileTextCallback callback); // Set custom file text data saver +RLAPI void set_trace_log_callback(TraceLogCallback callback); // Set custom trace log +RLAPI void set_load_file_data_callback(LoadFileDataCallback callback); // Set custom file binary data loader +RLAPI void set_save_file_data_callback(SaveFileDataCallback callback); // Set custom file binary data saver +RLAPI void set_load_file_text_callback(LoadFileTextCallback callback); // Set custom file text data loader +RLAPI void set_save_file_text_callback(SaveFileTextCallback callback); // Set custom file text data saver // Files management functions -RLAPI unsigned char *RL_LoadFileData(const char *fileName, int *dataSize); // Load file data as byte array (read) -RLAPI void RL_UnloadFileData(unsigned char *data); // Unload file data allocated by RL_LoadFileData() -RLAPI bool RL_SaveFileData(const char *fileName, void *data, int dataSize); // Save data to file from byte array (write), returns true on success -RLAPI bool RL_ExportDataAsCode(const unsigned char *data, int dataSize, const char *fileName); // Export data to code (.h), returns true on success -RLAPI char *RL_LoadFileText(const char *fileName); // Load text data from file (read), returns a '\0' terminated string -RLAPI void RL_UnloadFileText(char *text); // Unload file text data allocated by RL_LoadFileText() -RLAPI bool RL_SaveFileText(const char *fileName, char *text); // Save text data to file (write), string must be '\0' terminated, returns true on success +RLAPI unsigned char *LoadFileData(const char *fileName, int *dataSize); // Load file data as byte array (read) +RLAPI void unload_file_data(unsigned char *data); // Unload file data allocated by LoadFileData() +RLAPI bool save_file_data(const char *fileName, void *data, int dataSize); // Save data to file from byte array (write), returns true on success +RLAPI bool export_data_as_code(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 unload_file_text(char *text); // Unload file text data allocated by LoadFileText() +RLAPI bool save_file_text(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 RL_FileExists(const char *fileName); // Check if file exists -RLAPI bool RL_DirectoryExists(const char *dirPath); // Check if a directory path exists -RLAPI bool RL_IsFileExtension(const char *fileName, const char *ext); // Check file extension (including point: .png, .wav) -RLAPI int RL_GetFileLength(const char *fileName); // Get file length in bytes (NOTE: GetFileSize() conflicts with windows.h) -RLAPI const char *RL_GetFileExtension(const char *fileName); // Get pointer to extension for a filename string (includes dot: '.png') -RLAPI const char *RL_GetFileName(const char *filePath); // Get pointer to filename for a path string -RLAPI const char *RL_GetFileNameWithoutExt(const char *filePath); // Get filename string without extension (uses static string) -RLAPI const char *RL_GetDirectoryPath(const char *filePath); // Get full path for a given fileName with path (uses static string) -RLAPI const char *RL_GetPrevDirectoryPath(const char *dirPath); // Get previous directory path for a given path (uses static string) -RLAPI const char *RL_GetWorkingDirectory(void); // Get current working directory (uses static string) -RLAPI const char *RL_GetApplicationDirectory(void); // Get the directory of the running application (uses static string) -RLAPI bool RL_ChangeDirectory(const char *dir); // Change working directory, return true on success -RLAPI bool RL_IsPathFile(const char *path); // Check if a given path is a file or a directory -RLAPI RL_FilePathList RL_LoadDirectoryFiles(const char *dirPath); // Load directory filepaths -RLAPI RL_FilePathList RL_LoadDirectoryFilesEx(const char *basePath, const char *filter, bool scanSubdirs); // Load directory filepaths with extension filtering and recursive directory scan -RLAPI void RL_UnloadDirectoryFiles(RL_FilePathList files); // Unload filepaths -RLAPI bool RL_IsFileDropped(void); // Check if a file has been dropped into window -RLAPI RL_FilePathList RL_LoadDroppedFiles(void); // Load dropped filepaths -RLAPI void RL_UnloadDroppedFiles(RL_FilePathList files); // Unload dropped filepaths -RLAPI long RL_GetFileModTime(const char *fileName); // Get file modification time (last write time) +RLAPI bool file_exists(const char *fileName); // Check if file exists +RLAPI bool directory_exists(const char *dirPath); // Check if a directory path exists +RLAPI bool is_file_extension(const char *fileName, const char *ext); // Check file extension (including point: .png, .wav) +RLAPI int get_file_length(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 bool change_directory(const char *dir); // Change working directory, return true on success +RLAPI bool is_path_file(const char *path); // Check if a given path is a file or a directory +RLAPI File_Path_List load_directory_files(const char *dirPath); // Load directory filepaths +RLAPI File_Path_List load_directory_files_ex(const char *basePath, const char *filter, bool scanSubdirs); // Load directory filepaths with extension filtering and recursive directory scan +RLAPI void unload_directory_files(File_Path_List files); // Unload filepaths +RLAPI bool is_file_dropped(void); // Check if a file has been dropped into window +RLAPI File_Path_List load_dropped_files(void); // Load dropped filepaths +RLAPI void unload_dropped_files(File_Path_List files); // Unload dropped filepaths +RLAPI long get_file_mod_time(const char *fileName); // Get file modification time (last write time) // Compression/Encoding functionality -RLAPI unsigned char *RL_CompressData(const unsigned char *data, int dataSize, int *compDataSize); // Compress data (DEFLATE algorithm), memory must be RL_MemFree() -RLAPI unsigned char *RL_DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // Decompress data (DEFLATE algorithm), memory must be RL_MemFree() -RLAPI char *RL_EncodeDataBase64(const unsigned char *data, int dataSize, int *outputSize); // Encode data to Base64 string, memory must be RL_MemFree() -RLAPI unsigned char *RL_DecodeDataBase64(const unsigned char *data, int *outputSize); // Decode Base64 string data, memory must be RL_MemFree() +RLAPI unsigned char *CompressData(const unsigned char *data, int dataSize, int *compDataSize); // Compress data (DEFLATE algorithm), memory must be mem_free() +RLAPI unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // Decompress data (DEFLATE algorithm), memory must be mem_free() +RLAPI char *EncodeDataBase64(const unsigned char *data, int dataSize, int *outputSize); // Encode data to Base64 string, memory must be mem_free() +RLAPI unsigned char *DecodeDataBase64(const unsigned char *data, int *outputSize); // Decode Base64 string data, memory must be mem_free() // Automation events functionality -RLAPI RL_AutomationEventList RL_LoadAutomationEventList(const char *fileName); // Load automation events list from file, NULL for empty list, capacity = RL_MAX_AUTOMATION_EVENTS -RLAPI void RL_UnloadAutomationEventList(RL_AutomationEventList *list); // Unload automation events list from file -RLAPI bool RL_ExportAutomationEventList(RL_AutomationEventList list, const char *fileName); // Export automation events list as text file -RLAPI void RL_SetAutomationEventList(RL_AutomationEventList *list); // Set automation event list to record to -RLAPI void RL_SetAutomationEventBaseFrame(int frame); // Set automation event internal base frame to start recording -RLAPI void RL_StartAutomationEventRecording(void); // Start recording automation events (RL_AutomationEventList must be set) -RLAPI void RL_StopAutomationEventRecording(void); // Stop recording automation events -RLAPI void RL_PlayAutomationEvent(RL_AutomationEvent event); // Play a recorded automation event +RLAPI Automation_Event_List load_automation_event_list(const char *fileName); // Load automation events list from file, NULL for empty list, capacity = RL_MAX_AUTOMATION_EVENTS +RLAPI void unload_automation_event_list(Automation_Event_List *list); // Unload automation events list from file +RLAPI bool export_automation_event_list(Automation_Event_List list, const char *fileName); // Export automation events list as text file +RLAPI void set_automation_event_list(Automation_Event_List *list); // Set automation event list to record to +RLAPI void set_automation_event_base_frame(int frame); // Set automation event internal base frame to start recording +RLAPI void start_automation_event_recording(void); // Start recording automation events (Automation_Event_List must be set) +RLAPI void stop_automation_event_recording(void); // Stop recording automation events +RLAPI void play_automation_event(Automation_Event event); // Play a recorded automation event //------------------------------------------------------------------------------------ // Input Handling Functions (Module: core) //------------------------------------------------------------------------------------ // Input-related functions: keyboard -RLAPI bool RL_IsKeyPressed(int key); // Check if a key has been pressed once -RLAPI bool RL_IsKeyPressedRepeat(int key); // Check if a key has been pressed again (Only PLATFORM_DESKTOP) -RLAPI bool RL_IsKeyDown(int key); // Check if a key is being pressed -RLAPI bool RL_IsKeyReleased(int key); // Check if a key has been released once -RLAPI bool RL_IsKeyUp(int key); // Check if a key is NOT being pressed -RLAPI int RL_GetKeyPressed(void); // Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty -RLAPI int RL_GetCharPressed(void); // Get char pressed (unicode), call it multiple times for chars queued, returns 0 when the queue is empty -RLAPI void RL_SetExitKey(int key); // Set a custom key to exit program (default is ESC) +RLAPI bool is_key_pressed(int key); // Check if a key has been pressed once +RLAPI bool is_key_pressed_repeat(int key); // Check if a key has been pressed again (Only PLATFORM_DESKTOP) +RLAPI bool is_key_down(int key); // Check if a key is being pressed +RLAPI bool is_key_released(int key); // Check if a key has been released once +RLAPI bool is_key_up(int key); // Check if a key is NOT being pressed +RLAPI int get_key_pressed(void); // Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty +RLAPI int get_char_pressed(void); // Get char pressed (unicode), call it multiple times for chars queued, returns 0 when the queue is empty +RLAPI void set_exit_key(int key); // Set a custom key to exit program (default is ESC) // Input-related functions: gamepads -RLAPI bool RL_IsGamepadAvailable(int gamepad); // Check if a gamepad is available -RLAPI const char *RL_GetGamepadName(int gamepad); // Get gamepad internal name id -RLAPI bool RL_IsGamepadButtonPressed(int gamepad, int button); // Check if a gamepad button has been pressed once -RLAPI bool RL_IsGamepadButtonDown(int gamepad, int button); // Check if a gamepad button is being pressed -RLAPI bool RL_IsGamepadButtonReleased(int gamepad, int button); // Check if a gamepad button has been released once -RLAPI bool RL_IsGamepadButtonUp(int gamepad, int button); // Check if a gamepad button is NOT being pressed -RLAPI int RL_GetGamepadButtonPressed(void); // Get the last gamepad button pressed -RLAPI int RL_GetGamepadAxisCount(int gamepad); // Get gamepad axis count for a gamepad -RLAPI float RL_GetGamepadAxisMovement(int gamepad, int axis); // Get axis movement value for a gamepad axis -RLAPI int RL_SetGamepadMappings(const char *mappings); // Set internal gamepad mappings (SDL_GameControllerDB) +RLAPI bool is_gamepad_available(int gamepad); // Check if a gamepad is available +RLAPI const char *GetGamepadName(int gamepad); // Get gamepad internal name id +RLAPI bool is_gamepad_button_pressed(int gamepad, int button); // Check if a gamepad button has been pressed once +RLAPI bool is_gamepad_button_down(int gamepad, int button); // Check if a gamepad button is being pressed +RLAPI bool is_gamepad_button_released(int gamepad, int button); // Check if a gamepad button has been released once +RLAPI bool is_gamepad_button_up(int gamepad, int button); // Check if a gamepad button is NOT being pressed +RLAPI int get_gamepad_button_pressed(void); // Get the last gamepad button pressed +RLAPI int get_gamepad_axis_count(int gamepad); // Get gamepad axis count for a gamepad +RLAPI float get_gamepad_axis_movement(int gamepad, int axis); // Get axis movement value for a gamepad axis +RLAPI int set_gamepad_mappings(const char *mappings); // Set internal gamepad mappings (SDL_GameControllerDB) // Input-related functions: mouse -RLAPI bool RL_IsMouseButtonPressed(int button); // Check if a mouse button has been pressed once -RLAPI bool RL_IsMouseButtonDown(int button); // Check if a mouse button is being pressed -RLAPI bool RL_IsMouseButtonReleased(int button); // Check if a mouse button has been released once -RLAPI bool RL_IsMouseButtonUp(int button); // Check if a mouse button is NOT being pressed -RLAPI int RL_GetMouseX(void); // Get mouse position X -RLAPI int RL_GetMouseY(void); // Get mouse position Y -RLAPI RL_Vector2 RL_GetMousePosition(void); // Get mouse position XY -RLAPI RL_Vector2 RL_GetMouseDelta(void); // Get mouse delta between frames -RLAPI void RL_SetMousePosition(int x, int y); // Set mouse position XY -RLAPI void RL_SetMouseOffset(int offsetX, int offsetY); // Set mouse offset -RLAPI void RL_SetMouseScale(float scaleX, float scaleY); // Set mouse scaling -RLAPI float RL_GetMouseWheelMove(void); // Get mouse wheel movement for X or Y, whichever is larger -RLAPI RL_Vector2 RL_GetMouseWheelMoveV(void); // Get mouse wheel movement for both X and Y -RLAPI void RL_SetMouseCursor(int cursor); // Set mouse cursor +RLAPI bool is_mouse_button_pressed(int button); // Check if a mouse button has been pressed once +RLAPI bool is_mouse_button_down(int button); // Check if a mouse button is being pressed +RLAPI bool is_mouse_button_released(int button); // Check if a mouse button has been released once +RLAPI bool is_mouse_button_up(int button); // Check if a mouse button is NOT being pressed +RLAPI int get_mouse_x(void); // Get mouse position X +RLAPI int get_mouse_y(void); // Get mouse position Y +RLAPI Vector2 get_mouse_position(void); // Get mouse position XY +RLAPI Vector2 get_mouse_delta(void); // Get mouse delta between frames +RLAPI void set_mouse_position(int x, int y); // Set mouse position XY +RLAPI void set_mouse_offset(int offsetX, int offsetY); // Set mouse offset +RLAPI void set_mouse_scale(float scaleX, float scaleY); // Set mouse scaling +RLAPI float get_mouse_wheel_move(void); // Get mouse wheel movement for X or Y, whichever is larger +RLAPI Vector2 get_mouse_wheel_move_v(void); // Get mouse wheel movement for both X and Y +RLAPI void set_mouse_cursor(int cursor); // Set mouse cursor // Input-related functions: touch -RLAPI int RL_GetTouchX(void); // Get touch position X for touch point 0 (relative to screen size) -RLAPI int RL_GetTouchY(void); // Get touch position Y for touch point 0 (relative to screen size) -RLAPI RL_Vector2 RL_GetTouchPosition(int index); // Get touch position XY for a touch point index (relative to screen size) -RLAPI int RL_GetTouchPointId(int index); // Get touch point identifier for given index -RLAPI int RL_GetTouchPointCount(void); // Get number of touch points +RLAPI int get_touch_x(void); // Get touch position X for touch point 0 (relative to screen size) +RLAPI int get_touch_y(void); // Get touch position Y for touch point 0 (relative to screen size) +RLAPI Vector2 get_touch_position(int index); // Get touch position XY for a touch point index (relative to screen size) +RLAPI int get_touch_point_id(int index); // Get touch point identifier for given index +RLAPI int get_touch_point_count(void); // Get number of touch points //------------------------------------------------------------------------------------ // Gestures and Touch Handling Functions (Module: rgestures) //------------------------------------------------------------------------------------ -RLAPI void RL_SetGesturesEnabled(unsigned int flags); // Enable a set of gestures using flags -RLAPI bool RL_IsGestureDetected(unsigned int gesture); // Check if a gesture have been detected -RLAPI int RL_GetGestureDetected(void); // Get latest detected gesture -RLAPI float RL_GetGestureHoldDuration(void); // Get gesture hold time in milliseconds -RLAPI RL_Vector2 RL_GetGestureDragVector(void); // Get gesture drag vector -RLAPI float RL_GetGestureDragAngle(void); // Get gesture drag angle -RLAPI RL_Vector2 RL_GetGesturePinchVector(void); // Get gesture pinch delta -RLAPI float RL_GetGesturePinchAngle(void); // Get gesture pinch angle +RLAPI void set_gestures_enabled(unsigned int flags); // Enable a set of gestures using flags +RLAPI bool is_gesture_detected(unsigned int gesture); // Check if a gesture have been detected +RLAPI int get_gesture_detected(void); // Get latest detected gesture +RLAPI float get_gesture_hold_duration(void); // Get gesture hold time in milliseconds +RLAPI Vector2 get_gesture_drag_vector(void); // Get gesture drag vector +RLAPI float get_gesture_drag_angle(void); // Get gesture drag angle +RLAPI Vector2 get_gesture_pinch_vector(void); // Get gesture pinch delta +RLAPI float get_gesture_pinch_angle(void); // Get gesture pinch angle //------------------------------------------------------------------------------------ -// RL_Camera System Functions (Module: rcamera) +// Camera System Functions (Module: rcamera) //------------------------------------------------------------------------------------ -RLAPI void RL_UpdateCamera(RL_Camera *camera, int mode); // Update camera position for selected mode -RLAPI void RL_UpdateCameraPro(RL_Camera *camera, RL_Vector3 movement, RL_Vector3 rotation, float zoom); // Update camera movement/rotation +RLAPI void update_camera(Camera *camera, int mode); // Update camera position for selected mode +RLAPI void update_camera_pro(Camera *camera, Vector3 movement, Vector3 rotation, float zoom); // Update camera movement/rotation //------------------------------------------------------------------------------------ // Basic Shapes Drawing Functions (Module: shapes) @@ -1215,362 +1229,363 @@ RLAPI void RL_UpdateCameraPro(RL_Camera *camera, RL_Vector3 movement, RL_Vector3 // 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 RL_SetShapesTexture(RL_Texture2D texture, RL_Rectangle source); // Set texture and rectangle to be used on shapes drawing +RLAPI void set_shapes_texture(Texture2d texture, Rectangle source); // Set texture and rectangle to be used on shapes drawing // Basic shapes drawing functions -RLAPI void RL_DrawPixel(int posX, int posY, RL_Color color); // Draw a pixel -RLAPI void RL_DrawPixelV(RL_Vector2 position, RL_Color color); // Draw a pixel (Vector version) -RLAPI void RL_DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, RL_Color color); // Draw a line -RLAPI void RL_DrawLineV(RL_Vector2 startPos, RL_Vector2 endPos, RL_Color color); // Draw a line (using gl lines) -RLAPI void RL_DrawLineEx(RL_Vector2 startPos, RL_Vector2 endPos, float thick, RL_Color color); // Draw a line (using triangles/quads) -RLAPI void RL_DrawLineStrip(RL_Vector2 *points, int pointCount, RL_Color color); // Draw lines sequence (using gl lines) -RLAPI void RL_DrawLineBezier(RL_Vector2 startPos, RL_Vector2 endPos, float thick, RL_Color color); // Draw line segment cubic-bezier in-out interpolation -RLAPI void RL_DrawCircle(int centerX, int centerY, float radius, RL_Color color); // Draw a color-filled circle -RLAPI void RL_DrawCircleSector(RL_Vector2 center, float radius, float startAngle, float endAngle, int segments, RL_Color color); // Draw a piece of a circle -RLAPI void RL_DrawCircleSectorLines(RL_Vector2 center, float radius, float startAngle, float endAngle, int segments, RL_Color color); // Draw circle sector outline -RLAPI void RL_DrawCircleGradient(int centerX, int centerY, float radius, RL_Color color1, RL_Color color2); // Draw a gradient-filled circle -RLAPI void RL_DrawCircleV(RL_Vector2 center, float radius, RL_Color color); // Draw a color-filled circle (Vector version) -RLAPI void RL_DrawCircleLines(int centerX, int centerY, float radius, RL_Color color); // Draw circle outline -RLAPI void RL_DrawCircleLinesV(RL_Vector2 center, float radius, RL_Color color); // Draw circle outline (Vector version) -RLAPI void RL_DrawEllipse(int centerX, int centerY, float radiusH, float radiusV, RL_Color color); // Draw ellipse -RLAPI void RL_DrawEllipseLines(int centerX, int centerY, float radiusH, float radiusV, RL_Color color); // Draw ellipse outline -RLAPI void RL_DrawRing(RL_Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, RL_Color color); // Draw ring -RLAPI void RL_DrawRingLines(RL_Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, RL_Color color); // Draw ring outline -RLAPI void RL_DrawRectangle(int posX, int posY, int width, int height, RL_Color color); // Draw a color-filled rectangle -RLAPI void RL_DrawRectangleV(RL_Vector2 position, RL_Vector2 size, RL_Color color); // Draw a color-filled rectangle (Vector version) -RLAPI void RL_DrawRectangleRec(RL_Rectangle rec, RL_Color color); // Draw a color-filled rectangle -RLAPI void RL_DrawRectanglePro(RL_Rectangle rec, RL_Vector2 origin, float rotation, RL_Color color); // Draw a color-filled rectangle with pro parameters -RLAPI void RL_DrawRectangleGradientV(int posX, int posY, int width, int height, RL_Color color1, RL_Color color2);// Draw a vertical-gradient-filled rectangle -RLAPI void RL_DrawRectangleGradientH(int posX, int posY, int width, int height, RL_Color color1, RL_Color color2);// Draw a horizontal-gradient-filled rectangle -RLAPI void RL_DrawRectangleGradientEx(RL_Rectangle rec, RL_Color col1, RL_Color col2, RL_Color col3, RL_Color col4); // Draw a gradient-filled rectangle with custom vertex colors -RLAPI void RL_DrawRectangleLines(int posX, int posY, int width, int height, RL_Color color); // Draw rectangle outline -RLAPI void RL_DrawRectangleLinesEx(RL_Rectangle rec, float lineThick, RL_Color color); // Draw rectangle outline with extended parameters -RLAPI void RL_DrawRectangleRounded(RL_Rectangle rec, float roundness, int segments, RL_Color color); // Draw rectangle with rounded edges -RLAPI void RL_DrawRectangleRoundedLines(RL_Rectangle rec, float roundness, int segments, float lineThick, RL_Color color); // Draw rectangle with rounded edges outline -RLAPI void RL_DrawTriangle(RL_Vector2 v1, RL_Vector2 v2, RL_Vector2 v3, RL_Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) -RLAPI void RL_DrawTriangleLines(RL_Vector2 v1, RL_Vector2 v2, RL_Vector2 v3, RL_Color color); // Draw triangle outline (vertex in counter-clockwise order!) -RLAPI void RL_DrawTriangleFan(RL_Vector2 *points, int pointCount, RL_Color color); // Draw a triangle fan defined by points (first vertex is the center) -RLAPI void RL_DrawTriangleStrip(RL_Vector2 *points, int pointCount, RL_Color color); // Draw a triangle strip defined by points -RLAPI void RL_DrawPoly(RL_Vector2 center, int sides, float radius, float rotation, RL_Color color); // Draw a regular polygon (Vector version) -RLAPI void RL_DrawPolyLines(RL_Vector2 center, int sides, float radius, float rotation, RL_Color color); // Draw a polygon outline of n sides -RLAPI void RL_DrawPolyLinesEx(RL_Vector2 center, int sides, float radius, float rotation, float lineThick, RL_Color color); // Draw a polygon outline of n sides with extended parameters +RLAPI void draw_pixel(int posX, int posY, Color color); // Draw a pixel +RLAPI void draw_pixel_v(Vector2 position, Color color); // Draw a pixel (Vector version) +RLAPI void draw_line(int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw a line +RLAPI void draw_line_v(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (using gl lines) +RLAPI void draw_line_ex(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line (using triangles/quads) +RLAPI void draw_line_strip(Vector2 *points, int pointCount, Color color); // Draw lines sequence (using gl lines) +RLAPI void draw_line_bezier(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw line segment cubic-bezier in-out interpolation +RLAPI void draw_circle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle +RLAPI void draw_circle_sector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle +RLAPI void draw_circle_sector_lines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline +RLAPI void draw_circle_gradient(int centerX, int centerY, float radius, Color color1, Color color2); // Draw a gradient-filled circle +RLAPI void draw_circle_v(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version) +RLAPI void draw_circle_lines(int centerX, int centerY, float radius, Color color); // Draw circle outline +RLAPI void draw_circle_lines_v(Vector2 center, float radius, Color color); // Draw circle outline (Vector version) +RLAPI void draw_ellipse(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse +RLAPI void draw_ellipse_lines(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse outline +RLAPI void draw_ring(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring +RLAPI void draw_ring_lines(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring outline +RLAPI void draw_rectangle(int posX, int posY, int width, int height, Color color); // Draw a color-filled rectangle +RLAPI void draw_rectangle_v(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version) +RLAPI void draw_rectangle_rec(Rectangle rec, Color color); // Draw a color-filled rectangle +RLAPI void draw_rectangle_pro(Rectangle rec, Vector2 origin, float rotation, Color color); // Draw a color-filled rectangle with pro parameters +RLAPI void draw_rectangle_gradient_v(int posX, int posY, int width, int height, Color color1, Color color2);// Draw a vertical-gradient-filled rectangle +RLAPI void draw_rectangle_gradient_h(int posX, int posY, int width, int height, Color color1, Color color2);// Draw a horizontal-gradient-filled rectangle +RLAPI void draw_rectangle_gradient_ex(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // Draw a gradient-filled rectangle with custom vertex colors +RLAPI void draw_rectangle_lines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline +RLAPI void draw_rectangle_lines_ex(Rectangle rec, float lineThick, Color color); // Draw rectangle outline with extended parameters +RLAPI void draw_rectangle_rounded(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle with rounded edges +RLAPI void draw_rectangle_rounded_lines(Rectangle rec, float roundness, int segments, float lineThick, Color color); // Draw rectangle with rounded edges outline +RLAPI void draw_triangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +RLAPI void draw_triangle_lines(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline (vertex in counter-clockwise order!) +RLAPI void draw_triangle_fan(Vector2 *points, int pointCount, Color color); // Draw a triangle fan defined by points (first vertex is the center) +RLAPI void draw_triangle_strip(Vector2 *points, int pointCount, Color color); // Draw a triangle strip defined by points +RLAPI void draw_poly(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a regular polygon (Vector version) +RLAPI void draw_poly_lines(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a polygon outline of n sides +RLAPI void draw_poly_lines_ex(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(RL_Vector2 *points, int pointCount, float thick, RL_Color color); // Draw spline: Linear, minimum 2 points -RLAPI void DrawSplineBasis(RL_Vector2 *points, int pointCount, float thick, RL_Color color); // Draw spline: B-Spline, minimum 4 points -RLAPI void DrawSplineCatmullRom(RL_Vector2 *points, int pointCount, float thick, RL_Color color); // Draw spline: Catmull-Rom, minimum 4 points -RLAPI void DrawSplineBezierQuadratic(RL_Vector2 *points, int pointCount, float thick, RL_Color color); // Draw spline: Quadratic Bezier, minimum 3 points (1 control point): [p1, c2, p3, c4...] -RLAPI void DrawSplineBezierCubic(RL_Vector2 *points, int pointCount, float thick, RL_Color color); // Draw spline: Cubic Bezier, minimum 4 points (2 control points): [p1, c2, c3, p4, c5, c6...] -RLAPI void DrawSplineSegmentLinear(RL_Vector2 p1, RL_Vector2 p2, float thick, RL_Color color); // Draw spline segment: Linear, 2 points -RLAPI void DrawSplineSegmentBasis(RL_Vector2 p1, RL_Vector2 p2, RL_Vector2 p3, RL_Vector2 p4, float thick, RL_Color color); // Draw spline segment: B-Spline, 4 points -RLAPI void DrawSplineSegmentCatmullRom(RL_Vector2 p1, RL_Vector2 p2, RL_Vector2 p3, RL_Vector2 p4, float thick, RL_Color color); // Draw spline segment: Catmull-Rom, 4 points -RLAPI void DrawSplineSegmentBezierQuadratic(RL_Vector2 p1, RL_Vector2 c2, RL_Vector2 p3, float thick, RL_Color color); // Draw spline segment: Quadratic Bezier, 2 points, 1 control point -RLAPI void DrawSplineSegmentBezierCubic(RL_Vector2 p1, RL_Vector2 c2, RL_Vector2 c3, RL_Vector2 p4, float thick, RL_Color color); // Draw spline segment: Cubic Bezier, 2 points, 2 control points +RLAPI void draw_spline_linear(Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Linear, minimum 2 points +RLAPI void draw_spline_basis(Vector2 *points, int pointCount, float thick, Color color); // Draw spline: B-Spline, minimum 4 points +RLAPI void draw_spline_catmull_rom(Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Catmull-Rom, minimum 4 points +RLAPI void draw_spline_bezier_quadratic(Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Quadratic Bezier, minimum 3 points (1 control point): [p1, c2, p3, c4...] +RLAPI void draw_spline_bezier_cubic(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 draw_spline_segment_linear(Vector2 p1, Vector2 p2, float thick, Color color); // Draw spline segment: Linear, 2 points +RLAPI void draw_spline_segment_basis(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float thick, Color color); // Draw spline segment: B-Spline, 4 points +RLAPI void draw_spline_segment_catmull_rom(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float thick, Color color); // Draw spline segment: Catmull-Rom, 4 points +RLAPI void draw_spline_segment_bezier_quadratic(Vector2 p1, Vector2 c2, Vector2 p3, float thick, Color color); // Draw spline segment: Quadratic Bezier, 2 points, 1 control point +RLAPI void draw_spline_segment_bezier_cubic(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 RL_Vector2 GetSplinePointLinear(RL_Vector2 startPos, RL_Vector2 endPos, float t); // Get (evaluate) spline point: Linear -RLAPI RL_Vector2 GetSplinePointBasis(RL_Vector2 p1, RL_Vector2 p2, RL_Vector2 p3, RL_Vector2 p4, float t); // Get (evaluate) spline point: B-Spline -RLAPI RL_Vector2 GetSplinePointCatmullRom(RL_Vector2 p1, RL_Vector2 p2, RL_Vector2 p3, RL_Vector2 p4, float t); // Get (evaluate) spline point: Catmull-Rom -RLAPI RL_Vector2 GetSplinePointBezierQuad(RL_Vector2 p1, RL_Vector2 c2, RL_Vector2 p3, float t); // Get (evaluate) spline point: Quadratic Bezier -RLAPI RL_Vector2 GetSplinePointBezierCubic(RL_Vector2 p1, RL_Vector2 c2, RL_Vector2 c3, RL_Vector2 p4, float t); // Get (evaluate) spline point: Cubic Bezier +RLAPI Vector2 get_spline_point_linear(Vector2 startPos, Vector2 endPos, float t); // Get (evaluate) spline point: Linear +RLAPI Vector2 get_spline_point_basis(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float t); // Get (evaluate) spline point: B-Spline +RLAPI Vector2 get_spline_point_catmull_rom(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float t); // Get (evaluate) spline point: Catmull-Rom +RLAPI Vector2 get_spline_point_bezier_quad(Vector2 p1, Vector2 c2, Vector2 p3, float t); // Get (evaluate) spline point: Quadratic Bezier +RLAPI Vector2 get_spline_point_bezier_cubic(Vector2 p1, Vector2 c2, Vector2 c3, Vector2 p4, float t); // Get (evaluate) spline point: Cubic Bezier // Basic shapes collision detection functions -RLAPI bool RL_CheckCollisionRecs(RL_Rectangle rec1, RL_Rectangle rec2); // Check collision between two rectangles -RLAPI bool RL_CheckCollisionCircles(RL_Vector2 center1, float radius1, RL_Vector2 center2, float radius2); // Check collision between two circles -RLAPI bool RL_CheckCollisionCircleRec(RL_Vector2 center, float radius, RL_Rectangle rec); // Check collision between circle and rectangle -RLAPI bool RL_CheckCollisionPointRec(RL_Vector2 point, RL_Rectangle rec); // Check if point is inside rectangle -RLAPI bool RL_CheckCollisionPointCircle(RL_Vector2 point, RL_Vector2 center, float radius); // Check if point is inside circle -RLAPI bool RL_CheckCollisionPointTriangle(RL_Vector2 point, RL_Vector2 p1, RL_Vector2 p2, RL_Vector2 p3); // Check if point is inside a triangle -RLAPI bool RL_CheckCollisionPointPoly(RL_Vector2 point, RL_Vector2 *points, int pointCount); // Check if point is within a polygon described by array of vertices -RLAPI bool RL_CheckCollisionLines(RL_Vector2 startPos1, RL_Vector2 endPos1, RL_Vector2 startPos2, RL_Vector2 endPos2, RL_Vector2 *collisionPoint); // Check the collision between two lines defined by two points each, returns collision point by reference -RLAPI bool RL_CheckCollisionPointLine(RL_Vector2 point, RL_Vector2 p1, RL_Vector2 p2, int threshold); // Check if point belongs to line created between two points [p1] and [p2] with defined margin in pixels [threshold] -RLAPI RL_Rectangle RL_GetCollisionRec(RL_Rectangle rec1, RL_Rectangle rec2); // Get collision rectangle for two rectangles collision +RLAPI bool check_collision_recs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles +RLAPI bool check_collision_circles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles +RLAPI bool check_collision_circle_rec(Vector2 center, float radius, Rectangle rec); // Check collision between circle and rectangle +RLAPI bool check_collision_point_rec(Vector2 point, Rectangle rec); // Check if point is inside rectangle +RLAPI bool check_collision_point_circle(Vector2 point, Vector2 center, float radius); // Check if point is inside circle +RLAPI bool check_collision_point_triangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); // Check if point is inside a triangle +RLAPI bool check_collision_point_poly(Vector2 point, Vector2 *points, int pointCount); // Check if point is within a polygon described by array of vertices +RLAPI bool check_collision_lines(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 bool check_collision_point_line(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 Rectangle get_collision_rec(Rectangle rec1, Rectangle rec2); // Get collision rectangle for two rectangles collision //------------------------------------------------------------------------------------ -// RL_Texture Loading and Drawing Functions (Module: textures) +// Texture Loading and Drawing Functions (Module: textures) //------------------------------------------------------------------------------------ -// RL_Image loading functions +// Image loading functions // NOTE: These functions do not require GPU access -RLAPI RL_Image RL_LoadImage(const char *fileName); // Load image from file into CPU memory (RAM) -RLAPI RL_Image RL_LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image from RAW file data -RLAPI RL_Image RL_LoadImageSvg(const char *fileNameOrString, int width, int height); // Load image from SVG file data or string with specified size -RLAPI RL_Image RL_LoadImageAnim(const char *fileName, int *frames); // Load image sequence from file (frames appended to image.data) -RLAPI RL_Image RL_LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load image from memory buffer, fileType refers to extension: i.e. '.png' -RLAPI RL_Image RL_LoadImageFromTexture(RL_Texture2D texture); // Load image from GPU texture data -RLAPI RL_Image RL_LoadImageFromScreen(void); // Load image from screen buffer and (screenshot) -RLAPI bool RL_IsImageReady(RL_Image image); // Check if an image is ready -RLAPI void RL_UnloadImage(RL_Image image); // Unload image from CPU memory (RAM) -RLAPI bool RL_ExportImage(RL_Image image, const char *fileName); // Export image data to file, returns true on success -RLAPI unsigned char *RL_ExportImageToMemory(RL_Image image, const char *fileType, int *fileSize); // Export image to memory buffer -RLAPI bool RL_ExportImageAsCode(RL_Image image, const char *fileName); // Export image as code file defining an array of bytes, returns true on success +RLAPI Image load_image(const char *fileName); // Load image from file into CPU memory (RAM) +RLAPI Image load_image_raw(const char *fileName, int width, int height, int format, int headerSize); // Load image from RAW file data +RLAPI Image load_image_svg(const char *fileNameOrString, int width, int height); // Load image from SVG file data or string with specified size +RLAPI Image load_image_anim(const char *fileName, int *frames); // Load image sequence from file (frames appended to image.data) +RLAPI Image load_image_from_memory(const char *fileType, const unsigned char *fileData, int dataSize); // Load image from memory buffer, fileType refers to extension: i.e. '.png' +RLAPI Image load_image_from_texture(Texture2d texture); // Load image from GPU texture data +RLAPI Image load_image_from_screen(void); // Load image from screen buffer and (screenshot) +RLAPI bool is_image_ready(Image image); // Check if an image is ready +RLAPI void unload_image(Image image); // Unload image from CPU memory (RAM) +RLAPI bool export_image(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 export_image_as_code(Image image, const char *fileName); // Export image as code file defining an array of bytes, returns true on success -// RL_Image generation functions -RLAPI RL_Image RL_GenImageColor(int width, int height, RL_Color color); // Generate image: plain color -RLAPI RL_Image RL_GenImageGradientLinear(int width, int height, int direction, RL_Color start, RL_Color end); // Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient -RLAPI RL_Image RL_GenImageGradientRadial(int width, int height, float density, RL_Color inner, RL_Color outer); // Generate image: radial gradient -RLAPI RL_Image RL_GenImageGradientSquare(int width, int height, float density, RL_Color inner, RL_Color outer); // Generate image: square gradient -RLAPI RL_Image RL_GenImageChecked(int width, int height, int checksX, int checksY, RL_Color col1, RL_Color col2); // Generate image: checked -RLAPI RL_Image RL_GenImageWhiteNoise(int width, int height, float factor); // Generate image: white noise -RLAPI RL_Image RL_GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float scale); // Generate image: perlin noise -RLAPI RL_Image RL_GenImageCellular(int width, int height, int tileSize); // Generate image: cellular algorithm, bigger tileSize means bigger cells -RLAPI RL_Image RL_GenImageText(int width, int height, const char *text); // Generate image: grayscale image from text data +// Image generation functions +RLAPI Image gen_image_color(int width, int height, Color color); // Generate image: plain color +RLAPI Image gen_image_gradient_linear(int width, int height, int direction, Color start, Color end); // Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient +RLAPI Image gen_image_gradient_radial(int width, int height, float density, Color inner, Color outer); // Generate image: radial gradient +RLAPI Image gen_image_gradient_square(int width, int height, float density, Color inner, Color outer); // Generate image: square gradient +RLAPI Image gen_image_checked(int width, int height, int checksX, int checksY, Color col1, Color col2); // Generate image: checked +RLAPI Image gen_image_white_noise(int width, int height, float factor); // Generate image: white noise +RLAPI Image gen_image_perlin_noise(int width, int height, int offsetX, int offsetY, float scale); // Generate image: perlin noise +RLAPI Image gen_image_cellular(int width, int height, int tileSize); // Generate image: cellular algorithm, bigger tileSize means bigger cells +RLAPI Image gen_image_text(int width, int height, const char *text); // Generate image: grayscale image from text data -// RL_Image manipulation functions -RLAPI RL_Image RL_ImageCopy(RL_Image image); // Create an image duplicate (useful for transformations) -RLAPI RL_Image RL_ImageFromImage(RL_Image image, RL_Rectangle rec); // Create an image from another image piece -RLAPI RL_Image RL_ImageText(const char *text, int fontSize, RL_Color color); // Create an image from text (default font) -RLAPI RL_Image RL_ImageTextEx(RL_Font font, const char *text, float fontSize, float spacing, RL_Color tint); // Create an image from text (custom sprite font) -RLAPI void RL_ImageFormat(RL_Image *image, int newFormat); // Convert image data to desired format -RLAPI void RL_ImageToPOT(RL_Image *image, RL_Color fill); // Convert image to POT (power-of-two) -RLAPI void RL_ImageCrop(RL_Image *image, RL_Rectangle crop); // Crop an image to a defined rectangle -RLAPI void RL_ImageAlphaCrop(RL_Image *image, float threshold); // Crop image depending on alpha value -RLAPI void RL_ImageAlphaClear(RL_Image *image, RL_Color color, float threshold); // Clear alpha channel to desired color -RLAPI void RL_ImageAlphaMask(RL_Image *image, RL_Image alphaMask); // Apply alpha mask to image -RLAPI void RL_ImageAlphaPremultiply(RL_Image *image); // Premultiply alpha channel -RLAPI void RL_ImageBlurGaussian(RL_Image *image, int blurSize); // Apply Gaussian blur using a box blur approximation -RLAPI void RL_ImageResize(RL_Image *image, int newWidth, int newHeight); // Resize image (Bicubic scaling algorithm) -RLAPI void RL_ImageResizeNN(RL_Image *image, int newWidth,int newHeight); // Resize image (Nearest-Neighbor scaling algorithm) -RLAPI void RL_ImageResizeCanvas(RL_Image *image, int newWidth, int newHeight, int offsetX, int offsetY, RL_Color fill); // Resize canvas and fill with color -RLAPI void RL_ImageMipmaps(RL_Image *image); // Compute all mipmap levels for a provided image -RLAPI void RL_ImageDither(RL_Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) -RLAPI void RL_ImageFlipVertical(RL_Image *image); // Flip image vertically -RLAPI void RL_ImageFlipHorizontal(RL_Image *image); // Flip image horizontally -RLAPI void RL_ImageRotate(RL_Image *image, int degrees); // Rotate image by input angle in degrees (-359 to 359) -RLAPI void RL_ImageRotateCW(RL_Image *image); // Rotate image clockwise 90deg -RLAPI void RL_ImageRotateCCW(RL_Image *image); // Rotate image counter-clockwise 90deg -RLAPI void RL_ImageColorTint(RL_Image *image, RL_Color color); // Modify image color: tint -RLAPI void RL_ImageColorInvert(RL_Image *image); // Modify image color: invert -RLAPI void RL_ImageColorGrayscale(RL_Image *image); // Modify image color: grayscale -RLAPI void RL_ImageColorContrast(RL_Image *image, float contrast); // Modify image color: contrast (-100 to 100) -RLAPI void RL_ImageColorBrightness(RL_Image *image, int brightness); // Modify image color: brightness (-255 to 255) -RLAPI void RL_ImageColorReplace(RL_Image *image, RL_Color color, RL_Color replace); // Modify image color: replace color -RLAPI RL_Color *RL_LoadImageColors(RL_Image image); // Load color data from image as a RL_Color array (RGBA - 32bit) -RLAPI RL_Color *RL_LoadImagePalette(RL_Image image, int maxPaletteSize, int *colorCount); // Load colors palette from image as a RL_Color array (RGBA - 32bit) -RLAPI void RL_UnloadImageColors(RL_Color *colors); // Unload color data loaded with RL_LoadImageColors() -RLAPI void RL_UnloadImagePalette(RL_Color *colors); // Unload colors palette loaded with RL_LoadImagePalette() -RLAPI RL_Rectangle RL_GetImageAlphaBorder(RL_Image image, float threshold); // Get image alpha border rectangle -RLAPI RL_Color RL_GetImageColor(RL_Image image, int x, int y); // Get image pixel color at (x, y) position +// Image manipulation functions +RLAPI Image image_copy(Image image); // Create an image duplicate (useful for transformations) +RLAPI Image image_from_image(Image image, Rectangle rec); // Create an image from another image piece +RLAPI Image image_text(const char *text, int fontSize, Color color); // Create an image from text (default font) +RLAPI Image image_text_ex(Font font, const char *text, float fontSize, float spacing, Color tint); // Create an image from text (custom sprite font) +RLAPI void image_format(Image *image, int newFormat); // Convert image data to desired format +RLAPI void image_to_pot(Image *image, Color fill); // Convert image to POT (power-of-two) +RLAPI void image_crop(Image *image, Rectangle crop); // Crop an image to a defined rectangle +RLAPI void image_alpha_crop(Image *image, float threshold); // Crop image depending on alpha value +RLAPI void image_alpha_clear(Image *image, Color color, float threshold); // Clear alpha channel to desired color +RLAPI void image_alpha_mask(Image *image, Image alphaMask); // Apply alpha mask to image +RLAPI void image_alpha_premultiply(Image *image); // Premultiply alpha channel +RLAPI void image_blur_gaussian(Image *image, int blurSize); // Apply Gaussian blur using a box blur approximation +RLAPI void ImageKernelConvolution(Image *image, float* kernel, int kernelSize); // Apply Custom Square image convolution kernel +RLAPI void image_resize(Image *image, int newWidth, int newHeight); // Resize image (Bicubic scaling algorithm) +RLAPI void image_resize_nn(Image *image, int newWidth,int newHeight); // Resize image (Nearest-Neighbor scaling algorithm) +RLAPI void image_resize_canvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color fill); // Resize canvas and fill with color +RLAPI void image_mipmaps(Image *image); // Compute all mipmap levels for a provided image +RLAPI void image_dither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) +RLAPI void image_flip_vertical(Image *image); // Flip image vertically +RLAPI void image_flip_horizontal(Image *image); // Flip image horizontally +RLAPI void image_rotate(Image *image, int degrees); // Rotate image by input angle in degrees (-359 to 359) +RLAPI void image_rotate_cw(Image *image); // Rotate image clockwise 90deg +RLAPI void image_rotate_ccw(Image *image); // Rotate image counter-clockwise 90deg +RLAPI void image_color_tint(Image *image, Color color); // Modify image color: tint +RLAPI void image_color_invert(Image *image); // Modify image color: invert +RLAPI void image_color_grayscale(Image *image); // Modify image color: grayscale +RLAPI void image_color_contrast(Image *image, float contrast); // Modify image color: contrast (-100 to 100) +RLAPI void image_color_brightness(Image *image, int brightness); // Modify image color: brightness (-255 to 255) +RLAPI void image_color_replace(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 unload_image_colors(Color *colors); // Unload color data loaded with LoadImageColors() +RLAPI void unload_image_palette(Color *colors); // Unload colors palette loaded with LoadImagePalette() +RLAPI Rectangle get_image_alpha_border(Image image, float threshold); // Get image alpha border rectangle +RLAPI Color get_image_color(Image image, int x, int y); // Get image pixel color at (x, y) position -// RL_Image drawing functions -// NOTE: RL_Image software-rendering functions (CPU) -RLAPI void RL_ImageClearBackground(RL_Image *dst, RL_Color color); // Clear image background with given color -RLAPI void RL_ImageDrawPixel(RL_Image *dst, int posX, int posY, RL_Color color); // Draw pixel within an image -RLAPI void RL_ImageDrawPixelV(RL_Image *dst, RL_Vector2 position, RL_Color color); // Draw pixel within an image (Vector version) -RLAPI void RL_ImageDrawLine(RL_Image *dst, int startPosX, int startPosY, int endPosX, int endPosY, RL_Color color); // Draw line within an image -RLAPI void RL_ImageDrawLineV(RL_Image *dst, RL_Vector2 start, RL_Vector2 end, RL_Color color); // Draw line within an image (Vector version) -RLAPI void RL_ImageDrawCircle(RL_Image *dst, int centerX, int centerY, int radius, RL_Color color); // Draw a filled circle within an image -RLAPI void RL_ImageDrawCircleV(RL_Image *dst, RL_Vector2 center, int radius, RL_Color color); // Draw a filled circle within an image (Vector version) -RLAPI void RL_ImageDrawCircleLines(RL_Image *dst, int centerX, int centerY, int radius, RL_Color color); // Draw circle outline within an image -RLAPI void RL_ImageDrawCircleLinesV(RL_Image *dst, RL_Vector2 center, int radius, RL_Color color); // Draw circle outline within an image (Vector version) -RLAPI void RL_ImageDrawRectangle(RL_Image *dst, int posX, int posY, int width, int height, RL_Color color); // Draw rectangle within an image -RLAPI void RL_ImageDrawRectangleV(RL_Image *dst, RL_Vector2 position, RL_Vector2 size, RL_Color color); // Draw rectangle within an image (Vector version) -RLAPI void RL_ImageDrawRectangleRec(RL_Image *dst, RL_Rectangle rec, RL_Color color); // Draw rectangle within an image -RLAPI void RL_ImageDrawRectangleLines(RL_Image *dst, RL_Rectangle rec, int thick, RL_Color color); // Draw rectangle lines within an image -RLAPI void RL_ImageDraw(RL_Image *dst, RL_Image src, RL_Rectangle srcRec, RL_Rectangle dstRec, RL_Color tint); // Draw a source image within a destination image (tint applied to source) -RLAPI void RL_ImageDrawText(RL_Image *dst, const char *text, int posX, int posY, int fontSize, RL_Color color); // Draw text (using default font) within an image (destination) -RLAPI void RL_ImageDrawTextEx(RL_Image *dst, RL_Font font, const char *text, RL_Vector2 position, float fontSize, float spacing, RL_Color tint); // Draw text (custom sprite font) within an image (destination) +// Image drawing functions +// NOTE: Image software-rendering functions (CPU) +RLAPI void ImageClearBackground(Image *dst, Color color); // Clear image background with given color +RLAPI void image_draw_pixel(Image *dst, int posX, int posY, Color color); // Draw pixel within an image +RLAPI void image_draw_pixel_v(Image *dst, Vector2 position, Color color); // Draw pixel within an image (Vector version) +RLAPI void image_draw_line(Image *dst, int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw line within an image +RLAPI void image_draw_line_v(Image *dst, Vector2 start, Vector2 end, Color color); // Draw line within an image (Vector version) +RLAPI void image_draw_circle(Image *dst, int centerX, int centerY, int radius, Color color); // Draw a filled circle within an image +RLAPI void image_draw_circle_v(Image *dst, Vector2 center, int radius, Color color); // Draw a filled circle within an image (Vector version) +RLAPI void image_draw_circle_lines(Image *dst, int centerX, int centerY, int radius, Color color); // Draw circle outline within an image +RLAPI void image_draw_circle_lines_v(Image *dst, Vector2 center, int radius, Color color); // Draw circle outline within an image (Vector version) +RLAPI void image_draw_rectangle(Image *dst, int posX, int posY, int width, int height, Color color); // Draw rectangle within an image +RLAPI void image_draw_rectangle_v(Image *dst, Vector2 position, Vector2 size, Color color); // Draw rectangle within an image (Vector version) +RLAPI void image_draw_rectangle_rec(Image *dst, Rectangle rec, Color color); // Draw rectangle within an image +RLAPI void image_draw_rectangle_lines(Image *dst, Rectangle rec, int thick, Color color); // Draw rectangle lines within an image +RLAPI void image_draw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint); // Draw a source image within a destination image (tint applied to source) +RLAPI void image_draw_text(Image *dst, const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) within an image (destination) +RLAPI void image_draw_text_ex(Image *dst, Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text (custom sprite font) within an image (destination) -// RL_Texture loading functions +// Texture loading functions // NOTE: These functions require GPU access -RLAPI RL_Texture2D RL_LoadTexture(const char *fileName); // Load texture from file into GPU memory (VRAM) -RLAPI RL_Texture2D RL_LoadTextureFromImage(RL_Image image); // Load texture from image data -RLAPI RL_TextureCubemap RL_LoadTextureCubemap(RL_Image image, int layout); // Load cubemap from image, multiple image cubemap layouts supported -RLAPI RL_RenderTexture2D RL_LoadRenderTexture(int width, int height); // Load texture for rendering (framebuffer) -RLAPI bool RL_IsTextureReady(RL_Texture2D texture); // Check if a texture is ready -RLAPI void RL_UnloadTexture(RL_Texture2D texture); // Unload texture from GPU memory (VRAM) -RLAPI bool RL_IsRenderTextureReady(RL_RenderTexture2D target); // Check if a render texture is ready -RLAPI void RL_UnloadRenderTexture(RL_RenderTexture2D target); // Unload render texture from GPU memory (VRAM) -RLAPI void RL_UpdateTexture(RL_Texture2D texture, const void *pixels); // Update GPU texture with new data -RLAPI void RL_UpdateTextureRec(RL_Texture2D texture, RL_Rectangle rec, const void *pixels); // Update GPU texture rectangle with new data +RLAPI Texture2d load_texture(const char *fileName); // Load texture from file into GPU memory (VRAM) +RLAPI Texture2d load_texture_from_image(Image image); // Load texture from image data +RLAPI Texture_Cubemap load_texture_cubemap(Image image, int layout); // Load cubemap from image, multiple image cubemap layouts supported +RLAPI Render_Texture2D load_render_texture(int width, int height); // Load texture for rendering (framebuffer) +RLAPI bool is_texture_ready(Texture2d texture); // Check if a texture is ready +RLAPI void unload_texture(Texture2d texture); // Unload texture from GPU memory (VRAM) +RLAPI bool is_render_texture_ready(Render_Texture2D target); // Check if a render texture is ready +RLAPI void unload_render_texture(Render_Texture2D target); // Unload render texture from GPU memory (VRAM) +RLAPI void update_texture(Texture2d texture, const void *pixels); // Update GPU texture with new data +RLAPI void update_texture_rec(Texture2d texture, Rectangle rec, const void *pixels); // Update GPU texture rectangle with new data -// RL_Texture configuration functions -RLAPI void RL_GenTextureMipmaps(RL_Texture2D *texture); // Generate GPU mipmaps for a texture -RLAPI void RL_SetTextureFilter(RL_Texture2D texture, int filter); // Set texture scaling filter mode -RLAPI void RL_SetTextureWrap(RL_Texture2D texture, int wrap); // Set texture wrapping mode +// Texture configuration functions +RLAPI void gen_texture_mipmaps(Texture2d *texture); // Generate GPU mipmaps for a texture +RLAPI void set_texture_filter(Texture2d texture, int filter); // Set texture scaling filter mode +RLAPI void set_texture_wrap(Texture2d texture, int wrap); // Set texture wrapping mode -// RL_Texture drawing functions -RLAPI void RL_DrawTexture(RL_Texture2D texture, int posX, int posY, RL_Color tint); // Draw a RL_Texture2D -RLAPI void RL_DrawTextureV(RL_Texture2D texture, RL_Vector2 position, RL_Color tint); // Draw a RL_Texture2D with position defined as RL_Vector2 -RLAPI void RL_DrawTextureEx(RL_Texture2D texture, RL_Vector2 position, float rotation, float scale, RL_Color tint); // Draw a RL_Texture2D with extended parameters -RLAPI void RL_DrawTextureRec(RL_Texture2D texture, RL_Rectangle source, RL_Vector2 position, RL_Color tint); // Draw a part of a texture defined by a rectangle -RLAPI void RL_DrawTexturePro(RL_Texture2D texture, RL_Rectangle source, RL_Rectangle dest, RL_Vector2 origin, float rotation, RL_Color tint); // Draw a part of a texture defined by a rectangle with 'pro' parameters -RLAPI void RL_DrawTextureNPatch(RL_Texture2D texture, RL_NPatchInfo nPatchInfo, RL_Rectangle dest, RL_Vector2 origin, float rotation, RL_Color tint); // Draws a texture (or part of it) that stretches or shrinks nicely +// Texture drawing functions +RLAPI void draw_texture(Texture2d texture, int posX, int posY, Color tint); // Draw a Texture2d +RLAPI void draw_texture_v(Texture2d texture, Vector2 position, Color tint); // Draw a Texture2d with position defined as Vector2 +RLAPI void draw_texture_ex(Texture2d texture, Vector2 position, float rotation, float scale, Color tint); // Draw a Texture2d with extended parameters +RLAPI void draw_texture_rec(Texture2d texture, Rectangle source, Vector2 position, Color tint); // Draw a part of a texture defined by a rectangle +RLAPI void draw_texture_pro(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 draw_texture_npatch(Texture2d texture, N_Patch_Info nPatchInfo, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draws a texture (or part of it) that stretches or shrinks nicely -// RL_Color/pixel related functions -RLAPI RL_Color RL_Fade(RL_Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f -RLAPI int RL_ColorToInt(RL_Color color); // Get hexadecimal value for a RL_Color -RLAPI RL_Vector4 RL_ColorNormalize(RL_Color color); // Get RL_Color normalized as float [0..1] -RLAPI RL_Color RL_ColorFromNormalized(RL_Vector4 normalized); // Get RL_Color from normalized values [0..1] -RLAPI RL_Vector3 RL_ColorToHSV(RL_Color color); // Get HSV values for a RL_Color, hue [0..360], saturation/value [0..1] -RLAPI RL_Color RL_ColorFromHSV(float hue, float saturation, float value); // Get a RL_Color from HSV values, hue [0..360], saturation/value [0..1] -RLAPI RL_Color RL_ColorTint(RL_Color color, RL_Color tint); // Get color multiplied with another color -RLAPI RL_Color RL_ColorBrightness(RL_Color color, float factor); // Get color with brightness correction, brightness factor goes from -1.0f to 1.0f -RLAPI RL_Color RL_ColorContrast(RL_Color color, float contrast); // Get color with contrast correction, contrast values between -1.0f and 1.0f -RLAPI RL_Color RL_ColorAlpha(RL_Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f -RLAPI RL_Color RL_ColorAlphaBlend(RL_Color dst, RL_Color src, RL_Color tint); // Get src alpha-blended into dst color with tint -RLAPI RL_Color RL_GetColor(unsigned int hexValue); // Get RL_Color structure from hexadecimal value -RLAPI RL_Color RL_GetPixelColor(void *srcPtr, int format); // Get RL_Color from a source pixel pointer of certain format -RLAPI void RL_SetPixelColor(void *dstPtr, RL_Color color, int format); // Set color formatted into destination pixel pointer -RLAPI int RL_GetPixelDataSize(int width, int height, int format); // Get pixel data size in bytes for certain format +// Color/pixel related functions +RLAPI Color fade(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f +RLAPI int color_to_int(Color color); // Get hexadecimal value for a Color +RLAPI Vector4 color_normalize(Color color); // Get Color normalized as float [0..1] +RLAPI Color color_from_normalized(Vector4 normalized); // Get Color from normalized values [0..1] +RLAPI Vector3 color_to_hsv(Color color); // Get HSV values for a Color, hue [0..360], saturation/value [0..1] +RLAPI Color color_from_hsv(float hue, float saturation, float value); // Get a Color from HSV values, hue [0..360], saturation/value [0..1] +RLAPI Color color_tint(Color color, Color tint); // Get color multiplied with another color +RLAPI Color color_brightness(Color color, float factor); // Get color with brightness correction, brightness factor goes from -1.0f to 1.0f +RLAPI Color color_contrast(Color color, float contrast); // Get color with contrast correction, contrast values between -1.0f and 1.0f +RLAPI Color color_alpha(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f +RLAPI Color color_alpha_blend(Color dst, Color src, Color tint); // Get src alpha-blended into dst color with tint +RLAPI Color get_color(unsigned int hexValue); // Get Color structure from hexadecimal value +RLAPI Color get_pixel_color(void *srcPtr, int format); // Get Color from a source pixel pointer of certain format +RLAPI void set_pixel_color(void *dstPtr, Color color, int format); // Set color formatted into destination pixel pointer +RLAPI int get_pixel_data_size(int width, int height, int format); // Get pixel data size in bytes for certain format //------------------------------------------------------------------------------------ -// RL_Font Loading and Text Drawing Functions (Module: text) +// Font Loading and Text Drawing Functions (Module: text) //------------------------------------------------------------------------------------ -// RL_Font loading/unloading functions -RLAPI RL_Font RL_GetFontDefault(void); // Get the default RL_Font -RLAPI RL_Font RL_LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM) -RLAPI RL_Font RL_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 -RLAPI RL_Font RL_LoadFontFromImage(RL_Image image, RL_Color key, int firstChar); // Load font from RL_Image (XNA style) -RLAPI RL_Font RL_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 RL_IsFontReady(RL_Font font); // Check if a font is ready -RLAPI RL_GlyphInfo *RL_LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *codepoints, int codepointCount, int type); // Load font data for further use -RLAPI RL_Image RL_GenImageFontAtlas(const RL_GlyphInfo *glyphs, RL_Rectangle **glyphRecs, int glyphCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info -RLAPI void RL_UnloadFontData(RL_GlyphInfo *glyphs, int glyphCount); // Unload font chars info data (RAM) -RLAPI void RL_UnloadFont(RL_Font font); // Unload font from GPU memory (VRAM) -RLAPI bool RL_ExportFontAsCode(RL_Font font, const char *fileName); // Export font as code file, returns true on success +// Font loading/unloading functions +RLAPI Font get_font_default(void); // Get the default Font +RLAPI Font load_font(const char *fileName); // Load font from file into GPU memory (VRAM) +RLAPI Font load_font_ex(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 +RLAPI Font load_font_from_image(Image image, Color key, int firstChar); // Load font from Image (XNA style) +RLAPI Font load_font_from_memory(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 is_font_ready(Font font); // Check if a font is ready +RLAPI Glyph_Info *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *codepoints, int codepointCount, int type); // Load font data for further use +RLAPI Image gen_image_font_atlas(const Glyph_Info *glyphs, Rectangle **glyphRecs, int glyphCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info +RLAPI void unload_font_data(Glyph_Info *glyphs, int glyphCount); // Unload font chars info data (RAM) +RLAPI void unload_font(Font font); // Unload font from GPU memory (VRAM) +RLAPI bool export_font_as_code(Font font, const char *fileName); // Export font as code file, returns true on success // Text drawing functions -RLAPI void RL_DrawFPS(int posX, int posY); // Draw current FPS -RLAPI void RL_DrawText(const char *text, int posX, int posY, int fontSize, RL_Color color); // Draw text (using default font) -RLAPI void RL_DrawTextEx(RL_Font font, const char *text, RL_Vector2 position, float fontSize, float spacing, RL_Color tint); // Draw text using font and additional parameters -RLAPI void RL_DrawTextPro(RL_Font font, const char *text, RL_Vector2 position, RL_Vector2 origin, float rotation, float fontSize, float spacing, RL_Color tint); // Draw text using RL_Font and pro parameters (rotation) -RLAPI void RL_DrawTextCodepoint(RL_Font font, int codepoint, RL_Vector2 position, float fontSize, RL_Color tint); // Draw one character (codepoint) -RLAPI void RL_DrawTextCodepoints(RL_Font font, const int *codepoints, int codepointCount, RL_Vector2 position, float fontSize, float spacing, RL_Color tint); // Draw multiple character (codepoint) +RLAPI void draw_fps(int posX, int posY); // Draw current FPS +RLAPI void draw_text(const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) +RLAPI void draw_text_ex(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text using font and additional parameters +RLAPI void draw_text_pro(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 draw_text_codepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint); // Draw one character (codepoint) +RLAPI void draw_text_codepoints(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 RL_SetTextLineSpacing(int spacing); // Set vertical line spacing when drawing with line-breaks -RLAPI int RL_MeasureText(const char *text, int fontSize); // Measure string width for default font -RLAPI RL_Vector2 RL_MeasureTextEx(RL_Font font, const char *text, float fontSize, float spacing); // Measure string size for RL_Font -RLAPI int RL_GetGlyphIndex(RL_Font font, int codepoint); // Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found -RLAPI RL_GlyphInfo RL_GetGlyphInfo(RL_Font font, int codepoint); // Get glyph font info data for a codepoint (unicode character), fallback to '?' if not found -RLAPI RL_Rectangle RL_GetGlyphAtlasRec(RL_Font font, int codepoint); // Get glyph rectangle in font atlas for a codepoint (unicode character), fallback to '?' if not found +RLAPI void set_text_line_spacing(int spacing); // Set vertical line spacing when drawing with line-breaks +RLAPI int measure_text(const char *text, int fontSize); // Measure string width for default font +RLAPI Vector2 measure_text_ex(Font font, const char *text, float fontSize, float spacing); // Measure string size for Font +RLAPI int get_glyph_index(Font font, int codepoint); // Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found +RLAPI Glyph_Info get_glyph_info(Font font, int codepoint); // Get glyph font info data for a codepoint (unicode character), fallback to '?' if not found +RLAPI Rectangle get_glyph_atlas_rec(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 *RL_LoadUTF8(const int *codepoints, int length); // Load UTF-8 text encoded from codepoints array -RLAPI void RL_UnloadUTF8(char *text); // Unload UTF-8 text encoded from codepoints array -RLAPI int *RL_LoadCodepoints(const char *text, int *count); // Load all codepoints from a UTF-8 text string, codepoints count returned by parameter -RLAPI void RL_UnloadCodepoints(int *codepoints); // Unload codepoints data from memory -RLAPI int RL_GetCodepointCount(const char *text); // Get total number of codepoints in a UTF-8 encoded string -RLAPI int RL_GetCodepoint(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure -RLAPI int RL_GetCodepointNext(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure -RLAPI int RL_GetCodepointPrevious(const char *text, int *codepointSize); // Get previous codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure -RLAPI const char *RL_CodepointToUTF8(int codepoint, int *utf8Size); // Encode one codepoint into UTF-8 byte array (array length returned as parameter) +RLAPI char *LoadUTF8(const int *codepoints, int length); // Load UTF-8 text encoded from codepoints array +RLAPI void unload_utf8(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 unload_codepoints(int *codepoints); // Unload codepoints data from memory +RLAPI int get_codepoint_count(const char *text); // Get total number of codepoints in a UTF-8 encoded string +RLAPI int get_codepoint(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI int get_codepoint_next(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI int get_codepoint_previous(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 RL_TextCopy(char *dst, const char *src); // Copy one string to another, returns bytes copied -RLAPI bool RL_TextIsEqual(const char *text1, const char *text2); // Check if two text string are equal -RLAPI unsigned int RL_TextLength(const char *text); // Get text length, checks for '\0' ending -RLAPI const char *RL_TextFormat(const char *text, ...); // Text formatting with variables (sprintf() style) -RLAPI const char *RL_TextSubtext(const char *text, int position, int length); // Get a piece of a text string -RLAPI char *RL_TextReplace(char *text, const char *replace, const char *by); // Replace text string (WARNING: memory must be freed!) -RLAPI char *RL_TextInsert(const char *text, const char *insert, int position); // Insert text in a position (WARNING: memory must be freed!) -RLAPI const char *RL_TextJoin(const char **textList, int count, const char *delimiter); // Join text strings with delimiter +RLAPI int text_copy(char *dst, const char *src); // Copy one string to another, returns bytes copied +RLAPI bool text_is_equal(const char *text1, const char *text2); // Check if two text string are equal +RLAPI unsigned int text_length(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(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 RL_TextAppend(char *text, const char *append, int *position); // Append text at specific position and move cursor! -RLAPI int RL_TextFindIndex(const char *text, const char *find); // Find first text occurrence within a string -RLAPI const char *RL_TextToUpper(const char *text); // Get upper case version of provided string -RLAPI const char *RL_TextToLower(const char *text); // Get lower case version of provided string -RLAPI const char *RL_TextToPascal(const char *text); // Get Pascal case notation version of provided string -RLAPI int RL_TextToInteger(const char *text); // Get integer value from text (negative values not supported) +RLAPI void text_append(char *text, const char *append, int *position); // Append text at specific position and move cursor! +RLAPI int text_find_index(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 int text_to_integer(const char *text); // Get integer value from text (negative values not supported) //------------------------------------------------------------------------------------ // Basic 3d Shapes Drawing Functions (Module: models) //------------------------------------------------------------------------------------ // Basic geometric 3D shapes drawing functions -RLAPI void RL_DrawLine3D(RL_Vector3 startPos, RL_Vector3 endPos, RL_Color color); // Draw a line in 3D world space -RLAPI void RL_DrawPoint3D(RL_Vector3 position, RL_Color color); // Draw a point in 3D space, actually a small line -RLAPI void RL_DrawCircle3D(RL_Vector3 center, float radius, RL_Vector3 rotationAxis, float rotationAngle, RL_Color color); // Draw a circle in 3D world space -RLAPI void RL_DrawTriangle3D(RL_Vector3 v1, RL_Vector3 v2, RL_Vector3 v3, RL_Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) -RLAPI void RL_DrawTriangleStrip3D(RL_Vector3 *points, int pointCount, RL_Color color); // Draw a triangle strip defined by points -RLAPI void RL_DrawCube(RL_Vector3 position, float width, float height, float length, RL_Color color); // Draw cube -RLAPI void RL_DrawCubeV(RL_Vector3 position, RL_Vector3 size, RL_Color color); // Draw cube (Vector version) -RLAPI void RL_DrawCubeWires(RL_Vector3 position, float width, float height, float length, RL_Color color); // Draw cube wires -RLAPI void RL_DrawCubeWiresV(RL_Vector3 position, RL_Vector3 size, RL_Color color); // Draw cube wires (Vector version) -RLAPI void RL_DrawSphere(RL_Vector3 centerPos, float radius, RL_Color color); // Draw sphere -RLAPI void RL_DrawSphereEx(RL_Vector3 centerPos, float radius, int rings, int slices, RL_Color color); // Draw sphere with extended parameters -RLAPI void RL_DrawSphereWires(RL_Vector3 centerPos, float radius, int rings, int slices, RL_Color color); // Draw sphere wires -RLAPI void RL_DrawCylinder(RL_Vector3 position, float radiusTop, float radiusBottom, float height, int slices, RL_Color color); // Draw a cylinder/cone -RLAPI void RL_DrawCylinderEx(RL_Vector3 startPos, RL_Vector3 endPos, float startRadius, float endRadius, int sides, RL_Color color); // Draw a cylinder with base at startPos and top at endPos -RLAPI void RL_DrawCylinderWires(RL_Vector3 position, float radiusTop, float radiusBottom, float height, int slices, RL_Color color); // Draw a cylinder/cone wires -RLAPI void RL_DrawCylinderWiresEx(RL_Vector3 startPos, RL_Vector3 endPos, float startRadius, float endRadius, int sides, RL_Color color); // Draw a cylinder wires with base at startPos and top at endPos -RLAPI void RL_DrawCapsule(RL_Vector3 startPos, RL_Vector3 endPos, float radius, int slices, int rings, RL_Color color); // Draw a capsule with the center of its sphere caps at startPos and endPos -RLAPI void RL_DrawCapsuleWires(RL_Vector3 startPos, RL_Vector3 endPos, float radius, int slices, int rings, RL_Color color); // Draw capsule wireframe with the center of its sphere caps at startPos and endPos -RLAPI void RL_DrawPlane(RL_Vector3 centerPos, RL_Vector2 size, RL_Color color); // Draw a plane XZ -RLAPI void RL_DrawRay(RL_Ray ray, RL_Color color); // Draw a ray line -RLAPI void RL_DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0)) +RLAPI void draw_line3_d(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space +RLAPI void draw_point3_d(Vector3 position, Color color); // Draw a point in 3D space, actually a small line +RLAPI void draw_circle3_d(Vector3 center, float radius, Vector3 rotationAxis, float rotationAngle, Color color); // Draw a circle in 3D world space +RLAPI void draw_triangle3_d(Vector3 v1, Vector3 v2, Vector3 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +RLAPI void draw_triangle_strip3d(Vector3 *points, int pointCount, Color color); // Draw a triangle strip defined by points +RLAPI void draw_cube(Vector3 position, float width, float height, float length, Color color); // Draw cube +RLAPI void draw_cube_v(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version) +RLAPI void draw_cube_wires(Vector3 position, float width, float height, float length, Color color); // Draw cube wires +RLAPI void draw_cube_wires_v(Vector3 position, Vector3 size, Color color); // Draw cube wires (Vector version) +RLAPI void draw_sphere(Vector3 centerPos, float radius, Color color); // Draw sphere +RLAPI void draw_sphere_ex(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters +RLAPI void draw_sphere_wires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires +RLAPI void draw_cylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone +RLAPI void draw_cylinder_ex(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 draw_cylinder_wires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires +RLAPI void draw_cylinder_wires_ex(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 draw_capsule(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 draw_capsule_wires(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 draw_plane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ +RLAPI void draw_ray(Ray ray, Color color); // Draw a ray line +RLAPI void draw_grid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0)) //------------------------------------------------------------------------------------ -// RL_Model 3d Loading and Drawing Functions (Module: models) +// Model 3d Loading and Drawing Functions (Module: models) //------------------------------------------------------------------------------------ -// RL_Model management functions -RLAPI RL_Model RL_LoadModel(const char *fileName); // Load model from files (meshes and materials) -RLAPI RL_Model RL_LoadModelFromMesh(RL_Mesh mesh); // Load model from generated mesh (default material) -RLAPI bool RL_IsModelReady(RL_Model model); // Check if a model is ready -RLAPI void RL_UnloadModel(RL_Model model); // Unload model (including meshes) from memory (RAM and/or VRAM) -RLAPI RL_BoundingBox RL_GetModelBoundingBox(RL_Model model); // Compute model bounding box limits (considers all meshes) +// Model management functions +RLAPI Model load_model(const char *fileName); // Load model from files (meshes and materials) +RLAPI Model load_model_from_mesh(Mesh mesh); // Load model from generated mesh (default material) +RLAPI bool is_model_ready(Model model); // Check if a model is ready +RLAPI void unload_model(Model model); // Unload model (including meshes) from memory (RAM and/or VRAM) +RLAPI Bounding_box get_model_bounding_box(Model model); // Compute model bounding box limits (considers all meshes) -// RL_Model drawing functions -RLAPI void RL_DrawModel(RL_Model model, RL_Vector3 position, float scale, RL_Color tint); // Draw a model (with texture if set) -RLAPI void RL_DrawModelEx(RL_Model model, RL_Vector3 position, RL_Vector3 rotationAxis, float rotationAngle, RL_Vector3 scale, RL_Color tint); // Draw a model with extended parameters -RLAPI void RL_DrawModelWires(RL_Model model, RL_Vector3 position, float scale, RL_Color tint); // Draw a model wires (with texture if set) -RLAPI void RL_DrawModelWiresEx(RL_Model model, RL_Vector3 position, RL_Vector3 rotationAxis, float rotationAngle, RL_Vector3 scale, RL_Color tint); // Draw a model wires (with texture if set) with extended parameters -RLAPI void RL_DrawBoundingBox(RL_BoundingBox box, RL_Color color); // Draw bounding box (wires) -RLAPI void RL_DrawBillboard(RL_Camera camera, RL_Texture2D texture, RL_Vector3 position, float size, RL_Color tint); // Draw a billboard texture -RLAPI void RL_DrawBillboardRec(RL_Camera camera, RL_Texture2D texture, RL_Rectangle source, RL_Vector3 position, RL_Vector2 size, RL_Color tint); // Draw a billboard texture defined by source -RLAPI void RL_DrawBillboardPro(RL_Camera camera, RL_Texture2D texture, RL_Rectangle source, RL_Vector3 position, RL_Vector3 up, RL_Vector2 size, RL_Vector2 origin, float rotation, RL_Color tint); // Draw a billboard texture defined by source and rotation +// Model drawing functions +RLAPI void draw_model(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set) +RLAPI void draw_model_ex(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters +RLAPI void draw_model_wires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set) +RLAPI void draw_model_wires_ex(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 draw_bounding_box(Bounding_box box, Color color); // Draw bounding box (wires) +RLAPI void draw_billboard(Camera camera, Texture2d texture, Vector3 position, float size, Color tint); // Draw a billboard texture +RLAPI void draw_billboard_rec(Camera camera, Texture2d texture, Rectangle source, Vector3 position, Vector2 size, Color tint); // Draw a billboard texture defined by source +RLAPI void draw_billboard_pro(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 -// RL_Mesh management functions -RLAPI void RL_UploadMesh(RL_Mesh *mesh, bool dynamic); // Upload mesh vertex data in GPU and provide VAO/VBO ids -RLAPI void RL_UpdateMeshBuffer(RL_Mesh mesh, int index, const void *data, int dataSize, int offset); // Update mesh vertex data in GPU for a specific buffer index -RLAPI void RL_UnloadMesh(RL_Mesh mesh); // Unload mesh data from CPU and GPU -RLAPI void RL_DrawMesh(RL_Mesh mesh, RL_Material material, RL_Matrix transform); // Draw a 3d mesh with material and transform -RLAPI void RL_DrawMeshInstanced(RL_Mesh mesh, RL_Material material, const RL_Matrix *transforms, int instances); // Draw multiple mesh instances with material and different transforms -RLAPI bool RL_ExportMesh(RL_Mesh mesh, const char *fileName); // Export mesh data to file, returns true on success -RLAPI RL_BoundingBox RL_GetMeshBoundingBox(RL_Mesh mesh); // Compute mesh bounding box limits -RLAPI void RL_GenMeshTangents(RL_Mesh *mesh); // Compute mesh tangents +// Mesh management functions +RLAPI void upload_mesh(Mesh *mesh, bool dynamic); // Upload mesh vertex data in GPU and provide VAO/VBO ids +RLAPI void update_mesh_buffer(Mesh mesh, int index, const void *data, int dataSize, int offset); // Update mesh vertex data in GPU for a specific buffer index +RLAPI void unload_mesh(Mesh mesh); // Unload mesh data from CPU and GPU +RLAPI void draw_mesh(Mesh mesh, Material material, Matrix transform); // Draw a 3d mesh with material and transform +RLAPI void draw_mesh_instanced(Mesh mesh, Material material, const Matrix *transforms, int instances); // Draw multiple mesh instances with material and different transforms +RLAPI bool export_mesh(Mesh mesh, const char *fileName); // Export mesh data to file, returns true on success +RLAPI Bounding_box get_mesh_bounding_box(Mesh mesh); // Compute mesh bounding box limits +RLAPI void gen_mesh_tangents(Mesh *mesh); // Compute mesh tangents -// RL_Mesh generation functions -RLAPI RL_Mesh RL_GenMeshPoly(int sides, float radius); // Generate polygonal mesh -RLAPI RL_Mesh RL_GenMeshPlane(float width, float length, int resX, int resZ); // Generate plane mesh (with subdivisions) -RLAPI RL_Mesh RL_GenMeshCube(float width, float height, float length); // Generate cuboid mesh -RLAPI RL_Mesh RL_GenMeshSphere(float radius, int rings, int slices); // Generate sphere mesh (standard sphere) -RLAPI RL_Mesh RL_GenMeshHemiSphere(float radius, int rings, int slices); // Generate half-sphere mesh (no bottom cap) -RLAPI RL_Mesh RL_GenMeshCylinder(float radius, float height, int slices); // Generate cylinder mesh -RLAPI RL_Mesh RL_GenMeshCone(float radius, float height, int slices); // Generate cone/pyramid mesh -RLAPI RL_Mesh RL_GenMeshTorus(float radius, float size, int radSeg, int sides); // Generate torus mesh -RLAPI RL_Mesh RL_GenMeshKnot(float radius, float size, int radSeg, int sides); // Generate trefoil knot mesh -RLAPI RL_Mesh RL_GenMeshHeightmap(RL_Image heightmap, RL_Vector3 size); // Generate heightmap mesh from image data -RLAPI RL_Mesh RL_GenMeshCubicmap(RL_Image cubicmap, RL_Vector3 cubeSize); // Generate cubes-based map mesh from image data +// Mesh generation functions +RLAPI Mesh gen_mesh_poly(int sides, float radius); // Generate polygonal mesh +RLAPI Mesh gen_mesh_plane(float width, float length, int resX, int resZ); // Generate plane mesh (with subdivisions) +RLAPI Mesh gen_mesh_cube(float width, float height, float length); // Generate cuboid mesh +RLAPI Mesh gen_mesh_sphere(float radius, int rings, int slices); // Generate sphere mesh (standard sphere) +RLAPI Mesh gen_mesh_hemi_sphere(float radius, int rings, int slices); // Generate half-sphere mesh (no bottom cap) +RLAPI Mesh gen_mesh_cylinder(float radius, float height, int slices); // Generate cylinder mesh +RLAPI Mesh gen_mesh_cone(float radius, float height, int slices); // Generate cone/pyramid mesh +RLAPI Mesh gen_mesh_torus(float radius, float size, int radSeg, int sides); // Generate torus mesh +RLAPI Mesh gen_mesh_knot(float radius, float size, int radSeg, int sides); // Generate trefoil knot mesh +RLAPI Mesh gen_mesh_heightmap(Image heightmap, Vector3 size); // Generate heightmap mesh from image data +RLAPI Mesh gen_mesh_cubicmap(Image cubicmap, Vector3 cubeSize); // Generate cubes-based map mesh from image data -// RL_Material loading/unloading functions -RLAPI RL_Material *RL_LoadMaterials(const char *fileName, int *materialCount); // Load materials from model file -RLAPI RL_Material RL_LoadMaterialDefault(void); // Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps) -RLAPI bool RL_IsMaterialReady(RL_Material material); // Check if a material is ready -RLAPI void RL_UnloadMaterial(RL_Material material); // Unload material from GPU memory (VRAM) -RLAPI void RL_SetMaterialTexture(RL_Material *material, int mapType, RL_Texture2D texture); // Set texture for a material map type (RL_MATERIAL_MAP_DIFFUSE, RL_MATERIAL_MAP_SPECULAR...) -RLAPI void RL_SetModelMeshMaterial(RL_Model *model, int meshId, int materialId); // Set material for a mesh +// Material loading/unloading functions +RLAPI Material *LoadMaterials(const char *fileName, int *materialCount); // Load materials from model file +RLAPI Material load_material_default(void); // Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps) +RLAPI bool is_material_ready(Material material); // Check if a material is ready +RLAPI void unload_material(Material material); // Unload material from GPU memory (VRAM) +RLAPI void set_material_texture(Material *material, int mapType, Texture2d texture); // Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...) +RLAPI void set_model_mesh_material(Model *model, int meshId, int materialId); // Set material for a mesh -// RL_Model animations loading/unloading functions -RLAPI RL_ModelAnimation *RL_LoadModelAnimations(const char *fileName, int *animCount); // Load model animations from file -RLAPI void RL_UpdateModelAnimation(RL_Model model, RL_ModelAnimation anim, int frame); // Update model animation pose -RLAPI void RL_UnloadModelAnimation(RL_ModelAnimation anim); // Unload animation data -RLAPI void RL_UnloadModelAnimations(RL_ModelAnimation *animations, int animCount); // Unload animation array data -RLAPI bool RL_IsModelAnimationValid(RL_Model model, RL_ModelAnimation anim); // Check model animation skeleton match +// Model animations loading/unloading functions +RLAPI Model_Animation *LoadModelAnimations(const char *fileName, int *animCount); // Load model animations from file +RLAPI void update_model_animation(Model model, Model_Animation anim, int frame); // Update model animation pose +RLAPI void unload_model_animation(Model_Animation anim); // Unload animation data +RLAPI void unload_model_animations(Model_Animation *animations, int animCount); // Unload animation array data +RLAPI bool is_model_animation_valid(Model model, Model_Animation anim); // Check model animation skeleton match // Collision detection functions -RLAPI bool RL_CheckCollisionSpheres(RL_Vector3 center1, float radius1, RL_Vector3 center2, float radius2); // Check collision between two spheres -RLAPI bool RL_CheckCollisionBoxes(RL_BoundingBox box1, RL_BoundingBox box2); // Check collision between two bounding boxes -RLAPI bool RL_CheckCollisionBoxSphere(RL_BoundingBox box, RL_Vector3 center, float radius); // Check collision between box and sphere -RLAPI RL_RayCollision RL_GetRayCollisionSphere(RL_Ray ray, RL_Vector3 center, float radius); // Get collision info between ray and sphere -RLAPI RL_RayCollision RL_GetRayCollisionBox(RL_Ray ray, RL_BoundingBox box); // Get collision info between ray and box -RLAPI RL_RayCollision RL_GetRayCollisionMesh(RL_Ray ray, RL_Mesh mesh, RL_Matrix transform); // Get collision info between ray and mesh -RLAPI RL_RayCollision RL_GetRayCollisionTriangle(RL_Ray ray, RL_Vector3 p1, RL_Vector3 p2, RL_Vector3 p3); // Get collision info between ray and triangle -RLAPI RL_RayCollision RL_GetRayCollisionQuad(RL_Ray ray, RL_Vector3 p1, RL_Vector3 p2, RL_Vector3 p3, RL_Vector3 p4); // Get collision info between ray and quad +RLAPI bool check_collision_spheres(Vector3 center1, float radius1, Vector3 center2, float radius2); // Check collision between two spheres +RLAPI bool check_collision_boxes(Bounding_box box1, Bounding_box box2); // Check collision between two bounding boxes +RLAPI bool check_collision_box_sphere(Bounding_box box, Vector3 center, float radius); // Check collision between box and sphere +RLAPI Ray_Collision get_ray_collision_sphere(Ray ray, Vector3 center, float radius); // Get collision info between ray and sphere +RLAPI Ray_Collision get_ray_collision_box(Ray ray, Bounding_box box); // Get collision info between ray and box +RLAPI Ray_Collision get_ray_collision_mesh(Ray ray, Mesh mesh, Matrix transform); // Get collision info between ray and mesh +RLAPI Ray_Collision get_ray_collision_triangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3); // Get collision info between ray and triangle +RLAPI Ray_Collision get_ray_collision_quad(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4); // Get collision info between ray and quad //------------------------------------------------------------------------------------ // Audio Loading and Playing Functions (Module: audio) @@ -1578,85 +1593,84 @@ RLAPI RL_RayCollision RL_GetRayCollisionQuad(RL_Ray ray, RL_Vector3 p1, RL_Vecto typedef void (*AudioCallback)(void *bufferData, unsigned int frames); // Audio device management functions -RLAPI void RL_InitAudioDevice(void); // Initialize audio device and context -RLAPI void RL_CloseAudioDevice(void); // Close the audio device and context -RLAPI bool RL_IsAudioDeviceReady(void); // Check if audio device has been initialized successfully -RLAPI void RL_SetMasterVolume(float volume); // Set master volume (listener) -RLAPI float RL_GetMasterVolume(void); // Get master volume (listener) +RLAPI void init_audio_device(void); // Initialize audio device and context +RLAPI void close_audio_device(void); // Close the audio device and context +RLAPI bool is_audio_device_ready(void); // Check if audio device has been initialized successfully +RLAPI void set_master_volume(float volume); // Set master volume (listener) +RLAPI float get_master_volume(void); // Get master volume (listener) -// RL_Wave/RL_Sound loading/unloading functions -RLAPI RL_Wave RL_LoadWave(const char *fileName); // Load wave data from file -RLAPI RL_Wave RL_LoadWaveFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load wave from memory buffer, fileType refers to extension: i.e. '.wav' -RLAPI bool RL_IsWaveReady(RL_Wave wave); // Checks if wave data is ready -RLAPI RL_Sound RL_LoadSound(const char *fileName); // Load sound from file -RLAPI RL_Sound RL_LoadSoundFromWave(RL_Wave wave); // Load sound from wave data -RLAPI RL_Sound RL_LoadSoundAlias(RL_Sound source); // Create a new sound that shares the same sample data as the source sound, does not own the sound data -RLAPI bool RL_IsSoundReady(RL_Sound sound); // Checks if a sound is ready -RLAPI void RL_UpdateSound(RL_Sound sound, const void *data, int sampleCount); // Update sound buffer with new data -RLAPI void RL_UnloadWave(RL_Wave wave); // Unload wave data -RLAPI void RL_UnloadSound(RL_Sound sound); // Unload sound -RLAPI void RL_UnloadSoundAlias(RL_Sound alias); // Unload a sound alias (does not deallocate sample data) -RLAPI bool RL_ExportWave(RL_Wave wave, const char *fileName); // Export wave data to file, returns true on success -RLAPI bool RL_ExportWaveAsCode(RL_Wave wave, const char *fileName); // Export wave sample data to code (.h), returns true on success +// Wave/Sound loading/unloading functions +RLAPI Wave load_wave(const char *fileName); // Load wave data from file +RLAPI Wave load_wave_from_memory(const char *fileType, const unsigned char *fileData, int dataSize); // Load wave from memory buffer, fileType refers to extension: i.e. '.wav' +RLAPI bool is_wave_ready(Wave wave); // Checks if wave data is ready +RLAPI Sound load_sound(const char *fileName); // Load sound from file +RLAPI Sound load_sound_from_wave(Wave wave); // Load sound from wave data +RLAPI Sound load_sound_alias(Sound source); // Create a new sound that shares the same sample data as the source sound, does not own the sound data +RLAPI bool is_sound_ready(Sound sound); // Checks if a sound is ready +RLAPI void update_sound(Sound sound, const void *data, int sampleCount); // Update sound buffer with new data +RLAPI void unload_wave(Wave wave); // Unload wave data +RLAPI void unload_sound(Sound sound); // Unload sound +RLAPI void unload_sound_alias(Sound alias); // Unload a sound alias (does not deallocate sample data) +RLAPI bool export_wave(Wave wave, const char *fileName); // Export wave data to file, returns true on success +RLAPI bool export_wave_as_code(Wave wave, const char *fileName); // Export wave sample data to code (.h), returns true on success -// RL_Wave/RL_Sound management functions -RLAPI void RL_PlaySound(RL_Sound sound); // Play a sound -RLAPI void RL_StopSound(RL_Sound sound); // Stop playing a sound -RLAPI void RL_PauseSound(RL_Sound sound); // Pause a sound -RLAPI void RL_ResumeSound(RL_Sound sound); // Resume a paused sound -RLAPI bool RL_IsSoundPlaying(RL_Sound sound); // Check if a sound is currently playing -RLAPI void RL_SetSoundVolume(RL_Sound sound, float volume); // Set volume for a sound (1.0 is max level) -RLAPI void RL_SetSoundPitch(RL_Sound sound, float pitch); // Set pitch for a sound (1.0 is base level) -RLAPI void RL_SetSoundPan(RL_Sound sound, float pan); // Set pan for a sound (0.5 is center) -RLAPI RL_Wave RL_WaveCopy(RL_Wave wave); // Copy a wave to a new wave -RLAPI void RL_WaveCrop(RL_Wave *wave, int initSample, int finalSample); // Crop a wave to defined samples range -RLAPI void RL_WaveFormat(RL_Wave *wave, int sampleRate, int sampleSize, int channels); // Convert wave data to desired format -RLAPI float *RL_LoadWaveSamples(RL_Wave wave); // Load samples data from wave as a 32bit float data array -RLAPI void RL_UnloadWaveSamples(float *samples); // Unload samples data loaded with RL_LoadWaveSamples() +// Wave/Sound management functions +RLAPI void play_sound(Sound sound); // Play a sound +RLAPI void stop_sound(Sound sound); // Stop playing a sound +RLAPI void pause_sound(Sound sound); // Pause a sound +RLAPI void resume_sound(Sound sound); // Resume a paused sound +RLAPI bool is_sound_playing(Sound sound); // Check if a sound is currently playing +RLAPI void set_sound_volume(Sound sound, float volume); // Set volume for a sound (1.0 is max level) +RLAPI void set_sound_pitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level) +RLAPI void set_sound_pan(Sound sound, float pan); // Set pan for a sound (0.5 is center) +RLAPI Wave wave_copy(Wave wave); // Copy a wave to a new wave +RLAPI void wave_crop(Wave *wave, int initSample, int finalSample); // Crop a wave to defined samples range +RLAPI void wave_format(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 unload_wave_samples(float *samples); // Unload samples data loaded with LoadWaveSamples() -// RL_Music management functions -RLAPI RL_Music RL_LoadMusicStream(const char *fileName); // Load music stream from file -RLAPI RL_Music RL_LoadMusicStreamFromMemory(const char *fileType, const unsigned char *data, int dataSize); // Load music stream from data -RLAPI bool RL_IsMusicReady(RL_Music music); // Checks if a music stream is ready -RLAPI void RL_UnloadMusicStream(RL_Music music); // Unload music stream -RLAPI void RL_PlayMusicStream(RL_Music music); // Start music playing -RLAPI bool RL_IsMusicStreamPlaying(RL_Music music); // Check if music is playing -RLAPI void RL_UpdateMusicStream(RL_Music music); // Updates buffers for music streaming -RLAPI void RL_StopMusicStream(RL_Music music); // Stop music playing -RLAPI void RL_PauseMusicStream(RL_Music music); // Pause music playing -RLAPI void RL_ResumeMusicStream(RL_Music music); // Resume playing paused music -RLAPI void RL_SeekMusicStream(RL_Music music, float position); // Seek music to a position (in seconds) -RLAPI void RL_SetMusicVolume(RL_Music music, float volume); // Set volume for music (1.0 is max level) -RLAPI void RL_SetMusicPitch(RL_Music music, float pitch); // Set pitch for a music (1.0 is base level) -RLAPI void RL_SetMusicPan(RL_Music music, float pan); // Set pan for a music (0.5 is center) -RLAPI float RL_GetMusicTimeLength(RL_Music music); // Get music time length (in seconds) -RLAPI float RL_GetMusicTimePlayed(RL_Music music); // Get current music time played (in seconds) +// Music management functions +RLAPI Music load_music_stream(const char *fileName); // Load music stream from file +RLAPI Music load_music_stream_from_memory(const char *fileType, const unsigned char *data, int dataSize); // Load music stream from data +RLAPI bool is_music_ready(Music music); // Checks if a music stream is ready +RLAPI void unload_music_stream(Music music); // Unload music stream +RLAPI void play_music_stream(Music music); // Start music playing +RLAPI bool is_music_stream_playing(Music music); // Check if music is playing +RLAPI void update_music_stream(Music music); // Updates buffers for music streaming +RLAPI void stop_music_stream(Music music); // Stop music playing +RLAPI void pause_music_stream(Music music); // Pause music playing +RLAPI void resume_music_stream(Music music); // Resume playing paused music +RLAPI void seek_music_stream(Music music, float position); // Seek music to a position (in seconds) +RLAPI void set_music_volume(Music music, float volume); // Set volume for music (1.0 is max level) +RLAPI void set_music_pitch(Music music, float pitch); // Set pitch for a music (1.0 is base level) +RLAPI void set_music_pan(Music music, float pan); // Set pan for a music (0.5 is center) +RLAPI float get_music_time_length(Music music); // Get music time length (in seconds) +RLAPI float get_music_time_played(Music music); // Get current music time played (in seconds) -// RL_AudioStream management functions -RLAPI RL_AudioStream RL_LoadAudioStream(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels); // Load audio stream (to stream raw audio pcm data) -RLAPI bool RL_IsAudioStreamReady(RL_AudioStream stream); // Checks if an audio stream is ready -RLAPI void RL_UnloadAudioStream(RL_AudioStream stream); // Unload audio stream and free memory -RLAPI void RL_UpdateAudioStream(RL_AudioStream stream, const void *data, int frameCount); // Update audio stream buffers with data -RLAPI bool RL_IsAudioStreamProcessed(RL_AudioStream stream); // Check if any audio stream buffers requires refill -RLAPI void RL_PlayAudioStream(RL_AudioStream stream); // Play audio stream -RLAPI void RL_PauseAudioStream(RL_AudioStream stream); // Pause audio stream -RLAPI void RL_ResumeAudioStream(RL_AudioStream stream); // Resume audio stream -RLAPI bool RL_IsAudioStreamPlaying(RL_AudioStream stream); // Check if audio stream is playing -RLAPI void RL_StopAudioStream(RL_AudioStream stream); // Stop audio stream -RLAPI void RL_SetAudioStreamVolume(RL_AudioStream stream, float volume); // Set volume for audio stream (1.0 is max level) -RLAPI void RL_SetAudioStreamPitch(RL_AudioStream stream, float pitch); // Set pitch for audio stream (1.0 is base level) -RLAPI void RL_SetAudioStreamPan(RL_AudioStream stream, float pan); // Set pan for audio stream (0.5 is centered) -RLAPI void RL_SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams -RLAPI void RL_SetAudioStreamCallback(RL_AudioStream stream, AudioCallback callback); // Audio thread callback to request new data +// Audio_Stream management functions +RLAPI Audio_Stream load_audio_stream(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels); // Load audio stream (to stream raw audio pcm data) +RLAPI bool is_audio_stream_ready(Audio_Stream stream); // Checks if an audio stream is ready +RLAPI void unload_audio_stream(Audio_Stream stream); // Unload audio stream and free memory +RLAPI void update_audio_stream(Audio_Stream stream, const void *data, int frameCount); // Update audio stream buffers with data +RLAPI bool is_audio_stream_processed(Audio_Stream stream); // Check if any audio stream buffers requires refill +RLAPI void play_audio_stream(Audio_Stream stream); // Play audio stream +RLAPI void pause_audio_stream(Audio_Stream stream); // Pause audio stream +RLAPI void resume_audio_stream(Audio_Stream stream); // Resume audio stream +RLAPI bool is_audio_stream_playing(Audio_Stream stream); // Check if audio stream is playing +RLAPI void stop_audio_stream(Audio_Stream stream); // Stop audio stream +RLAPI void set_audio_stream_volume(Audio_Stream stream, float volume); // Set volume for audio stream (1.0 is max level) +RLAPI void set_audio_stream_pitch(Audio_Stream stream, float pitch); // Set pitch for audio stream (1.0 is base level) +RLAPI void set_audio_stream_pan(Audio_Stream stream, float pan); // Set pan for audio stream (0.5 is centered) +RLAPI void set_audio_stream_buffer_size_default(int size); // Default size for new audio streams +RLAPI void set_audio_stream_callback(Audio_Stream stream, AudioCallback callback); // Audio thread callback to request new data -RLAPI void RL_AttachAudioStreamProcessor(RL_AudioStream stream, AudioCallback processor); // Attach audio stream processor to stream, receives the samples as s -RLAPI void RL_DetachAudioStreamProcessor(RL_AudioStream stream, AudioCallback processor); // Detach audio stream processor from stream +RLAPI void attach_audio_stream_processor(Audio_Stream stream, AudioCallback processor); // Attach audio stream processor to stream, receives the samples as s +RLAPI void detach_audio_stream_processor(Audio_Stream stream, AudioCallback processor); // Detach audio stream processor from stream -RLAPI void RL_AttachAudioMixedProcessor(AudioCallback processor); // Attach audio stream processor to the entire audio pipeline, receives the samples as s -RLAPI void RL_DetachAudioMixedProcessor(AudioCallback processor); // Detach audio stream processor from the entire audio pipeline +RLAPI void attach_audio_mixed_processor(AudioCallback processor); // Attach audio stream processor to the entire audio pipeline, receives the samples as s +RLAPI void detach_audio_mixed_processor(AudioCallback processor); // Detach audio stream processor from the entire audio pipeline -#if defined(__cplusplus) -} -#endif +RL_EXTERN_C_END +RL_NS_END #endif // RAYLIB_H diff --git a/project/auxillary/vis_ast/dependencies/raylib/include/raymath.h b/project/auxillary/vis_ast/dependencies/raylib/include/raymath.h index 5178062..deca55d 100644 --- a/project/auxillary/vis_ast/dependencies/raylib/include/raymath.h +++ b/project/auxillary/vis_ast/dependencies/raylib/include/raymath.h @@ -1,9 +1,9 @@ /********************************************************************************************** * -* raymath v1.5 - Math functions to work with RL_Vector2, RL_Vector3, RL_Matrix and Quaternions +* raymath v1.5 - Math functions to work with Vector2, Vector3, Matrix and Quaternions * * CONVENTIONS: -* - RL_Matrix structure is defined as row-major (memory layout) but parameters naming AND all +* - 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 @@ -94,83 +94,91 @@ #define RL_RAD2DEG (180.0f/RL_PI) #endif -// Get float vector for RL_Matrix -#ifndef RL_MatrixToFloat - #define RL_MatrixToFloat(mat) (RL_MatrixToFloatV(mat).v) +// Get float vector for Matrix +#ifndef MatrixToFloat + #define MatrixToFloat(mat) (RL_NS(matrix_to_float_v)(mat).v) #endif -// Get float vector for RL_Vector3 -#ifndef RL_Vector3ToFloat - #define RL_Vector3ToFloat(vec) (RL_Vector3ToFloatV(vec).v) +// Get float vector for Vector3 +#ifndef Vector3ToFloat + #define Vector3ToFloat(vec) (RL_NS(vector3_to_float_v)(vec).v) #endif +#include "config.h" + +RL_NS_BEGIN + //---------------------------------------------------------------------------------- // Types and Structures Definition //---------------------------------------------------------------------------------- #if !defined(RL_VECTOR2_TYPE) -// RL_Vector2 type -typedef struct RL_Vector2 { +// Vector2 type +typedef struct Vector2 { float x; float y; -} RL_Vector2; +} Vector2; #define RL_VECTOR2_TYPE #endif #if !defined(RL_VECTOR3_TYPE) -// RL_Vector3 type -typedef struct RL_Vector3 { +// Vector3 type +typedef struct Vector3 { float x; float y; float z; -} RL_Vector3; +} Vector3; #define RL_VECTOR3_TYPE #endif #if !defined(RL_VECTOR4_TYPE) -// RL_Vector4 type -typedef struct RL_Vector4 { +// Vector4 type +typedef struct Vector4 { float x; float y; float z; float w; -} RL_Vector4; +} Vector4; #define RL_VECTOR4_TYPE #endif #if !defined(RL_QUATERNION_TYPE) -// RL_Quaternion type -typedef RL_Vector4 RL_Quaternion; +// Quaternion type +typedef Vector4 Quaternion; #define RL_QUATERNION_TYPE #endif #if !defined(RL_MATRIX_TYPE) -// RL_Matrix type (OpenGL style 4x4 - right handed, column major) -typedef struct RL_Matrix { - float m0, m4, m8, m12; // RL_Matrix first row (4 components) - float m1, m5, m9, m13; // RL_Matrix second row (4 components) - float m2, m6, m10, m14; // RL_Matrix third row (4 components) - float m3, m7, m11, m15; // RL_Matrix fourth row (4 components) -} RL_Matrix; +// 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 RL_float3 { +typedef struct float3 { float v[3]; -} RL_float3; +} float3; -typedef struct RL_float16 { +typedef struct float16 { float v[16]; -} RL_float16; +} float16; + +RL_NS_END #include // Required for: sinf(), cosf(), tan(), atan2f(), sqrtf(), floor(), fminf(), fmaxf(), fabs() +RL_NS_BEGIN + //---------------------------------------------------------------------------------- // Module Functions Definition - Utils math //---------------------------------------------------------------------------------- -// RL_Clamp float value -RMAPI float RL_Clamp(float value, float min, float max) +// clamp float value +RMAPI float clamp(float value, float min, float max) { float result = (value < min)? min : value; @@ -180,31 +188,31 @@ RMAPI float RL_Clamp(float value, float min, float max) } // Calculate linear interpolation between two floats -RMAPI float RL_Lerp(float start, float end, float amount) +RMAPI float lerp(float start, float end, float amount) { float result = start + amount*(end - start); return result; } -// RL_Normalize input value within input range -RMAPI float RL_Normalize(float value, float start, float end) +// normalize input value within input range +RMAPI float normalize(float value, float start, float end) { float result = (value - start)/(end - start); return result; } -// RL_Remap input value within input range to output range -RMAPI float RL_Remap(float value, float inputStart, float inputEnd, float outputStart, float outputEnd) +// 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; } -// RL_Wrap input value from min to max -RMAPI float RL_Wrap(float value, float min, float max) +// 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)); @@ -212,7 +220,7 @@ RMAPI float RL_Wrap(float value, float min, float max) } // Check whether two given floats are almost equal -RMAPI int RL_FloatEquals(float x, float y) +RMAPI int float_equals(float x, float y) { #if !defined(EPSILON) #define EPSILON 0.000001f @@ -224,59 +232,59 @@ RMAPI int RL_FloatEquals(float x, float y) } //---------------------------------------------------------------------------------- -// Module Functions Definition - RL_Vector2 math +// Module Functions Definition - Vector2 math //---------------------------------------------------------------------------------- // Vector with components value 0.0f -RMAPI RL_Vector2 RL_Vector2Zero(void) +RMAPI Vector2 vector2_zero(void) { - RL_Vector2 result = { 0.0f, 0.0f }; + Vector2 result = { 0.0f, 0.0f }; return result; } // Vector with components value 1.0f -RMAPI RL_Vector2 RL_Vector2One(void) +RMAPI Vector2 vector2_one(void) { - RL_Vector2 result = { 1.0f, 1.0f }; + Vector2 result = { 1.0f, 1.0f }; return result; } // Add two vectors (v1 + v2) -RMAPI RL_Vector2 RL_Vector2Add(RL_Vector2 v1, RL_Vector2 v2) +RMAPI Vector2 vector2_add(Vector2 v1, Vector2 v2) { - RL_Vector2 result = { v1.x + v2.x, v1.y + v2.y }; + Vector2 result = { v1.x + v2.x, v1.y + v2.y }; return result; } // Add vector and float value -RMAPI RL_Vector2 RL_Vector2AddValue(RL_Vector2 v, float add) +RMAPI Vector2 vector2_add_value(Vector2 v, float add) { - RL_Vector2 result = { v.x + add, v.y + add }; + Vector2 result = { v.x + add, v.y + add }; return result; } // Subtract two vectors (v1 - v2) -RMAPI RL_Vector2 RL_Vector2Subtract(RL_Vector2 v1, RL_Vector2 v2) +RMAPI Vector2 vector2_subtract(Vector2 v1, Vector2 v2) { - RL_Vector2 result = { v1.x - v2.x, v1.y - v2.y }; + Vector2 result = { v1.x - v2.x, v1.y - v2.y }; return result; } // Subtract vector by float value -RMAPI RL_Vector2 RL_Vector2SubtractValue(RL_Vector2 v, float sub) +RMAPI Vector2 vector2_subtract_value(Vector2 v, float sub) { - RL_Vector2 result = { v.x - sub, v.y - sub }; + Vector2 result = { v.x - sub, v.y - sub }; return result; } // Calculate vector length -RMAPI float RL_Vector2Length(RL_Vector2 v) +RMAPI float vector2_length(Vector2 v) { float result = sqrtf((v.x*v.x) + (v.y*v.y)); @@ -284,7 +292,7 @@ RMAPI float RL_Vector2Length(RL_Vector2 v) } // Calculate vector square length -RMAPI float RL_Vector2LengthSqr(RL_Vector2 v) +RMAPI float vector2_length_sqr(Vector2 v) { float result = (v.x*v.x) + (v.y*v.y); @@ -292,7 +300,7 @@ RMAPI float RL_Vector2LengthSqr(RL_Vector2 v) } // Calculate two vectors dot product -RMAPI float RL_Vector2DotProduct(RL_Vector2 v1, RL_Vector2 v2) +RMAPI float vector2_dot_product(Vector2 v1, Vector2 v2) { float result = (v1.x*v2.x + v1.y*v2.y); @@ -300,7 +308,7 @@ RMAPI float RL_Vector2DotProduct(RL_Vector2 v1, RL_Vector2 v2) } // Calculate distance between two vectors -RMAPI float RL_Vector2Distance(RL_Vector2 v1, RL_Vector2 v2) +RMAPI float vector2_distance(Vector2 v1, Vector2 v2) { float result = sqrtf((v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y)); @@ -308,7 +316,7 @@ RMAPI float RL_Vector2Distance(RL_Vector2 v1, RL_Vector2 v2) } // Calculate square distance between two vectors -RMAPI float RL_Vector2DistanceSqr(RL_Vector2 v1, RL_Vector2 v2) +RMAPI float vector2_distance_sqr(Vector2 v1, Vector2 v2) { float result = ((v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y)); @@ -317,7 +325,7 @@ RMAPI float RL_Vector2DistanceSqr(RL_Vector2 v1, RL_Vector2 v2) // Calculate angle between two vectors // NOTE: Angle is calculated from origin point (0, 0) -RMAPI float RL_Vector2Angle(RL_Vector2 v1, RL_Vector2 v2) +RMAPI float vector2_angle(Vector2 v1, Vector2 v2) { float result = 0.0f; @@ -332,7 +340,7 @@ RMAPI float RL_Vector2Angle(RL_Vector2 v1, RL_Vector2 v2) // Calculate angle defined by a two vectors line // NOTE: Parameters need to be normalized // Current implementation should be aligned with glm::angle -RMAPI float RL_Vector2LineAngle(RL_Vector2 start, RL_Vector2 end) +RMAPI float vector2_line_angle(Vector2 start, Vector2 end) { float result = 0.0f; @@ -343,41 +351,41 @@ RMAPI float RL_Vector2LineAngle(RL_Vector2 start, RL_Vector2 end) } // Scale vector (multiply by value) -RMAPI RL_Vector2 RL_Vector2Scale(RL_Vector2 v, float scale) +RMAPI Vector2 vector2_scale(Vector2 v, float scale) { - RL_Vector2 result = { v.x*scale, v.y*scale }; + Vector2 result = { v.x*scale, v.y*scale }; return result; } // Multiply vector by vector -RMAPI RL_Vector2 RL_Vector2Multiply(RL_Vector2 v1, RL_Vector2 v2) +RMAPI Vector2 vector2_multiply(Vector2 v1, Vector2 v2) { - RL_Vector2 result = { v1.x*v2.x, v1.y*v2.y }; + Vector2 result = { v1.x*v2.x, v1.y*v2.y }; return result; } // Negate vector -RMAPI RL_Vector2 RL_Vector2Negate(RL_Vector2 v) +RMAPI Vector2 vector2_negate(Vector2 v) { - RL_Vector2 result = { -v.x, -v.y }; + Vector2 result = { -v.x, -v.y }; return result; } // Divide vector by vector -RMAPI RL_Vector2 RL_Vector2Divide(RL_Vector2 v1, RL_Vector2 v2) +RMAPI Vector2 vector2_divide(Vector2 v1, Vector2 v2) { - RL_Vector2 result = { v1.x/v2.x, v1.y/v2.y }; + Vector2 result = { v1.x/v2.x, v1.y/v2.y }; return result; } -// RL_Normalize provided vector -RMAPI RL_Vector2 RL_Vector2Normalize(RL_Vector2 v) +// normalize provided vector +RMAPI Vector2 vector2_normalize(Vector2 v) { - RL_Vector2 result = { 0 }; + Vector2 result = { 0 }; float length = sqrtf((v.x*v.x) + (v.y*v.y)); if (length > 0) @@ -390,10 +398,10 @@ RMAPI RL_Vector2 RL_Vector2Normalize(RL_Vector2 v) return result; } -// Transforms a RL_Vector2 by a given RL_Matrix -RMAPI RL_Vector2 RL_Vector2Transform(RL_Vector2 v, RL_Matrix mat) +// Transforms a Vector2 by a given Matrix +RMAPI Vector2 vector2_transform(Vector2 v, Matrix mat) { - RL_Vector2 result = { 0 }; + Vector2 result = { 0 }; float x = v.x; float y = v.y; @@ -406,9 +414,9 @@ RMAPI RL_Vector2 RL_Vector2Transform(RL_Vector2 v, RL_Matrix mat) } // Calculate linear interpolation between two vectors -RMAPI RL_Vector2 RL_Vector2Lerp(RL_Vector2 v1, RL_Vector2 v2, float amount) +RMAPI Vector2 vector2_lerp(Vector2 v1, Vector2 v2, float amount) { - RL_Vector2 result = { 0 }; + Vector2 result = { 0 }; result.x = v1.x + amount*(v2.x - v1.x); result.y = v1.y + amount*(v2.y - v1.y); @@ -417,9 +425,9 @@ RMAPI RL_Vector2 RL_Vector2Lerp(RL_Vector2 v1, RL_Vector2 v2, float amount) } // Calculate reflected vector to normal -RMAPI RL_Vector2 RL_Vector2Reflect(RL_Vector2 v, RL_Vector2 normal) +RMAPI Vector2 vector2_reflect(Vector2 v, Vector2 normal) { - RL_Vector2 result = { 0 }; + Vector2 result = { 0 }; float dotProduct = (v.x*normal.x + v.y*normal.y); // Dot product @@ -430,9 +438,9 @@ RMAPI RL_Vector2 RL_Vector2Reflect(RL_Vector2 v, RL_Vector2 normal) } // Rotate vector by angle -RMAPI RL_Vector2 RL_Vector2Rotate(RL_Vector2 v, float angle) +RMAPI Vector2 vector2_rotate(Vector2 v, float angle) { - RL_Vector2 result = { 0 }; + Vector2 result = { 0 }; float cosres = cosf(angle); float sinres = sinf(angle); @@ -444,9 +452,9 @@ RMAPI RL_Vector2 RL_Vector2Rotate(RL_Vector2 v, float angle) } // Move Vector towards target -RMAPI RL_Vector2 RL_Vector2MoveTowards(RL_Vector2 v, RL_Vector2 target, float maxDistance) +RMAPI Vector2 vector2_move_towards(Vector2 v, Vector2 target, float maxDistance) { - RL_Vector2 result = { 0 }; + Vector2 result = { 0 }; float dx = target.x - v.x; float dy = target.y - v.y; @@ -463,18 +471,18 @@ RMAPI RL_Vector2 RL_Vector2MoveTowards(RL_Vector2 v, RL_Vector2 target, float ma } // Invert the given vector -RMAPI RL_Vector2 RL_Vector2Invert(RL_Vector2 v) +RMAPI Vector2 vector2_invert(Vector2 v) { - RL_Vector2 result = { 1.0f/v.x, 1.0f/v.y }; + Vector2 result = { 1.0f/v.x, 1.0f/v.y }; return result; } -// RL_Clamp the components of the vector between +// clamp the components of the vector between // min and max values specified by the given vectors -RMAPI RL_Vector2 RL_Vector2Clamp(RL_Vector2 v, RL_Vector2 min, RL_Vector2 max) +RMAPI Vector2 vector2_clamp(Vector2 v, Vector2 min, Vector2 max) { - RL_Vector2 result = { 0 }; + Vector2 result = { 0 }; result.x = fminf(max.x, fmaxf(min.x, v.x)); result.y = fminf(max.y, fmaxf(min.y, v.y)); @@ -482,10 +490,10 @@ RMAPI RL_Vector2 RL_Vector2Clamp(RL_Vector2 v, RL_Vector2 min, RL_Vector2 max) return result; } -// RL_Clamp the magnitude of the vector between two min and max values -RMAPI RL_Vector2 RL_Vector2ClampValue(RL_Vector2 v, float min, float max) +// clamp the magnitude of the vector between two min and max values +RMAPI Vector2 vector2_clamp_value(Vector2 v, float min, float max) { - RL_Vector2 result = v; + Vector2 result = v; float length = (v.x*v.x) + (v.y*v.y); if (length > 0.0f) @@ -510,7 +518,7 @@ RMAPI RL_Vector2 RL_Vector2ClampValue(RL_Vector2 v, float min, float max) } // Check whether two given vectors are almost equal -RMAPI int RL_Vector2Equals(RL_Vector2 p, RL_Vector2 q) +RMAPI int vector2_equals(Vector2 p, Vector2 q) { #if !defined(EPSILON) #define EPSILON 0.000001f @@ -523,99 +531,99 @@ RMAPI int RL_Vector2Equals(RL_Vector2 p, RL_Vector2 q) } //---------------------------------------------------------------------------------- -// Module Functions Definition - RL_Vector3 math +// Module Functions Definition - Vector3 math //---------------------------------------------------------------------------------- // Vector with components value 0.0f -RMAPI RL_Vector3 RL_Vector3Zero(void) +RMAPI Vector3 vector3_zero(void) { - RL_Vector3 result = { 0.0f, 0.0f, 0.0f }; + Vector3 result = { 0.0f, 0.0f, 0.0f }; return result; } // Vector with components value 1.0f -RMAPI RL_Vector3 RL_Vector3One(void) +RMAPI Vector3 vector3_one(void) { - RL_Vector3 result = { 1.0f, 1.0f, 1.0f }; + Vector3 result = { 1.0f, 1.0f, 1.0f }; return result; } // Add two vectors -RMAPI RL_Vector3 RL_Vector3Add(RL_Vector3 v1, RL_Vector3 v2) +RMAPI Vector3 vector3_add(Vector3 v1, Vector3 v2) { - RL_Vector3 result = { v1.x + v2.x, v1.y + v2.y, v1.z + v2.z }; + Vector3 result = { v1.x + v2.x, v1.y + v2.y, v1.z + v2.z }; return result; } // Add vector and float value -RMAPI RL_Vector3 RL_Vector3AddValue(RL_Vector3 v, float add) +RMAPI Vector3 vector3_add_value(Vector3 v, float add) { - RL_Vector3 result = { v.x + add, v.y + add, v.z + add }; + Vector3 result = { v.x + add, v.y + add, v.z + add }; return result; } // Subtract two vectors -RMAPI RL_Vector3 RL_Vector3Subtract(RL_Vector3 v1, RL_Vector3 v2) +RMAPI Vector3 vector3_subtract(Vector3 v1, Vector3 v2) { - RL_Vector3 result = { v1.x - v2.x, v1.y - v2.y, v1.z - v2.z }; + Vector3 result = { v1.x - v2.x, v1.y - v2.y, v1.z - v2.z }; return result; } // Subtract vector by float value -RMAPI RL_Vector3 RL_Vector3SubtractValue(RL_Vector3 v, float sub) +RMAPI Vector3 vector3_subtract_value(Vector3 v, float sub) { - RL_Vector3 result = { v.x - sub, v.y - sub, v.z - sub }; + Vector3 result = { v.x - sub, v.y - sub, v.z - sub }; return result; } // Multiply vector by scalar -RMAPI RL_Vector3 RL_Vector3Scale(RL_Vector3 v, float scalar) +RMAPI Vector3 vector3_scale(Vector3 v, float scalar) { - RL_Vector3 result = { v.x*scalar, v.y*scalar, v.z*scalar }; + Vector3 result = { v.x*scalar, v.y*scalar, v.z*scalar }; return result; } // Multiply vector by vector -RMAPI RL_Vector3 RL_Vector3Multiply(RL_Vector3 v1, RL_Vector3 v2) +RMAPI Vector3 vector3_multiply(Vector3 v1, Vector3 v2) { - RL_Vector3 result = { v1.x*v2.x, v1.y*v2.y, v1.z*v2.z }; + Vector3 result = { v1.x*v2.x, v1.y*v2.y, v1.z*v2.z }; return result; } // Calculate two vectors cross product -RMAPI RL_Vector3 RL_Vector3CrossProduct(RL_Vector3 v1, RL_Vector3 v2) +RMAPI Vector3 vector3_cross_product(Vector3 v1, Vector3 v2) { - RL_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 }; + 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 RL_Vector3 RL_Vector3Perpendicular(RL_Vector3 v) +RMAPI Vector3 vector3_perpendicular(Vector3 v) { - RL_Vector3 result = { 0 }; + Vector3 result = { 0 }; float min = (float) fabs(v.x); - RL_Vector3 cardinalAxis = {1.0f, 0.0f, 0.0f}; + Vector3 cardinalAxis = {1.0f, 0.0f, 0.0f}; if (fabsf(v.y) < min) { min = (float) fabs(v.y); - RL_Vector3 tmp = {0.0f, 1.0f, 0.0f}; + Vector3 tmp = {0.0f, 1.0f, 0.0f}; cardinalAxis = tmp; } if (fabsf(v.z) < min) { - RL_Vector3 tmp = {0.0f, 0.0f, 1.0f}; + Vector3 tmp = {0.0f, 0.0f, 1.0f}; cardinalAxis = tmp; } @@ -628,7 +636,7 @@ RMAPI RL_Vector3 RL_Vector3Perpendicular(RL_Vector3 v) } // Calculate vector length -RMAPI float RL_Vector3Length(const RL_Vector3 v) +RMAPI float vector3_length(const Vector3 v) { float result = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); @@ -636,7 +644,7 @@ RMAPI float RL_Vector3Length(const RL_Vector3 v) } // Calculate vector square length -RMAPI float RL_Vector3LengthSqr(const RL_Vector3 v) +RMAPI float vector3_length_sqr(const Vector3 v) { float result = v.x*v.x + v.y*v.y + v.z*v.z; @@ -644,7 +652,7 @@ RMAPI float RL_Vector3LengthSqr(const RL_Vector3 v) } // Calculate two vectors dot product -RMAPI float RL_Vector3DotProduct(RL_Vector3 v1, RL_Vector3 v2) +RMAPI float vector3_dot_product(Vector3 v1, Vector3 v2) { float result = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); @@ -652,7 +660,7 @@ RMAPI float RL_Vector3DotProduct(RL_Vector3 v1, RL_Vector3 v2) } // Calculate distance between two vectors -RMAPI float RL_Vector3Distance(RL_Vector3 v1, RL_Vector3 v2) +RMAPI float vector3_distance(Vector3 v1, Vector3 v2) { float result = 0.0f; @@ -665,7 +673,7 @@ RMAPI float RL_Vector3Distance(RL_Vector3 v1, RL_Vector3 v2) } // Calculate square distance between two vectors -RMAPI float RL_Vector3DistanceSqr(RL_Vector3 v1, RL_Vector3 v2) +RMAPI float vector3_distance_sqr(Vector3 v1, Vector3 v2) { float result = 0.0f; @@ -678,11 +686,11 @@ RMAPI float RL_Vector3DistanceSqr(RL_Vector3 v1, RL_Vector3 v2) } // Calculate angle between two vectors -RMAPI float RL_Vector3Angle(RL_Vector3 v1, RL_Vector3 v2) +RMAPI float vector3_angle(Vector3 v1, Vector3 v2) { float result = 0.0f; - RL_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 }; + 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); @@ -691,25 +699,25 @@ RMAPI float RL_Vector3Angle(RL_Vector3 v1, RL_Vector3 v2) } // Negate provided vector (invert direction) -RMAPI RL_Vector3 RL_Vector3Negate(RL_Vector3 v) +RMAPI Vector3 vector3_negate(Vector3 v) { - RL_Vector3 result = { -v.x, -v.y, -v.z }; + Vector3 result = { -v.x, -v.y, -v.z }; return result; } // Divide vector by vector -RMAPI RL_Vector3 RL_Vector3Divide(RL_Vector3 v1, RL_Vector3 v2) +RMAPI Vector3 vector3_divide(Vector3 v1, Vector3 v2) { - RL_Vector3 result = { v1.x/v2.x, v1.y/v2.y, v1.z/v2.z }; + Vector3 result = { v1.x/v2.x, v1.y/v2.y, v1.z/v2.z }; return result; } -// RL_Normalize provided vector -RMAPI RL_Vector3 RL_Vector3Normalize(RL_Vector3 v) +// normalize provided vector +RMAPI Vector3 vector3_normalize(Vector3 v) { - RL_Vector3 result = v; + Vector3 result = v; float length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); if (length != 0.0f) @@ -725,10 +733,10 @@ RMAPI RL_Vector3 RL_Vector3Normalize(RL_Vector3 v) } //Calculate the projection of the vector v1 on to v2 -RMAPI RL_Vector3 RL_Vector3Project(RL_Vector3 v1, RL_Vector3 v2) +RMAPI Vector3 vector3_project(Vector3 v1, Vector3 v2) { - RL_Vector3 result = { 0 }; - + 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); @@ -742,10 +750,10 @@ RMAPI RL_Vector3 RL_Vector3Project(RL_Vector3 v1, RL_Vector3 v2) } //Calculate the rejection of the vector v1 on to v2 -RMAPI RL_Vector3 RL_Vector3Reject(RL_Vector3 v1, RL_Vector3 v2) +RMAPI Vector3 vector3_reject(Vector3 v1, Vector3 v2) { - RL_Vector3 result = { 0 }; - + 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); @@ -761,13 +769,13 @@ RMAPI RL_Vector3 RL_Vector3Reject(RL_Vector3 v1, RL_Vector3 v2) // Orthonormalize provided vectors // Makes vectors normalized and orthogonal to each other // Gram-Schmidt function implementation -RMAPI void RL_Vector3OrthoNormalize(RL_Vector3 *v1, RL_Vector3 *v2) +RMAPI void vector3_ortho_normalize(Vector3 *v1, Vector3 *v2) { float length = 0.0f; float ilength = 0.0f; - // RL_Vector3Normalize(*v1); - RL_Vector3 v = *v1; + // vector3_normalize(*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; @@ -775,10 +783,10 @@ RMAPI void RL_Vector3OrthoNormalize(RL_Vector3 *v1, RL_Vector3 *v2) v1->y *= ilength; v1->z *= ilength; - // RL_Vector3CrossProduct(*v1, *v2) - RL_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 }; + // vector3_cross_product(*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 }; - // RL_Vector3Normalize(vn1); + // vector3_normalize(vn1); v = vn1; length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); if (length == 0.0f) length = 1.0f; @@ -787,16 +795,16 @@ RMAPI void RL_Vector3OrthoNormalize(RL_Vector3 *v1, RL_Vector3 *v2) vn1.y *= ilength; vn1.z *= ilength; - // RL_Vector3CrossProduct(vn1, *v1) - RL_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 }; + // vector3_cross_product(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 RL_Vector3 by a given RL_Matrix -RMAPI RL_Vector3 RL_Vector3Transform(RL_Vector3 v, RL_Matrix mat) +// Transforms a Vector3 by a given Matrix +RMAPI Vector3 vector3_transform(Vector3 v, Matrix mat) { - RL_Vector3 result = { 0 }; + Vector3 result = { 0 }; float x = v.x; float y = v.y; @@ -809,10 +817,10 @@ RMAPI RL_Vector3 RL_Vector3Transform(RL_Vector3 v, RL_Matrix mat) return result; } -// RL_Transform a vector by quaternion rotation -RMAPI RL_Vector3 RL_Vector3RotateByQuaternion(RL_Vector3 v, RL_Quaternion q) +// Transform a vector by quaternion rotation +RMAPI Vector3 vector3_rotate_by_quaternion(Vector3 v, Quaternion q) { - RL_Vector3 result = { 0 }; + 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); @@ -822,14 +830,14 @@ RMAPI RL_Vector3 RL_Vector3RotateByQuaternion(RL_Vector3 v, RL_Quaternion q) } // Rotates a vector around an axis -RMAPI RL_Vector3 RL_Vector3RotateByAxisAngle(RL_Vector3 v, RL_Vector3 axis, float angle) +RMAPI Vector3 vector3_rotate_by_axis_angle(Vector3 v, Vector3 axis, float angle) { // Using Euler-Rodrigues Formula // Ref.: https://en.wikipedia.org/w/index.php?title=Euler%E2%80%93Rodrigues_formula - RL_Vector3 result = v; + Vector3 result = v; - // RL_Vector3Normalize(axis); + // vector3_normalize(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; @@ -843,21 +851,21 @@ RMAPI RL_Vector3 RL_Vector3RotateByAxisAngle(RL_Vector3 v, RL_Vector3 axis, floa float c = axis.y*a; float d = axis.z*a; a = cosf(angle); - RL_Vector3 w = { b, c, d }; + Vector3 w = { b, c, d }; - // RL_Vector3CrossProduct(w, v) - RL_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 }; + // vector3_cross_product(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 }; - // RL_Vector3CrossProduct(w, wv) - RL_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 }; + // vector3_cross_product(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 }; - // RL_Vector3Scale(wv, 2*a) + // vector3_scale(wv, 2*a) a *= 2; wv.x *= a; wv.y *= a; wv.z *= a; - // RL_Vector3Scale(wwv, 2) + // vector3_scale(wwv, 2) wwv.x *= 2; wwv.y *= 2; wwv.z *= 2; @@ -874,9 +882,9 @@ RMAPI RL_Vector3 RL_Vector3RotateByAxisAngle(RL_Vector3 v, RL_Vector3 axis, floa } // Calculate linear interpolation between two vectors -RMAPI RL_Vector3 RL_Vector3Lerp(RL_Vector3 v1, RL_Vector3 v2, float amount) +RMAPI Vector3 vector3_lerp(Vector3 v1, Vector3 v2, float amount) { - RL_Vector3 result = { 0 }; + Vector3 result = { 0 }; result.x = v1.x + amount*(v2.x - v1.x); result.y = v1.y + amount*(v2.y - v1.y); @@ -886,9 +894,9 @@ RMAPI RL_Vector3 RL_Vector3Lerp(RL_Vector3 v1, RL_Vector3 v2, float amount) } // Calculate reflected vector to normal -RMAPI RL_Vector3 RL_Vector3Reflect(RL_Vector3 v, RL_Vector3 normal) +RMAPI Vector3 vector3_reflect(Vector3 v, Vector3 normal) { - RL_Vector3 result = { 0 }; + Vector3 result = { 0 }; // I is the original vector // N is the normal of the incident plane @@ -904,9 +912,9 @@ RMAPI RL_Vector3 RL_Vector3Reflect(RL_Vector3 v, RL_Vector3 normal) } // Get min value for each pair of components -RMAPI RL_Vector3 RL_Vector3Min(RL_Vector3 v1, RL_Vector3 v2) +RMAPI Vector3 vector3_min(Vector3 v1, Vector3 v2) { - RL_Vector3 result = { 0 }; + Vector3 result = { 0 }; result.x = fminf(v1.x, v2.x); result.y = fminf(v1.y, v2.y); @@ -916,9 +924,9 @@ RMAPI RL_Vector3 RL_Vector3Min(RL_Vector3 v1, RL_Vector3 v2) } // Get max value for each pair of components -RMAPI RL_Vector3 RL_Vector3Max(RL_Vector3 v1, RL_Vector3 v2) +RMAPI Vector3 vector3_max(Vector3 v1, Vector3 v2) { - RL_Vector3 result = { 0 }; + Vector3 result = { 0 }; result.x = fmaxf(v1.x, v2.x); result.y = fmaxf(v1.y, v2.y); @@ -929,18 +937,18 @@ RMAPI RL_Vector3 RL_Vector3Max(RL_Vector3 v1, RL_Vector3 v2) // 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 RL_Vector3 RL_Vector3Barycenter(RL_Vector3 p, RL_Vector3 a, RL_Vector3 b, RL_Vector3 c) +RMAPI Vector3 vector3_barycenter(Vector3 p, Vector3 a, Vector3 b, Vector3 c) { - RL_Vector3 result = { 0 }; + Vector3 result = { 0 }; - RL_Vector3 v0 = { b.x - a.x, b.y - a.y, b.z - a.z }; // RL_Vector3Subtract(b, a) - RL_Vector3 v1 = { c.x - a.x, c.y - a.y, c.z - a.z }; // RL_Vector3Subtract(c, a) - RL_Vector3 v2 = { p.x - a.x, p.y - a.y, p.z - a.z }; // RL_Vector3Subtract(p, a) - float d00 = (v0.x*v0.x + v0.y*v0.y + v0.z*v0.z); // RL_Vector3DotProduct(v0, v0) - float d01 = (v0.x*v1.x + v0.y*v1.y + v0.z*v1.z); // RL_Vector3DotProduct(v0, v1) - float d11 = (v1.x*v1.x + v1.y*v1.y + v1.z*v1.z); // RL_Vector3DotProduct(v1, v1) - float d20 = (v2.x*v0.x + v2.y*v0.y + v2.z*v0.z); // RL_Vector3DotProduct(v2, v0) - float d21 = (v2.x*v1.x + v2.y*v1.y + v2.z*v1.z); // RL_Vector3DotProduct(v2, v1) + Vector3 v0 = { b.x - a.x, b.y - a.y, b.z - a.z }; // vector3_subtract(b, a) + Vector3 v1 = { c.x - a.x, c.y - a.y, c.z - a.z }; // vector3_subtract(c, a) + Vector3 v2 = { p.x - a.x, p.y - a.y, p.z - a.z }; // vector3_subtract(p, a) + float d00 = (v0.x*v0.x + v0.y*v0.y + v0.z*v0.z); // vector3_dot_product(v0, v0) + float d01 = (v0.x*v1.x + v0.y*v1.y + v0.z*v1.z); // vector3_dot_product(v0, v1) + float d11 = (v1.x*v1.x + v1.y*v1.y + v1.z*v1.z); // vector3_dot_product(v1, v1) + float d20 = (v2.x*v0.x + v2.y*v0.y + v2.z*v0.z); // vector3_dot_product(v2, v0) + float d21 = (v2.x*v1.x + v2.y*v1.y + v2.z*v1.z); // vector3_dot_product(v2, v1) float denom = d00*d11 - d01*d01; @@ -951,14 +959,14 @@ RMAPI RL_Vector3 RL_Vector3Barycenter(RL_Vector3 p, RL_Vector3 a, RL_Vector3 b, return result; } -// Projects a RL_Vector3 from screen space into object space +// Projects a Vector3 from screen space into object space // NOTE: We are avoiding calling other raymath functions despite available -RMAPI RL_Vector3 RL_Vector3Unproject(RL_Vector3 source, RL_Matrix projection, RL_Matrix view) +RMAPI Vector3 vector3_unproject(Vector3 source, Matrix projection, Matrix view) { - RL_Vector3 result = { 0 }; + Vector3 result = { 0 }; // Calculate unprojected matrix (multiply view matrix by projection matrix) and invert it - RL_Matrix matViewProj = { // RL_MatrixMultiply(view, projection); + Matrix matViewProj = { // matrix_multiply(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, @@ -976,7 +984,7 @@ RMAPI RL_Vector3 RL_Vector3Unproject(RL_Vector3 source, RL_Matrix projection, RL 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 -> RL_MatrixInvert(matViewProj); + // Calculate inverted matrix -> matrix_invert(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; @@ -999,7 +1007,7 @@ RMAPI RL_Vector3 RL_Vector3Unproject(RL_Vector3 source, RL_Matrix projection, RL // 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); - RL_Matrix matViewProjInv = { + Matrix matViewProjInv = { (a11*b11 - a12*b10 + a13*b09)*invDet, (-a01*b11 + a02*b10 - a03*b09)*invDet, (a31*b05 - a32*b04 + a33*b03)*invDet, @@ -1018,10 +1026,10 @@ RMAPI RL_Vector3 RL_Vector3Unproject(RL_Vector3 source, RL_Matrix projection, RL (a20*b03 - a21*b01 + a22*b00)*invDet }; // Create quaternion from source point - RL_Quaternion quat = { source.x, source.y, source.z, 1.0f }; + Quaternion quat = { source.x, source.y, source.z, 1.0f }; // Multiply quat point by unprojecte matrix - RL_Quaternion qtransformed = { // RL_QuaternionTransform(quat, matViewProjInv) + Quaternion qtransformed = { // quaternion_transform(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, @@ -1035,10 +1043,10 @@ RMAPI RL_Vector3 RL_Vector3Unproject(RL_Vector3 source, RL_Matrix projection, RL return result; } -// Get RL_Vector3 as float array -RMAPI RL_float3 RL_Vector3ToFloatV(RL_Vector3 v) +// Get Vector3 as float array +RMAPI float3 vector3_to_float_v(Vector3 v) { - RL_float3 buffer = { 0 }; + float3 buffer = { 0 }; buffer.v[0] = v.x; buffer.v[1] = v.y; @@ -1048,18 +1056,18 @@ RMAPI RL_float3 RL_Vector3ToFloatV(RL_Vector3 v) } // Invert the given vector -RMAPI RL_Vector3 RL_Vector3Invert(RL_Vector3 v) +RMAPI Vector3 vector3_invert(Vector3 v) { - RL_Vector3 result = { 1.0f/v.x, 1.0f/v.y, 1.0f/v.z }; + Vector3 result = { 1.0f/v.x, 1.0f/v.y, 1.0f/v.z }; return result; } -// RL_Clamp the components of the vector between +// clamp the components of the vector between // min and max values specified by the given vectors -RMAPI RL_Vector3 RL_Vector3Clamp(RL_Vector3 v, RL_Vector3 min, RL_Vector3 max) +RMAPI Vector3 vector3_clamp(Vector3 v, Vector3 min, Vector3 max) { - RL_Vector3 result = { 0 }; + Vector3 result = { 0 }; result.x = fminf(max.x, fmaxf(min.x, v.x)); result.y = fminf(max.y, fmaxf(min.y, v.y)); @@ -1068,10 +1076,10 @@ RMAPI RL_Vector3 RL_Vector3Clamp(RL_Vector3 v, RL_Vector3 min, RL_Vector3 max) return result; } -// RL_Clamp the magnitude of the vector between two values -RMAPI RL_Vector3 RL_Vector3ClampValue(RL_Vector3 v, float min, float max) +// clamp the magnitude of the vector between two values +RMAPI Vector3 vector3_clamp_value(Vector3 v, float min, float max) { - RL_Vector3 result = v; + Vector3 result = v; float length = (v.x*v.x) + (v.y*v.y) + (v.z*v.z); if (length > 0.0f) @@ -1098,7 +1106,7 @@ RMAPI RL_Vector3 RL_Vector3ClampValue(RL_Vector3 v, float min, float max) } // Check whether two given vectors are almost equal -RMAPI int RL_Vector3Equals(RL_Vector3 p, RL_Vector3 q) +RMAPI int vector3_equals(Vector3 p, Vector3 q) { #if !defined(EPSILON) #define EPSILON 0.000001f @@ -1116,9 +1124,9 @@ RMAPI int RL_Vector3Equals(RL_Vector3 p, RL_Vector3 q) // 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 RL_Vector3 RL_Vector3Refract(RL_Vector3 v, RL_Vector3 n, float r) +RMAPI Vector3 vector3_refract(Vector3 v, Vector3 n, float r) { - RL_Vector3 result = { 0 }; + 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); @@ -1137,11 +1145,11 @@ RMAPI RL_Vector3 RL_Vector3Refract(RL_Vector3 v, RL_Vector3 n, float r) } //---------------------------------------------------------------------------------- -// Module Functions Definition - RL_Matrix math +// Module Functions Definition - Matrix math //---------------------------------------------------------------------------------- // Compute matrix determinant -RMAPI float RL_MatrixDeterminant(RL_Matrix mat) +RMAPI float matrix_determinant(Matrix mat) { float result = 0.0f; @@ -1162,7 +1170,7 @@ RMAPI float RL_MatrixDeterminant(RL_Matrix mat) } // Get the trace of the matrix (sum of the values along the diagonal) -RMAPI float RL_MatrixTrace(RL_Matrix mat) +RMAPI float matrix_trace(Matrix mat) { float result = (mat.m0 + mat.m5 + mat.m10 + mat.m15); @@ -1170,9 +1178,9 @@ RMAPI float RL_MatrixTrace(RL_Matrix mat) } // Transposes provided matrix -RMAPI RL_Matrix RL_MatrixTranspose(RL_Matrix mat) +RMAPI Matrix matrix_transpose(Matrix mat) { - RL_Matrix result = { 0 }; + Matrix result = { 0 }; result.m0 = mat.m0; result.m1 = mat.m4; @@ -1195,9 +1203,9 @@ RMAPI RL_Matrix RL_MatrixTranspose(RL_Matrix mat) } // Invert provided matrix -RMAPI RL_Matrix RL_MatrixInvert(RL_Matrix mat) +RMAPI Matrix matrix_invert(Matrix mat) { - RL_Matrix result = { 0 }; + Matrix result = { 0 }; // Cache the matrix values (speed optimization) float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3; @@ -1241,21 +1249,24 @@ RMAPI RL_Matrix RL_MatrixInvert(RL_Matrix mat) return result; } +// #if !defined(RL_REFACTORED_C) && !defined(RL_REFACTORED_CPP) || !defined(RLGL_H) +// #if !defined(RLGL_H) && !defined(RL_REFACTORED_C) && !defined(RL_REFACTORED_CPP) // Get identity matrix -RMAPI RL_Matrix RL_MatrixIdentity(void) +RMAPI Matrix matrix_identity(void) { - RL_Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 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; } +// #endif // Add two matrices -RMAPI RL_Matrix RL_MatrixAdd(RL_Matrix left, RL_Matrix right) +RMAPI Matrix matrix_add(Matrix left, Matrix right) { - RL_Matrix result = { 0 }; + Matrix result = { 0 }; result.m0 = left.m0 + right.m0; result.m1 = left.m1 + right.m1; @@ -1278,9 +1289,9 @@ RMAPI RL_Matrix RL_MatrixAdd(RL_Matrix left, RL_Matrix right) } // Subtract two matrices (left - right) -RMAPI RL_Matrix RL_MatrixSubtract(RL_Matrix left, RL_Matrix right) +RMAPI Matrix matrix_subtract(Matrix left, Matrix right) { - RL_Matrix result = { 0 }; + Matrix result = { 0 }; result.m0 = left.m0 - right.m0; result.m1 = left.m1 - right.m1; @@ -1302,11 +1313,13 @@ RMAPI RL_Matrix RL_MatrixSubtract(RL_Matrix left, RL_Matrix right) return result; } +// #if !defined(RL_REFACTORED_C) && !defined(RL_REFACTORED_CPP) || !defined(RLGL_H) +// #if !defined(RLGL_H) && !defined(RL_REFACTORED_C) && !defined(RL_REFACTORED_CPP) // Get two matrix multiplication // NOTE: When multiplying matrices... the order matters! -RMAPI RL_Matrix RL_MatrixMultiply(RL_Matrix left, RL_Matrix right) +RMAPI Matrix matrix_multiply(Matrix left, Matrix right) { - RL_Matrix result = { 0 }; + 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; @@ -1327,11 +1340,12 @@ RMAPI RL_Matrix RL_MatrixMultiply(RL_Matrix left, RL_Matrix right) return result; } +// #endif // Get translation matrix -RMAPI RL_Matrix RL_MatrixTranslate(float x, float y, float z) +RMAPI Matrix matrix_translate(float x, float y, float z) { - RL_Matrix result = { 1.0f, 0.0f, 0.0f, x, + 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 }; @@ -1341,9 +1355,9 @@ RMAPI RL_Matrix RL_MatrixTranslate(float x, float y, float z) // Create rotation matrix from axis and angle // NOTE: Angle should be provided in radians -RMAPI RL_Matrix RL_MatrixRotate(RL_Vector3 axis, float angle) +RMAPI Matrix matrix_rotate(Vector3 axis, float angle) { - RL_Matrix result = { 0 }; + Matrix result = { 0 }; float x = axis.x, y = axis.y, z = axis.z; @@ -1386,12 +1400,12 @@ RMAPI RL_Matrix RL_MatrixRotate(RL_Vector3 axis, float angle) // Get x-rotation matrix // NOTE: Angle must be provided in radians -RMAPI RL_Matrix RL_MatrixRotateX(float angle) +RMAPI Matrix matrix_rotate_x(float angle) { - RL_Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 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 }; // RL_MatrixIdentity() + 0.0f, 0.0f, 0.0f, 1.0f }; // matrix_identity() float cosres = cosf(angle); float sinres = sinf(angle); @@ -1406,12 +1420,12 @@ RMAPI RL_Matrix RL_MatrixRotateX(float angle) // Get y-rotation matrix // NOTE: Angle must be provided in radians -RMAPI RL_Matrix RL_MatrixRotateY(float angle) +RMAPI Matrix matrix_rotate_y(float angle) { - RL_Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 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 }; // RL_MatrixIdentity() + 0.0f, 0.0f, 0.0f, 1.0f }; // matrix_identity() float cosres = cosf(angle); float sinres = sinf(angle); @@ -1426,12 +1440,12 @@ RMAPI RL_Matrix RL_MatrixRotateY(float angle) // Get z-rotation matrix // NOTE: Angle must be provided in radians -RMAPI RL_Matrix RL_MatrixRotateZ(float angle) +RMAPI Matrix matrix_rotate_z(float angle) { - RL_Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 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 }; // RL_MatrixIdentity() + 0.0f, 0.0f, 0.0f, 1.0f }; // matrix_identity() float cosres = cosf(angle); float sinres = sinf(angle); @@ -1447,12 +1461,12 @@ RMAPI RL_Matrix RL_MatrixRotateZ(float angle) // Get xyz-rotation matrix // NOTE: Angle must be provided in radians -RMAPI RL_Matrix RL_MatrixRotateXYZ(RL_Vector3 angle) +RMAPI Matrix matrix_rotate_xyz(Vector3 angle) { - RL_Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 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 }; // RL_MatrixIdentity() + 0.0f, 0.0f, 0.0f, 1.0f }; // matrix_identity() float cosz = cosf(-angle.z); float sinz = sinf(-angle.z); @@ -1478,9 +1492,9 @@ RMAPI RL_Matrix RL_MatrixRotateXYZ(RL_Vector3 angle) // Get zyx-rotation matrix // NOTE: Angle must be provided in radians -RMAPI RL_Matrix RL_MatrixRotateZYX(RL_Vector3 angle) +RMAPI Matrix matrix_rotate_zyx(Vector3 angle) { - RL_Matrix result = { 0 }; + Matrix result = { 0 }; float cz = cosf(angle.z); float sz = sinf(angle.z); @@ -1513,9 +1527,9 @@ RMAPI RL_Matrix RL_MatrixRotateZYX(RL_Vector3 angle) } // Get scaling matrix -RMAPI RL_Matrix RL_MatrixScale(float x, float y, float z) +RMAPI Matrix matrix_scale(float x, float y, float z) { - RL_Matrix result = { x, 0.0f, 0.0f, 0.0f, + 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 }; @@ -1524,15 +1538,15 @@ RMAPI RL_Matrix RL_MatrixScale(float x, float y, float z) } // Get perspective projection matrix -RMAPI RL_Matrix RL_MatrixFrustum(double left, double right, double bottom, double top, double near, double far) +RMAPI Matrix matrix_frustum(double left, double right, double bottom, double top, double near, double far) { - RL_Matrix result = { 0 }; + Matrix result = { 0 }; - float RLGL_ = (float)(right - left); + float rl = (float)(right - left); float tb = (float)(top - bottom); float fn = (float)(far - near); - result.m0 = ((float)near*2.0f)/RLGL_; + result.m0 = ((float)near*2.0f)/rl; result.m1 = 0.0f; result.m2 = 0.0f; result.m3 = 0.0f; @@ -1542,7 +1556,7 @@ RMAPI RL_Matrix RL_MatrixFrustum(double left, double right, double bottom, doubl result.m6 = 0.0f; result.m7 = 0.0f; - result.m8 = ((float)right + (float)left)/RLGL_; + result.m8 = ((float)right + (float)left)/rl; result.m9 = ((float)top + (float)bottom)/tb; result.m10 = -((float)far + (float)near)/fn; result.m11 = -1.0f; @@ -1557,23 +1571,23 @@ RMAPI RL_Matrix RL_MatrixFrustum(double left, double right, double bottom, doubl // Get perspective projection matrix // NOTE: Fovy angle must be provided in radians -RMAPI RL_Matrix RL_MatrixPerspective(double fovY, double aspect, double nearPlane, double farPlane) +RMAPI Matrix matrix_perspective(double fovY, double aspect, double nearPlane, double farPlane) { - RL_Matrix result = { 0 }; + Matrix result = { 0 }; double top = nearPlane*tan(fovY*0.5); double bottom = -top; double right = top*aspect; double left = -right; - // RL_MatrixFrustum(-right, right, -top, top, near, far); - float RLGL_ = (float)(right - left); + // matrix_frustum(-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)/RLGL_; + result.m0 = ((float)nearPlane*2.0f)/rl; result.m5 = ((float)nearPlane*2.0f)/tb; - result.m8 = ((float)right + (float)left)/RLGL_; + 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; @@ -1583,15 +1597,15 @@ RMAPI RL_Matrix RL_MatrixPerspective(double fovY, double aspect, double nearPlan } // Get orthographic projection matrix -RMAPI RL_Matrix RL_MatrixOrtho(double left, double right, double bottom, double top, double nearPlane, double farPlane) +RMAPI Matrix matrix_ortho(double left, double right, double bottom, double top, double nearPlane, double farPlane) { - RL_Matrix result = { 0 }; + Matrix result = { 0 }; - float RLGL_ = (float)(right - left); + float rl = (float)(right - left); float tb = (float)(top - bottom); float fn = (float)(farPlane - nearPlane); - result.m0 = 2.0f/RLGL_; + result.m0 = 2.0f/rl; result.m1 = 0.0f; result.m2 = 0.0f; result.m3 = 0.0f; @@ -1603,7 +1617,7 @@ RMAPI RL_Matrix RL_MatrixOrtho(double left, double right, double bottom, double result.m9 = 0.0f; result.m10 = -2.0f/fn; result.m11 = 0.0f; - result.m12 = -((float)left + (float)right)/RLGL_; + 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; @@ -1612,18 +1626,18 @@ RMAPI RL_Matrix RL_MatrixOrtho(double left, double right, double bottom, double } // Get camera look-at matrix (view matrix) -RMAPI RL_Matrix RL_MatrixLookAt(RL_Vector3 eye, RL_Vector3 target, RL_Vector3 up) +RMAPI Matrix matrix_look_at(Vector3 eye, Vector3 target, Vector3 up) { - RL_Matrix result = { 0 }; + Matrix result = { 0 }; float length = 0.0f; float ilength = 0.0f; - // RL_Vector3Subtract(eye, target) - RL_Vector3 vz = { eye.x - target.x, eye.y - target.y, eye.z - target.z }; + // vector3_subtract(eye, target) + Vector3 vz = { eye.x - target.x, eye.y - target.y, eye.z - target.z }; - // RL_Vector3Normalize(vz) - RL_Vector3 v = vz; + // vector3_normalize(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; @@ -1631,10 +1645,10 @@ RMAPI RL_Matrix RL_MatrixLookAt(RL_Vector3 eye, RL_Vector3 target, RL_Vector3 up vz.y *= ilength; vz.z *= ilength; - // RL_Vector3CrossProduct(up, vz) - RL_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 }; + // vector3_cross_product(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 }; - // RL_Vector3Normalize(x) + // vector3_normalize(x) v = vx; length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); if (length == 0.0f) length = 1.0f; @@ -1643,8 +1657,8 @@ RMAPI RL_Matrix RL_MatrixLookAt(RL_Vector3 eye, RL_Vector3 target, RL_Vector3 up vx.y *= ilength; vx.z *= ilength; - // RL_Vector3CrossProduct(vz, vx) - RL_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 }; + // vector3_cross_product(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; @@ -1658,18 +1672,18 @@ RMAPI RL_Matrix RL_MatrixLookAt(RL_Vector3 eye, RL_Vector3 target, RL_Vector3 up 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); // RL_Vector3DotProduct(vx, eye) - result.m13 = -(vy.x*eye.x + vy.y*eye.y + vy.z*eye.z); // RL_Vector3DotProduct(vy, eye) - result.m14 = -(vz.x*eye.x + vz.y*eye.y + vz.z*eye.z); // RL_Vector3DotProduct(vz, eye) + result.m12 = -(vx.x*eye.x + vx.y*eye.y + vx.z*eye.z); // vector3_dot_product(vx, eye) + result.m13 = -(vy.x*eye.x + vy.y*eye.y + vy.z*eye.z); // vector3_dot_product(vy, eye) + result.m14 = -(vz.x*eye.x + vz.y*eye.y + vz.z*eye.z); // vector3_dot_product(vz, eye) result.m15 = 1.0f; return result; } // Get float array of matrix data -RMAPI RL_float16 RL_MatrixToFloatV(RL_Matrix mat) +RMAPI float16 matrix_to_float_v(Matrix mat) { - RL_float16 result = { 0 }; + float16 result = { 0 }; result.v[0] = mat.m0; result.v[1] = mat.m1; @@ -1692,61 +1706,61 @@ RMAPI RL_float16 RL_MatrixToFloatV(RL_Matrix mat) } //---------------------------------------------------------------------------------- -// Module Functions Definition - RL_Quaternion math +// Module Functions Definition - Quaternion math //---------------------------------------------------------------------------------- // Add two quaternions -RMAPI RL_Quaternion RL_QuaternionAdd(RL_Quaternion q1, RL_Quaternion q2) +RMAPI Quaternion quaternion_add(Quaternion q1, Quaternion q2) { - RL_Quaternion result = {q1.x + q2.x, q1.y + q2.y, q1.z + q2.z, q1.w + q2.w}; + 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 RL_Quaternion RL_QuaternionAddValue(RL_Quaternion q, float add) +RMAPI Quaternion quaternion_add_value(Quaternion q, float add) { - RL_Quaternion result = {q.x + add, q.y + add, q.z + add, q.w + add}; + Quaternion result = {q.x + add, q.y + add, q.z + add, q.w + add}; return result; } // Subtract two quaternions -RMAPI RL_Quaternion RL_QuaternionSubtract(RL_Quaternion q1, RL_Quaternion q2) +RMAPI Quaternion quaternion_subtract(Quaternion q1, Quaternion q2) { - RL_Quaternion result = {q1.x - q2.x, q1.y - q2.y, q1.z - q2.z, q1.w - q2.w}; + 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 RL_Quaternion RL_QuaternionSubtractValue(RL_Quaternion q, float sub) +RMAPI Quaternion quaternion_subtract_value(Quaternion q, float sub) { - RL_Quaternion result = {q.x - sub, q.y - sub, q.z - sub, q.w - sub}; + Quaternion result = {q.x - sub, q.y - sub, q.z - sub, q.w - sub}; return result; } // Get identity quaternion -RMAPI RL_Quaternion RL_QuaternionIdentity(void) +RMAPI Quaternion quaternion_identity(void) { - RL_Quaternion result = { 0.0f, 0.0f, 0.0f, 1.0f }; + Quaternion result = { 0.0f, 0.0f, 0.0f, 1.0f }; return result; } // Computes the length of a quaternion -RMAPI float RL_QuaternionLength(RL_Quaternion q) +RMAPI float quaternion_length(Quaternion q) { float result = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); return result; } -// RL_Normalize provided quaternion -RMAPI RL_Quaternion RL_QuaternionNormalize(RL_Quaternion q) +// normalize provided quaternion +RMAPI Quaternion quaternion_normalize(Quaternion q) { - RL_Quaternion result = { 0 }; + 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; @@ -1761,9 +1775,9 @@ RMAPI RL_Quaternion RL_QuaternionNormalize(RL_Quaternion q) } // Invert provided quaternion -RMAPI RL_Quaternion RL_QuaternionInvert(RL_Quaternion q) +RMAPI Quaternion quaternion_invert(Quaternion q) { - RL_Quaternion result = q; + Quaternion result = q; float lengthSq = q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w; @@ -1781,9 +1795,9 @@ RMAPI RL_Quaternion RL_QuaternionInvert(RL_Quaternion q) } // Calculate two quaternion multiplication -RMAPI RL_Quaternion RL_QuaternionMultiply(RL_Quaternion q1, RL_Quaternion q2) +RMAPI Quaternion quaternion_multiply(Quaternion q1, Quaternion q2) { - RL_Quaternion result = { 0 }; + 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; @@ -1797,9 +1811,9 @@ RMAPI RL_Quaternion RL_QuaternionMultiply(RL_Quaternion q1, RL_Quaternion q2) } // Scale quaternion by float value -RMAPI RL_Quaternion RL_QuaternionScale(RL_Quaternion q, float mul) +RMAPI Quaternion quaternion_scale(Quaternion q, float mul) { - RL_Quaternion result = { 0 }; + Quaternion result = { 0 }; result.x = q.x*mul; result.y = q.y*mul; @@ -1810,17 +1824,17 @@ RMAPI RL_Quaternion RL_QuaternionScale(RL_Quaternion q, float mul) } // Divide two quaternions -RMAPI RL_Quaternion RL_QuaternionDivide(RL_Quaternion q1, RL_Quaternion q2) +RMAPI Quaternion quaternion_divide(Quaternion q1, Quaternion q2) { - RL_Quaternion result = { q1.x/q2.x, q1.y/q2.y, q1.z/q2.z, q1.w/q2.w }; + 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 RL_Quaternion RL_QuaternionLerp(RL_Quaternion q1, RL_Quaternion q2, float amount) +RMAPI Quaternion quaternion_lerp(Quaternion q1, Quaternion q2, float amount) { - RL_Quaternion result = { 0 }; + Quaternion result = { 0 }; result.x = q1.x + amount*(q2.x - q1.x); result.y = q1.y + amount*(q2.y - q1.y); @@ -1831,18 +1845,18 @@ RMAPI RL_Quaternion RL_QuaternionLerp(RL_Quaternion q1, RL_Quaternion q2, float } // Calculate slerp-optimized interpolation between two quaternions -RMAPI RL_Quaternion RL_QuaternionNlerp(RL_Quaternion q1, RL_Quaternion q2, float amount) +RMAPI Quaternion quaternion_nlerp(Quaternion q1, Quaternion q2, float amount) { - RL_Quaternion result = { 0 }; + Quaternion result = { 0 }; - // RL_QuaternionLerp(q1, q2, amount) + // quaternion_lerp(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); - // RL_QuaternionNormalize(q); - RL_Quaternion q = result; + // quaternion_normalize(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; @@ -1856,9 +1870,9 @@ RMAPI RL_Quaternion RL_QuaternionNlerp(RL_Quaternion q1, RL_Quaternion q2, float } // Calculates spherical linear interpolation between two quaternions -RMAPI RL_Quaternion RL_QuaternionSlerp(RL_Quaternion q1, RL_Quaternion q2, float amount) +RMAPI Quaternion quaternion_slerp(Quaternion q1, Quaternion q2, float amount) { - RL_Quaternion result = { 0 }; + Quaternion result = { 0 }; #if !defined(EPSILON) #define EPSILON 0.000001f @@ -1873,7 +1887,7 @@ RMAPI RL_Quaternion RL_QuaternionSlerp(RL_Quaternion q1, RL_Quaternion q2, float } if (fabsf(cosHalfTheta) >= 1.0f) result = q1; - else if (cosHalfTheta > 0.95f) result = RL_QuaternionNlerp(q1, q2, amount); + else if (cosHalfTheta > 0.95f) result = quaternion_nlerp(q1, q2, amount); else { float halfTheta = acosf(cosHalfTheta); @@ -1902,21 +1916,21 @@ RMAPI RL_Quaternion RL_QuaternionSlerp(RL_Quaternion q1, RL_Quaternion q2, float } // Calculate quaternion based on the rotation from one vector to another -RMAPI RL_Quaternion RL_QuaternionFromVector3ToVector3(RL_Vector3 from, RL_Vector3 to) +RMAPI Quaternion quaternion_from_vector3_to_vector3(Vector3 from, Vector3 to) { - RL_Quaternion result = { 0 }; + Quaternion result = { 0 }; - float cos2Theta = (from.x*to.x + from.y*to.y + from.z*to.z); // RL_Vector3DotProduct(from, to) - RL_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 }; // RL_Vector3CrossProduct(from, to) + float cos2Theta = (from.x*to.x + from.y*to.y + from.z*to.z); // vector3_dot_product(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 }; // vector3_cross_product(from, to) result.x = cross.x; result.y = cross.y; result.z = cross.z; result.w = 1.0f + cos2Theta; - // RL_QuaternionNormalize(q); - // NOTE: RL_Normalize to essentially nlerp the original and identity to 0.5 - RL_Quaternion q = result; + // quaternion_normalize(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; @@ -1930,9 +1944,9 @@ RMAPI RL_Quaternion RL_QuaternionFromVector3ToVector3(RL_Vector3 from, RL_Vector } // Get a quaternion for a given rotation matrix -RMAPI RL_Quaternion RL_QuaternionFromMatrix(RL_Matrix mat) +RMAPI Quaternion quaternion_from_matrix(Matrix mat) { - RL_Quaternion result = { 0 }; + Quaternion result = { 0 }; float fourWSquaredMinus1 = mat.m0 + mat.m5 + mat.m10; float fourXSquaredMinus1 = mat.m0 - mat.m5 - mat.m10; @@ -1994,12 +2008,12 @@ RMAPI RL_Quaternion RL_QuaternionFromMatrix(RL_Matrix mat) } // Get a matrix for a given quaternion -RMAPI RL_Matrix RL_QuaternionToMatrix(RL_Quaternion q) +RMAPI Matrix quaternion_to_matrix(Quaternion q) { - RL_Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 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 }; // RL_MatrixIdentity() + 0.0f, 0.0f, 0.0f, 1.0f }; // matrix_identity() float a2 = q.x*q.x; float b2 = q.y*q.y; @@ -2028,9 +2042,9 @@ RMAPI RL_Matrix RL_QuaternionToMatrix(RL_Quaternion q) // Get rotation quaternion for an angle and axis // NOTE: Angle must be provided in radians -RMAPI RL_Quaternion RL_QuaternionFromAxisAngle(RL_Vector3 axis, float angle) +RMAPI Quaternion quaternion_from_axis_angle(Vector3 axis, float angle) { - RL_Quaternion result = { 0.0f, 0.0f, 0.0f, 1.0f }; + 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); @@ -2041,8 +2055,8 @@ RMAPI RL_Quaternion RL_QuaternionFromAxisAngle(RL_Vector3 axis, float angle) float length = 0.0f; float ilength = 0.0f; - // RL_Vector3Normalize(axis) - RL_Vector3 v = axis; + // vector3_normalize(axis) + Vector3 v = axis; 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; @@ -2058,8 +2072,8 @@ RMAPI RL_Quaternion RL_QuaternionFromAxisAngle(RL_Vector3 axis, float angle) result.z = axis.z*sinres; result.w = cosres; - // RL_QuaternionNormalize(q); - RL_Quaternion q = result; + // quaternion_normalize(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; @@ -2073,11 +2087,11 @@ RMAPI RL_Quaternion RL_QuaternionFromAxisAngle(RL_Vector3 axis, float angle) } // Get the rotation angle and axis for a given quaternion -RMAPI void RL_QuaternionToAxisAngle(RL_Quaternion q, RL_Vector3 *outAxis, float *outAngle) +RMAPI void quaternion_to_axis_angle(Quaternion q, Vector3 *outAxis, float *outAngle) { if (fabsf(q.w) > 1.0f) { - // RL_QuaternionNormalize(q); + // quaternion_normalize(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; @@ -2088,7 +2102,7 @@ RMAPI void RL_QuaternionToAxisAngle(RL_Quaternion q, RL_Vector3 *outAxis, float q.w = q.w*ilength; } - RL_Vector3 resAxis = { 0.0f, 0.0f, 0.0f }; + Vector3 resAxis = { 0.0f, 0.0f, 0.0f }; float resAngle = 2.0f*acosf(q.w); float den = sqrtf(1.0f - q.w*q.w); @@ -2111,9 +2125,9 @@ RMAPI void RL_QuaternionToAxisAngle(RL_Quaternion q, RL_Vector3 *outAxis, float // Get the quaternion equivalent to Euler angles // NOTE: Rotation order is ZYX -RMAPI RL_Quaternion RL_QuaternionFromEuler(float pitch, float yaw, float roll) +RMAPI Quaternion quaternion_from_euler(float pitch, float yaw, float roll) { - RL_Quaternion result = { 0 }; + Quaternion result = { 0 }; float x0 = cosf(pitch*0.5f); float x1 = sinf(pitch*0.5f); @@ -2131,10 +2145,10 @@ RMAPI RL_Quaternion RL_QuaternionFromEuler(float pitch, float yaw, float roll) } // Get the Euler angles equivalent to quaternion (roll, pitch, yaw) -// NOTE: Angles are returned in a RL_Vector3 struct in radians -RMAPI RL_Vector3 RL_QuaternionToEuler(RL_Quaternion q) +// NOTE: Angles are returned in a Vector3 struct in radians +RMAPI Vector3 quaternion_to_euler(Quaternion q) { - RL_Vector3 result = { 0 }; + Vector3 result = { 0 }; // Roll (x-axis rotation) float x0 = 2.0f*(q.w*q.x + q.y*q.z); @@ -2155,10 +2169,10 @@ RMAPI RL_Vector3 RL_QuaternionToEuler(RL_Quaternion q) return result; } -// RL_Transform a quaternion given a transformation matrix -RMAPI RL_Quaternion RL_QuaternionTransform(RL_Quaternion q, RL_Matrix mat) +// Transform a quaternion given a transformation matrix +RMAPI Quaternion quaternion_transform(Quaternion q, Matrix mat) { - RL_Quaternion result = { 0 }; + 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; @@ -2169,7 +2183,7 @@ RMAPI RL_Quaternion RL_QuaternionTransform(RL_Quaternion q, RL_Matrix mat) } // Check whether two given quaternions are almost equal -RMAPI int RL_QuaternionEquals(RL_Quaternion p, RL_Quaternion q) +RMAPI int quaternion_equals(Quaternion p, Quaternion q) { #if !defined(EPSILON) #define EPSILON 0.000001f @@ -2187,4 +2201,6 @@ RMAPI int RL_QuaternionEquals(RL_Quaternion p, RL_Quaternion q) return result; } +RL_NS_END + #endif // RAYMATH_H diff --git a/project/auxillary/vis_ast/dependencies/raylib/include/rcamera.h b/project/auxillary/vis_ast/dependencies/raylib/include/rcamera.h index d33aaa8..b0bea47 100644 --- a/project/auxillary/vis_ast/dependencies/raylib/include/rcamera.h +++ b/project/auxillary/vis_ast/dependencies/raylib/include/rcamera.h @@ -72,57 +72,59 @@ #define RL_CAMERA_CULL_DISTANCE_FAR RL_CULL_DISTANCE_FAR #endif +RL_NS_BEGIN + //---------------------------------------------------------------------------------- // Types and Structures Definition // NOTE: Below types are required for standalone usage //---------------------------------------------------------------------------------- #if defined(RCAMERA_STANDALONE) - // RL_Vector2, 2 components - typedef struct RL_Vector2 { + // Vector2, 2 components + typedef struct Vector2 { float x; // Vector x component float y; // Vector y component - } RL_Vector2; + } Vector2; - // RL_Vector3, 3 components - typedef struct RL_Vector3 { + // Vector3, 3 components + typedef struct Vector3 { float x; // Vector x component float y; // Vector y component float z; // Vector z component - } RL_Vector3; + } Vector3; - // RL_Matrix, 4x4 components, column major, OpenGL style, right-handed - typedef struct RL_Matrix { - float m0, m4, m8, m12; // RL_Matrix first row (4 components) - float m1, m5, m9, m13; // RL_Matrix second row (4 components) - float m2, m6, m10, m14; // RL_Matrix third row (4 components) - float m3, m7, m11, m15; // RL_Matrix fourth row (4 components) - } RL_Matrix; + // 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; - // RL_Camera type, defines a camera position/orientation in 3d space - typedef struct RL_Camera3D { - RL_Vector3 position; // RL_Camera position - RL_Vector3 target; // RL_Camera target it looks-at - RL_Vector3 up; // RL_Camera up vector (rotation over its axis) - float fovy; // RL_Camera field-of-view apperture in Y (degrees) in perspective, used as near plane width in orthographic - int projection; // RL_Camera projection type: RL_CAMERA_PERSPECTIVE or RL_CAMERA_ORTHOGRAPHIC - } RL_Camera3D; + // 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 RL_Camera3D RL_Camera; // RL_Camera type fallback, defaults to RL_Camera3D + typedef Camera3D Camera; // Camera type fallback, defaults to Camera3D - // RL_Camera projection + // Camera projection typedef enum { - RL_CAMERA_PERSPECTIVE = 0, // Perspective projection - RL_CAMERA_ORTHOGRAPHIC // Orthographic projection - } RL_CameraProjection; + CAMERA_PERSPECTIVE = 0, // Perspective projection + CAMERA_ORTHOGRAPHIC // Orthographic projection + } CameraProjection; - // RL_Camera system modes + // Camera system modes typedef enum { - RL_CAMERA_CUSTOM = 0, // RL_Camera custom, controlled by user (RL_UpdateCamera() does nothing) - RL_CAMERA_FREE, // RL_Camera free mode - RL_CAMERA_ORBITAL, // RL_Camera orbital, around target, zoom supported - RL_CAMERA_FIRST_PERSON, // RL_Camera first person - RL_CAMERA_THIRD_PERSON // RL_Camera third person - } RL_CameraMode; + CAMERA_CUSTOM = 0, // Camera custom, controlled by user (update_camera() 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 //---------------------------------------------------------------------------------- @@ -134,31 +136,29 @@ // Module Functions Declaration //---------------------------------------------------------------------------------- -#if defined(__cplusplus) -extern "C" { // Prevents name mangling of functions -#endif +RL_EXTERN_C_BEGIN -RLAPI RL_Vector3 GetCameraForward(RL_Camera *camera); -RLAPI RL_Vector3 GetCameraUp(RL_Camera *camera); -RLAPI RL_Vector3 GetCameraRight(RL_Camera *camera); +RLAPI Vector3 get_camera_forward(Camera *camera); +RLAPI Vector3 get_camera_up(Camera *camera); +RLAPI Vector3 get_camera_right(Camera *camera); -// RL_Camera movement -RLAPI void CameraMoveForward(RL_Camera *camera, float distance, bool moveInWorldPlane); -RLAPI void CameraMoveUp(RL_Camera *camera, float distance); -RLAPI void CameraMoveRight(RL_Camera *camera, float distance, bool moveInWorldPlane); -RLAPI void CameraMoveToTarget(RL_Camera *camera, float delta); +// Camera movement +RLAPI void camera_move_forward(Camera *camera, float distance, bool moveInWorldPlane); +RLAPI void camera_move_up(Camera *camera, float distance); +RLAPI void camera_move_right(Camera *camera, float distance, bool moveInWorldPlane); +RLAPI void camera_move_to_target(Camera *camera, float delta); -// RL_Camera rotation -RLAPI void CameraYaw(RL_Camera *camera, float angle, bool rotateAroundTarget); -RLAPI void CameraPitch(RL_Camera *camera, float angle, bool lockView, bool rotateAroundTarget, bool rotateUp); -RLAPI void CameraRoll(RL_Camera *camera, float angle); +// Camera rotation +RLAPI void camera_yaw(Camera *camera, float angle, bool rotateAroundTarget); +RLAPI void camera_pitch(Camera *camera, float angle, bool lockView, bool rotateAroundTarget, bool rotateUp); +RLAPI void camera_roll(Camera *camera, float angle); -RLAPI RL_Matrix GetCameraViewMatrix(RL_Camera *camera); -RLAPI RL_Matrix GetCameraProjectionMatrix(RL_Camera* camera, float aspect); +RLAPI Matrix get_camera_view_matrix(Camera *camera); +RLAPI Matrix get_camera_projection_matrix(Camera* camera, float aspect); -#if defined(__cplusplus) -} -#endif +RL_EXTERN_C_END + +RL_NS_END #endif // RCAMERA_H @@ -172,47 +172,47 @@ RLAPI RL_Matrix GetCameraProjectionMatrix(RL_Camera* camera, float aspect); #if defined(RCAMERA_IMPLEMENTATION) #include "raymath.h" // Required for vector maths: - // RL_Vector3Add() - // RL_Vector3Subtract() - // RL_Vector3Scale() - // RL_Vector3Normalize() - // RL_Vector3Distance() - // RL_Vector3CrossProduct() - // RL_Vector3RotateByAxisAngle() - // RL_Vector3Angle() - // RL_Vector3Negate() - // RL_MatrixLookAt() - // RL_MatrixPerspective() - // RL_MatrixOrtho() - // RL_MatrixIdentity() + // vector3_add() + // vector3_subtract() + // vector3_scale() + // vector3_normalize() + // vector3_distance() + // vector3_cross_product() + // vector3_rotate_by_axis_angle() + // vector3_angle() + // vector3_negate() + // matrix_look_at() + // matrix_perspective() + // matrix_ortho() + // matrix_identity() // raylib required functionality: - // RL_GetMouseDelta() - // RL_GetMouseWheelMove() - // RL_IsKeyDown() - // RL_IsKeyPressed() - // RL_GetFrameTime() + // get_mouse_delta() + // get_mouse_wheel_move() + // is_key_down() + // is_key_pressed() + // get_frame_time() //---------------------------------------------------------------------------------- // Defines and Macros //---------------------------------------------------------------------------------- -#define RL_CAMERA_MOVE_SPEED 0.09f -#define RL_CAMERA_ROTATION_SPEED 0.03f -#define RL_CAMERA_PAN_SPEED 0.2f +#define CAMERA_MOVE_SPEED 0.09f +#define CAMERA_ROTATION_SPEED 0.03f +#define CAMERA_PAN_SPEED 0.2f -// RL_Camera mouse movement sensitivity -#define RL_CAMERA_MOUSE_MOVE_SENSITIVITY 0.003f // TODO: it should be independant of framerate -#define RL_CAMERA_MOUSE_SCROLL_SENSITIVITY 1.5f +// Camera mouse movement sensitivity +#define CAMERA_MOUSE_MOVE_SENSITIVITY 0.003f // TODO: it should be independant of framerate +#define CAMERA_MOUSE_SCROLL_SENSITIVITY 1.5f -#define RL_CAMERA_ORBITAL_SPEED 0.5f // Radians per second +#define CAMERA_ORBITAL_SPEED 0.5f // Radians per second -#define RL_CAMERA_FIRST_PERSON_STEP_TRIGONOMETRIC_DIVIDER 8.0f -#define RL_CAMERA_FIRST_PERSON_STEP_DIVIDER 30.0f -#define RL_CAMERA_FIRST_PERSON_WAVING_DIVIDER 200.0f +#define CAMERA_FIRST_PERSON_STEP_TRIGONOMETRIC_DIVIDER 8.0f +#define CAMERA_FIRST_PERSON_STEP_DIVIDER 30.0f +#define CAMERA_FIRST_PERSON_WAVING_DIVIDER 200.0f // PLAYER (used by camera) -#define RL_PLAYER_MOVEMENT_SENSITIVITY 20.0f +#define PLAYER_MOVEMENT_SENSITIVITY 20.0f //---------------------------------------------------------------------------------- // Types and Structures Definition @@ -229,88 +229,90 @@ RLAPI RL_Matrix GetCameraProjectionMatrix(RL_Camera* camera, float aspect); //---------------------------------------------------------------------------------- //... +RL_NS_BEGIN + //---------------------------------------------------------------------------------- // Module Functions Definition //---------------------------------------------------------------------------------- // Returns the cameras forward vector (normalized) -RL_Vector3 GetCameraForward(RL_Camera *camera) +Vector3 get_camera_forward(Camera *camera) { - return RL_Vector3Normalize(RL_Vector3Subtract(camera->target, camera->position)); + return vector3_normalize(vector3_subtract(camera->target, camera->position)); } // Returns the cameras up vector (normalized) // Note: The up vector might not be perpendicular to the forward vector -RL_Vector3 GetCameraUp(RL_Camera *camera) +Vector3 get_camera_up(Camera *camera) { - return RL_Vector3Normalize(camera->up); + return vector3_normalize(camera->up); } // Returns the cameras right vector (normalized) -RL_Vector3 GetCameraRight(RL_Camera *camera) +Vector3 get_camera_right(Camera *camera) { - RL_Vector3 forward = GetCameraForward(camera); - RL_Vector3 up = GetCameraUp(camera); + Vector3 forward = get_camera_forward(camera); + Vector3 up = get_camera_up(camera); - return RL_Vector3CrossProduct(forward, up); + return vector3_cross_product(forward, up); } // Moves the camera in its forward direction -void CameraMoveForward(RL_Camera *camera, float distance, bool moveInWorldPlane) +void camera_move_forward(Camera *camera, float distance, bool moveInWorldPlane) { - RL_Vector3 forward = GetCameraForward(camera); + Vector3 forward = get_camera_forward(camera); if (moveInWorldPlane) { // Project vector onto world plane forward.y = 0; - forward = RL_Vector3Normalize(forward); + forward = vector3_normalize(forward); } // Scale by distance - forward = RL_Vector3Scale(forward, distance); + forward = vector3_scale(forward, distance); // Move position and target - camera->position = RL_Vector3Add(camera->position, forward); - camera->target = RL_Vector3Add(camera->target, forward); + camera->position = vector3_add(camera->position, forward); + camera->target = vector3_add(camera->target, forward); } // Moves the camera in its up direction -void CameraMoveUp(RL_Camera *camera, float distance) +void camera_move_up(Camera *camera, float distance) { - RL_Vector3 up = GetCameraUp(camera); + Vector3 up = get_camera_up(camera); // Scale by distance - up = RL_Vector3Scale(up, distance); + up = vector3_scale(up, distance); // Move position and target - camera->position = RL_Vector3Add(camera->position, up); - camera->target = RL_Vector3Add(camera->target, up); + camera->position = vector3_add(camera->position, up); + camera->target = vector3_add(camera->target, up); } // Moves the camera target in its current right direction -void CameraMoveRight(RL_Camera *camera, float distance, bool moveInWorldPlane) +void camera_move_right(Camera *camera, float distance, bool moveInWorldPlane) { - RL_Vector3 right = GetCameraRight(camera); + Vector3 right = get_camera_right(camera); if (moveInWorldPlane) { // Project vector onto world plane right.y = 0; - right = RL_Vector3Normalize(right); + right = vector3_normalize(right); } // Scale by distance - right = RL_Vector3Scale(right, distance); + right = vector3_scale(right, distance); // Move position and target - camera->position = RL_Vector3Add(camera->position, right); - camera->target = RL_Vector3Add(camera->target, right); + camera->position = vector3_add(camera->position, right); + camera->target = vector3_add(camera->target, right); } // Moves the camera position closer/farther to/from the camera target -void CameraMoveToTarget(RL_Camera *camera, float delta) +void camera_move_to_target(Camera *camera, float delta) { - float distance = RL_Vector3Distance(camera->position, camera->target); + float distance = vector3_distance(camera->position, camera->target); // Apply delta distance += delta; @@ -319,213 +321,213 @@ void CameraMoveToTarget(RL_Camera *camera, float delta) if (distance <= 0) distance = 0.001f; // Set new distance by moving the position along the forward vector - RL_Vector3 forward = GetCameraForward(camera); - camera->position = RL_Vector3Add(camera->target, RL_Vector3Scale(forward, -distance)); + Vector3 forward = get_camera_forward(camera); + camera->position = vector3_add(camera->target, vector3_scale(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(RL_Camera *camera, float angle, bool rotateAroundTarget) +void camera_yaw(Camera *camera, float angle, bool rotateAroundTarget) { // Rotation axis - RL_Vector3 up = GetCameraUp(camera); + Vector3 up = get_camera_up(camera); // View vector - RL_Vector3 targetPosition = RL_Vector3Subtract(camera->target, camera->position); + Vector3 targetPosition = vector3_subtract(camera->target, camera->position); // Rotate view vector around up axis - targetPosition = RL_Vector3RotateByAxisAngle(targetPosition, up, angle); + targetPosition = vector3_rotate_by_axis_angle(targetPosition, up, angle); if (rotateAroundTarget) { // Move position relative to target - camera->position = RL_Vector3Subtract(camera->target, targetPosition); + camera->position = vector3_subtract(camera->target, targetPosition); } else // rotate around camera.position { // Move target relative to position - camera->target = RL_Vector3Add(camera->position, targetPosition); + camera->target = vector3_add(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 RL_CAMERA_FREE) +// - rotateUp rotates the up direction as well (typically only usefull in CAMERA_FREE) // NOTE: angle must be provided in radians -void CameraPitch(RL_Camera *camera, float angle, bool lockView, bool rotateAroundTarget, bool rotateUp) +void camera_pitch(Camera *camera, float angle, bool lockView, bool rotateAroundTarget, bool rotateUp) { // Up direction - RL_Vector3 up = GetCameraUp(camera); + Vector3 up = get_camera_up(camera); // View vector - RL_Vector3 targetPosition = RL_Vector3Subtract(camera->target, camera->position); + Vector3 targetPosition = vector3_subtract(camera->target, camera->position); if (lockView) { // In these camera modes we clamp the Pitch angle // to allow only viewing straight up or down. - // RL_Clamp view up - float maxAngleUp = RL_Vector3Angle(up, targetPosition); + // clamp view up + float maxAngleUp = vector3_angle(up, targetPosition); maxAngleUp -= 0.001f; // avoid numerical errors if (angle > maxAngleUp) angle = maxAngleUp; - // RL_Clamp view down - float maxAngleDown = RL_Vector3Angle(RL_Vector3Negate(up), targetPosition); + // clamp view down + float maxAngleDown = vector3_angle(vector3_negate(up), targetPosition); maxAngleDown *= -1.0f; // downwards angle is negative maxAngleDown += 0.001f; // avoid numerical errors if (angle < maxAngleDown) angle = maxAngleDown; } // Rotation axis - RL_Vector3 right = GetCameraRight(camera); + Vector3 right = get_camera_right(camera); // Rotate view vector around right axis - targetPosition = RL_Vector3RotateByAxisAngle(targetPosition, right, angle); + targetPosition = vector3_rotate_by_axis_angle(targetPosition, right, angle); if (rotateAroundTarget) { // Move position relative to target - camera->position = RL_Vector3Subtract(camera->target, targetPosition); + camera->position = vector3_subtract(camera->target, targetPosition); } else // rotate around camera.position { // Move target relative to position - camera->target = RL_Vector3Add(camera->position, targetPosition); + camera->target = vector3_add(camera->position, targetPosition); } if (rotateUp) { // Rotate up direction around right axis - camera->up = RL_Vector3RotateByAxisAngle(camera->up, right, angle); + camera->up = vector3_rotate_by_axis_angle(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(RL_Camera *camera, float angle) +void camera_roll(Camera *camera, float angle) { // Rotation axis - RL_Vector3 forward = GetCameraForward(camera); + Vector3 forward = get_camera_forward(camera); // Rotate up direction around forward axis - camera->up = RL_Vector3RotateByAxisAngle(camera->up, forward, angle); + camera->up = vector3_rotate_by_axis_angle(camera->up, forward, angle); } // Returns the camera view matrix -RL_Matrix GetCameraViewMatrix(RL_Camera *camera) +Matrix get_camera_view_matrix(Camera *camera) { - return RL_MatrixLookAt(camera->position, camera->target, camera->up); + return matrix_look_at(camera->position, camera->target, camera->up); } // Returns the camera projection matrix -RL_Matrix GetCameraProjectionMatrix(RL_Camera *camera, float aspect) +Matrix get_camera_projection_matrix(Camera *camera, float aspect) { - if (camera->projection == RL_CAMERA_PERSPECTIVE) + if (camera->projection == CAMERA_PERSPECTIVE) { - return RL_MatrixPerspective(camera->fovy*RL_DEG2RAD, aspect, RL_CAMERA_CULL_DISTANCE_NEAR, RL_CAMERA_CULL_DISTANCE_FAR); + return matrix_perspective(camera->fovy*RL_DEG2RAD, aspect, RL_CAMERA_CULL_DISTANCE_NEAR, RL_CAMERA_CULL_DISTANCE_FAR); } - else if (camera->projection == RL_CAMERA_ORTHOGRAPHIC) + else if (camera->projection == CAMERA_ORTHOGRAPHIC) { double top = camera->fovy/2.0; double right = top*aspect; - return RL_MatrixOrtho(-right, right, -top, top, RL_CAMERA_CULL_DISTANCE_NEAR, RL_CAMERA_CULL_DISTANCE_FAR); + return matrix_ortho(-right, right, -top, top, RL_CAMERA_CULL_DISTANCE_NEAR, RL_CAMERA_CULL_DISTANCE_FAR); } - return RL_MatrixIdentity(); + return matrix_identity(); } #if !defined(RCAMERA_STANDALONE) // Update camera position for selected mode -// RL_Camera mode: RL_CAMERA_FREE, RL_CAMERA_FIRST_PERSON, RL_CAMERA_THIRD_PERSON, RL_CAMERA_ORBITAL or CUSTOM -void RL_UpdateCamera(RL_Camera *camera, int mode) +// Camera mode: CAMERA_FREE, CAMERA_FIRST_PERSON, CAMERA_THIRD_PERSON, CAMERA_ORBITAL or CUSTOM +void update_camera(Camera *camera, int mode) { - RL_Vector2 mousePositionDelta = RL_GetMouseDelta(); + Vector2 mousePositionDelta = get_mouse_delta(); - bool moveInWorldPlane = ((mode == RL_CAMERA_FIRST_PERSON) || (mode == RL_CAMERA_THIRD_PERSON)); - bool rotateAroundTarget = ((mode == RL_CAMERA_THIRD_PERSON) || (mode == RL_CAMERA_ORBITAL)); - bool lockView = ((mode == RL_CAMERA_FIRST_PERSON) || (mode == RL_CAMERA_THIRD_PERSON) || (mode == RL_CAMERA_ORBITAL)); + bool moveInWorldPlane = ((mode == CAMERA_FIRST_PERSON) || (mode == CAMERA_THIRD_PERSON)); + bool rotateAroundTarget = ((mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL)); + bool lockView = ((mode == CAMERA_FIRST_PERSON) || (mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL)); bool rotateUp = false; - if (mode == RL_CAMERA_ORBITAL) + if (mode == CAMERA_ORBITAL) { // Orbital can just orbit - RL_Matrix rotation = RL_MatrixRotate(GetCameraUp(camera), RL_CAMERA_ORBITAL_SPEED*RL_GetFrameTime()); - RL_Vector3 view = RL_Vector3Subtract(camera->position, camera->target); - view = RL_Vector3Transform(view, rotation); - camera->position = RL_Vector3Add(camera->target, view); + Matrix rotation = matrix_rotate(get_camera_up(camera), CAMERA_ORBITAL_SPEED*get_frame_time()); + Vector3 view = vector3_subtract(camera->position, camera->target); + view = vector3_transform(view, rotation); + camera->position = vector3_add(camera->target, view); } else { - // RL_Camera rotation - if (RL_IsKeyDown(RL_KEY_DOWN)) CameraPitch(camera, -RL_CAMERA_ROTATION_SPEED, lockView, rotateAroundTarget, rotateUp); - if (RL_IsKeyDown(RL_KEY_UP)) CameraPitch(camera, RL_CAMERA_ROTATION_SPEED, lockView, rotateAroundTarget, rotateUp); - if (RL_IsKeyDown(RL_KEY_RIGHT)) CameraYaw(camera, -RL_CAMERA_ROTATION_SPEED, rotateAroundTarget); - if (RL_IsKeyDown(RL_KEY_LEFT)) CameraYaw(camera, RL_CAMERA_ROTATION_SPEED, rotateAroundTarget); - if (RL_IsKeyDown(RL_KEY_Q)) CameraRoll(camera, -RL_CAMERA_ROTATION_SPEED); - if (RL_IsKeyDown(RL_KEY_E)) CameraRoll(camera, RL_CAMERA_ROTATION_SPEED); + // Camera rotation + if (is_key_down(KEY_DOWN)) camera_pitch(camera, -CAMERA_ROTATION_SPEED, lockView, rotateAroundTarget, rotateUp); + if (is_key_down(KEY_UP)) camera_pitch(camera, CAMERA_ROTATION_SPEED, lockView, rotateAroundTarget, rotateUp); + if (is_key_down(KEY_RIGHT)) camera_yaw(camera, -CAMERA_ROTATION_SPEED, rotateAroundTarget); + if (is_key_down(KEY_LEFT)) camera_yaw(camera, CAMERA_ROTATION_SPEED, rotateAroundTarget); + if (is_key_down(KEY_Q)) camera_roll(camera, -CAMERA_ROTATION_SPEED); + if (is_key_down(KEY_E)) camera_roll(camera, CAMERA_ROTATION_SPEED); - // RL_Camera movement - if (!RL_IsGamepadAvailable(0)) + // Camera movement + if (!is_gamepad_available(0)) { - // RL_Camera pan (for RL_CAMERA_FREE) - if ((mode == RL_CAMERA_FREE) && (RL_IsMouseButtonDown(RL_MOUSE_BUTTON_MIDDLE))) + // Camera pan (for CAMERA_FREE) + if ((mode == CAMERA_FREE) && (is_mouse_button_down(MOUSE_BUTTON_MIDDLE))) { - const RL_Vector2 mouseDelta = RL_GetMouseDelta(); - if (mouseDelta.x > 0.0f) CameraMoveRight(camera, RL_CAMERA_PAN_SPEED, moveInWorldPlane); - if (mouseDelta.x < 0.0f) CameraMoveRight(camera, -RL_CAMERA_PAN_SPEED, moveInWorldPlane); - if (mouseDelta.y > 0.0f) CameraMoveUp(camera, -RL_CAMERA_PAN_SPEED); - if (mouseDelta.y < 0.0f) CameraMoveUp(camera, RL_CAMERA_PAN_SPEED); + const Vector2 mouseDelta = get_mouse_delta(); + if (mouseDelta.x > 0.0f) camera_move_right(camera, CAMERA_PAN_SPEED, moveInWorldPlane); + if (mouseDelta.x < 0.0f) camera_move_right(camera, -CAMERA_PAN_SPEED, moveInWorldPlane); + if (mouseDelta.y > 0.0f) camera_move_up(camera, -CAMERA_PAN_SPEED); + if (mouseDelta.y < 0.0f) camera_move_up(camera, CAMERA_PAN_SPEED); } else { // Mouse support - CameraYaw(camera, -mousePositionDelta.x*RL_CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget); - CameraPitch(camera, -mousePositionDelta.y*RL_CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp); + camera_yaw(camera, -mousePositionDelta.x*CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget); + camera_pitch(camera, -mousePositionDelta.y*CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp); } // Keyboard support - if (RL_IsKeyDown(RL_KEY_W)) CameraMoveForward(camera, RL_CAMERA_MOVE_SPEED, moveInWorldPlane); - if (RL_IsKeyDown(RL_KEY_A)) CameraMoveRight(camera, -RL_CAMERA_MOVE_SPEED, moveInWorldPlane); - if (RL_IsKeyDown(RL_KEY_S)) CameraMoveForward(camera, -RL_CAMERA_MOVE_SPEED, moveInWorldPlane); - if (RL_IsKeyDown(RL_KEY_D)) CameraMoveRight(camera, RL_CAMERA_MOVE_SPEED, moveInWorldPlane); + if (is_key_down(KEY_W)) camera_move_forward(camera, CAMERA_MOVE_SPEED, moveInWorldPlane); + if (is_key_down(KEY_A)) camera_move_right(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane); + if (is_key_down(KEY_S)) camera_move_forward(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane); + if (is_key_down(KEY_D)) camera_move_right(camera, CAMERA_MOVE_SPEED, moveInWorldPlane); } else { // Gamepad controller support - CameraYaw(camera, -(RL_GetGamepadAxisMovement(0, RL_GAMEPAD_AXIS_RIGHT_X) * 2)*RL_CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget); - CameraPitch(camera, -(RL_GetGamepadAxisMovement(0, RL_GAMEPAD_AXIS_RIGHT_Y) * 2)*RL_CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp); + camera_yaw(camera, -(get_gamepad_axis_movement(0, GAMEPAD_AXIS_RIGHT_X) * 2)*CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget); + camera_pitch(camera, -(get_gamepad_axis_movement(0, GAMEPAD_AXIS_RIGHT_Y) * 2)*CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp); - if (RL_GetGamepadAxisMovement(0, RL_GAMEPAD_AXIS_LEFT_Y) <= -0.25f) CameraMoveForward(camera, RL_CAMERA_MOVE_SPEED, moveInWorldPlane); - if (RL_GetGamepadAxisMovement(0, RL_GAMEPAD_AXIS_LEFT_X) <= -0.25f) CameraMoveRight(camera, -RL_CAMERA_MOVE_SPEED, moveInWorldPlane); - if (RL_GetGamepadAxisMovement(0, RL_GAMEPAD_AXIS_LEFT_Y) >= 0.25f) CameraMoveForward(camera, -RL_CAMERA_MOVE_SPEED, moveInWorldPlane); - if (RL_GetGamepadAxisMovement(0, RL_GAMEPAD_AXIS_LEFT_X) >= 0.25f) CameraMoveRight(camera, RL_CAMERA_MOVE_SPEED, moveInWorldPlane); + if (get_gamepad_axis_movement(0, GAMEPAD_AXIS_LEFT_Y) <= -0.25f) camera_move_forward(camera, CAMERA_MOVE_SPEED, moveInWorldPlane); + if (get_gamepad_axis_movement(0, GAMEPAD_AXIS_LEFT_X) <= -0.25f) camera_move_right(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane); + if (get_gamepad_axis_movement(0, GAMEPAD_AXIS_LEFT_Y) >= 0.25f) camera_move_forward(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane); + if (get_gamepad_axis_movement(0, GAMEPAD_AXIS_LEFT_X) >= 0.25f) camera_move_right(camera, CAMERA_MOVE_SPEED, moveInWorldPlane); } - if (mode == RL_CAMERA_FREE) + if (mode == CAMERA_FREE) { - if (RL_IsKeyDown(RL_KEY_SPACE)) CameraMoveUp(camera, RL_CAMERA_MOVE_SPEED); - if (RL_IsKeyDown(RL_KEY_LEFT_CONTROL)) CameraMoveUp(camera, -RL_CAMERA_MOVE_SPEED); + if (is_key_down(KEY_SPACE)) camera_move_up(camera, CAMERA_MOVE_SPEED); + if (is_key_down(KEY_LEFT_CONTROL)) camera_move_up(camera, -CAMERA_MOVE_SPEED); } } - if ((mode == RL_CAMERA_THIRD_PERSON) || (mode == RL_CAMERA_ORBITAL) || (mode == RL_CAMERA_FREE)) + if ((mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL) || (mode == CAMERA_FREE)) { // Zoom target distance - CameraMoveToTarget(camera, -RL_GetMouseWheelMove()); - if (RL_IsKeyPressed(RL_KEY_KP_SUBTRACT)) CameraMoveToTarget(camera, 2.0f); - if (RL_IsKeyPressed(RL_KEY_KP_ADD)) CameraMoveToTarget(camera, -2.0f); + camera_move_to_target(camera, -get_mouse_wheel_move()); + if (is_key_pressed(KEY_KP_SUBTRACT)) camera_move_to_target(camera, 2.0f); + if (is_key_pressed(KEY_KP_ADD)) camera_move_to_target(camera, -2.0f); } } #endif // !RCAMERA_STANDALONE // Update camera movement, movement/rotation values should be provided by user -void RL_UpdateCameraPro(RL_Camera *camera, RL_Vector3 movement, RL_Vector3 rotation, float zoom) +void update_camera_pro(Camera *camera, Vector3 movement, Vector3 rotation, float zoom) { // Required values // movement.x - Move forward/backward @@ -541,18 +543,20 @@ void RL_UpdateCameraPro(RL_Camera *camera, RL_Vector3 movement, RL_Vector3 rotat bool rotateUp = false; bool moveInWorldPlane = true; - // RL_Camera rotation - CameraPitch(camera, -rotation.y*RL_DEG2RAD, lockView, rotateAroundTarget, rotateUp); - CameraYaw(camera, -rotation.x*RL_DEG2RAD, rotateAroundTarget); - CameraRoll(camera, rotation.z*RL_DEG2RAD); + // Camera rotation + camera_pitch(camera, -rotation.y*RL_DEG2RAD, lockView, rotateAroundTarget, rotateUp); + camera_yaw(camera, -rotation.x*RL_DEG2RAD, rotateAroundTarget); + camera_roll(camera, rotation.z*RL_DEG2RAD); - // RL_Camera movement - CameraMoveForward(camera, movement.x, moveInWorldPlane); - CameraMoveRight(camera, movement.y, moveInWorldPlane); - CameraMoveUp(camera, movement.z); + // Camera movement + camera_move_forward(camera, movement.x, moveInWorldPlane); + camera_move_right(camera, movement.y, moveInWorldPlane); + camera_move_up(camera, movement.z); // Zoom target distance - CameraMoveToTarget(camera, zoom); + camera_move_to_target(camera, zoom); } +RL_NS_END + #endif // RCAMERA_IMPLEMENTATION diff --git a/project/auxillary/vis_ast/dependencies/raylib/include/rgestures.h b/project/auxillary/vis_ast/dependencies/raylib/include/rgestures.h index 650cfbb..2e5aee6 100644 --- a/project/auxillary/vis_ast/dependencies/raylib/include/rgestures.h +++ b/project/auxillary/vis_ast/dependencies/raylib/include/rgestures.h @@ -65,30 +65,34 @@ typedef enum bool { false = 0, true = !false } bool; #endif +#include "config.h" + +RL_NS_BEGIN + #if !defined(RL_VECTOR2_TYPE) -// RL_Vector2 type -typedef struct RL_Vector2 { +// Vector2 type +typedef struct Vector2 { float x; float y; -} RL_Vector2; +} Vector2; #endif #if defined(RGESTURES_STANDALONE) // Gestures type // NOTE: It could be used as flags to enable only some gestures typedef enum { - RL_GESTURE_NONE = 0, - RL_GESTURE_TAP = 1, - RL_GESTURE_DOUBLETAP = 2, - RL_GESTURE_HOLD = 4, - RL_GESTURE_DRAG = 8, - RL_GESTURE_SWIPE_RIGHT = 16, - RL_GESTURE_SWIPE_LEFT = 32, - RL_GESTURE_SWIPE_UP = 64, - RL_GESTURE_SWIPE_DOWN = 128, - RL_GESTURE_PINCH_IN = 256, - RL_GESTURE_PINCH_OUT = 512 -} RL_Gesture; + GESTURE_NONE = 0, + GESTURE_TAP = 1, + GESTURE_DOUBLETAP = 2, + GESTURE_HOLD = 4, + GESTURE_DRAG = 8, + GESTURE_SWIPE_RIGHT = 16, + GESTURE_SWIPE_LEFT = 32, + GESTURE_SWIPE_UP = 64, + GESTURE_SWIPE_DOWN = 128, + GESTURE_PINCH_IN = 256, + GESTURE_PINCH_OUT = 512 +} Gesture; #endif typedef enum { @@ -96,15 +100,15 @@ typedef enum { TOUCH_ACTION_DOWN, TOUCH_ACTION_MOVE, TOUCH_ACTION_CANCEL -} RL_TouchAction; +} TouchAction; -// RL_Gesture event +// Gesture event typedef struct { int touchAction; int pointCount; int pointId[RL_MAX_TOUCH_POINTS]; - RL_Vector2 position[RL_MAX_TOUCH_POINTS]; -} RL_GestureEvent; + Vector2 position[RL_MAX_TOUCH_POINTS]; +} GestureEvent; //---------------------------------------------------------------------------------- // Global Variables Definition @@ -115,28 +119,26 @@ typedef struct { // Module Functions Declaration //---------------------------------------------------------------------------------- -#if defined(__cplusplus) -extern "C" { // Prevents name mangling of functions -#endif +RL_EXTERN_C_BEGIN -void RL_ProcessGestureEvent(RL_GestureEvent event); // Process gesture event and translate it into gestures -void RL_UpdateGestures(void); // Update gestures detected (must be called every frame) +void process_gesture_event(GestureEvent event); // Process gesture event and translate it into gestures +void update_gestures(void); // Update gestures detected (must be called every frame) #if defined(RGESTURES_STANDALONE) -void RL_SetGesturesEnabled(unsigned int flags); // Enable a set of gestures using flags -bool RL_IsGestureDetected(int gesture); // Check if a gesture have been detected -int RL_GetGestureDetected(void); // Get latest detected gesture +void set_gestures_enabled(unsigned int flags); // Enable a set of gestures using flags +bool is_gesture_detected(int gesture); // Check if a gesture have been detected +int get_gesture_detected(void); // Get latest detected gesture -float RL_GetGestureHoldDuration(void); // Get gesture hold time in seconds -RL_Vector2 RL_GetGestureDragVector(void); // Get gesture drag vector -float RL_GetGestureDragAngle(void); // Get gesture drag angle -RL_Vector2 RL_GetGesturePinchVector(void); // Get gesture pinch delta -float RL_GetGesturePinchAngle(void); // Get gesture pinch angle +float get_gesture_hold_duration(void); // Get gesture hold time in seconds +Vector2 get_gesture_drag_vector(void); // Get gesture drag vector +float get_gesture_drag_angle(void); // Get gesture drag angle +Vector2 get_gesture_pinch_vector(void); // Get gesture pinch delta +float get_gesture_pinch_angle(void); // Get gesture pinch angle #endif -#if defined(__cplusplus) -} -#endif +RL_EXTERN_C_END + +RL_NS_END #endif // RGESTURES_H @@ -154,8 +156,8 @@ float RL_GetGesturePinchAngle(void); // Get gesture pinch extern "C" { // Prevents name mangling of functions #endif // Functions required to query time on Windows - int __stdcall RL_QueryPerformanceCounter(unsigned long long int *lpPerformanceCount); - int __stdcall RL_QueryPerformanceFrequency(unsigned long long int *lpFrequency); + int __stdcall query_performance_counter(unsigned long long int *lpPerformanceCount); + int __stdcall query_performance_frequency(unsigned long long int *lpFrequency); #if defined(__cplusplus) } #endif @@ -186,6 +188,8 @@ float RL_GetGesturePinchAngle(void); // Get gesture pinch #define RL_PINCH_TIMEOUT 0.3f // Pinch minimum time, measured in seconds #define RL_DOUBLETAP_RANGE 0.03f // DoubleTap range, measured in normalized screen units (0.0f to 1.0f) +RL_NS_BEGIN + //---------------------------------------------------------------------------------- // Types and Structures Definition //---------------------------------------------------------------------------------- @@ -198,14 +202,14 @@ typedef struct { int firstId; // Touch id for first touch point int pointCount; // Touch points counter double eventTime; // Time stamp when an event happened - RL_Vector2 upPosition; // Touch up position - RL_Vector2 downPositionA; // First touch down position - RL_Vector2 downPositionB; // Second touch down position - RL_Vector2 downDragPosition; // Touch drag position - RL_Vector2 moveDownPositionA; // First touch down position on move - RL_Vector2 moveDownPositionB; // Second touch down position on move - RL_Vector2 previousPositionA; // Previous position A to compare for pinch gestures - RL_Vector2 previousPositionB; // Previous position B to compare for pinch gestures + Vector2 upPosition; // Touch up position + Vector2 downPositionA; // First touch down position + Vector2 downPositionB; // Second touch down position + Vector2 downDragPosition; // Touch drag position + Vector2 moveDownPositionA; // First touch down position on move + Vector2 moveDownPositionB; // Second touch down position on move + Vector2 previousPositionA; // Previous position A to compare for pinch gestures + Vector2 previousPositionB; // Previous position B to compare for pinch gestures int tapCounter; // TAP counter (one tap implies TOUCH_ACTION_DOWN and TOUCH_ACTION_UP actions) } Touch; struct { @@ -213,7 +217,7 @@ typedef struct { double timeDuration; // HOLD duration in seconds } Hold; struct { - RL_Vector2 vector; // DRAG vector (between initial and current position) + Vector2 vector; // DRAG vector (between initial and current position) float angle; // DRAG angle (relative to x-axis) float distance; // DRAG distance (from initial touch point to final) (normalized [0..1]) float intensity; // DRAG intensity, how far why did the DRAG (pixels per frame) @@ -222,269 +226,287 @@ typedef struct { double startTime; // SWIPE start time to calculate drag intensity } Swipe; struct { - RL_Vector2 vector; // PINCH vector (between first and second touch points) + Vector2 vector; // PINCH vector (between first and second touch points) float angle; // PINCH angle (relative to x-axis) float distance; // PINCH displacement distance (normalized [0..1]) } Pinch; -} RL_GesturesData; +} GesturesData; //---------------------------------------------------------------------------------- // Global Variables Definition //---------------------------------------------------------------------------------- -static RL_GesturesData RL_GESTURES = { +static GesturesData GESTURES = { +#ifdef __cplusplus + (unsigned int)-1, + GESTURE_NONE, + 0b0000001111111111 +#else .Touch.firstId = -1, - .current = RL_GESTURE_NONE, // No current gesture detected + .current = GESTURE_NONE, // No current gesture detected .enabledFlags = 0b0000001111111111 // All gestures supported by default +#endif }; //---------------------------------------------------------------------------------- // Module specific Functions Declaration //---------------------------------------------------------------------------------- -static float rgVector2Angle(RL_Vector2 initialPosition, RL_Vector2 finalPosition); -static float rgVector2Distance(RL_Vector2 v1, RL_Vector2 v2); -static double rgGetCurrentTime(void); +static float rg_vector2_angle(Vector2 initialPosition, Vector2 finalPosition); +static float rg_vector2_distance(Vector2 v1, Vector2 v2); +static double rg_get_current_time(void); //---------------------------------------------------------------------------------- // Module Functions Definition //---------------------------------------------------------------------------------- // Enable only desired gestures to be detected -void RL_SetGesturesEnabled(unsigned int flags) +void set_gestures_enabled(unsigned int flags) { - RL_GESTURES.enabledFlags = flags; + GESTURES.enabledFlags = flags; } // Check if a gesture have been detected -bool RL_IsGestureDetected(unsigned int gesture) +bool is_gesture_detected(unsigned int gesture) { - if ((RL_GESTURES.enabledFlags & RL_GESTURES.current) == gesture) return true; + if ((GESTURES.enabledFlags & GESTURES.current) == gesture) return true; else return false; } // Process gesture event and translate it into gestures -void RL_ProcessGestureEvent(RL_GestureEvent event) +void process_gesture_event(GestureEvent event) { // Reset required variables - RL_GESTURES.Touch.pointCount = event.pointCount; // Required on RL_UpdateGestures() + GESTURES.Touch.pointCount = event.pointCount; // Required on update_gestures() - if (RL_GESTURES.Touch.pointCount == 1) // One touch point + if (GESTURES.Touch.pointCount == 1) // One touch point { if (event.touchAction == TOUCH_ACTION_DOWN) { - RL_GESTURES.Touch.tapCounter++; // Tap counter + GESTURES.Touch.tapCounter++; // Tap counter // Detect GESTURE_DOUBLE_TAP - if ((RL_GESTURES.current == RL_GESTURE_NONE) && (RL_GESTURES.Touch.tapCounter >= 2) && ((rgGetCurrentTime() - RL_GESTURES.Touch.eventTime) < RL_TAP_TIMEOUT) && (rgVector2Distance(RL_GESTURES.Touch.downPositionA, event.position[0]) < RL_DOUBLETAP_RANGE)) + if ((GESTURES.current == GESTURE_NONE) && (GESTURES.Touch.tapCounter >= 2) && ((rg_get_current_time() - GESTURES.Touch.eventTime) < RL_TAP_TIMEOUT) && (rg_vector2_distance(GESTURES.Touch.downPositionA, event.position[0]) < RL_DOUBLETAP_RANGE)) { - RL_GESTURES.current = RL_GESTURE_DOUBLETAP; - RL_GESTURES.Touch.tapCounter = 0; + GESTURES.current = GESTURE_DOUBLETAP; + GESTURES.Touch.tapCounter = 0; } - else // Detect RL_GESTURE_TAP + else // Detect GESTURE_TAP { - RL_GESTURES.Touch.tapCounter = 1; - RL_GESTURES.current = RL_GESTURE_TAP; + GESTURES.Touch.tapCounter = 1; + GESTURES.current = GESTURE_TAP; } - RL_GESTURES.Touch.downPositionA = event.position[0]; - RL_GESTURES.Touch.downDragPosition = event.position[0]; + GESTURES.Touch.downPositionA = event.position[0]; + GESTURES.Touch.downDragPosition = event.position[0]; - RL_GESTURES.Touch.upPosition = RL_GESTURES.Touch.downPositionA; - RL_GESTURES.Touch.eventTime = rgGetCurrentTime(); + GESTURES.Touch.upPosition = GESTURES.Touch.downPositionA; + GESTURES.Touch.eventTime = rg_get_current_time(); - RL_GESTURES.Swipe.startTime = rgGetCurrentTime(); + GESTURES.Swipe.startTime = rg_get_current_time(); - RL_GESTURES.Drag.vector = (RL_Vector2){ 0.0f, 0.0f }; + #ifdef __cplusplus + GESTURES.Drag.vector = Vector2{ 0.0f, 0.0f }; + #else + GESTURES.Drag.vector = (Vector2){ 0.0f, 0.0f }; + #endif } else if (event.touchAction == TOUCH_ACTION_UP) { // A swipe can happen while the current gesture is drag, but (specially for web) also hold, so set upPosition for both cases - if (RL_GESTURES.current == RL_GESTURE_DRAG || RL_GESTURES.current == RL_GESTURE_HOLD) RL_GESTURES.Touch.upPosition = event.position[0]; + if (GESTURES.current == GESTURE_DRAG || GESTURES.current == GESTURE_HOLD) GESTURES.Touch.upPosition = event.position[0]; - // NOTE: RL_GESTURES.Drag.intensity dependent on the resolution of the screen - RL_GESTURES.Drag.distance = rgVector2Distance(RL_GESTURES.Touch.downPositionA, RL_GESTURES.Touch.upPosition); - RL_GESTURES.Drag.intensity = RL_GESTURES.Drag.distance/(float)((rgGetCurrentTime() - RL_GESTURES.Swipe.startTime)); + // NOTE: GESTURES.Drag.intensity dependent on the resolution of the screen + GESTURES.Drag.distance = rg_vector2_distance(GESTURES.Touch.downPositionA, GESTURES.Touch.upPosition); + GESTURES.Drag.intensity = GESTURES.Drag.distance/(float)((rg_get_current_time() - GESTURES.Swipe.startTime)); // Detect GESTURE_SWIPE - if ((RL_GESTURES.Drag.intensity > RL_FORCE_TO_SWIPE) && (RL_GESTURES.current != RL_GESTURE_DRAG)) + if ((GESTURES.Drag.intensity > RL_FORCE_TO_SWIPE) && (GESTURES.current != GESTURE_DRAG)) { // NOTE: Angle should be inverted in Y - RL_GESTURES.Drag.angle = 360.0f - rgVector2Angle(RL_GESTURES.Touch.downPositionA, RL_GESTURES.Touch.upPosition); + GESTURES.Drag.angle = 360.0f - rg_vector2_angle(GESTURES.Touch.downPositionA, GESTURES.Touch.upPosition); - if ((RL_GESTURES.Drag.angle < 30) || (RL_GESTURES.Drag.angle > 330)) RL_GESTURES.current = RL_GESTURE_SWIPE_RIGHT; // Right - else if ((RL_GESTURES.Drag.angle >= 30) && (RL_GESTURES.Drag.angle <= 150)) RL_GESTURES.current = RL_GESTURE_SWIPE_UP; // Up - else if ((RL_GESTURES.Drag.angle > 150) && (RL_GESTURES.Drag.angle < 210)) RL_GESTURES.current = RL_GESTURE_SWIPE_LEFT; // Left - else if ((RL_GESTURES.Drag.angle >= 210) && (RL_GESTURES.Drag.angle <= 330)) RL_GESTURES.current = RL_GESTURE_SWIPE_DOWN; // Down - else RL_GESTURES.current = RL_GESTURE_NONE; + if ((GESTURES.Drag.angle < 30) || (GESTURES.Drag.angle > 330)) GESTURES.current = GESTURE_SWIPE_RIGHT; // Right + else if ((GESTURES.Drag.angle >= 30) && (GESTURES.Drag.angle <= 150)) GESTURES.current = GESTURE_SWIPE_UP; // Up + else if ((GESTURES.Drag.angle > 150) && (GESTURES.Drag.angle < 210)) GESTURES.current = GESTURE_SWIPE_LEFT; // Left + else if ((GESTURES.Drag.angle >= 210) && (GESTURES.Drag.angle <= 330)) GESTURES.current = GESTURE_SWIPE_DOWN; // Down + else GESTURES.current = GESTURE_NONE; } else { - RL_GESTURES.Drag.distance = 0.0f; - RL_GESTURES.Drag.intensity = 0.0f; - RL_GESTURES.Drag.angle = 0.0f; + GESTURES.Drag.distance = 0.0f; + GESTURES.Drag.intensity = 0.0f; + GESTURES.Drag.angle = 0.0f; - RL_GESTURES.current = RL_GESTURE_NONE; + GESTURES.current = GESTURE_NONE; } - RL_GESTURES.Touch.downDragPosition = (RL_Vector2){ 0.0f, 0.0f }; - RL_GESTURES.Touch.pointCount = 0; + #if __cplusplus + GESTURES.Touch.downDragPosition = Vector2{ 0.0f, 0.0f }; + #else + GESTURES.Touch.downDragPosition = (Vector2){ 0.0f, 0.0f }; + #endif + GESTURES.Touch.pointCount = 0; } else if (event.touchAction == TOUCH_ACTION_MOVE) { - RL_GESTURES.Touch.moveDownPositionA = event.position[0]; + GESTURES.Touch.moveDownPositionA = event.position[0]; - if (RL_GESTURES.current == RL_GESTURE_HOLD) + if (GESTURES.current == GESTURE_HOLD) { - if (RL_GESTURES.Hold.resetRequired) RL_GESTURES.Touch.downPositionA = event.position[0]; + if (GESTURES.Hold.resetRequired) GESTURES.Touch.downPositionA = event.position[0]; - RL_GESTURES.Hold.resetRequired = false; + GESTURES.Hold.resetRequired = false; - // Detect RL_GESTURE_DRAG - if ((rgGetCurrentTime() - RL_GESTURES.Touch.eventTime) > RL_DRAG_TIMEOUT) + // Detect GESTURE_DRAG + if ((rg_get_current_time() - GESTURES.Touch.eventTime) > RL_DRAG_TIMEOUT) { - RL_GESTURES.Touch.eventTime = rgGetCurrentTime(); - RL_GESTURES.current = RL_GESTURE_DRAG; + GESTURES.Touch.eventTime = rg_get_current_time(); + GESTURES.current = GESTURE_DRAG; } } - RL_GESTURES.Drag.vector.x = RL_GESTURES.Touch.moveDownPositionA.x - RL_GESTURES.Touch.downDragPosition.x; - RL_GESTURES.Drag.vector.y = RL_GESTURES.Touch.moveDownPositionA.y - RL_GESTURES.Touch.downDragPosition.y; + GESTURES.Drag.vector.x = GESTURES.Touch.moveDownPositionA.x - GESTURES.Touch.downDragPosition.x; + GESTURES.Drag.vector.y = GESTURES.Touch.moveDownPositionA.y - GESTURES.Touch.downDragPosition.y; } } - else if (RL_GESTURES.Touch.pointCount == 2) // Two touch points + else if (GESTURES.Touch.pointCount == 2) // Two touch points { if (event.touchAction == TOUCH_ACTION_DOWN) { - RL_GESTURES.Touch.downPositionA = event.position[0]; - RL_GESTURES.Touch.downPositionB = event.position[1]; + GESTURES.Touch.downPositionA = event.position[0]; + GESTURES.Touch.downPositionB = event.position[1]; - RL_GESTURES.Touch.previousPositionA = RL_GESTURES.Touch.downPositionA; - RL_GESTURES.Touch.previousPositionB = RL_GESTURES.Touch.downPositionB; + GESTURES.Touch.previousPositionA = GESTURES.Touch.downPositionA; + GESTURES.Touch.previousPositionB = GESTURES.Touch.downPositionB; - //RL_GESTURES.Pinch.distance = rgVector2Distance(RL_GESTURES.Touch.downPositionA, RL_GESTURES.Touch.downPositionB); + //GESTURES.Pinch.distance = rg_vector2_distance(GESTURES.Touch.downPositionA, GESTURES.Touch.downPositionB); - RL_GESTURES.Pinch.vector.x = RL_GESTURES.Touch.downPositionB.x - RL_GESTURES.Touch.downPositionA.x; - RL_GESTURES.Pinch.vector.y = RL_GESTURES.Touch.downPositionB.y - RL_GESTURES.Touch.downPositionA.y; + GESTURES.Pinch.vector.x = GESTURES.Touch.downPositionB.x - GESTURES.Touch.downPositionA.x; + GESTURES.Pinch.vector.y = GESTURES.Touch.downPositionB.y - GESTURES.Touch.downPositionA.y; - RL_GESTURES.current = RL_GESTURE_HOLD; - RL_GESTURES.Hold.timeDuration = rgGetCurrentTime(); + GESTURES.current = GESTURE_HOLD; + GESTURES.Hold.timeDuration = rg_get_current_time(); } else if (event.touchAction == TOUCH_ACTION_MOVE) { - RL_GESTURES.Pinch.distance = rgVector2Distance(RL_GESTURES.Touch.moveDownPositionA, RL_GESTURES.Touch.moveDownPositionB); + GESTURES.Pinch.distance = rg_vector2_distance(GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB); - RL_GESTURES.Touch.moveDownPositionA = event.position[0]; - RL_GESTURES.Touch.moveDownPositionB = event.position[1]; + GESTURES.Touch.moveDownPositionA = event.position[0]; + GESTURES.Touch.moveDownPositionB = event.position[1]; - RL_GESTURES.Pinch.vector.x = RL_GESTURES.Touch.moveDownPositionB.x - RL_GESTURES.Touch.moveDownPositionA.x; - RL_GESTURES.Pinch.vector.y = RL_GESTURES.Touch.moveDownPositionB.y - RL_GESTURES.Touch.moveDownPositionA.y; + GESTURES.Pinch.vector.x = GESTURES.Touch.moveDownPositionB.x - GESTURES.Touch.moveDownPositionA.x; + GESTURES.Pinch.vector.y = GESTURES.Touch.moveDownPositionB.y - GESTURES.Touch.moveDownPositionA.y; - if ((rgVector2Distance(RL_GESTURES.Touch.previousPositionA, RL_GESTURES.Touch.moveDownPositionA) >= RL_MINIMUM_PINCH) || (rgVector2Distance(RL_GESTURES.Touch.previousPositionB, RL_GESTURES.Touch.moveDownPositionB) >= RL_MINIMUM_PINCH)) + if ((rg_vector2_distance(GESTURES.Touch.previousPositionA, GESTURES.Touch.moveDownPositionA) >= RL_MINIMUM_PINCH) || (rg_vector2_distance(GESTURES.Touch.previousPositionB, GESTURES.Touch.moveDownPositionB) >= RL_MINIMUM_PINCH)) { - if ( rgVector2Distance(RL_GESTURES.Touch.previousPositionA, RL_GESTURES.Touch.previousPositionB) > rgVector2Distance(RL_GESTURES.Touch.moveDownPositionA, RL_GESTURES.Touch.moveDownPositionB) ) RL_GESTURES.current = RL_GESTURE_PINCH_IN; - else RL_GESTURES.current = RL_GESTURE_PINCH_OUT; + if ( rg_vector2_distance(GESTURES.Touch.previousPositionA, GESTURES.Touch.previousPositionB) > rg_vector2_distance(GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB) ) GESTURES.current = GESTURE_PINCH_IN; + else GESTURES.current = GESTURE_PINCH_OUT; } else { - RL_GESTURES.current = RL_GESTURE_HOLD; - RL_GESTURES.Hold.timeDuration = rgGetCurrentTime(); + GESTURES.current = GESTURE_HOLD; + GESTURES.Hold.timeDuration = rg_get_current_time(); } // NOTE: Angle should be inverted in Y - RL_GESTURES.Pinch.angle = 360.0f - rgVector2Angle(RL_GESTURES.Touch.moveDownPositionA, RL_GESTURES.Touch.moveDownPositionB); + GESTURES.Pinch.angle = 360.0f - rg_vector2_angle(GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB); } else if (event.touchAction == TOUCH_ACTION_UP) { - RL_GESTURES.Pinch.distance = 0.0f; - RL_GESTURES.Pinch.angle = 0.0f; - RL_GESTURES.Pinch.vector = (RL_Vector2){ 0.0f, 0.0f }; - RL_GESTURES.Touch.pointCount = 0; + GESTURES.Pinch.distance = 0.0f; + GESTURES.Pinch.angle = 0.0f; + #if __cplusplus + GESTURES.Pinch.vector = Vector2{ 0.0f, 0.0f }; + #else + GESTURES.Pinch.vector = (Vector2){ 0.0f, 0.0f }; + #endif + GESTURES.Touch.pointCount = 0; - RL_GESTURES.current = RL_GESTURE_NONE; + GESTURES.current = GESTURE_NONE; } } - else if (RL_GESTURES.Touch.pointCount > 2) // More than two touch points + else if (GESTURES.Touch.pointCount > 2) // More than two touch points { // TODO: Process gesture events for more than two points } } // Update gestures detected (must be called every frame) -void RL_UpdateGestures(void) +void update_gestures(void) { // NOTE: Gestures are processed through system callbacks on touch events - // Detect RL_GESTURE_HOLD - if (((RL_GESTURES.current == RL_GESTURE_TAP) || (RL_GESTURES.current == RL_GESTURE_DOUBLETAP)) && (RL_GESTURES.Touch.pointCount < 2)) + // Detect GESTURE_HOLD + if (((GESTURES.current == GESTURE_TAP) || (GESTURES.current == GESTURE_DOUBLETAP)) && (GESTURES.Touch.pointCount < 2)) { - RL_GESTURES.current = RL_GESTURE_HOLD; - RL_GESTURES.Hold.timeDuration = rgGetCurrentTime(); + GESTURES.current = GESTURE_HOLD; + GESTURES.Hold.timeDuration = rg_get_current_time(); } - // Detect RL_GESTURE_NONE - if ((RL_GESTURES.current == RL_GESTURE_SWIPE_RIGHT) || (RL_GESTURES.current == RL_GESTURE_SWIPE_UP) || (RL_GESTURES.current == RL_GESTURE_SWIPE_LEFT) || (RL_GESTURES.current == RL_GESTURE_SWIPE_DOWN)) + // Detect GESTURE_NONE + if ((GESTURES.current == GESTURE_SWIPE_RIGHT) || (GESTURES.current == GESTURE_SWIPE_UP) || (GESTURES.current == GESTURE_SWIPE_LEFT) || (GESTURES.current == GESTURE_SWIPE_DOWN)) { - RL_GESTURES.current = RL_GESTURE_NONE; + GESTURES.current = GESTURE_NONE; } } // Get latest detected gesture -int RL_GetGestureDetected(void) +int get_gesture_detected(void) { // Get current gesture only if enabled - return (RL_GESTURES.enabledFlags & RL_GESTURES.current); + return (GESTURES.enabledFlags & GESTURES.current); } // Hold time measured in ms -float RL_GetGestureHoldDuration(void) +float get_gesture_hold_duration(void) { // NOTE: time is calculated on current gesture HOLD double time = 0.0; - if (RL_GESTURES.current == RL_GESTURE_HOLD) time = rgGetCurrentTime() - RL_GESTURES.Hold.timeDuration; + if (GESTURES.current == GESTURE_HOLD) time = rg_get_current_time() - GESTURES.Hold.timeDuration; return (float)time; } // Get drag vector (between initial touch point to current) -RL_Vector2 RL_GetGestureDragVector(void) +Vector2 get_gesture_drag_vector(void) { // NOTE: drag vector is calculated on one touch points TOUCH_ACTION_MOVE - return RL_GESTURES.Drag.vector; + return GESTURES.Drag.vector; } // Get drag angle // NOTE: Angle in degrees, horizontal-right is 0, counterclockwise -float RL_GetGestureDragAngle(void) +float get_gesture_drag_angle(void) { // NOTE: drag angle is calculated on one touch points TOUCH_ACTION_UP - return RL_GESTURES.Drag.angle; + return GESTURES.Drag.angle; } // Get distance between two pinch points -RL_Vector2 RL_GetGesturePinchVector(void) +Vector2 get_gesture_pinch_vector(void) { // NOTE: Pinch distance is calculated on two touch points TOUCH_ACTION_MOVE - return RL_GESTURES.Pinch.vector; + return GESTURES.Pinch.vector; } // Get angle between two pinch points // NOTE: Angle in degrees, horizontal-right is 0, counterclockwise -float RL_GetGesturePinchAngle(void) +float get_gesture_pinch_angle(void) { // NOTE: pinch angle is calculated on two touch points TOUCH_ACTION_MOVE - return RL_GESTURES.Pinch.angle; + return GESTURES.Pinch.angle; } //---------------------------------------------------------------------------------- // Module specific Functions Definition //---------------------------------------------------------------------------------- // Get angle from two-points vector with X-axis -static float rgVector2Angle(RL_Vector2 v1, RL_Vector2 v2) +static float rg_vector2_angle(Vector2 v1, Vector2 v2) { float angle = atan2f(v2.y - v1.y, v2.x - v1.x)*(180.0f/RL_PI); @@ -493,8 +515,8 @@ static float rgVector2Angle(RL_Vector2 v1, RL_Vector2 v2) return angle; } -// Calculate distance between two RL_Vector2 -static float rgVector2Distance(RL_Vector2 v1, RL_Vector2 v2) +// Calculate distance between two Vector2 +static float rg_vector2_distance(Vector2 v1, Vector2 v2) { float result; @@ -507,18 +529,18 @@ static float rgVector2Distance(RL_Vector2 v1, RL_Vector2 v2) } // Time measure returned are seconds -static double rgGetCurrentTime(void) +static double rg_get_current_time(void) { double time = 0; #if !defined(RGESTURES_STANDALONE) - time = RL_GetTime(); + time = get_time(); #else #if defined(_WIN32) unsigned long long int clockFrequency, currentTime; - RL_QueryPerformanceFrequency(&clockFrequency); // BE CAREFUL: Costly operation! - RL_QueryPerformanceCounter(¤tTime); + query_performance_frequency(&clockFrequency); // BE CAREFUL: Costly operation! + query_performance_counter(¤tTime); time = (double)currentTime/clockFrequency; // Time in seconds #endif @@ -552,4 +574,6 @@ static double rgGetCurrentTime(void) return time; } +RL_NS_END + #endif // RGESTURES_IMPLEMENTATION diff --git a/project/auxillary/vis_ast/dependencies/raylib/include/rlgl.h b/project/auxillary/vis_ast/dependencies/raylib/include/rlgl.h index b68a608..193ba05 100644 --- a/project/auxillary/vis_ast/dependencies/raylib/include/rlgl.h +++ b/project/auxillary/vis_ast/dependencies/raylib/include/rlgl.h @@ -1,24 +1,24 @@ /********************************************************************************************** * -* RLGL_gl v4.5 - A multi-OpenGL abstraction layer with an immediate-mode style API +* rlgl v4.5 - 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) -* that provides a pseudo-OpenGL 1.1 immediate-mode style API (RLGL_Vertex, RLGL_Translate, RLGL_Rotate...) +* that provides a pseudo-OpenGL 1.1 immediate-mode style API (Vertex, Translate, Rotate...) * * ADDITIONAL NOTES: * When choosing an OpenGL backend different than OpenGL 1.1, some internal buffer are -* initialized on RLGL_Init() to accumulate vertex data. +* initialized on init() to accumulate vertex data. * * When an internal state change is required all the stored vertex data is renderer in batch, -* additionally, RLGL_DrawRenderBatchActive() could be called to force flushing of the batch. +* additionally, draw_render_batch_active() could be called to force flushing of the batch. * * Some resources are also loaded for convenience, here the complete list: -* - Default batch (RLGL_GLOBAL_DATA.defaultBatch): RenderBatch system to accumulate vertex data -* - Default texture (RLGL_GLOBAL_DATA.defaultTextureId): 1x1 white pixel R8G8B8A8 -* - Default shader (RLGL_GLOBAL_DATA.State.defaultShaderId, RLGL_GLOBAL_DATA.State.defaultShaderLocs) +* - Default batch (GLOBAL_DATA.defaultBatch): RenderBatch system to accumulate vertex data +* - Default texture (GLOBAL_DATA.defaultTextureId): 1x1 white pixel R8G8B8A8 +* - Default shader (GLOBAL_DATA.State.defaultShaderId, GLOBAL_DATA.State.defaultShaderLocs) * -* Internal buffer (and resources) must be manually unloaded calling RLGL_Close(). +* Internal buffer (and resources) must be manually unloaded calling close(). * * CONFIGURATION: * #define GRAPHICS_API_OPENGL_11 @@ -28,8 +28,8 @@ * #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_gl module, if OpenGL version is -* required by any other module, use RLGL_GetVersion() to check it +* Those preprocessor defines are only used on rlgl module, if OpenGL version is +* required by any other module, use get_version() to check it * * #define RLGL_IMPLEMENTATION * Generates the implementation of the library into the included file. @@ -46,7 +46,7 @@ * #define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT * Enable debug context (only available on OpenGL 4.3) * -* RLGL_gl capabilities could be customized just defining some internal +* 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 @@ -54,10 +54,10 @@ * #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 RL_Matrix stack +* #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 +* #define CULL_DISTANCE_NEAR 0.01 // Default projection matrix near cull distance +* #define 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: @@ -126,6 +126,38 @@ #endif #endif +// Indicates of raylib has been refactored +#ifndef RL_REFACTORED_CPP +#define RL_REFACTORED_CPP +#endif + +#define RLGL_USE_CPP_NAMESPACE 1 +#define RLGL_USE_CPP_MANGLING 1 + +#if RLGL_USE_CPP_NAMESPACE && defined(__cplusplus) + #pragma message("USING CPP MANGLING") + #define RLGL_NS_BEGIN namespace rl { + #define RLGL_NS_END } +#else + #define RLGL_NS_BEGIN + #define RLGL_NS_END +#endif + +#if RLGL_USE_CPP_MANGLING && defined(__cplusplus) + #pragma message("USING CPP MANGALING") + #define RLGL_EXTERN_C_BEGIN + #define RLGL_EXTERN_C_END +#else + #ifdef __cplusplus + #define RLGL_EXTERN_C_BEGIN extern "C" { + #define RLGL_EXTERN_C_END } + #else + #define RLGL_EXTERN_C_BEGIN + #define RLGL_EXTERN_C_END + #endif +#endif + + // Support RL_TRACELOG macros #ifndef RL_TRACELOG #define RL_TRACELOG(level, ...) (void)0 @@ -220,9 +252,9 @@ #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 4 // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture()) #endif -// Internal RL_Matrix stack +// Internal Matrix stack #ifndef RL_MAX_MATRIX_STACK_SIZE - #define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of RL_Matrix stack + #define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of Matrix stack #endif // Shader limits @@ -231,34 +263,34 @@ #endif // Projection matrix culling -#ifndef RL_CULL_DISTANCE_NEAR - #define RL_CULL_DISTANCE_NEAR 0.01 // Default near cull distance +#ifndef CULL_DISTANCE_NEAR + #define 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 +#ifndef CULL_DISTANCE_FAR + #define 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 TEXTURE_WRAP_S 0x2802 // GL_TEXTURE_WRAP_S +#define TEXTURE_WRAP_T 0x2803 // GL_TEXTURE_WRAP_T +#define TEXTURE_MAG_FILTER 0x2800 // GL_TEXTURE_MAG_FILTER +#define 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 TEXTURE_FILTER_NEAREST 0x2600 // GL_NEAREST +#define TEXTURE_FILTER_LINEAR 0x2601 // GL_LINEAR +#define TEXTURE_FILTER_MIP_NEAREST 0x2700 // GL_NEAREST_MIPMAP_NEAREST +#define TEXTURE_FILTER_NEAREST_MIP_LINEAR 0x2702 // GL_NEAREST_MIPMAP_LINEAR +#define TEXTURE_FILTER_LINEAR_MIP_NEAREST 0x2701 // GL_LINEAR_MIPMAP_NEAREST +#define TEXTURE_FILTER_MIP_LINEAR 0x2703 // GL_LINEAR_MIPMAP_LINEAR +#define TEXTURE_FILTER_ANISOTROPIC 0x3000 // Anisotropic filter (custom identifier) +#define 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 +#define TEXTURE_WRAP_REPEAT 0x2901 // GL_REPEAT +#define TEXTURE_WRAP_CLAMP 0x812F // GL_CLAMP_TO_EDGE +#define TEXTURE_WRAP_MIRROR_REPEAT 0x8370 // GL_MIRRORED_REPEAT +#define TEXTURE_WRAP_MIRROR_CLAMP 0x8742 // GL_MIRROR_CLAMP_EXT -// RL_Matrix modes (equivalent to OpenGL) +// Matrix modes (equivalent to OpenGL) #define RL_MODELVIEW 0x1700 // GL_MODELVIEW #define RL_PROJECTION 0x1701 // GL_PROJECTION #define RL_TEXTURE 0x1702 // GL_TEXTURE @@ -311,14 +343,14 @@ #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 BLEND_EQUATION 0x8009 // GL_BLEND_EQUATION +#define BLEND_EQUATION_RGB 0x8009 // GL_BLEND_EQUATION_RGB // (Same as BLEND_EQUATION) +#define BLEND_EQUATION_ALPHA 0x883D // GL_BLEND_EQUATION_ALPHA +#define BLEND_DST_RGB 0x80C8 // GL_BLEND_DST_RGB +#define BLEND_SRC_RGB 0x80C9 // GL_BLEND_SRC_RGB +#define BLEND_DST_ALPHA 0x80CA // GL_BLEND_DST_ALPHA +#define BLEND_SRC_ALPHA 0x80CB // GL_BLEND_SRC_ALPHA +#define BLEND_COLOR 0x8005 // GL_BLEND_COLOR //---------------------------------------------------------------------------------- @@ -331,19 +363,21 @@ typedef enum bool { false = 0, true = !false } bool; #endif +RLGL_NS_BEGIN + #if !defined(RL_MATRIX_TYPE) -// RL_Matrix, 4x4 components, column major, OpenGL style, right handed -typedef struct RL_Matrix { - float m0, m4, m8, m12; // RL_Matrix first row (4 components) - float m1, m5, m9, m13; // RL_Matrix second row (4 components) - float m2, m6, m10, m14; // RL_Matrix third row (4 components) - float m3, m7, m11, m15; // RL_Matrix fourth row (4 components) -} RL_Matrix; +// 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 RLGL_VertexBuffer { +typedef struct vertex_buffer { int elementCount; // Number of elements in the buffer (QUADS) float *vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) @@ -357,234 +391,233 @@ typedef struct RLGL_VertexBuffer { #endif unsigned int vaoId; // OpenGL Vertex Array Object id unsigned int vboId[4]; // OpenGL Vertex Buffer Objects id (4 types of vertex data) -} RLGL_VertexBuffer; +} vertex_buffer; // 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 RLGL_DrawCall { +typedef struct draw_call { 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_GLOBAL_DATA.currentBatch->vertexBuffer.vaoId - //unsigned int shaderId; // Shader id to be used on the draw -> Using RLGL_GLOBAL_DATA.currentShaderId + //unsigned int vaoId; // Vertex array id to be used on the draw -> Using GLOBAL_DATA.currentBatch->vertexBuffer.vaoId + //unsigned int shaderId; // Shader id to be used on the draw -> Using GLOBAL_DATA.currentShaderId unsigned int textureId; // Texture id to be used on the draw -> Use to create new draw call if changes - //RL_Matrix projection; // Projection matrix for this draw -> Using RLGL_GLOBAL_DATA.projection by default - //RL_Matrix modelview; // Modelview matrix for this draw -> Using RLGL_GLOBAL_DATA.modelview by default -} RLGL_DrawCall; + //Matrix projection; // Projection matrix for this draw -> Using GLOBAL_DATA.projection by default + //Matrix modelview; // Modelview matrix for this draw -> Using GLOBAL_DATA.modelview by default +} draw_call; -// RLGL_RenderBatch type -typedef struct RLGL_RenderBatch { +// render_batch type +typedef struct render_batch { int bufferCount; // Number of vertex buffers (multi-buffering support) int currentBuffer; // Current buffer tracking in case of multi-buffering - RLGL_VertexBuffer *vertexBuffer; // Dynamic buffer(s) for vertex data + vertex_buffer *vertexBuffer; // Dynamic buffer(s) for vertex data - RLGL_DrawCall *draws; // Draw calls array, depends on textureId + draw_call *draws; // Draw calls array, depends on textureId int drawCounter; // Draw calls counter float currentDepth; // Current depth value for next draw -} RLGL_RenderBatch; +} render_batch; // OpenGL version typedef enum { - RLGL_OPENGL_11 = 1, // OpenGL 1.1 - RLGL_OPENGL_21, // OpenGL 2.1 (GLSL 120) - RLGL_OPENGL_33, // OpenGL 3.3 (GLSL 330) - RLGL_OPENGL_43, // OpenGL 4.3 (using GLSL 330) - RLGL_OPENGL_ES_20, // OpenGL ES 2.0 (GLSL 100) - RLGL_OPENGL_ES_30 // OpenGL ES 3.0 (GLSL 300 es) -} RLGL_GlVersion; + 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) +} gl_version; -#ifndef RAYLIB_H +// Will not define these if not built standalone OR RLAPI is defined which means this file was not refactored +#if !defined(RL_REFACTORED_C) && !defined(RL_REFACTORED_CPP) // 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 -} RLGL_TraceLogLevel; + 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 +} trace_log_level; // 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 -} RLGL_PixelFormat; + 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 +} pixel_format; // 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 -} RLGL_TextureFilter; + 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 +} texture_filter; // 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 -} RLGL_ShaderLocationIndex; + 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_location_index; -#define RL_SHADER_LOC_MAP_DIFFUSE RL_SHADER_LOC_MAP_ALBEDO -#define RL_SHADER_LOC_MAP_SPECULAR RL_SHADER_LOC_MAP_METALNESS +#define SHADER_LOC_MAP_DIFFUSE RL_NS(SHADER_LOC_MAP_ALBEDO) +#define SHADER_LOC_MAP_SPECULAR RL_NS(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_SAMPLER2D // Shader uniform type: sampler2d -} RLGL_ShaderUniformDataType; + 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_SAMPLER2D // Shader uniform type: sampler2d +} shader_uniform_data_type; // 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) -} RLGL_ShaderAttributeDataType; + 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) +} shader_attribute_data_type; // 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 RLGL_SetBlendFactors()) - RL_BLEND_CUSTOM_SEPARATE // Blend textures using custom src/dst factors (use RLGL_SetBlendFactorsSeparate()) -} RLGL_BlendMode; + 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 set_blend_factors()) + BLEND_CUSTOM_SEPARATE // Blend textures using custom src/dst factors (use set_blend_factors_separate()) +} blend_mode; #endif //ifndef RAYLIB_H // 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 -} RLGL_FramebufferAttachType; + ATTACHMENT_COLOR_CHANNEL0 = 0, // Framebuffer attachment type: color 0 + ATTACHMENT_COLOR_CHANNEL1 = 1, // Framebuffer attachment type: color 1 + ATTACHMENT_COLOR_CHANNEL2 = 2, // Framebuffer attachment type: color 2 + ATTACHMENT_COLOR_CHANNEL3 = 3, // Framebuffer attachment type: color 3 + ATTACHMENT_COLOR_CHANNEL4 = 4, // Framebuffer attachment type: color 4 + ATTACHMENT_COLOR_CHANNEL5 = 5, // Framebuffer attachment type: color 5 + ATTACHMENT_COLOR_CHANNEL6 = 6, // Framebuffer attachment type: color 6 + ATTACHMENT_COLOR_CHANNEL7 = 7, // Framebuffer attachment type: color 7 + ATTACHMENT_DEPTH = 100, // Framebuffer attachment type: depth + ATTACHMENT_STENCIL = 200, // Framebuffer attachment type: stencil +} framebuffer_attach_type; // 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 -} RLGL_FramebufferAttachTextureType; + ATTACHMENT_CUBEMAP_POSITIVE_X = 0, // Framebuffer texture attachment type: cubemap, +X side + ATTACHMENT_CUBEMAP_NEGATIVE_X = 1, // Framebuffer texture attachment type: cubemap, -X side + ATTACHMENT_CUBEMAP_POSITIVE_Y = 2, // Framebuffer texture attachment type: cubemap, +Y side + ATTACHMENT_CUBEMAP_NEGATIVE_Y = 3, // Framebuffer texture attachment type: cubemap, -Y side + ATTACHMENT_CUBEMAP_POSITIVE_Z = 4, // Framebuffer texture attachment type: cubemap, +Z side + ATTACHMENT_CUBEMAP_NEGATIVE_Z = 5, // Framebuffer texture attachment type: cubemap, -Z side + ATTACHMENT_TEXTURE2D = 100, // Framebuffer texture attachment type: texture2d + ATTACHMENT_RENDERBUFFER = 200, // Framebuffer texture attachment type: renderbuffer +} framebuffer_attach_texture_type; // Face culling mode typedef enum { - RL_CULL_FACE_FRONT = 0, - RL_CULL_FACE_BACK -} RLGL_CullMode; + CULL_FACE_FRONT = 0, + CULL_FACE_BACK +} cull_mode; //------------------------------------------------------------------------------------ -// Functions Declaration - RL_Matrix operations +// Functions Declaration - Matrix operations //------------------------------------------------------------------------------------ -#if defined(__cplusplus) -extern "C" { // Prevents name mangling of functions -#endif +RLGL_EXTERN_C_BEGIN -RLAPI void RLGL_MatrixMode(int mode); // Choose the current matrix to be transformed -RLAPI void RLGL_PushMatrix(void); // Push the current matrix to stack -RLAPI void RLGL_PopMatrix(void); // Pop latest inserted matrix from stack -RLAPI void RLGL_LoadIdentity(void); // Reset current matrix to identity matrix -RLAPI void RLGL_Translatef(float x, float y, float z); // Multiply the current matrix by a translation matrix -RLAPI void RLGL_Rotatef(float angle, float x, float y, float z); // Multiply the current matrix by a rotation matrix -RLAPI void RLGL_Scalef(float x, float y, float z); // Multiply the current matrix by a scaling matrix -RLAPI void RLGL_MultMatrixf(const float *matf); // Multiply the current matrix by another matrix -RLAPI void RLGL_Frustum(double left, double right, double bottom, double top, double znear, double zfar); -RLAPI void RLGL_Ortho(double left, double right, double bottom, double top, double znear, double zfar); -RLAPI void RLGL_Viewport(int x, int y, int width, int height); // Set the viewport area +RLAPI void matrix_mode(int mode); // Choose the current matrix to be transformed +RLAPI void push_matrix(void); // Push the current matrix to stack +RLAPI void pop_matrix(void); // Pop latest inserted matrix from stack +RLAPI void load_identity(void); // Reset current matrix to identity matrix +RLAPI void translatef(float x, float y, float z); // Multiply the current matrix by a translation matrix +RLAPI void rotatef(float angle, float x, float y, float z); // Multiply the current matrix by a rotation matrix +RLAPI void scalef(float x, float y, float z); // Multiply the current matrix by a scaling matrix +RLAPI void mult_matrixf(const float *matf); // Multiply the current matrix by another matrix +RLAPI void frustum(double left, double right, double bottom, double top, double znear, double zfar); +RLAPI void ortho(double left, double right, double bottom, double top, double znear, double zfar); +RLAPI void viewport(int x, int y, int width, int height); // Set the viewport area //------------------------------------------------------------------------------------ // Functions Declaration - Vertex level operations //------------------------------------------------------------------------------------ -RLAPI void RLGL_Begin(int mode); // Initialize drawing mode (how to organize vertex) -RLAPI void RLGL_End(void); // Finish vertex providing -RLAPI void RLGL_Vertex2i(int x, int y); // Define one vertex (position) - 2 int -RLAPI void RLGL_Vertex2f(float x, float y); // Define one vertex (position) - 2 float -RLAPI void RLGL_Vertex3f(float x, float y, float z); // Define one vertex (position) - 3 float -RLAPI void RLGL_TexCoord2f(float x, float y); // Define one vertex (texture coordinate) - 2 float -RLAPI void RLGL_Normal3f(float x, float y, float z); // Define one vertex (normal) - 3 float -RLAPI void RLGL_Color4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a); // Define one vertex (color) - 4 byte -RLAPI void RLGL_Color3f(float x, float y, float z); // Define one vertex (color) - 3 float -RLAPI void RLGL_Color4f(float x, float y, float z, float w); // Define one vertex (color) - 4 float +RLAPI void begin(int mode); // Initialize drawing mode (how to organize vertex) +RLAPI void end(void); // Finish vertex providing +RLAPI void vertex2i(int x, int y); // Define one vertex (position) - 2 int +RLAPI void vertex2f(float x, float y); // Define one vertex (position) - 2 float +RLAPI void vertex3f(float x, float y, float z); // Define one vertex (position) - 3 float +RLAPI void tex_coord2f(float x, float y); // Define one vertex (texture coordinate) - 2 float +RLAPI void normal3f(float x, float y, float z); // Define one vertex (normal) - 3 float +RLAPI void color4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a); // Define one vertex (color) - 4 byte +RLAPI void color3f(float x, float y, float z); // Define one vertex (color) - 3 float +RLAPI void color4f(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) @@ -593,186 +626,186 @@ RLAPI void RLGL_Color4f(float x, float y, float z, float w); // Define one verte //------------------------------------------------------------------------------------ // Vertex buffers state -RLAPI bool RLGL_EnableVertexArray(unsigned int vaoId); // Enable vertex array (VAO, if supported) -RLAPI void RLGL_DisableVertexArray(void); // Disable vertex array (VAO, if supported) -RLAPI void RLGL_EnableVertexBuffer(unsigned int id); // Enable vertex buffer (VBO) -RLAPI void RLGL_DisableVertexBuffer(void); // Disable vertex buffer (VBO) -RLAPI void RLGL_EnableVertexBufferElement(unsigned int id);// Enable vertex buffer element (VBO element) -RLAPI void RLGL_DisableVertexBufferElement(void); // Disable vertex buffer element (VBO element) -RLAPI void RLGL_EnableVertexAttribute(unsigned int index); // Enable vertex attribute index -RLAPI void RLGL_DisableVertexAttribute(unsigned int index);// Disable vertex attribute index +RLAPI bool enable_vertex_array(unsigned int vaoId); // Enable vertex array (VAO, if supported) +RLAPI void disable_vertex_array(void); // Disable vertex array (VAO, if supported) +RLAPI void enable_vertex_buffer(unsigned int id); // Enable vertex buffer (VBO) +RLAPI void disable_vertex_buffer(void); // Disable vertex buffer (VBO) +RLAPI void enable_vertex_buffer_element(unsigned int id);// Enable vertex buffer element (VBO element) +RLAPI void disable_vertex_buffer_element(void); // Disable vertex buffer element (VBO element) +RLAPI void enable_vertex_attribute(unsigned int index); // Enable vertex attribute index +RLAPI void disable_vertex_attribute(unsigned int index);// Disable vertex attribute index #if defined(GRAPHICS_API_OPENGL_11) -RLAPI void RLGL_EnableStatePointer(int vertexAttribType, void *buffer); // Enable attribute state pointer -RLAPI void RLGL_DisableStatePointer(int vertexAttribType); // Disable attribute state pointer +RLAPI void enable_state_pointer(int vertexAttribType, void *buffer); // Enable attribute state pointer +RLAPI void disable_state_pointer(int vertexAttribType); // Disable attribute state pointer #endif // Textures state -RLAPI void RLGL_ActiveTextureSlot(int slot); // Select and active a texture slot -RLAPI void RLGL_EnableTexture(unsigned int id); // Enable texture -RLAPI void RLGL_DisableTexture(void); // Disable texture -RLAPI void RLGL_EnableTextureCubemap(unsigned int id); // Enable texture cubemap -RLAPI void RLGL_DisableTextureCubemap(void); // Disable texture cubemap -RLAPI void RLGL_TextureParameters(unsigned int id, int param, int value); // Set texture parameters (filter, wrap) -RLAPI void RLGL_CubemapParameters(unsigned int id, int param, int value); // Set cubemap parameters (filter, wrap) +RLAPI void active_texture_slot(int slot); // Select and active a texture slot +RLAPI void enable_texture(unsigned int id); // Enable texture +RLAPI void disable_texture(void); // Disable texture +RLAPI void enable_texture_cubemap(unsigned int id); // Enable texture cubemap +RLAPI void disable_texture_cubemap(void); // Disable texture cubemap +RLAPI void texture_parameters(unsigned int id, int param, int value); // Set texture parameters (filter, wrap) +RLAPI void cubemap_parameters(unsigned int id, int param, int value); // Set cubemap parameters (filter, wrap) // Shader state -RLAPI void RLGL_EnableShader(unsigned int id); // Enable shader program -RLAPI void RLGL_DisableShader(void); // Disable shader program +RLAPI void enable_shader(unsigned int id); // Enable shader program +RLAPI void disable_shader(void); // Disable shader program // Framebuffer state -RLAPI void RLGL_EnableFramebuffer(unsigned int id); // Enable render texture (fbo) -RLAPI void RLGL_DisableFramebuffer(void); // Disable render texture (fbo), return to default framebuffer -RLAPI void RLGL_ActiveDrawBuffers(int count); // Activate multiple draw color buffers -RLAPI void RLGL_BlitFramebuffer(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 enable_framebuffer(unsigned int id); // Enable render texture (fbo) +RLAPI void disable_framebuffer(void); // Disable render texture (fbo), return to default framebuffer +RLAPI void active_draw_buffers(int count); // Activate multiple draw color buffers +RLAPI void blit_framebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight, int bufferMask); // Blit active framebuffer to main framebuffer // General render state -RLAPI void RLGL_EnableColorBlend(void); // Enable color blending -RLAPI void RLGL_DisableColorBlend(void); // Disable color blending -RLAPI void RLGL_EnableDepthTest(void); // Enable depth test -RLAPI void RLGL_DisableDepthTest(void); // Disable depth test -RLAPI void RLGL_EnableDepthMask(void); // Enable depth write -RLAPI void RLGL_DisableDepthMask(void); // Disable depth write -RLAPI void RLGL_EnableBackfaceCulling(void); // Enable backface culling -RLAPI void RLGL_DisableBackfaceCulling(void); // Disable backface culling -RLAPI void RLGL_SetCullFace(int mode); // Set face culling mode -RLAPI void RLGL_EnableScissorTest(void); // Enable scissor test -RLAPI void RLGL_DisableScissorTest(void); // Disable scissor test -RLAPI void RLGL_Scissor(int x, int y, int width, int height); // Scissor test -RLAPI void RLGL_EnableWireMode(void); // Enable wire mode -RLAPI void RLGL_EnablePointMode(void); // Enable point mode -RLAPI void RLGL_DisableWireMode(void); // Disable wire mode ( and point ) maybe rename -RLAPI void RLGL_SetLineWidth(float width); // Set the line drawing width -RLAPI float RLGL_GetLineWidth(void); // Get the line drawing width -RLAPI void RLGL_EnableSmoothLines(void); // Enable line aliasing -RLAPI void RLGL_DisableSmoothLines(void); // Disable line aliasing -RLAPI void RLGL_EnableStereoRender(void); // Enable stereo rendering -RLAPI void RLGL_DisableStereoRender(void); // Disable stereo rendering -RLAPI bool RLGL_IsStereoRenderEnabled(void); // Check if stereo render is enabled +RLAPI void enable_color_blend(void); // Enable color blending +RLAPI void disable_color_blend(void); // Disable color blending +RLAPI void enable_depth_test(void); // Enable depth test +RLAPI void disable_depth_test(void); // Disable depth test +RLAPI void enable_depth_mask(void); // Enable depth write +RLAPI void disable_depth_mask(void); // Disable depth write +RLAPI void enable_backface_culling(void); // Enable backface culling +RLAPI void disable_backface_culling(void); // Disable backface culling +RLAPI void set_cull_face(int mode); // Set face culling mode +RLAPI void enable_scissor_test(void); // Enable scissor test +RLAPI void disable_scissor_test(void); // Disable scissor test +RLAPI void scissor(int x, int y, int width, int height); // Scissor test +RLAPI void enable_wire_mode(void); // Enable wire mode +RLAPI void enable_point_mode(void); // Enable point mode +RLAPI void disable_wire_mode(void); // Disable wire mode ( and point ) maybe rename +RLAPI void set_line_width(float width); // Set the line drawing width +RLAPI float get_line_width(void); // Get the line drawing width +RLAPI void enable_smooth_lines(void); // Enable line aliasing +RLAPI void disable_smooth_lines(void); // Disable line aliasing +RLAPI void enable_stereo_render(void); // Enable stereo rendering +RLAPI void disable_stereo_render(void); // Disable stereo rendering +RLAPI bool is_stereo_render_enabled(void); // Check if stereo render is enabled -RLAPI void RLGL_ClearColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a); // Clear color buffer with color -RLAPI void RLGL_ClearScreenBuffers(void); // Clear used screen buffers (color and depth) -RLAPI void RLGL_CheckErrors(void); // Check and log OpenGL error codes -RLAPI void RLGL_SetBlendMode(int mode); // Set blending mode -RLAPI void RLGL_SetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation); // Set blending mode factor and equation (using OpenGL factors) -RLAPI void RLGL_SetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha, int glEqRGB, int glEqAlpha); // Set blending mode factors and equations separately (using OpenGL factors) +RLAPI void clear_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a); // Clear color buffer with color +RLAPI void clear_screen_buffers(void); // Clear used screen buffers (color and depth) +RLAPI void check_errors(void); // Check and log OpenGL error codes +RLAPI void set_blend_mode(int mode); // Set blending mode +RLAPI void set_blend_factors(int glSrcFactor, int glDstFactor, int glEquation); // Set blending mode factor and equation (using OpenGL factors) +RLAPI void set_blend_factors_separate(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_gl functionality +// Functions Declaration - rlgl functionality //------------------------------------------------------------------------------------ -// RLGL_gl initialization functions -RLAPI void RLGL_Init(int width, int height); // Initialize RLGL_gl (buffers, shaders, textures, states) -RLAPI void RLGL_Close(void); // De-initialize RLGL_gl (buffers, shaders, textures) -RLAPI void RLGL_LoadExtensions(void *loader); // Load OpenGL extensions (loader function required) -RLAPI int RLGL_GetVersion(void); // Get current OpenGL version -RLAPI void RLGL_SetFramebufferWidth(int width); // Set current framebuffer width -RLAPI int RLGL_GetFramebufferWidth(void); // Get default framebuffer width -RLAPI void RLGL_SetFramebufferHeight(int height); // Set current framebuffer height -RLAPI int RLGL_GetFramebufferHeight(void); // Get default framebuffer height +// rlgl initialization functions +RLAPI void init(int width, int height); // Initialize rlgl (buffers, shaders, textures, states) +RLAPI void close(void); // De-initialize rlgl (buffers, shaders, textures) +RLAPI void load_extensions(void *loader); // Load OpenGL extensions (loader function required) +RLAPI int get_version(void); // Get current OpenGL version +RLAPI void set_framebuffer_width(int width); // Set current framebuffer width +RLAPI int get_framebuffer_width(void); // Get default framebuffer width +RLAPI void set_framebuffer_height(int height); // Set current framebuffer height +RLAPI int get_framebuffer_height(void); // Get default framebuffer height -RLAPI unsigned int RLGL_GetTextureIdDefault(void); // Get default texture id -RLAPI unsigned int RLGL_GetShaderIdDefault(void); // Get default shader id -RLAPI int *RLGL_GetShaderLocsDefault(void); // Get default shader locations +RLAPI unsigned int get_texture_id_default(void); // Get default texture id +RLAPI unsigned int get_shader_id_default(void); // Get default shader id +RLAPI int *get_shader_locs_default(void); // Get default shader locations // Render batch management -// NOTE: RLGL_gl provides a default render batch to behave like OpenGL 1.1 immediate mode +// 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 RLGL_RenderBatch RLGL_LoadRenderBatch(int numBuffers, int bufferElements); // Load a render batch system -RLAPI void RLGL_UnloadRenderBatch(RLGL_RenderBatch batch); // Unload render batch system -RLAPI void RLGL_DrawRenderBatch(RLGL_RenderBatch *batch); // Draw render batch data (Update->Draw->Reset) -RLAPI void RLGL_SetRenderBatchActive(RLGL_RenderBatch *batch); // Set the active render batch for RLGL_gl (NULL for default internal) -RLAPI void RLGL_DrawRenderBatchActive(void); // Update and draw internal render batch -RLAPI bool RLGL_CheckRenderBatchLimit(int vCount); // Check internal buffer overflow for a given number of vertex +RLAPI render_batch load_render_batch(int numBuffers, int bufferElements); // Load a render batch system +RLAPI void unload_render_batch(render_batch batch); // Unload render batch system +RLAPI void draw_render_batch(render_batch *batch); // Draw render batch data (Update->Draw->Reset) +RLAPI void set_render_batch_active(render_batch *batch); // Set the active render batch for rlgl (NULL for default internal) +RLAPI void draw_render_batch_active(void); // Update and draw internal render batch +RLAPI bool check_render_batch_limit(int vCount); // Check internal buffer overflow for a given number of vertex -RLAPI void RLGL_SetTexture(unsigned int id); // Set current texture for render batch and check buffers limits +RLAPI void set_texture(unsigned int id); // Set current texture for render batch and check buffers limits //------------------------------------------------------------------------------------------------------------------------ // Vertex buffers management -RLAPI unsigned int RLGL_LoadVertexArray(void); // Load vertex array (vao) if supported -RLAPI unsigned int RLGL_LoadVertexBuffer(const void *buffer, int size, bool dynamic); // Load a vertex buffer attribute -RLAPI unsigned int RLGL_LoadVertexBufferElement(const void *buffer, int size, bool dynamic); // Load a new attributes element buffer -RLAPI void RLGL_UpdateVertexBuffer(unsigned int bufferId, const void *data, int dataSize, int offset); // Update GPU buffer with new data -RLAPI void RLGL_UpdateVertexBufferElements(unsigned int id, const void *data, int dataSize, int offset); // Update vertex buffer elements with new data -RLAPI void RLGL_UnloadVertexArray(unsigned int vaoId); -RLAPI void RLGL_UnloadVertexBuffer(unsigned int vboId); -RLAPI void RLGL_SetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int stride, const void *pointer); -RLAPI void RLGL_SetVertexAttributeDivisor(unsigned int index, int divisor); -RLAPI void RLGL_SetVertexAttributeDefault(int locIndex, const void *value, int attribType, int count); // Set vertex attribute default value -RLAPI void RLGL_DrawVertexArray(int offset, int count); -RLAPI void RLGL_DrawVertexArrayElements(int offset, int count, const void *buffer); -RLAPI void RLGL_DrawVertexArrayInstanced(int offset, int count, int instances); -RLAPI void RLGL_DrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances); +RLAPI unsigned int load_vertex_array(void); // Load vertex array (vao) if supported +RLAPI unsigned int load_vertex_buffer(const void *buffer, int size, bool dynamic); // Load a vertex buffer attribute +RLAPI unsigned int load_vertex_buffer_element(const void *buffer, int size, bool dynamic); // Load a new attributes element buffer +RLAPI void update_vertex_buffer(unsigned int bufferId, const void *data, int dataSize, int offset); // Update GPU buffer with new data +RLAPI void update_vertex_buffer_elements(unsigned int id, const void *data, int dataSize, int offset); // Update vertex buffer elements with new data +RLAPI void unload_vertex_array(unsigned int vaoId); +RLAPI void unload_vertex_buffer(unsigned int vboId); +RLAPI void set_vertex_attribute(unsigned int index, int compSize, int type, bool normalized, int stride, const void *pointer); +RLAPI void set_vertex_attribute_divisor(unsigned int index, int divisor); +RLAPI void set_vertex_attribute_default(int locIndex, const void *value, int attribType, int count); // Set vertex attribute default value +RLAPI void draw_vertex_array(int offset, int count); +RLAPI void draw_vertex_array_elements(int offset, int count, const void *buffer); +RLAPI void draw_vertex_array_instanced(int offset, int count, int instances); +RLAPI void draw_vertex_array_elements_instanced(int offset, int count, const void *buffer, int instances); // Textures management -RLAPI unsigned int RLGL_LoadTexture(const void *data, int width, int height, int format, int mipmapCount); // Load texture in GPU -RLAPI unsigned int RLGL_LoadTextureDepth(int width, int height, bool useRenderBuffer); // Load depth texture/renderbuffer (to be attached to fbo) -RLAPI unsigned int RLGL_LoadTextureCubemap(const void *data, int size, int format); // Load texture cubemap -RLAPI void RLGL_UpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int height, int format, const void *data); // Update GPU texture with new data -RLAPI void RLGL_GetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned int *glFormat, unsigned int *glType); // Get OpenGL internal formats -RLAPI const char *RLGL_GetPixelFormatName(unsigned int format); // Get name string for pixel format -RLAPI void RLGL_UnloadTexture(unsigned int id); // Unload texture from GPU memory -RLAPI void RLGL_GenTextureMipmaps(unsigned int id, int width, int height, int format, int *mipmaps); // Generate mipmap data for selected texture -RLAPI void *RLGL_ReadTexturePixels(unsigned int id, int width, int height, int format); // Read texture pixel data -RLAPI unsigned char *RLGL_ReadScreenPixels(int width, int height); // Read screen pixel data (color buffer) +RLAPI unsigned int load_texture(const void *data, int width, int height, int format, int mipmapCount); // Load texture in GPU +RLAPI unsigned int load_texture_depth(int width, int height, bool useRenderBuffer); // Load depth texture/renderbuffer (to be attached to fbo) +RLAPI unsigned int load_texture_cubemap(const void *data, int size, int format); // Load texture cubemap +RLAPI void update_texture(unsigned int id, int offsetX, int offsetY, int width, int height, int format, const void *data); // Update GPU texture with new data +RLAPI void get_gl_texture_formats(int format, unsigned int *glInternalFormat, unsigned int *glFormat, unsigned int *glType); // Get OpenGL internal formats +RLAPI const char *get_pixel_format_name(unsigned int format); // Get name string for pixel format +RLAPI void unload_texture(unsigned int id); // Unload texture from GPU memory +RLAPI void gen_texture_mipmaps(unsigned int id, int width, int height, int format, int *mipmaps); // Generate mipmap data for selected texture +RLAPI void *read_texture_pixels(unsigned int id, int width, int height, int format); // Read texture pixel data +RLAPI unsigned char *read_screen_pixels(int width, int height); // Read screen pixel data (color buffer) // Framebuffer management (fbo) -RLAPI unsigned int RLGL_LoadFramebuffer(int width, int height); // Load an empty framebuffer -RLAPI void RLGL_FramebufferAttach(unsigned int fboId, unsigned int texId, int attachType, int texType, int mipLevel); // Attach texture/renderbuffer to a framebuffer -RLAPI bool RLGL_FramebufferComplete(unsigned int id); // Verify framebuffer is complete -RLAPI void RLGL_UnloadFramebuffer(unsigned int id); // Delete framebuffer from GPU +RLAPI unsigned int load_framebuffer(int width, int height); // Load an empty framebuffer +RLAPI void framebuffer_attach(unsigned int fboId, unsigned int texId, int attachType, int texType, int mipLevel); // Attach texture/renderbuffer to a framebuffer +RLAPI bool framebuffer_complete(unsigned int id); // Verify framebuffer is complete +RLAPI void unload_framebuffer(unsigned int id); // Delete framebuffer from GPU // Shaders management -RLAPI unsigned int RLGL_LoadShaderCode(const char *vsCode, const char *fsCode); // Load shader from code strings -RLAPI unsigned int RLGL_CompileShader(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 RLGL_LoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId); // Load custom shader program -RLAPI void RLGL_UnloadShaderProgram(unsigned int id); // Unload shader program -RLAPI int RLGL_GetLocationUniform(unsigned int shaderId, const char *uniformName); // Get shader location uniform -RLAPI int RLGL_GetLocationAttrib(unsigned int shaderId, const char *attribName); // Get shader location attribute -RLAPI void RLGL_SetUniform(int locIndex, const void *value, int uniformType, int count); // Set shader value uniform -RLAPI void RLGL_SetUniformMatrix(int locIndex, RL_Matrix mat); // Set shader value matrix -RLAPI void RLGL_SetUniformSampler(int locIndex, unsigned int textureId); // Set shader value sampler -RLAPI void RLGL_SetShader(unsigned int id, int *locs); // Set shader currently active (id and locations) +RLAPI unsigned int load_shader_code(const char *vsCode, const char *fsCode); // Load shader from code strings +RLAPI unsigned int compile_shader(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 load_shader_program(unsigned int vShaderId, unsigned int fShaderId); // Load custom shader program +RLAPI void unload_shader_program(unsigned int id); // Unload shader program +RLAPI int get_location_uniform(unsigned int shaderId, const char *uniformName); // Get shader location uniform +RLAPI int get_location_attrib(unsigned int shaderId, const char *attribName); // Get shader location attribute +RLAPI void set_uniform(int locIndex, const void *value, int uniformType, int count); // Set shader value uniform +RLAPI void set_uniform_matrix(int locIndex, Matrix mat); // Set shader value matrix +RLAPI void set_uniform_sampler(int locIndex, unsigned int textureId); // Set shader value sampler +RLAPI void set_shader(unsigned int id, int *locs); // Set shader currently active (id and locations) // Compute shader management -RLAPI unsigned int RLGL_LoadComputeShaderProgram(unsigned int shaderId); // Load compute shader program -RLAPI void RLGL_ComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ); // Dispatch compute shader (equivalent to *draw* for graphics pipeline) +RLAPI unsigned int load_compute_shader_program(unsigned int shaderId); // Load compute shader program +RLAPI void compute_shader_dispatch(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 RLGL_LoadShaderBuffer(unsigned int size, const void *data, int usageHint); // Load shader storage buffer object (SSBO) -RLAPI void RLGL_UnloadShaderBuffer(unsigned int ssboId); // Unload shader storage buffer object (SSBO) -RLAPI void RLGL_UpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int offset); // Update SSBO buffer data -RLAPI void RLGL_BindShaderBuffer(unsigned int id, unsigned int index); // Bind SSBO buffer -RLAPI void RLGL_ReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsigned int offset); // Read SSBO buffer data (GPU->CPU) -RLAPI void RLGL_CopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, unsigned int srcOffset, unsigned int count); // Copy SSBO data between buffers -RLAPI unsigned int RLGL_GetShaderBufferSize(unsigned int id); // Get SSBO buffer size +RLAPI unsigned int load_shader_buffer(unsigned int size, const void *data, int usageHint); // Load shader storage buffer object (SSBO) +RLAPI void unload_shader_buffer(unsigned int ssboId); // Unload shader storage buffer object (SSBO) +RLAPI void update_shader_buffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int offset); // Update SSBO buffer data +RLAPI void bind_shader_buffer(unsigned int id, unsigned int index); // Bind SSBO buffer +RLAPI void read_shader_buffer(unsigned int id, void *dest, unsigned int count, unsigned int offset); // Read SSBO buffer data (GPU->CPU) +RLAPI void copy_shader_buffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, unsigned int srcOffset, unsigned int count); // Copy SSBO data between buffers +RLAPI unsigned int get_shader_buffer_size(unsigned int id); // Get SSBO buffer size // Buffer management -RLAPI void RLGL_BindImageTexture(unsigned int id, unsigned int index, int format, bool readonly); // Bind image texture +RLAPI void bind_image_texture(unsigned int id, unsigned int index, int format, bool readonly); // Bind image texture -// RL_Matrix state management -RLAPI RL_Matrix RLGL_GetMatrixModelview(void); // Get internal modelview matrix -RLAPI RL_Matrix RLGL_GetMatrixProjection(void); // Get internal projection matrix -RLAPI RL_Matrix RLGL_GetMatrixTransform(void); // Get internal accumulated transform matrix -RLAPI RL_Matrix RLGL_GetMatrixProjectionStereo(int eye); // Get internal projection matrix for stereo render (selected eye) -RLAPI RL_Matrix RLGL_GetMatrixViewOffsetStereo(int eye); // Get internal view offset matrix for stereo render (selected eye) -RLAPI void RLGL_SetMatrixProjection(RL_Matrix proj); // Set a custom projection matrix (replaces internal projection matrix) -RLAPI void RLGL_SetMatrixModelview(RL_Matrix view); // Set a custom modelview matrix (replaces internal modelview matrix) -RLAPI void RLGL_SetMatrixProjectionStereo(RL_Matrix right, RL_Matrix left); // Set eyes projection matrices for stereo rendering -RLAPI void RLGL_SetMatrixViewOffsetStereo(RL_Matrix right, RL_Matrix left); // Set eyes view offsets matrices for stereo rendering +// Matrix state management +RLAPI Matrix get_matrix_modelview(void); // Get internal modelview matrix +RLAPI Matrix get_matrix_projection(void); // Get internal projection matrix +RLAPI Matrix get_matrix_transform(void); // Get internal accumulated transform matrix +RLAPI Matrix get_matrix_projection_stereo(int eye); // Get internal projection matrix for stereo render (selected eye) +RLAPI Matrix get_matrix_view_offset_stereo(int eye); // Get internal view offset matrix for stereo render (selected eye) +RLAPI void set_matrix_projection(Matrix proj); // Set a custom projection matrix (replaces internal projection matrix) +RLAPI void set_matrix_modelview(Matrix view); // Set a custom modelview matrix (replaces internal modelview matrix) +RLAPI void set_matrix_projection_stereo(Matrix right, Matrix left); // Set eyes projection matrices for stereo rendering +RLAPI void set_matrix_view_offset_stereo(Matrix right, Matrix left); // Set eyes view offsets matrices for stereo rendering // Quick and dirty cube/quad buffers load->draw->unload -RLAPI void RLGL_LoadDrawCube(void); // Load and draw a cube -RLAPI void RLGL_LoadDrawQuad(void); // Load and draw a quad +RLAPI void load_draw_cube(void); // Load and draw a cube +RLAPI void load_draw_quad(void); // Load and draw a quad -#if defined(__cplusplus) -} -#endif +RLGL_EXTERN_C_END + +RLGL_NS_END #endif // RLGL_H /*********************************************************************************** * -* RLGL_GLOBAL_DATA IMPLEMENTATION +* GLOBAL_DATA IMPLEMENTATION * ************************************************************************************/ @@ -835,7 +868,7 @@ RLAPI void RLGL_LoadDrawQuad(void); // Load and draw a quad #endif #include // Required for: malloc(), free() -#include // Required for: strcmp(), strlen() [Used in RLGL_Init(), on extensions loading] +#include // Required for: strcmp(), strlen() [Used in init(), on extensions loading] #include // Required for: sqrtf(), sinf(), cosf(), floor(), log() //---------------------------------------------------------------------------------- @@ -963,13 +996,15 @@ RLAPI void RLGL_LoadDrawQuad(void); // Load and draw a quad #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) #endif +RLGL_NS_BEGIN + //---------------------------------------------------------------------------------- // Types and Structures Definition //---------------------------------------------------------------------------------- #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) -typedef struct RLGL_glData { - RLGL_RenderBatch *currentBatch; // Current render batch - RLGL_RenderBatch defaultBatch; // Default internal render batch +typedef struct glData { + render_batch *currentBatch; // Current render batch + render_batch defaultBatch; // Default internal render batch struct { int vertexCounter; // Current active render batch vertex counter (generic, used for all batches) @@ -978,13 +1013,13 @@ typedef struct RLGL_glData { unsigned char colorr, colorg, colorb, colora; // Current active color (added on glVertex*()) int currentMatrixMode; // Current matrix mode - RL_Matrix *currentMatrix; // Current matrix pointer - RL_Matrix modelview; // Default modelview matrix - RL_Matrix projection; // Default projection matrix - RL_Matrix transform; // Transform matrix to be used with RLGL_Translate, RLGL_Rotate, RLGL_Scale + Matrix *currentMatrix; // Current matrix pointer + Matrix modelview; // Default modelview matrix + Matrix projection; // Default projection matrix + Matrix transform; // Transform matrix to be used with Translate, Rotate, Scale bool transformRequired; // Require transform matrix application to current draw-call vertex (if required) - RL_Matrix stack[RL_MAX_MATRIX_STACK_SIZE];// RL_Matrix stack for push/pop - int stackCounter; // RL_Matrix stack counter + 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) @@ -996,8 +1031,8 @@ typedef struct RLGL_glData { int *currentShaderLocs; // Current shader locations pointer to be used on rendering (by default, defaultShaderLocs) bool stereoRender; // Stereo rendering flag - RL_Matrix projectionStereo[2]; // VR stereo rendering eyes projection matrices - RL_Matrix viewOffsetStereo[2]; // VR stereo rendering eyes view offset matrices + 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 @@ -1038,9 +1073,9 @@ typedef struct RLGL_glData { int maxDepthBits; // Maximum bits for depth component } ExtSupported; // Extensions supported flags -} RLGL_glData; +} glData; -typedef void *(*RLGL_glLoadProc)(const char *name); // OpenGL extension functions loader signature (same as GLADloadproc) +typedef void *(*glLoadProc)(const char *name); // OpenGL extension functions loader signature (same as GLADloadproc) #endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 @@ -1048,7 +1083,7 @@ typedef void *(*RLGL_glLoadProc)(const char *name); // OpenGL extension functi // Global Variables Definition //---------------------------------------------------------------------------------- #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) -static RLGL_glData RLGL_GLOBAL_DATA = { 0 }; +static glData GLOBAL_DATA = { 0 }; #endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 #if defined(GRAPHICS_API_OPENGL_ES2) && !defined(GRAPHICS_API_OPENGL_ES3) @@ -1063,31 +1098,35 @@ static PFNGLDRAWELEMENTSINSTANCEDEXTPROC glDrawElementsInstanced = NULL; static PFNGLVERTEXATTRIBDIVISOREXTPROC glVertexAttribDivisor = NULL; #endif +RLGL_EXTERN_C_BEGIN + //---------------------------------------------------------------------------------- // Module specific Functions Declaration //---------------------------------------------------------------------------------- #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) -static void RLGL_LoadShaderDefault(void); // Load default shader -static void RLGL_UnloadShaderDefault(void); // Unload default shader +static void load_shader_default(void); // Load default shader +static void unload_shader_default(void); // Unload default shader #if defined(RLGL_SHOW_GL_DETAILS_INFO) -static const char *RLGL_GetCompressedFormatName(int format); // Get compressed format official GL identifier name +static const char *GetCompressedFormatName(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 RLGL_GetPixelDataSize(int width, int height, int format); // Get pixel data size in bytes (image or texture) +static int internal_get_pixel_data_size(int width, int height, int format); // Get pixel data size in bytes (image or texture) +#if !defined(RAYMATH_H) // Auxiliar matrix math functions -static RL_Matrix RLGL_MatrixIdentity(void); // Get identity matrix -static RL_Matrix RLGL_MatrixMultiply(RL_Matrix left, RL_Matrix right); // Multiply two matrices +static Matrix internal_matrix_identity(void); // Get identity matrix +static Matrix internal_matrix_multiply(Matrix left, Matrix right); // Multiply two matrices +#endif //---------------------------------------------------------------------------------- -// Module Functions Definition - RL_Matrix operations +// Module Functions Definition - Matrix operations //---------------------------------------------------------------------------------- #if defined(GRAPHICS_API_OPENGL_11) // Fallback to OpenGL 1.1 function calls //--------------------------------------- -void RLGL_MatrixMode(int mode) +void matrix_mode(int mode) { switch (mode) { @@ -1098,77 +1137,77 @@ void RLGL_MatrixMode(int mode) } } -void RLGL_Frustum(double left, double right, double bottom, double top, double znear, double zfar) +void frustum(double left, double right, double bottom, double top, double znear, double zfar) { glFrustum(left, right, bottom, top, znear, zfar); } -void RLGL_Ortho(double left, double right, double bottom, double top, double znear, double zfar) +void ortho(double left, double right, double bottom, double top, double znear, double zfar) { glOrtho(left, right, bottom, top, znear, zfar); } -void RLGL_PushMatrix(void) { glPushMatrix(); } -void RLGL_PopMatrix(void) { glPopMatrix(); } -void RLGL_LoadIdentity(void) { glLoadIdentity(); } -void RLGL_Translatef(float x, float y, float z) { glTranslatef(x, y, z); } -void RLGL_Rotatef(float angle, float x, float y, float z) { glRotatef(angle, x, y, z); } -void RLGL_Scalef(float x, float y, float z) { glScalef(x, y, z); } -void RLGL_MultMatrixf(const float *matf) { glMultMatrixf(matf); } +void push_matrix(void) { glPushMatrix(); } +void pop_matrix(void) { glPopMatrix(); } +void load_identity(void) { glLoadIdentity(); } +void translatef(float x, float y, float z) { glTranslatef(x, y, z); } +void rotatef(float angle, float x, float y, float z) { glRotatef(angle, x, y, z); } +void scalef(float x, float y, float z) { glScalef(x, y, z); } +void mult_matrixf(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 RLGL_MatrixMode(int mode) +void matrix_mode(int mode) { - if (mode == RL_PROJECTION) RLGL_GLOBAL_DATA.State.currentMatrix = &RLGL_GLOBAL_DATA.State.projection; - else if (mode == RL_MODELVIEW) RLGL_GLOBAL_DATA.State.currentMatrix = &RLGL_GLOBAL_DATA.State.modelview; + if (mode == RL_PROJECTION) GLOBAL_DATA.State.currentMatrix = &GLOBAL_DATA.State.projection; + else if (mode == RL_MODELVIEW) GLOBAL_DATA.State.currentMatrix = &GLOBAL_DATA.State.modelview; //else if (mode == RL_TEXTURE) // Not supported - RLGL_GLOBAL_DATA.State.currentMatrixMode = mode; + GLOBAL_DATA.State.currentMatrixMode = mode; } -// Push the current matrix into RLGL_GLOBAL_DATA.State.stack -void RLGL_PushMatrix(void) +// Push the current matrix into GLOBAL_DATA.State.stack +void push_matrix(void) { - if (RLGL_GLOBAL_DATA.State.stackCounter >= RL_MAX_MATRIX_STACK_SIZE) RL_TRACELOG(RL_LOG_ERROR, "RLGL_GLOBAL_DATA: RL_Matrix stack overflow (RL_MAX_MATRIX_STACK_SIZE)"); + if (GLOBAL_DATA.State.stackCounter >= RL_MAX_MATRIX_STACK_SIZE) RL_TRACELOG(LOG_ERROR, "GLOBAL_DATA: Matrix stack overflow (RL_MAX_MATRIX_STACK_SIZE)"); - if (RLGL_GLOBAL_DATA.State.currentMatrixMode == RL_MODELVIEW) + if (GLOBAL_DATA.State.currentMatrixMode == RL_MODELVIEW) { - RLGL_GLOBAL_DATA.State.transformRequired = true; - RLGL_GLOBAL_DATA.State.currentMatrix = &RLGL_GLOBAL_DATA.State.transform; + GLOBAL_DATA.State.transformRequired = true; + GLOBAL_DATA.State.currentMatrix = &GLOBAL_DATA.State.transform; } - RLGL_GLOBAL_DATA.State.stack[RLGL_GLOBAL_DATA.State.stackCounter] = *RLGL_GLOBAL_DATA.State.currentMatrix; - RLGL_GLOBAL_DATA.State.stackCounter++; + GLOBAL_DATA.State.stack[GLOBAL_DATA.State.stackCounter] = *GLOBAL_DATA.State.currentMatrix; + GLOBAL_DATA.State.stackCounter++; } -// Pop lattest inserted matrix from RLGL_GLOBAL_DATA.State.stack -void RLGL_PopMatrix(void) +// Pop lattest inserted matrix from GLOBAL_DATA.State.stack +void pop_matrix(void) { - if (RLGL_GLOBAL_DATA.State.stackCounter > 0) + if (GLOBAL_DATA.State.stackCounter > 0) { - RL_Matrix mat = RLGL_GLOBAL_DATA.State.stack[RLGL_GLOBAL_DATA.State.stackCounter - 1]; - *RLGL_GLOBAL_DATA.State.currentMatrix = mat; - RLGL_GLOBAL_DATA.State.stackCounter--; + Matrix mat = GLOBAL_DATA.State.stack[GLOBAL_DATA.State.stackCounter - 1]; + *GLOBAL_DATA.State.currentMatrix = mat; + GLOBAL_DATA.State.stackCounter--; } - if ((RLGL_GLOBAL_DATA.State.stackCounter == 0) && (RLGL_GLOBAL_DATA.State.currentMatrixMode == RL_MODELVIEW)) + if ((GLOBAL_DATA.State.stackCounter == 0) && (GLOBAL_DATA.State.currentMatrixMode == RL_MODELVIEW)) { - RLGL_GLOBAL_DATA.State.currentMatrix = &RLGL_GLOBAL_DATA.State.modelview; - RLGL_GLOBAL_DATA.State.transformRequired = false; + GLOBAL_DATA.State.currentMatrix = &GLOBAL_DATA.State.modelview; + GLOBAL_DATA.State.transformRequired = false; } } // Reset current matrix to identity matrix -void RLGL_LoadIdentity(void) +void load_identity(void) { - *RLGL_GLOBAL_DATA.State.currentMatrix = RLGL_MatrixIdentity(); + *GLOBAL_DATA.State.currentMatrix = internal_matrix_identity(); } // Multiply the current matrix by a translation matrix -void RLGL_Translatef(float x, float y, float z) +void translatef(float x, float y, float z) { - RL_Matrix matTranslation = { + Matrix matTranslation = { 1.0f, 0.0f, 0.0f, x, 0.0f, 1.0f, 0.0f, y, 0.0f, 0.0f, 1.0f, z, @@ -1176,14 +1215,14 @@ void RLGL_Translatef(float x, float y, float z) }; // NOTE: We transpose matrix with multiplication order - *RLGL_GLOBAL_DATA.State.currentMatrix = RLGL_MatrixMultiply(matTranslation, *RLGL_GLOBAL_DATA.State.currentMatrix); + *GLOBAL_DATA.State.currentMatrix = internal_matrix_multiply(matTranslation, *GLOBAL_DATA.State.currentMatrix); } // Multiply the current matrix by a rotation matrix // NOTE: The provided angle must be in degrees -void RLGL_Rotatef(float angle, float x, float y, float z) +void rotatef(float angle, float x, float y, float z) { - RL_Matrix matRotation = RLGL_MatrixIdentity(); + Matrix matRotation = internal_matrix_identity(); // Axis vector (x, y, z) normalization float lengthSquared = x*x + y*y + z*z; @@ -1221,13 +1260,13 @@ void RLGL_Rotatef(float angle, float x, float y, float z) matRotation.m15 = 1.0f; // NOTE: We transpose matrix with multiplication order - *RLGL_GLOBAL_DATA.State.currentMatrix = RLGL_MatrixMultiply(matRotation, *RLGL_GLOBAL_DATA.State.currentMatrix); + *GLOBAL_DATA.State.currentMatrix = internal_matrix_multiply(matRotation, *GLOBAL_DATA.State.currentMatrix); } // Multiply the current matrix by a scaling matrix -void RLGL_Scalef(float x, float y, float z) +void scalef(float x, float y, float z) { - RL_Matrix matScale = { + Matrix matScale = { x, 0.0f, 0.0f, 0.0f, 0.0f, y, 0.0f, 0.0f, 0.0f, 0.0f, z, 0.0f, @@ -1235,31 +1274,31 @@ void RLGL_Scalef(float x, float y, float z) }; // NOTE: We transpose matrix with multiplication order - *RLGL_GLOBAL_DATA.State.currentMatrix = RLGL_MatrixMultiply(matScale, *RLGL_GLOBAL_DATA.State.currentMatrix); + *GLOBAL_DATA.State.currentMatrix = internal_matrix_multiply(matScale, *GLOBAL_DATA.State.currentMatrix); } // Multiply the current matrix by another matrix -void RLGL_MultMatrixf(const float *matf) +void mult_matrixf(const float *matf) { - // RL_Matrix creation from array - RL_Matrix mat = { matf[0], matf[4], matf[8], matf[12], + // 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_GLOBAL_DATA.State.currentMatrix = RLGL_MatrixMultiply(*RLGL_GLOBAL_DATA.State.currentMatrix, mat); + *GLOBAL_DATA.State.currentMatrix = internal_matrix_multiply(*GLOBAL_DATA.State.currentMatrix, mat); } // Multiply the current matrix by a perspective matrix generated by parameters -void RLGL_Frustum(double left, double right, double bottom, double top, double znear, double zfar) +void frustum(double left, double right, double bottom, double top, double znear, double zfar) { - RL_Matrix matFrustum = { 0 }; + Matrix matFrustum = { 0 }; - float RLGL_ = (float)(right - left); + float rl = (float)(right - left); float tb = (float)(top - bottom); float fn = (float)(zfar - znear); - matFrustum.m0 = ((float) znear*2.0f)/RLGL_; + matFrustum.m0 = ((float) znear*2.0f)/rl; matFrustum.m1 = 0.0f; matFrustum.m2 = 0.0f; matFrustum.m3 = 0.0f; @@ -1269,7 +1308,7 @@ void RLGL_Frustum(double left, double right, double bottom, double top, double z matFrustum.m6 = 0.0f; matFrustum.m7 = 0.0f; - matFrustum.m8 = ((float)right + (float)left)/RLGL_; + 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; @@ -1279,21 +1318,21 @@ void RLGL_Frustum(double left, double right, double bottom, double top, double z matFrustum.m14 = -((float)zfar*(float)znear*2.0f)/fn; matFrustum.m15 = 0.0f; - *RLGL_GLOBAL_DATA.State.currentMatrix = RLGL_MatrixMultiply(*RLGL_GLOBAL_DATA.State.currentMatrix, matFrustum); + *GLOBAL_DATA.State.currentMatrix = internal_matrix_multiply(*GLOBAL_DATA.State.currentMatrix, matFrustum); } // Multiply the current matrix by an orthographic matrix generated by parameters -void RLGL_Ortho(double left, double right, double bottom, double top, double znear, double zfar) +void ortho(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 - RL_Matrix matOrtho = { 0 }; + Matrix matOrtho = { 0 }; - float RLGL_ = (float)(right - left); + float rl = (float)(right - left); float tb = (float)(top - bottom); float fn = (float)(zfar - znear); - matOrtho.m0 = 2.0f/RLGL_; + matOrtho.m0 = 2.0f/rl; matOrtho.m1 = 0.0f; matOrtho.m2 = 0.0f; matOrtho.m3 = 0.0f; @@ -1305,18 +1344,18 @@ void RLGL_Ortho(double left, double right, double bottom, double top, double zne matOrtho.m9 = 0.0f; matOrtho.m10 = -2.0f/fn; matOrtho.m11 = 0.0f; - matOrtho.m12 = -((float)left + (float)right)/RLGL_; + 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_GLOBAL_DATA.State.currentMatrix = RLGL_MatrixMultiply(*RLGL_GLOBAL_DATA.State.currentMatrix, matOrtho); + *GLOBAL_DATA.State.currentMatrix = internal_matrix_multiply(*GLOBAL_DATA.State.currentMatrix, matOrtho); } #endif // Set the viewport area (transformation from normalized device coordinates to window coordinates) // NOTE: We store current viewport dimensions -void RLGL_Viewport(int x, int y, int width, int height) +void viewport(int x, int y, int width, int height) { glViewport(x, y, width, height); } @@ -1327,7 +1366,7 @@ void RLGL_Viewport(int x, int y, int width, int height) #if defined(GRAPHICS_API_OPENGL_11) // Fallback to OpenGL 1.1 function calls //--------------------------------------- -void RLGL_Begin(int mode) +void begin(int mode) { switch (mode) { @@ -1338,169 +1377,169 @@ void RLGL_Begin(int mode) } } -void RLGL_End() { glEnd(); } -void RLGL_Vertex2i(int x, int y) { glVertex2i(x, y); } -void RLGL_Vertex2f(float x, float y) { glVertex2f(x, y); } -void RLGL_Vertex3f(float x, float y, float z) { glVertex3f(x, y, z); } -void RLGL_TexCoord2f(float x, float y) { glTexCoord2f(x, y); } -void RLGL_Normal3f(float x, float y, float z) { glNormal3f(x, y, z); } -void RLGL_Color4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { glColor4ub(r, g, b, a); } -void RLGL_Color3f(float x, float y, float z) { glColor3f(x, y, z); } -void RLGL_Color4f(float x, float y, float z, float w) { glColor4f(x, y, z, w); } +void end() { glEnd(); } +void vertex2i(int x, int y) { glVertex2i(x, y); } +void vertex2f(float x, float y) { glVertex2f(x, y); } +void vertex3f(float x, float y, float z) { glVertex3f(x, y, z); } +void tex_coord2f(float x, float y) { glTexCoord2f(x, y); } +void normal3f(float x, float y, float z) { glNormal3f(x, y, z); } +void color4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { glColor4ub(r, g, b, a); } +void color3f(float x, float y, float z) { glColor3f(x, y, z); } +void color4f(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 RLGL_Begin(int mode) +void begin(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_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].mode != mode) + if (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].mode != mode) { - if (RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount > 0) + if (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount > 0) { - // Make sure current RLGL_GLOBAL_DATA.currentBatch->draws[i].vertexCount is aligned a multiple of 4, + // Make sure current GLOBAL_DATA.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_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_LINES) RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount < 4)? RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount : RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%4); - else if (RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount < 4)? 1 : (4 - (RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%4))); - else RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment = 0; + if (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_LINES) GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment = ((GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount < 4)? GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount : GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%4); + else if (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment = ((GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount < 4)? 1 : (4 - (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%4))); + else GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment = 0; - if (!RLGL_CheckRenderBatchLimit(RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment)) + if (!check_render_batch_limit(GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment)) { - RLGL_GLOBAL_DATA.State.vertexCounter += RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment; - RLGL_GLOBAL_DATA.currentBatch->drawCounter++; + GLOBAL_DATA.State.vertexCounter += GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment; + GLOBAL_DATA.currentBatch->drawCounter++; } } - if (RLGL_GLOBAL_DATA.currentBatch->drawCounter >= RL_DEFAULT_BATCH_DRAWCALLS) RLGL_DrawRenderBatch(RLGL_GLOBAL_DATA.currentBatch); + if (GLOBAL_DATA.currentBatch->drawCounter >= RL_DEFAULT_BATCH_DRAWCALLS) draw_render_batch(GLOBAL_DATA.currentBatch); - RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].mode = mode; - RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount = 0; - RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].textureId = RLGL_GLOBAL_DATA.State.defaultTextureId; + GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].mode = mode; + GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount = 0; + GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].textureId = GLOBAL_DATA.State.defaultTextureId; } } // Finish vertex providing -void RLGL_End(void) +void end(void) { - // NOTE: Depth increment is dependant on RLGL_Ortho(): z-near and z-far values, + // NOTE: Depth increment is dependant on ortho(): 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_GLOBAL_DATA.currentBatch->currentDepth += (1.0f/20000.0f); + GLOBAL_DATA.currentBatch->currentDepth += (1.0f/20000.0f); } // Define one vertex (position) // NOTE: Vertex position data is the basic information required for drawing -void RLGL_Vertex3f(float x, float y, float z) +void vertex3f(float x, float y, float z) { float tx = x; float ty = y; float tz = z; // Transform provided vector if required - if (RLGL_GLOBAL_DATA.State.transformRequired) + if (GLOBAL_DATA.State.transformRequired) { - tx = RLGL_GLOBAL_DATA.State.transform.m0*x + RLGL_GLOBAL_DATA.State.transform.m4*y + RLGL_GLOBAL_DATA.State.transform.m8*z + RLGL_GLOBAL_DATA.State.transform.m12; - ty = RLGL_GLOBAL_DATA.State.transform.m1*x + RLGL_GLOBAL_DATA.State.transform.m5*y + RLGL_GLOBAL_DATA.State.transform.m9*z + RLGL_GLOBAL_DATA.State.transform.m13; - tz = RLGL_GLOBAL_DATA.State.transform.m2*x + RLGL_GLOBAL_DATA.State.transform.m6*y + RLGL_GLOBAL_DATA.State.transform.m10*z + RLGL_GLOBAL_DATA.State.transform.m14; + tx = GLOBAL_DATA.State.transform.m0*x + GLOBAL_DATA.State.transform.m4*y + GLOBAL_DATA.State.transform.m8*z + GLOBAL_DATA.State.transform.m12; + ty = GLOBAL_DATA.State.transform.m1*x + GLOBAL_DATA.State.transform.m5*y + GLOBAL_DATA.State.transform.m9*z + GLOBAL_DATA.State.transform.m13; + tz = GLOBAL_DATA.State.transform.m2*x + GLOBAL_DATA.State.transform.m6*y + GLOBAL_DATA.State.transform.m10*z + GLOBAL_DATA.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_GLOBAL_DATA.State.vertexCounter > (RLGL_GLOBAL_DATA.currentBatch->vertexBuffer[RLGL_GLOBAL_DATA.currentBatch->currentBuffer].elementCount*4 - 4)) + if (GLOBAL_DATA.State.vertexCounter > (GLOBAL_DATA.currentBatch->vertexBuffer[GLOBAL_DATA.currentBatch->currentBuffer].elementCount*4 - 4)) { - if ((RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_LINES) && - (RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%2 == 0)) + if ((GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_LINES) && + (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.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 - RLGL_CheckRenderBatchLimit(2 + 1); + check_render_batch_limit(2 + 1); } - else if ((RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) && - (RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%3 == 0)) + else if ((GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) && + (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%3 == 0)) { - RLGL_CheckRenderBatchLimit(3 + 1); + check_render_batch_limit(3 + 1); } - else if ((RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_QUADS) && - (RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%4 == 0)) + else if ((GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_QUADS) && + (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%4 == 0)) { - RLGL_CheckRenderBatchLimit(4 + 1); + check_render_batch_limit(4 + 1); } } // Add vertices - RLGL_GLOBAL_DATA.currentBatch->vertexBuffer[RLGL_GLOBAL_DATA.currentBatch->currentBuffer].vertices[3*RLGL_GLOBAL_DATA.State.vertexCounter] = tx; - RLGL_GLOBAL_DATA.currentBatch->vertexBuffer[RLGL_GLOBAL_DATA.currentBatch->currentBuffer].vertices[3*RLGL_GLOBAL_DATA.State.vertexCounter + 1] = ty; - RLGL_GLOBAL_DATA.currentBatch->vertexBuffer[RLGL_GLOBAL_DATA.currentBatch->currentBuffer].vertices[3*RLGL_GLOBAL_DATA.State.vertexCounter + 2] = tz; + GLOBAL_DATA.currentBatch->vertexBuffer[GLOBAL_DATA.currentBatch->currentBuffer].vertices[3*GLOBAL_DATA.State.vertexCounter] = tx; + GLOBAL_DATA.currentBatch->vertexBuffer[GLOBAL_DATA.currentBatch->currentBuffer].vertices[3*GLOBAL_DATA.State.vertexCounter + 1] = ty; + GLOBAL_DATA.currentBatch->vertexBuffer[GLOBAL_DATA.currentBatch->currentBuffer].vertices[3*GLOBAL_DATA.State.vertexCounter + 2] = tz; // Add current texcoord - RLGL_GLOBAL_DATA.currentBatch->vertexBuffer[RLGL_GLOBAL_DATA.currentBatch->currentBuffer].texcoords[2*RLGL_GLOBAL_DATA.State.vertexCounter] = RLGL_GLOBAL_DATA.State.texcoordx; - RLGL_GLOBAL_DATA.currentBatch->vertexBuffer[RLGL_GLOBAL_DATA.currentBatch->currentBuffer].texcoords[2*RLGL_GLOBAL_DATA.State.vertexCounter + 1] = RLGL_GLOBAL_DATA.State.texcoordy; + GLOBAL_DATA.currentBatch->vertexBuffer[GLOBAL_DATA.currentBatch->currentBuffer].texcoords[2*GLOBAL_DATA.State.vertexCounter] = GLOBAL_DATA.State.texcoordx; + GLOBAL_DATA.currentBatch->vertexBuffer[GLOBAL_DATA.currentBatch->currentBuffer].texcoords[2*GLOBAL_DATA.State.vertexCounter + 1] = GLOBAL_DATA.State.texcoordy; - // WARNING: By default RLGL_VertexBuffer struct does not store normals + // WARNING: By default vertex_buffer struct does not store normals // Add current color - RLGL_GLOBAL_DATA.currentBatch->vertexBuffer[RLGL_GLOBAL_DATA.currentBatch->currentBuffer].colors[4*RLGL_GLOBAL_DATA.State.vertexCounter] = RLGL_GLOBAL_DATA.State.colorr; - RLGL_GLOBAL_DATA.currentBatch->vertexBuffer[RLGL_GLOBAL_DATA.currentBatch->currentBuffer].colors[4*RLGL_GLOBAL_DATA.State.vertexCounter + 1] = RLGL_GLOBAL_DATA.State.colorg; - RLGL_GLOBAL_DATA.currentBatch->vertexBuffer[RLGL_GLOBAL_DATA.currentBatch->currentBuffer].colors[4*RLGL_GLOBAL_DATA.State.vertexCounter + 2] = RLGL_GLOBAL_DATA.State.colorb; - RLGL_GLOBAL_DATA.currentBatch->vertexBuffer[RLGL_GLOBAL_DATA.currentBatch->currentBuffer].colors[4*RLGL_GLOBAL_DATA.State.vertexCounter + 3] = RLGL_GLOBAL_DATA.State.colora; + GLOBAL_DATA.currentBatch->vertexBuffer[GLOBAL_DATA.currentBatch->currentBuffer].colors[4*GLOBAL_DATA.State.vertexCounter] = GLOBAL_DATA.State.colorr; + GLOBAL_DATA.currentBatch->vertexBuffer[GLOBAL_DATA.currentBatch->currentBuffer].colors[4*GLOBAL_DATA.State.vertexCounter + 1] = GLOBAL_DATA.State.colorg; + GLOBAL_DATA.currentBatch->vertexBuffer[GLOBAL_DATA.currentBatch->currentBuffer].colors[4*GLOBAL_DATA.State.vertexCounter + 2] = GLOBAL_DATA.State.colorb; + GLOBAL_DATA.currentBatch->vertexBuffer[GLOBAL_DATA.currentBatch->currentBuffer].colors[4*GLOBAL_DATA.State.vertexCounter + 3] = GLOBAL_DATA.State.colora; - RLGL_GLOBAL_DATA.State.vertexCounter++; - RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount++; + GLOBAL_DATA.State.vertexCounter++; + GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount++; } // Define one vertex (position) -void RLGL_Vertex2f(float x, float y) +void vertex2f(float x, float y) { - RLGL_Vertex3f(x, y, RLGL_GLOBAL_DATA.currentBatch->currentDepth); + vertex3f(x, y, GLOBAL_DATA.currentBatch->currentDepth); } // Define one vertex (position) -void RLGL_Vertex2i(int x, int y) +void vertex2i(int x, int y) { - RLGL_Vertex3f((float)x, (float)y, RLGL_GLOBAL_DATA.currentBatch->currentDepth); + vertex3f((float)x, (float)y, GLOBAL_DATA.currentBatch->currentDepth); } // Define one vertex (texture coordinate) // NOTE: Texture coordinates are limited to QUADS only -void RLGL_TexCoord2f(float x, float y) +void tex_coord2f(float x, float y) { - RLGL_GLOBAL_DATA.State.texcoordx = x; - RLGL_GLOBAL_DATA.State.texcoordy = y; + GLOBAL_DATA.State.texcoordx = x; + GLOBAL_DATA.State.texcoordy = y; } // Define one vertex (normal) // NOTE: Normals limited to TRIANGLES only? -void RLGL_Normal3f(float x, float y, float z) +void normal3f(float x, float y, float z) { - RLGL_GLOBAL_DATA.State.normalx = x; - RLGL_GLOBAL_DATA.State.normaly = y; - RLGL_GLOBAL_DATA.State.normalz = z; + GLOBAL_DATA.State.normalx = x; + GLOBAL_DATA.State.normaly = y; + GLOBAL_DATA.State.normalz = z; } // Define one vertex (color) -void RLGL_Color4ub(unsigned char x, unsigned char y, unsigned char z, unsigned char w) +void color4ub(unsigned char x, unsigned char y, unsigned char z, unsigned char w) { - RLGL_GLOBAL_DATA.State.colorr = x; - RLGL_GLOBAL_DATA.State.colorg = y; - RLGL_GLOBAL_DATA.State.colorb = z; - RLGL_GLOBAL_DATA.State.colora = w; + GLOBAL_DATA.State.colorr = x; + GLOBAL_DATA.State.colorg = y; + GLOBAL_DATA.State.colorb = z; + GLOBAL_DATA.State.colora = w; } // Define one vertex (color) -void RLGL_Color4f(float r, float g, float b, float a) +void color4f(float r, float g, float b, float a) { - RLGL_Color4ub((unsigned char)(r*255), (unsigned char)(g*255), (unsigned char)(b*255), (unsigned char)(a*255)); + color4ub((unsigned char)(r*255), (unsigned char)(g*255), (unsigned char)(b*255), (unsigned char)(a*255)); } // Define one vertex (color) -void RLGL_Color3f(float x, float y, float z) +void color3f(float x, float y, float z) { - RLGL_Color4ub((unsigned char)(x*255), (unsigned char)(y*255), (unsigned char)(z*255), 255); + color4ub((unsigned char)(x*255), (unsigned char)(y*255), (unsigned char)(z*255), 255); } #endif @@ -1510,58 +1549,58 @@ void RLGL_Color3f(float x, float y, float z) //-------------------------------------------------------------------------------------- // Set current texture to use -void RLGL_SetTexture(unsigned int id) +void set_texture(unsigned int id) { if (id == 0) { #if defined(GRAPHICS_API_OPENGL_11) - RLGL_DisableTexture(); + disable_texture(); #else // NOTE: If quads batch limit is reached, we force a draw call and next batch starts - if (RLGL_GLOBAL_DATA.State.vertexCounter >= - RLGL_GLOBAL_DATA.currentBatch->vertexBuffer[RLGL_GLOBAL_DATA.currentBatch->currentBuffer].elementCount*4) + if (GLOBAL_DATA.State.vertexCounter >= + GLOBAL_DATA.currentBatch->vertexBuffer[GLOBAL_DATA.currentBatch->currentBuffer].elementCount*4) { - RLGL_DrawRenderBatch(RLGL_GLOBAL_DATA.currentBatch); + draw_render_batch(GLOBAL_DATA.currentBatch); } #endif } else { #if defined(GRAPHICS_API_OPENGL_11) - RLGL_EnableTexture(id); + enable_texture(id); #else - if (RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].textureId != id) + if (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].textureId != id) { - if (RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount > 0) + if (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount > 0) { - // Make sure current RLGL_GLOBAL_DATA.currentBatch->draws[i].vertexCount is aligned a multiple of 4, + // Make sure current GLOBAL_DATA.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_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_LINES) RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount < 4)? RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount : RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%4); - else if (RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount < 4)? 1 : (4 - (RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%4))); - else RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment = 0; + if (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_LINES) GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment = ((GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount < 4)? GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount : GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%4); + else if (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment = ((GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount < 4)? 1 : (4 - (GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount%4))); + else GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment = 0; - if (!RLGL_CheckRenderBatchLimit(RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment)) + if (!check_render_batch_limit(GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment)) { - RLGL_GLOBAL_DATA.State.vertexCounter += RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment; + GLOBAL_DATA.State.vertexCounter += GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexAlignment; - RLGL_GLOBAL_DATA.currentBatch->drawCounter++; + GLOBAL_DATA.currentBatch->drawCounter++; } } - if (RLGL_GLOBAL_DATA.currentBatch->drawCounter >= RL_DEFAULT_BATCH_DRAWCALLS) RLGL_DrawRenderBatch(RLGL_GLOBAL_DATA.currentBatch); + if (GLOBAL_DATA.currentBatch->drawCounter >= RL_DEFAULT_BATCH_DRAWCALLS) draw_render_batch(GLOBAL_DATA.currentBatch); - RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].textureId = id; - RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount = 0; + GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].textureId = id; + GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].vertexCount = 0; } #endif } } // Select and active a texture slot -void RLGL_ActiveTextureSlot(int slot) +void active_texture_slot(int slot) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glActiveTexture(GL_TEXTURE0 + slot); @@ -1569,7 +1608,7 @@ void RLGL_ActiveTextureSlot(int slot) } // Enable texture -void RLGL_EnableTexture(unsigned int id) +void enable_texture(unsigned int id) { #if defined(GRAPHICS_API_OPENGL_11) glEnable(GL_TEXTURE_2D); @@ -1578,7 +1617,7 @@ void RLGL_EnableTexture(unsigned int id) } // Disable texture -void RLGL_DisableTexture(void) +void disable_texture(void) { #if defined(GRAPHICS_API_OPENGL_11) glDisable(GL_TEXTURE_2D); @@ -1587,7 +1626,7 @@ void RLGL_DisableTexture(void) } // Enable texture cubemap -void RLGL_EnableTextureCubemap(unsigned int id) +void enable_texture_cubemap(unsigned int id) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glBindTexture(GL_TEXTURE_CUBE_MAP, id); @@ -1595,7 +1634,7 @@ void RLGL_EnableTextureCubemap(unsigned int id) } // Disable texture cubemap -void RLGL_DisableTextureCubemap(void) +void disable_texture_cubemap(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glBindTexture(GL_TEXTURE_CUBE_MAP, 0); @@ -1603,7 +1642,7 @@ void RLGL_DisableTextureCubemap(void) } // Set texture parameters (wrap mode/filter mode) -void RLGL_TextureParameters(unsigned int id, int param, int value) +void texture_parameters(unsigned int id, int param, int value) { glBindTexture(GL_TEXTURE_2D, id); @@ -1614,35 +1653,35 @@ void RLGL_TextureParameters(unsigned int id, int param, int value) switch (param) { - case RL_TEXTURE_WRAP_S: - case RL_TEXTURE_WRAP_T: + case TEXTURE_WRAP_S: + case TEXTURE_WRAP_T: { - if (value == RL_TEXTURE_WRAP_MIRROR_CLAMP) + if (value == TEXTURE_WRAP_MIRROR_CLAMP) { #if !defined(GRAPHICS_API_OPENGL_11) - if (RLGL_GLOBAL_DATA.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_2D, param, value); - else RL_TRACELOG(RL_LOG_WARNING, "GL: Clamp mirror wrap mode not supported (GL_MIRROR_CLAMP_EXT)"); + if (GLOBAL_DATA.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_2D, param, value); + else RL_TRACELOG(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: + case TEXTURE_MAG_FILTER: + case TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_2D, param, value); break; + case TEXTURE_FILTER_ANISOTROPIC: { #if !defined(GRAPHICS_API_OPENGL_11) - if (value <= RLGL_GLOBAL_DATA.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); - else if (RLGL_GLOBAL_DATA.ExtSupported.maxAnisotropyLevel > 0.0f) + if (value <= GLOBAL_DATA.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + else if (GLOBAL_DATA.ExtSupported.maxAnisotropyLevel > 0.0f) { - RL_TRACELOG(RL_LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, (int)RLGL_GLOBAL_DATA.ExtSupported.maxAnisotropyLevel); + RL_TRACELOG(LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, (int)GLOBAL_DATA.ExtSupported.maxAnisotropyLevel); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); } - else RL_TRACELOG(RL_LOG_WARNING, "GL: Anisotropic filtering not supported"); + else RL_TRACELOG(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); + case TEXTURE_MIPMAP_BIAS_RATIO: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, value/100.0f); #endif default: break; } @@ -1651,7 +1690,7 @@ void RLGL_TextureParameters(unsigned int id, int param, int value) } // Set cubemap parameters (wrap mode/filter mode) -void RLGL_CubemapParameters(unsigned int id, int param, int value) +void cubemap_parameters(unsigned int id, int param, int value) { #if !defined(GRAPHICS_API_OPENGL_11) glBindTexture(GL_TEXTURE_CUBE_MAP, id); @@ -1661,31 +1700,31 @@ void RLGL_CubemapParameters(unsigned int id, int param, int value) switch (param) { - case RL_TEXTURE_WRAP_S: - case RL_TEXTURE_WRAP_T: + case TEXTURE_WRAP_S: + case TEXTURE_WRAP_T: { - if (value == RL_TEXTURE_WRAP_MIRROR_CLAMP) + if (value == TEXTURE_WRAP_MIRROR_CLAMP) { - if (RLGL_GLOBAL_DATA.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); - else RL_TRACELOG(RL_LOG_WARNING, "GL: Clamp mirror wrap mode not supported (GL_MIRROR_CLAMP_EXT)"); + if (GLOBAL_DATA.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); + else RL_TRACELOG(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: + case TEXTURE_MAG_FILTER: + case TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); break; + case TEXTURE_FILTER_ANISOTROPIC: { - if (value <= RLGL_GLOBAL_DATA.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); - else if (RLGL_GLOBAL_DATA.ExtSupported.maxAnisotropyLevel > 0.0f) + if (value <= GLOBAL_DATA.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + else if (GLOBAL_DATA.ExtSupported.maxAnisotropyLevel > 0.0f) { - RL_TRACELOG(RL_LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, (int)RLGL_GLOBAL_DATA.ExtSupported.maxAnisotropyLevel); + RL_TRACELOG(LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, (int)GLOBAL_DATA.ExtSupported.maxAnisotropyLevel); glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); } - else RL_TRACELOG(RL_LOG_WARNING, "GL: Anisotropic filtering not supported"); + else RL_TRACELOG(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); + case TEXTURE_MIPMAP_BIAS_RATIO: glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_LOD_BIAS, value/100.0f); #endif default: break; } @@ -1695,7 +1734,7 @@ void RLGL_CubemapParameters(unsigned int id, int param, int value) } // Enable shader program -void RLGL_EnableShader(unsigned int id) +void enable_shader(unsigned int id) { #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) glUseProgram(id); @@ -1703,7 +1742,7 @@ void RLGL_EnableShader(unsigned int id) } // Disable shader program -void RLGL_DisableShader(void) +void disable_shader(void) { #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) glUseProgram(0); @@ -1711,7 +1750,7 @@ void RLGL_DisableShader(void) } // Enable rendering to texture (fbo) -void RLGL_EnableFramebuffer(unsigned int id) +void enable_framebuffer(unsigned int id) { #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) glBindFramebuffer(GL_FRAMEBUFFER, id); @@ -1719,7 +1758,7 @@ void RLGL_EnableFramebuffer(unsigned int id) } // Disable rendering to texture -void RLGL_DisableFramebuffer(void) +void disable_framebuffer(void) { #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) && defined(RLGL_RENDER_TEXTURES_HINT) glBindFramebuffer(GL_FRAMEBUFFER, 0); @@ -1727,7 +1766,7 @@ void RLGL_DisableFramebuffer(void) } // Blit active framebuffer to main framebuffer -void RLGL_BlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight, int bufferMask) +void blit_framebuffer(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); @@ -1736,7 +1775,7 @@ void RLGL_BlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int d // Activate multiple draw color buffers // NOTE: One color buffer is always active by default -void RLGL_ActiveDrawBuffers(int count) +void active_draw_buffers(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, @@ -1746,7 +1785,7 @@ void RLGL_ActiveDrawBuffers(int count) if (count > 0) { - if (count > 8) RL_TRACELOG(RL_LOG_WARNING, "GL: Max color buffers limited to 8"); + if (count > 8) RL_TRACELOG(LOG_WARNING, "GL: Max color buffers limited to 8"); else { unsigned int buffers[8] = { @@ -1778,7 +1817,7 @@ void RLGL_ActiveDrawBuffers(int count) #endif } } - else RL_TRACELOG(RL_LOG_WARNING, "GL: One color buffer active by default"); + else RL_TRACELOG(LOG_WARNING, "GL: One color buffer active by default"); #endif } @@ -1787,51 +1826,51 @@ void RLGL_ActiveDrawBuffers(int count) //---------------------------------------------------------------------------------- // Enable color blending -void RLGL_EnableColorBlend(void) { glEnable(GL_BLEND); } +void enable_color_blend(void) { glEnable(GL_BLEND); } // Disable color blending -void RLGL_DisableColorBlend(void) { glDisable(GL_BLEND); } +void disable_color_blend(void) { glDisable(GL_BLEND); } // Enable depth test -void RLGL_EnableDepthTest(void) { glEnable(GL_DEPTH_TEST); } +void enable_depth_test(void) { glEnable(GL_DEPTH_TEST); } // Disable depth test -void RLGL_DisableDepthTest(void) { glDisable(GL_DEPTH_TEST); } +void disable_depth_test(void) { glDisable(GL_DEPTH_TEST); } // Enable depth write -void RLGL_EnableDepthMask(void) { glDepthMask(GL_TRUE); } +void enable_depth_mask(void) { glDepthMask(GL_TRUE); } // Disable depth write -void RLGL_DisableDepthMask(void) { glDepthMask(GL_FALSE); } +void disable_depth_mask(void) { glDepthMask(GL_FALSE); } // Enable backface culling -void RLGL_EnableBackfaceCulling(void) { glEnable(GL_CULL_FACE); } +void enable_backface_culling(void) { glEnable(GL_CULL_FACE); } // Disable backface culling -void RLGL_DisableBackfaceCulling(void) { glDisable(GL_CULL_FACE); } +void disable_backface_culling(void) { glDisable(GL_CULL_FACE); } // Set face culling mode -void RLGL_SetCullFace(int mode) +void set_cull_face(int mode) { switch (mode) { - case RL_CULL_FACE_BACK: glCullFace(GL_BACK); break; - case RL_CULL_FACE_FRONT: glCullFace(GL_FRONT); break; + case CULL_FACE_BACK: glCullFace(GL_BACK); break; + case CULL_FACE_FRONT: glCullFace(GL_FRONT); break; default: break; } } // Enable scissor test -void RLGL_EnableScissorTest(void) { glEnable(GL_SCISSOR_TEST); } +void enable_scissor_test(void) { glEnable(GL_SCISSOR_TEST); } // Disable scissor test -void RLGL_DisableScissorTest(void) { glDisable(GL_SCISSOR_TEST); } +void disable_scissor_test(void) { glDisable(GL_SCISSOR_TEST); } // Scissor test -void RLGL_Scissor(int x, int y, int width, int height) { glScissor(x, y, width, height); } +void scissor(int x, int y, int width, int height) { glScissor(x, y, width, height); } // Enable wire mode -void RLGL_EnableWireMode(void) +void enable_wire_mode(void) { #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) // NOTE: glPolygonMode() not available on OpenGL ES @@ -1839,7 +1878,7 @@ void RLGL_EnableWireMode(void) #endif } -void RLGL_EnablePointMode(void) +void enable_point_mode(void) { #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) // NOTE: glPolygonMode() not available on OpenGL ES @@ -1848,7 +1887,7 @@ void RLGL_EnablePointMode(void) #endif } // Disable wire mode -void RLGL_DisableWireMode(void) +void disable_wire_mode(void) { #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) // NOTE: glPolygonMode() not available on OpenGL ES @@ -1857,10 +1896,10 @@ void RLGL_DisableWireMode(void) } // Set the line drawing width -void RLGL_SetLineWidth(float width) { glLineWidth(width); } +void set_line_width(float width) { glLineWidth(width); } // Get the line drawing width -float RLGL_GetLineWidth(void) +float get_line_width(void) { float width = 0; glGetFloatv(GL_LINE_WIDTH, &width); @@ -1868,7 +1907,7 @@ float RLGL_GetLineWidth(void) } // Enable line aliasing -void RLGL_EnableSmoothLines(void) +void enable_smooth_lines(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_11) glEnable(GL_LINE_SMOOTH); @@ -1876,7 +1915,7 @@ void RLGL_EnableSmoothLines(void) } // Disable line aliasing -void RLGL_DisableSmoothLines(void) +void disable_smooth_lines(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_11) glDisable(GL_LINE_SMOOTH); @@ -1884,33 +1923,33 @@ void RLGL_DisableSmoothLines(void) } // Enable stereo rendering -void RLGL_EnableStereoRender(void) +void enable_stereo_render(void) { #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) - RLGL_GLOBAL_DATA.State.stereoRender = true; + GLOBAL_DATA.State.stereoRender = true; #endif } // Disable stereo rendering -void RLGL_DisableStereoRender(void) +void disable_stereo_render(void) { #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) - RLGL_GLOBAL_DATA.State.stereoRender = false; + GLOBAL_DATA.State.stereoRender = false; #endif } // Check if stereo render is enabled -bool RLGL_IsStereoRenderEnabled(void) +bool is_stereo_render_enabled(void) { #if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) - return RLGL_GLOBAL_DATA.State.stereoRender; + return GLOBAL_DATA.State.stereoRender; #else return false; #endif } // Clear color buffer with color -void RLGL_ClearColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) +void clear_color(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; @@ -1922,14 +1961,14 @@ void RLGL_ClearColor(unsigned char r, unsigned char g, unsigned char b, unsigned } // Clear used screen buffers (color and depth) -void RLGL_ClearScreenBuffers(void) +void clear_screen_buffers(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 RLGL_CheckErrors() +void check_errors() { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) int check = 1; @@ -1939,93 +1978,93 @@ void RLGL_CheckErrors() switch (err) { case GL_NO_ERROR: check = 0; break; - case 0x0500: RL_TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_ENUM"); break; - case 0x0501: RL_TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_VALUE"); break; - case 0x0502: RL_TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_OPERATION"); break; - case 0x0503: RL_TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_STACK_OVERFLOW"); break; - case 0x0504: RL_TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_STACK_UNDERFLOW"); break; - case 0x0505: RL_TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_OUT_OF_MEMORY"); break; - case 0x0506: RL_TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_FRAMEBUFFER_OPERATION"); break; - default: RL_TRACELOG(RL_LOG_WARNING, "GL: Error detected: Unknown error code: %x", err); break; + case 0x0500: RL_TRACELOG(LOG_WARNING, "GL: Error detected: GL_INVALID_ENUM"); break; + case 0x0501: RL_TRACELOG(LOG_WARNING, "GL: Error detected: GL_INVALID_VALUE"); break; + case 0x0502: RL_TRACELOG(LOG_WARNING, "GL: Error detected: GL_INVALID_OPERATION"); break; + case 0x0503: RL_TRACELOG(LOG_WARNING, "GL: Error detected: GL_STACK_OVERFLOW"); break; + case 0x0504: RL_TRACELOG(LOG_WARNING, "GL: Error detected: GL_STACK_UNDERFLOW"); break; + case 0x0505: RL_TRACELOG(LOG_WARNING, "GL: Error detected: GL_OUT_OF_MEMORY"); break; + case 0x0506: RL_TRACELOG(LOG_WARNING, "GL: Error detected: GL_INVALID_FRAMEBUFFER_OPERATION"); break; + default: RL_TRACELOG(LOG_WARNING, "GL: Error detected: Unknown error code: %x", err); break; } } #endif } // Set blend mode -void RLGL_SetBlendMode(int mode) +void set_blend_mode(int mode) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - if ((RLGL_GLOBAL_DATA.State.currentBlendMode != mode) || ((mode == RL_BLEND_CUSTOM || mode == RL_BLEND_CUSTOM_SEPARATE) && RLGL_GLOBAL_DATA.State.glCustomBlendModeModified)) + if ((GLOBAL_DATA.State.currentBlendMode != mode) || ((mode == BLEND_CUSTOM || mode == BLEND_CUSTOM_SEPARATE) && GLOBAL_DATA.State.glCustomBlendModeModified)) { - RLGL_DrawRenderBatch(RLGL_GLOBAL_DATA.currentBatch); + draw_render_batch(GLOBAL_DATA.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: + case BLEND_ALPHA: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); break; + case BLEND_ADDITIVE: glBlendFunc(GL_SRC_ALPHA, GL_ONE); glBlendEquation(GL_FUNC_ADD); break; + case BLEND_MULTIPLIED: glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); break; + case BLEND_ADD_COLORS: glBlendFunc(GL_ONE, GL_ONE); glBlendEquation(GL_FUNC_ADD); break; + case BLEND_SUBTRACT_COLORS: glBlendFunc(GL_ONE, GL_ONE); glBlendEquation(GL_FUNC_SUBTRACT); break; + case BLEND_ALPHA_PREMULTIPLY: glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); break; + case BLEND_CUSTOM: { - // NOTE: Using GL blend src/dst factors and GL equation configured with RLGL_SetBlendFactors() - glBlendFunc(RLGL_GLOBAL_DATA.State.glBlendSrcFactor, RLGL_GLOBAL_DATA.State.glBlendDstFactor); glBlendEquation(RLGL_GLOBAL_DATA.State.glBlendEquation); + // NOTE: Using GL blend src/dst factors and GL equation configured with set_blend_factors() + glBlendFunc(GLOBAL_DATA.State.glBlendSrcFactor, GLOBAL_DATA.State.glBlendDstFactor); glBlendEquation(GLOBAL_DATA.State.glBlendEquation); } break; - case RL_BLEND_CUSTOM_SEPARATE: + case BLEND_CUSTOM_SEPARATE: { - // NOTE: Using GL blend src/dst factors and GL equation configured with RLGL_SetBlendFactorsSeparate() - glBlendFuncSeparate(RLGL_GLOBAL_DATA.State.glBlendSrcFactorRGB, RLGL_GLOBAL_DATA.State.glBlendDestFactorRGB, RLGL_GLOBAL_DATA.State.glBlendSrcFactorAlpha, RLGL_GLOBAL_DATA.State.glBlendDestFactorAlpha); - glBlendEquationSeparate(RLGL_GLOBAL_DATA.State.glBlendEquationRGB, RLGL_GLOBAL_DATA.State.glBlendEquationAlpha); + // NOTE: Using GL blend src/dst factors and GL equation configured with set_blend_factors_separate() + glBlendFuncSeparate(GLOBAL_DATA.State.glBlendSrcFactorRGB, GLOBAL_DATA.State.glBlendDestFactorRGB, GLOBAL_DATA.State.glBlendSrcFactorAlpha, GLOBAL_DATA.State.glBlendDestFactorAlpha); + glBlendEquationSeparate(GLOBAL_DATA.State.glBlendEquationRGB, GLOBAL_DATA.State.glBlendEquationAlpha); } break; default: break; } - RLGL_GLOBAL_DATA.State.currentBlendMode = mode; - RLGL_GLOBAL_DATA.State.glCustomBlendModeModified = false; + GLOBAL_DATA.State.currentBlendMode = mode; + GLOBAL_DATA.State.glCustomBlendModeModified = false; } #endif } // Set blending mode factor and equation -void RLGL_SetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation) +void set_blend_factors(int glSrcFactor, int glDstFactor, int glEquation) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - if ((RLGL_GLOBAL_DATA.State.glBlendSrcFactor != glSrcFactor) || - (RLGL_GLOBAL_DATA.State.glBlendDstFactor != glDstFactor) || - (RLGL_GLOBAL_DATA.State.glBlendEquation != glEquation)) + if ((GLOBAL_DATA.State.glBlendSrcFactor != glSrcFactor) || + (GLOBAL_DATA.State.glBlendDstFactor != glDstFactor) || + (GLOBAL_DATA.State.glBlendEquation != glEquation)) { - RLGL_GLOBAL_DATA.State.glBlendSrcFactor = glSrcFactor; - RLGL_GLOBAL_DATA.State.glBlendDstFactor = glDstFactor; - RLGL_GLOBAL_DATA.State.glBlendEquation = glEquation; + GLOBAL_DATA.State.glBlendSrcFactor = glSrcFactor; + GLOBAL_DATA.State.glBlendDstFactor = glDstFactor; + GLOBAL_DATA.State.glBlendEquation = glEquation; - RLGL_GLOBAL_DATA.State.glCustomBlendModeModified = true; + GLOBAL_DATA.State.glCustomBlendModeModified = true; } #endif } // Set blending mode factor and equation separately for RGB and alpha -void RLGL_SetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha, int glEqRGB, int glEqAlpha) +void set_blend_factors_separate(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_GLOBAL_DATA.State.glBlendSrcFactorRGB != glSrcRGB) || - (RLGL_GLOBAL_DATA.State.glBlendDestFactorRGB != glDstRGB) || - (RLGL_GLOBAL_DATA.State.glBlendSrcFactorAlpha != glSrcAlpha) || - (RLGL_GLOBAL_DATA.State.glBlendDestFactorAlpha != glDstAlpha) || - (RLGL_GLOBAL_DATA.State.glBlendEquationRGB != glEqRGB) || - (RLGL_GLOBAL_DATA.State.glBlendEquationAlpha != glEqAlpha)) + if ((GLOBAL_DATA.State.glBlendSrcFactorRGB != glSrcRGB) || + (GLOBAL_DATA.State.glBlendDestFactorRGB != glDstRGB) || + (GLOBAL_DATA.State.glBlendSrcFactorAlpha != glSrcAlpha) || + (GLOBAL_DATA.State.glBlendDestFactorAlpha != glDstAlpha) || + (GLOBAL_DATA.State.glBlendEquationRGB != glEqRGB) || + (GLOBAL_DATA.State.glBlendEquationAlpha != glEqAlpha)) { - RLGL_GLOBAL_DATA.State.glBlendSrcFactorRGB = glSrcRGB; - RLGL_GLOBAL_DATA.State.glBlendDestFactorRGB = glDstRGB; - RLGL_GLOBAL_DATA.State.glBlendSrcFactorAlpha = glSrcAlpha; - RLGL_GLOBAL_DATA.State.glBlendDestFactorAlpha = glDstAlpha; - RLGL_GLOBAL_DATA.State.glBlendEquationRGB = glEqRGB; - RLGL_GLOBAL_DATA.State.glBlendEquationAlpha = glEqAlpha; + GLOBAL_DATA.State.glBlendSrcFactorRGB = glSrcRGB; + GLOBAL_DATA.State.glBlendDestFactorRGB = glDstRGB; + GLOBAL_DATA.State.glBlendSrcFactorAlpha = glSrcAlpha; + GLOBAL_DATA.State.glBlendDestFactorAlpha = glDstAlpha; + GLOBAL_DATA.State.glBlendEquationRGB = glEqRGB; + GLOBAL_DATA.State.glBlendEquationAlpha = glEqAlpha; - RLGL_GLOBAL_DATA.State.glCustomBlendModeModified = true; + GLOBAL_DATA.State.glCustomBlendModeModified = true; } #endif } @@ -2034,7 +2073,7 @@ void RLGL_SetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, in // Module Functions Definition - OpenGL Debug //---------------------------------------------------------------------------------- #if defined(RLGL_ENABLE_OPENGL_DEBUG_CONTEXT) && defined(GRAPHICS_API_OPENGL_43) -static void GLAPIENTRY RLGL_DebugMessageCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam) +static void GLAPIENTRY DebugMessageCallback(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: @@ -2083,25 +2122,25 @@ static void GLAPIENTRY RLGL_DebugMessageCallback(GLenum source, GLenum type, GLu default: break; } - RL_TRACELOG(RL_LOG_WARNING, "GL: OpenGL debug message: %s", message); - RL_TRACELOG(RL_LOG_WARNING, " > Type: %s", msgType); - RL_TRACELOG(RL_LOG_WARNING, " > Source = %s", msgSource); - RL_TRACELOG(RL_LOG_WARNING, " > Severity = %s", msgSeverity); + RL_TRACELOG(LOG_WARNING, "GL: OpenGL debug message: %s", message); + RL_TRACELOG(LOG_WARNING, " > Type: %s", msgType); + RL_TRACELOG(LOG_WARNING, " > Source = %s", msgSource); + RL_TRACELOG(LOG_WARNING, " > Severity = %s", msgSeverity); } #endif //---------------------------------------------------------------------------------- -// Module Functions Definition - RLGL_gl functionality +// Module Functions Definition - rlgl functionality //---------------------------------------------------------------------------------- -// Initialize RLGL_gl: OpenGL extensions, default buffers/shaders/textures, OpenGL states -void RLGL_Init(int width, int height) +// Initialize rlgl: OpenGL extensions, default buffers/shaders/textures, OpenGL states +void init(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(RLGL_DebugMessageCallback, 0); + glDebugMessageCallback(DebugMessageCallback, 0); // glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, GL_DEBUG_SEVERITY_HIGH, 0, 0, GL_TRUE); // Debug context options: @@ -2115,29 +2154,29 @@ void RLGL_Init(int width, int height) #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_GLOBAL_DATA.State.defaultTextureId = RLGL_LoadTexture(pixels, 1, 1, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1); + GLOBAL_DATA.State.defaultTextureId = load_texture(pixels, 1, 1, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1); - if (RLGL_GLOBAL_DATA.State.defaultTextureId != 0) RL_TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Default texture loaded successfully", RLGL_GLOBAL_DATA.State.defaultTextureId); - else RL_TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load default texture"); + if (GLOBAL_DATA.State.defaultTextureId != 0) RL_TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Default texture loaded successfully", GLOBAL_DATA.State.defaultTextureId); + else RL_TRACELOG(LOG_WARNING, "TEXTURE: Failed to load default texture"); // Init default Shader (customized for GL 3.3 and ES2) - // Loaded: RLGL_GLOBAL_DATA.State.defaultShaderId + RLGL_GLOBAL_DATA.State.defaultShaderLocs - RLGL_LoadShaderDefault(); - RLGL_GLOBAL_DATA.State.currentShaderId = RLGL_GLOBAL_DATA.State.defaultShaderId; - RLGL_GLOBAL_DATA.State.currentShaderLocs = RLGL_GLOBAL_DATA.State.defaultShaderLocs; + // Loaded: GLOBAL_DATA.State.defaultShaderId + GLOBAL_DATA.State.defaultShaderLocs + load_shader_default(); + GLOBAL_DATA.State.currentShaderId = GLOBAL_DATA.State.defaultShaderId; + GLOBAL_DATA.State.currentShaderLocs = GLOBAL_DATA.State.defaultShaderLocs; // Init default vertex arrays buffers - RLGL_GLOBAL_DATA.defaultBatch = RLGL_LoadRenderBatch(RL_DEFAULT_BATCH_BUFFERS, RL_DEFAULT_BATCH_BUFFER_ELEMENTS); - RLGL_GLOBAL_DATA.currentBatch = &RLGL_GLOBAL_DATA.defaultBatch; + GLOBAL_DATA.defaultBatch = load_render_batch(RL_DEFAULT_BATCH_BUFFERS, RL_DEFAULT_BATCH_BUFFER_ELEMENTS); + GLOBAL_DATA.currentBatch = &GLOBAL_DATA.defaultBatch; // Init stack matrices (emulating OpenGL 1.1) - for (int i = 0; i < RL_MAX_MATRIX_STACK_SIZE; i++) RLGL_GLOBAL_DATA.State.stack[i] = RLGL_MatrixIdentity(); + for (int i = 0; i < RL_MAX_MATRIX_STACK_SIZE; i++) GLOBAL_DATA.State.stack[i] = internal_matrix_identity(); // Init internal matrices - RLGL_GLOBAL_DATA.State.transform = RLGL_MatrixIdentity(); - RLGL_GLOBAL_DATA.State.projection = RLGL_MatrixIdentity(); - RLGL_GLOBAL_DATA.State.modelview = RLGL_MatrixIdentity(); - RLGL_GLOBAL_DATA.State.currentMatrix = &RLGL_GLOBAL_DATA.State.modelview; + GLOBAL_DATA.State.transform = internal_matrix_identity(); + GLOBAL_DATA.State.projection = internal_matrix_identity(); + GLOBAL_DATA.State.modelview = internal_matrix_identity(); + GLOBAL_DATA.State.currentMatrix = &GLOBAL_DATA.State.modelview; #endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 // Initialize OpenGL default states @@ -2169,10 +2208,10 @@ void RLGL_Init(int width, int height) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) // Store screen size into global variables - RLGL_GLOBAL_DATA.State.framebufferWidth = width; - RLGL_GLOBAL_DATA.State.framebufferHeight = height; + GLOBAL_DATA.State.framebufferWidth = width; + GLOBAL_DATA.State.framebufferHeight = height; - RL_TRACELOG(RL_LOG_INFO, "RLGL_GLOBAL_DATA: Default OpenGL state initialized successfully"); + RL_TRACELOG(LOG_INFO, "GLOBAL_DATA: Default OpenGL state initialized successfully"); //---------------------------------------------------------- #endif @@ -2183,72 +2222,72 @@ void RLGL_Init(int width, int height) } // Vertex Buffer Object deinitialization (memory free) -void RLGL_Close(void) +void close(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - RLGL_UnloadRenderBatch(RLGL_GLOBAL_DATA.defaultBatch); + unload_render_batch(GLOBAL_DATA.defaultBatch); - RLGL_UnloadShaderDefault(); // Unload default shader + unload_shader_default(); // Unload default shader - glDeleteTextures(1, &RLGL_GLOBAL_DATA.State.defaultTextureId); // Unload default texture - RL_TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Default texture unloaded successfully", RLGL_GLOBAL_DATA.State.defaultTextureId); + glDeleteTextures(1, &GLOBAL_DATA.State.defaultTextureId); // Unload default texture + RL_TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Default texture unloaded successfully", GLOBAL_DATA.State.defaultTextureId); #endif } // Load OpenGL extensions // NOTE: External loader function must be provided -void RLGL_LoadExtensions(void *loader) +void load_extensions(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) RL_TRACELOG(RL_LOG_WARNING, "GLAD: Cannot load OpenGL extensions"); - else RL_TRACELOG(RL_LOG_INFO, "GLAD: OpenGL extensions loaded successfully"); + if (gladLoadGL((GLADloadfunc)loader) == 0) RL_TRACELOG(LOG_WARNING, "GLAD: Cannot load OpenGL extensions"); + else RL_TRACELOG(LOG_INFO, "GLAD: OpenGL extensions loaded successfully"); // Get number of supported extensions GLint numExt = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &numExt); - RL_TRACELOG(RL_LOG_INFO, "GL: Supported extensions count: %i", numExt); + RL_TRACELOG(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 - RL_TRACELOG(RL_LOG_INFO, "GL: OpenGL extensions:"); - for (int i = 0; i < numExt; i++) RL_TRACELOG(RL_LOG_INFO, " %s", glGetStringi(GL_EXTENSIONS, i)); + RL_TRACELOG(LOG_INFO, "GL: OpenGL extensions:"); + for (int i = 0; i < numExt; i++) RL_TRACELOG(LOG_INFO, " %s", glGetStringi(GL_EXTENSIONS, i)); #endif #if defined(GRAPHICS_API_OPENGL_21) // Register supported extensions flags // Optional OpenGL 2.1 extensions - RLGL_GLOBAL_DATA.ExtSupported.vao = GLAD_GL_ARB_vertex_array_object; - RLGL_GLOBAL_DATA.ExtSupported.instancing = (GLAD_GL_EXT_draw_instanced && GLAD_GL_ARB_instanced_arrays); - RLGL_GLOBAL_DATA.ExtSupported.texNPOT = GLAD_GL_ARB_texture_non_power_of_two; - RLGL_GLOBAL_DATA.ExtSupported.texFloat32 = GLAD_GL_ARB_texture_float; - RLGL_GLOBAL_DATA.ExtSupported.texFloat16 = GLAD_GL_ARB_texture_float; - RLGL_GLOBAL_DATA.ExtSupported.texDepth = GLAD_GL_ARB_depth_texture; - RLGL_GLOBAL_DATA.ExtSupported.maxDepthBits = 32; - RLGL_GLOBAL_DATA.ExtSupported.texAnisoFilter = GLAD_GL_EXT_texture_filter_anisotropic; - RLGL_GLOBAL_DATA.ExtSupported.texMirrorClamp = GLAD_GL_EXT_texture_mirror_clamp; + GLOBAL_DATA.ExtSupported.vao = GLAD_GL_ARB_vertex_array_object; + GLOBAL_DATA.ExtSupported.instancing = (GLAD_GL_EXT_draw_instanced && GLAD_GL_ARB_instanced_arrays); + GLOBAL_DATA.ExtSupported.texNPOT = GLAD_GL_ARB_texture_non_power_of_two; + GLOBAL_DATA.ExtSupported.texFloat32 = GLAD_GL_ARB_texture_float; + GLOBAL_DATA.ExtSupported.texFloat16 = GLAD_GL_ARB_texture_float; + GLOBAL_DATA.ExtSupported.texDepth = GLAD_GL_ARB_depth_texture; + GLOBAL_DATA.ExtSupported.maxDepthBits = 32; + GLOBAL_DATA.ExtSupported.texAnisoFilter = GLAD_GL_EXT_texture_filter_anisotropic; + GLOBAL_DATA.ExtSupported.texMirrorClamp = GLAD_GL_EXT_texture_mirror_clamp; #else // Register supported extensions flags // OpenGL 3.3 extensions supported by default (core) - RLGL_GLOBAL_DATA.ExtSupported.vao = true; - RLGL_GLOBAL_DATA.ExtSupported.instancing = true; - RLGL_GLOBAL_DATA.ExtSupported.texNPOT = true; - RLGL_GLOBAL_DATA.ExtSupported.texFloat32 = true; - RLGL_GLOBAL_DATA.ExtSupported.texFloat16 = true; - RLGL_GLOBAL_DATA.ExtSupported.texDepth = true; - RLGL_GLOBAL_DATA.ExtSupported.maxDepthBits = 32; - RLGL_GLOBAL_DATA.ExtSupported.texAnisoFilter = true; - RLGL_GLOBAL_DATA.ExtSupported.texMirrorClamp = true; + GLOBAL_DATA.ExtSupported.vao = true; + GLOBAL_DATA.ExtSupported.instancing = true; + GLOBAL_DATA.ExtSupported.texNPOT = true; + GLOBAL_DATA.ExtSupported.texFloat32 = true; + GLOBAL_DATA.ExtSupported.texFloat16 = true; + GLOBAL_DATA.ExtSupported.texDepth = true; + GLOBAL_DATA.ExtSupported.maxDepthBits = 32; + GLOBAL_DATA.ExtSupported.texAnisoFilter = true; + GLOBAL_DATA.ExtSupported.texMirrorClamp = true; #endif // Optional OpenGL 3.3 extensions - RLGL_GLOBAL_DATA.ExtSupported.texCompASTC = GLAD_GL_KHR_texture_compression_astc_hdr && GLAD_GL_KHR_texture_compression_astc_ldr; - RLGL_GLOBAL_DATA.ExtSupported.texCompDXT = GLAD_GL_EXT_texture_compression_s3tc; // Texture compression: DXT - RLGL_GLOBAL_DATA.ExtSupported.texCompETC2 = GLAD_GL_ARB_ES3_compatibility; // Texture compression: ETC2/EAC + GLOBAL_DATA.ExtSupported.texCompASTC = GLAD_GL_KHR_texture_compression_astc_hdr && GLAD_GL_KHR_texture_compression_astc_ldr; + GLOBAL_DATA.ExtSupported.texCompDXT = GLAD_GL_EXT_texture_compression_s3tc; // Texture compression: DXT + GLOBAL_DATA.ExtSupported.texCompETC2 = GLAD_GL_ARB_ES3_compatibility; // Texture compression: ETC2/EAC #if defined(GRAPHICS_API_OPENGL_43) - RLGL_GLOBAL_DATA.ExtSupported.computeShader = GLAD_GL_ARB_compute_shader; - RLGL_GLOBAL_DATA.ExtSupported.ssbo = GLAD_GL_ARB_shader_storage_buffer_object; + GLOBAL_DATA.ExtSupported.computeShader = GLAD_GL_ARB_compute_shader; + GLOBAL_DATA.ExtSupported.ssbo = GLAD_GL_ARB_shader_storage_buffer_object; #endif #endif // GRAPHICS_API_OPENGL_33 @@ -2256,32 +2295,32 @@ void RLGL_LoadExtensions(void *loader) #if defined(GRAPHICS_API_OPENGL_ES3) // Register supported extensions flags // OpenGL ES 3.0 extensions supported by default (or it should be) - RLGL_GLOBAL_DATA.ExtSupported.vao = true; - RLGL_GLOBAL_DATA.ExtSupported.instancing = true; - RLGL_GLOBAL_DATA.ExtSupported.texNPOT = true; - RLGL_GLOBAL_DATA.ExtSupported.texFloat32 = true; - RLGL_GLOBAL_DATA.ExtSupported.texFloat16 = true; - RLGL_GLOBAL_DATA.ExtSupported.texDepth = true; - RLGL_GLOBAL_DATA.ExtSupported.texDepthWebGL = true; - RLGL_GLOBAL_DATA.ExtSupported.maxDepthBits = 24; - RLGL_GLOBAL_DATA.ExtSupported.texAnisoFilter = true; - RLGL_GLOBAL_DATA.ExtSupported.texMirrorClamp = true; + GLOBAL_DATA.ExtSupported.vao = true; + GLOBAL_DATA.ExtSupported.instancing = true; + GLOBAL_DATA.ExtSupported.texNPOT = true; + GLOBAL_DATA.ExtSupported.texFloat32 = true; + GLOBAL_DATA.ExtSupported.texFloat16 = true; + GLOBAL_DATA.ExtSupported.texDepth = true; + GLOBAL_DATA.ExtSupported.texDepthWebGL = true; + GLOBAL_DATA.ExtSupported.maxDepthBits = 24; + GLOBAL_DATA.ExtSupported.texAnisoFilter = true; + GLOBAL_DATA.ExtSupported.texMirrorClamp = true; // TODO: Check for additional OpenGL ES 3.0 supported extensions: - //RLGL_GLOBAL_DATA.ExtSupported.texCompDXT = true; - //RLGL_GLOBAL_DATA.ExtSupported.texCompETC1 = true; - //RLGL_GLOBAL_DATA.ExtSupported.texCompETC2 = true; - //RLGL_GLOBAL_DATA.ExtSupported.texCompPVRT = true; - //RLGL_GLOBAL_DATA.ExtSupported.texCompASTC = true; - //RLGL_GLOBAL_DATA.ExtSupported.maxAnisotropyLevel = true; - //RLGL_GLOBAL_DATA.ExtSupported.computeShader = true; - //RLGL_GLOBAL_DATA.ExtSupported.ssbo = true; + //GLOBAL_DATA.ExtSupported.texCompDXT = true; + //GLOBAL_DATA.ExtSupported.texCompETC1 = true; + //GLOBAL_DATA.ExtSupported.texCompETC2 = true; + //GLOBAL_DATA.ExtSupported.texCompPVRT = true; + //GLOBAL_DATA.ExtSupported.texCompASTC = true; + //GLOBAL_DATA.ExtSupported.maxAnisotropyLevel = true; + //GLOBAL_DATA.ExtSupported.computeShader = true; + //GLOBAL_DATA.ExtSupported.ssbo = true; #elif defined(GRAPHICS_API_OPENGL_ES2) #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_DESKTOP_SDL) // TODO: Support GLAD loader for OpenGL ES 3.0 - if (gladLoadGLES2((GLADloadfunc)loader) == 0) RL_TRACELOG(RL_LOG_WARNING, "GLAD: Cannot load OpenGL ES2.0 functions"); - else RL_TRACELOG(RL_LOG_INFO, "GLAD: OpenGL ES 2.0 loaded successfully"); + if (gladLoadGLES2((GLADloadfunc)loader) == 0) RL_TRACELOG(LOG_WARNING, "GLAD: Cannot load OpenGL ES2.0 functions"); + else RL_TRACELOG(LOG_INFO, "GLAD: OpenGL ES 2.0 loaded successfully"); #endif // Get supported extensions list @@ -2305,11 +2344,11 @@ void RLGL_LoadExtensions(void *loader) } } - RL_TRACELOG(RL_LOG_INFO, "GL: Supported extensions count: %i", numExt); + RL_TRACELOG(LOG_INFO, "GL: Supported extensions count: %i", numExt); #if defined(RLGL_SHOW_GL_DETAILS_INFO) - RL_TRACELOG(RL_LOG_INFO, "GL: OpenGL extensions:"); - for (int i = 0; i < numExt; i++) RL_TRACELOG(RL_LOG_INFO, " %s", extList[i]); + RL_TRACELOG(LOG_INFO, "GL: OpenGL extensions:"); + for (int i = 0; i < numExt; i++) RL_TRACELOG(LOG_INFO, " %s", extList[i]); #endif // Check required extensions @@ -2321,75 +2360,75 @@ void RLGL_LoadExtensions(void *loader) { // 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)((RLGL_glLoadProc)loader)("glGenVertexArraysOES"); - glBindVertexArray = (PFNGLBINDVERTEXARRAYOESPROC)((RLGL_glLoadProc)loader)("glBindVertexArrayOES"); - glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSOESPROC)((RLGL_glLoadProc)loader)("glDeleteVertexArraysOES"); + glGenVertexArrays = (PFNGLGENVERTEXARRAYSOESPROC)((glLoadProc)loader)("glGenVertexArraysOES"); + glBindVertexArray = (PFNGLBINDVERTEXARRAYOESPROC)((glLoadProc)loader)("glBindVertexArrayOES"); + glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSOESPROC)((glLoadProc)loader)("glDeleteVertexArraysOES"); //glIsVertexArray = (PFNGLISVERTEXARRAYOESPROC)loader("glIsVertexArrayOES"); // NOTE: Fails in WebGL, omitted - if ((glGenVertexArrays != NULL) && (glBindVertexArray != NULL) && (glDeleteVertexArrays != NULL)) RLGL_GLOBAL_DATA.ExtSupported.vao = true; + if ((glGenVertexArrays != NULL) && (glBindVertexArray != NULL) && (glDeleteVertexArrays != NULL)) GLOBAL_DATA.ExtSupported.vao = true; } // Check instanced rendering support if (strcmp(extList[i], (const char *)"GL_ANGLE_instanced_arrays") == 0) // Web ANGLE { - glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((RLGL_glLoadProc)loader)("glDrawArraysInstancedANGLE"); - glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((RLGL_glLoadProc)loader)("glDrawElementsInstancedANGLE"); - glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((RLGL_glLoadProc)loader)("glVertexAttribDivisorANGLE"); + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((glLoadProc)loader)("glDrawArraysInstancedANGLE"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((glLoadProc)loader)("glDrawElementsInstancedANGLE"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((glLoadProc)loader)("glVertexAttribDivisorANGLE"); - if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) RLGL_GLOBAL_DATA.ExtSupported.instancing = true; + if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) GLOBAL_DATA.ExtSupported.instancing = true; } else { if ((strcmp(extList[i], (const char *)"GL_EXT_draw_instanced") == 0) && // Standard EXT (strcmp(extList[i], (const char *)"GL_EXT_instanced_arrays") == 0)) { - glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((RLGL_glLoadProc)loader)("glDrawArraysInstancedEXT"); - glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((RLGL_glLoadProc)loader)("glDrawElementsInstancedEXT"); - glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((RLGL_glLoadProc)loader)("glVertexAttribDivisorEXT"); + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((glLoadProc)loader)("glDrawArraysInstancedEXT"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((glLoadProc)loader)("glDrawElementsInstancedEXT"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((glLoadProc)loader)("glVertexAttribDivisorEXT"); - if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) RLGL_GLOBAL_DATA.ExtSupported.instancing = true; + if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) GLOBAL_DATA.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_GLOBAL_DATA.ExtSupported.texNPOT = true; + if (strcmp(extList[i], (const char *)"GL_OES_texture_npot") == 0) GLOBAL_DATA.ExtSupported.texNPOT = true; // Check texture float support - if (strcmp(extList[i], (const char *)"GL_OES_texture_float") == 0) RLGL_GLOBAL_DATA.ExtSupported.texFloat32 = true; - if (strcmp(extList[i], (const char *)"GL_OES_texture_half_float") == 0) RLGL_GLOBAL_DATA.ExtSupported.texFloat16 = true; + if (strcmp(extList[i], (const char *)"GL_OES_texture_float") == 0) GLOBAL_DATA.ExtSupported.texFloat32 = true; + if (strcmp(extList[i], (const char *)"GL_OES_texture_half_float") == 0) GLOBAL_DATA.ExtSupported.texFloat16 = true; // Check depth texture support - if (strcmp(extList[i], (const char *)"GL_OES_depth_texture") == 0) RLGL_GLOBAL_DATA.ExtSupported.texDepth = true; - if (strcmp(extList[i], (const char *)"GL_WEBGL_depth_texture") == 0) RLGL_GLOBAL_DATA.ExtSupported.texDepthWebGL = true; // WebGL requires unsized internal format - if (RLGL_GLOBAL_DATA.ExtSupported.texDepthWebGL) RLGL_GLOBAL_DATA.ExtSupported.texDepth = true; + if (strcmp(extList[i], (const char *)"GL_OES_depth_texture") == 0) GLOBAL_DATA.ExtSupported.texDepth = true; + if (strcmp(extList[i], (const char *)"GL_WEBGL_depth_texture") == 0) GLOBAL_DATA.ExtSupported.texDepthWebGL = true; // WebGL requires unsized internal format + if (GLOBAL_DATA.ExtSupported.texDepthWebGL) GLOBAL_DATA.ExtSupported.texDepth = true; - if (strcmp(extList[i], (const char *)"GL_OES_depth24") == 0) RLGL_GLOBAL_DATA.ExtSupported.maxDepthBits = 24; // Not available on WebGL - if (strcmp(extList[i], (const char *)"GL_OES_depth32") == 0) RLGL_GLOBAL_DATA.ExtSupported.maxDepthBits = 32; // Not available on WebGL + if (strcmp(extList[i], (const char *)"GL_OES_depth24") == 0) GLOBAL_DATA.ExtSupported.maxDepthBits = 24; // Not available on WebGL + if (strcmp(extList[i], (const char *)"GL_OES_depth32") == 0) GLOBAL_DATA.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_GLOBAL_DATA.ExtSupported.texCompDXT = true; + (strcmp(extList[i], (const char *)"GL_WEBKIT_WEBGL_compressed_texture_s3tc") == 0)) GLOBAL_DATA.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_GLOBAL_DATA.ExtSupported.texCompETC1 = true; + (strcmp(extList[i], (const char *)"GL_WEBGL_compressed_texture_etc1") == 0)) GLOBAL_DATA.ExtSupported.texCompETC1 = true; // Check texture compression support: ETC2/EAC - if (strcmp(extList[i], (const char *)"GL_ARB_ES3_compatibility") == 0) RLGL_GLOBAL_DATA.ExtSupported.texCompETC2 = true; + if (strcmp(extList[i], (const char *)"GL_ARB_ES3_compatibility") == 0) GLOBAL_DATA.ExtSupported.texCompETC2 = true; // Check texture compression support: PVR - if (strcmp(extList[i], (const char *)"GL_IMG_texture_compression_pvrtc") == 0) RLGL_GLOBAL_DATA.ExtSupported.texCompPVRT = true; + if (strcmp(extList[i], (const char *)"GL_IMG_texture_compression_pvrtc") == 0) GLOBAL_DATA.ExtSupported.texCompPVRT = true; // Check texture compression support: ASTC - if (strcmp(extList[i], (const char *)"GL_KHR_texture_compression_astc_hdr") == 0) RLGL_GLOBAL_DATA.ExtSupported.texCompASTC = true; + if (strcmp(extList[i], (const char *)"GL_KHR_texture_compression_astc_hdr") == 0) GLOBAL_DATA.ExtSupported.texCompASTC = true; // Check anisotropic texture filter support - if (strcmp(extList[i], (const char *)"GL_EXT_texture_filter_anisotropic") == 0) RLGL_GLOBAL_DATA.ExtSupported.texAnisoFilter = true; + if (strcmp(extList[i], (const char *)"GL_EXT_texture_filter_anisotropic") == 0) GLOBAL_DATA.ExtSupported.texAnisoFilter = true; // Check clamp mirror wrap mode support - if (strcmp(extList[i], (const char *)"GL_EXT_texture_mirror_clamp") == 0) RLGL_GLOBAL_DATA.ExtSupported.texMirrorClamp = true; + if (strcmp(extList[i], (const char *)"GL_EXT_texture_mirror_clamp") == 0) GLOBAL_DATA.ExtSupported.texMirrorClamp = true; } // Free extensions pointers @@ -2400,156 +2439,156 @@ void RLGL_LoadExtensions(void *loader) // Check OpenGL information and capabilities //------------------------------------------------------------------------------ // Show current OpenGL and GLSL version - RL_TRACELOG(RL_LOG_INFO, "GL: OpenGL device information:"); - RL_TRACELOG(RL_LOG_INFO, " > Vendor: %s", glGetString(GL_VENDOR)); - RL_TRACELOG(RL_LOG_INFO, " > Renderer: %s", glGetString(GL_RENDERER)); - RL_TRACELOG(RL_LOG_INFO, " > Version: %s", glGetString(GL_VERSION)); - RL_TRACELOG(RL_LOG_INFO, " > GLSL: %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); + RL_TRACELOG(LOG_INFO, "GL: OpenGL device information:"); + RL_TRACELOG(LOG_INFO, " > Vendor: %s", glGetString(GL_VENDOR)); + RL_TRACELOG(LOG_INFO, " > Renderer: %s", glGetString(GL_RENDERER)); + RL_TRACELOG(LOG_INFO, " > Version: %s", glGetString(GL_VERSION)); + RL_TRACELOG(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_GLOBAL_DATA.ExtSupported.maxAnisotropyLevel); + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &GLOBAL_DATA.ExtSupported.maxAnisotropyLevel); #if defined(RLGL_SHOW_GL_DETAILS_INFO) // Show some OpenGL GPU capabilities - RL_TRACELOG(RL_LOG_INFO, "GL: OpenGL capabilities:"); + RL_TRACELOG(LOG_INFO, "GL: OpenGL capabilities:"); GLint capability = 0; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &capability); - RL_TRACELOG(RL_LOG_INFO, " GL_MAX_TEXTURE_SIZE: %i", capability); + RL_TRACELOG(LOG_INFO, " GL_MAX_TEXTURE_SIZE: %i", capability); glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &capability); - RL_TRACELOG(RL_LOG_INFO, " GL_MAX_CUBE_MAP_TEXTURE_SIZE: %i", capability); + RL_TRACELOG(LOG_INFO, " GL_MAX_CUBE_MAP_TEXTURE_SIZE: %i", capability); glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &capability); - RL_TRACELOG(RL_LOG_INFO, " GL_MAX_TEXTURE_IMAGE_UNITS: %i", capability); + RL_TRACELOG(LOG_INFO, " GL_MAX_TEXTURE_IMAGE_UNITS: %i", capability); glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &capability); - RL_TRACELOG(RL_LOG_INFO, " GL_MAX_VERTEX_ATTRIBS: %i", capability); + RL_TRACELOG(LOG_INFO, " GL_MAX_VERTEX_ATTRIBS: %i", capability); #if !defined(GRAPHICS_API_OPENGL_ES2) glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &capability); - RL_TRACELOG(RL_LOG_INFO, " GL_MAX_UNIFORM_BLOCK_SIZE: %i", capability); + RL_TRACELOG(LOG_INFO, " GL_MAX_UNIFORM_BLOCK_SIZE: %i", capability); glGetIntegerv(GL_MAX_DRAW_BUFFERS, &capability); - RL_TRACELOG(RL_LOG_INFO, " GL_MAX_DRAW_BUFFERS: %i", capability); - if (RLGL_GLOBAL_DATA.ExtSupported.texAnisoFilter) RL_TRACELOG(RL_LOG_INFO, " GL_MAX_TEXTURE_MAX_ANISOTROPY: %.0f", RLGL_GLOBAL_DATA.ExtSupported.maxAnisotropyLevel); + RL_TRACELOG(LOG_INFO, " GL_MAX_DRAW_BUFFERS: %i", capability); + if (GLOBAL_DATA.ExtSupported.texAnisoFilter) RL_TRACELOG(LOG_INFO, " GL_MAX_TEXTURE_MAX_ANISOTROPY: %.0f", GLOBAL_DATA.ExtSupported.maxAnisotropyLevel); #endif glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &capability); - RL_TRACELOG(RL_LOG_INFO, " GL_NUM_COMPRESSED_TEXTURE_FORMATS: %i", capability); + RL_TRACELOG(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++) RL_TRACELOG(RL_LOG_INFO, " %s", RLGL_GetCompressedFormatName(compFormats[i])); + for (int i = 0; i < capability; i++) RL_TRACELOG(LOG_INFO, " %s", GetCompressedFormatName(compFormats[i])); RL_FREE(compFormats); #if defined(GRAPHICS_API_OPENGL_43) glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &capability); - RL_TRACELOG(RL_LOG_INFO, " GL_MAX_VERTEX_ATTRIB_BINDINGS: %i", capability); + RL_TRACELOG(LOG_INFO, " GL_MAX_VERTEX_ATTRIB_BINDINGS: %i", capability); glGetIntegerv(GL_MAX_UNIFORM_LOCATIONS, &capability); - RL_TRACELOG(RL_LOG_INFO, " GL_MAX_UNIFORM_LOCATIONS: %i", capability); + RL_TRACELOG(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_GLOBAL_DATA.ExtSupported.vao) RL_TRACELOG(RL_LOG_INFO, "GL: VAO extension detected, VAO functions loaded successfully"); - else RL_TRACELOG(RL_LOG_WARNING, "GL: VAO extension not found, VAO not supported"); - if (RLGL_GLOBAL_DATA.ExtSupported.texNPOT) RL_TRACELOG(RL_LOG_INFO, "GL: NPOT textures extension detected, full NPOT textures supported"); - else RL_TRACELOG(RL_LOG_WARNING, "GL: NPOT textures extension not found, limited NPOT support (no-mipmaps, no-repeat)"); - if (RLGL_GLOBAL_DATA.ExtSupported.texCompDXT) RL_TRACELOG(RL_LOG_INFO, "GL: DXT compressed textures supported"); - if (RLGL_GLOBAL_DATA.ExtSupported.texCompETC1) RL_TRACELOG(RL_LOG_INFO, "GL: ETC1 compressed textures supported"); - if (RLGL_GLOBAL_DATA.ExtSupported.texCompETC2) RL_TRACELOG(RL_LOG_INFO, "GL: ETC2/EAC compressed textures supported"); - if (RLGL_GLOBAL_DATA.ExtSupported.texCompPVRT) RL_TRACELOG(RL_LOG_INFO, "GL: PVRT compressed textures supported"); - if (RLGL_GLOBAL_DATA.ExtSupported.texCompASTC) RL_TRACELOG(RL_LOG_INFO, "GL: ASTC compressed textures supported"); - if (RLGL_GLOBAL_DATA.ExtSupported.computeShader) RL_TRACELOG(RL_LOG_INFO, "GL: Compute shaders supported"); - if (RLGL_GLOBAL_DATA.ExtSupported.ssbo) RL_TRACELOG(RL_LOG_INFO, "GL: Shader storage buffer objects supported"); + if (GLOBAL_DATA.ExtSupported.vao) RL_TRACELOG(LOG_INFO, "GL: VAO extension detected, VAO functions loaded successfully"); + else RL_TRACELOG(LOG_WARNING, "GL: VAO extension not found, VAO not supported"); + if (GLOBAL_DATA.ExtSupported.texNPOT) RL_TRACELOG(LOG_INFO, "GL: NPOT textures extension detected, full NPOT textures supported"); + else RL_TRACELOG(LOG_WARNING, "GL: NPOT textures extension not found, limited NPOT support (no-mipmaps, no-repeat)"); + if (GLOBAL_DATA.ExtSupported.texCompDXT) RL_TRACELOG(LOG_INFO, "GL: DXT compressed textures supported"); + if (GLOBAL_DATA.ExtSupported.texCompETC1) RL_TRACELOG(LOG_INFO, "GL: ETC1 compressed textures supported"); + if (GLOBAL_DATA.ExtSupported.texCompETC2) RL_TRACELOG(LOG_INFO, "GL: ETC2/EAC compressed textures supported"); + if (GLOBAL_DATA.ExtSupported.texCompPVRT) RL_TRACELOG(LOG_INFO, "GL: PVRT compressed textures supported"); + if (GLOBAL_DATA.ExtSupported.texCompASTC) RL_TRACELOG(LOG_INFO, "GL: ASTC compressed textures supported"); + if (GLOBAL_DATA.ExtSupported.computeShader) RL_TRACELOG(LOG_INFO, "GL: Compute shaders supported"); + if (GLOBAL_DATA.ExtSupported.ssbo) RL_TRACELOG(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 RLGL_GetVersion(void) +int get_version(void) { int glVersion = 0; #if defined(GRAPHICS_API_OPENGL_11) - glVersion = RLGL_OPENGL_11; + glVersion = RL_OPENGL_11; #endif #if defined(GRAPHICS_API_OPENGL_21) - glVersion = RLGL_OPENGL_21; + glVersion = RL_OPENGL_21; #elif defined(GRAPHICS_API_OPENGL_43) - glVersion = RLGL_OPENGL_43; + glVersion = RL_OPENGL_43; #elif defined(GRAPHICS_API_OPENGL_33) - glVersion = RLGL_OPENGL_33; + glVersion = RL_OPENGL_33; #endif #if defined(GRAPHICS_API_OPENGL_ES3) - glVersion = RLGL_OPENGL_ES_30; + glVersion = RL_OPENGL_ES_30; #elif defined(GRAPHICS_API_OPENGL_ES2) - glVersion = RLGL_OPENGL_ES_20; + glVersion = RL_OPENGL_ES_20; #endif return glVersion; } // Set current framebuffer width -void RLGL_SetFramebufferWidth(int width) +void set_framebuffer_width(int width) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - RLGL_GLOBAL_DATA.State.framebufferWidth = width; + GLOBAL_DATA.State.framebufferWidth = width; #endif } // Set current framebuffer height -void RLGL_SetFramebufferHeight(int height) +void set_framebuffer_height(int height) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - RLGL_GLOBAL_DATA.State.framebufferHeight = height; + GLOBAL_DATA.State.framebufferHeight = height; #endif } // Get default framebuffer width -int RLGL_GetFramebufferWidth(void) +int get_framebuffer_width(void) { int width = 0; #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - width = RLGL_GLOBAL_DATA.State.framebufferWidth; + width = GLOBAL_DATA.State.framebufferWidth; #endif return width; } // Get default framebuffer height -int RLGL_GetFramebufferHeight(void) +int get_framebuffer_height(void) { int height = 0; #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - height = RLGL_GLOBAL_DATA.State.framebufferHeight; + height = GLOBAL_DATA.State.framebufferHeight; #endif return height; } // Get default internal texture (white texture) // NOTE: Default texture is a 1x1 pixel UNCOMPRESSED_R8G8B8A8 -unsigned int RLGL_GetTextureIdDefault(void) +unsigned int get_texture_id_default(void) { unsigned int id = 0; #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - id = RLGL_GLOBAL_DATA.State.defaultTextureId; + id = GLOBAL_DATA.State.defaultTextureId; #endif return id; } // Get default shader id -unsigned int RLGL_GetShaderIdDefault(void) +unsigned int get_shader_id_default(void) { unsigned int id = 0; #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - id = RLGL_GLOBAL_DATA.State.defaultShaderId; + id = GLOBAL_DATA.State.defaultShaderId; #endif return id; } // Get default shader locs -int *RLGL_GetShaderLocsDefault(void) +int *get_shader_locs_default(void) { int *locs = NULL; #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - locs = RLGL_GLOBAL_DATA.State.defaultShaderLocs; + locs = GLOBAL_DATA.State.defaultShaderLocs; #endif return locs; } @@ -2557,14 +2596,14 @@ int *RLGL_GetShaderLocsDefault(void) // Render batch management //------------------------------------------------------------------------------------------------ // Load render batch -RLGL_RenderBatch RLGL_LoadRenderBatch(int numBuffers, int bufferElements) +render_batch load_render_batch(int numBuffers, int bufferElements) { - RLGL_RenderBatch batch = { 0 }; + render_batch 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 = (RLGL_VertexBuffer *)RL_MALLOC(numBuffers*sizeof(RLGL_VertexBuffer)); + batch.vertexBuffer = (vertex_buffer *)RL_MALLOC(numBuffers*sizeof(vertex_buffer)); for (int i = 0; i < numBuffers; i++) { @@ -2599,17 +2638,17 @@ RLGL_RenderBatch RLGL_LoadRenderBatch(int numBuffers, int bufferElements) k++; } - RLGL_GLOBAL_DATA.State.vertexCounter = 0; + GLOBAL_DATA.State.vertexCounter = 0; } - RL_TRACELOG(RL_LOG_INFO, "RLGL_GLOBAL_DATA: Render batch vertex buffers loaded successfully in RAM (CPU)"); + RL_TRACELOG(LOG_INFO, "GLOBAL_DATA: 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_GLOBAL_DATA.ExtSupported.vao) + if (GLOBAL_DATA.ExtSupported.vao) { // Initialize Quads VAO glGenVertexArrays(1, &batch.vertexBuffer[i].vaoId); @@ -2621,22 +2660,22 @@ RLGL_RenderBatch RLGL_LoadRenderBatch(int numBuffers, int bufferElements) 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_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION]); - glVertexAttribPointer(RLGL_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_VERTEX_POSITION]); + glVertexAttribPointer(GLOBAL_DATA.State.currentShaderLocs[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_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01]); - glVertexAttribPointer(RLGL_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_VERTEX_TEXCOORD01]); + glVertexAttribPointer(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); // Vertex color buffer (shader-location = 3) glGenBuffers(1, &batch.vertexBuffer[i].vboId[2]); glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[2]); glBufferData(GL_ARRAY_BUFFER, bufferElements*4*4*sizeof(unsigned char), batch.vertexBuffer[i].colors, GL_DYNAMIC_DRAW); - glEnableVertexAttribArray(RLGL_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR]); - glVertexAttribPointer(RLGL_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); + glEnableVertexAttribArray(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_VERTEX_COLOR]); + glVertexAttribPointer(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); // Fill index buffer glGenBuffers(1, &batch.vertexBuffer[i].vboId[3]); @@ -2649,15 +2688,15 @@ RLGL_RenderBatch RLGL_LoadRenderBatch(int numBuffers, int bufferElements) #endif } - RL_TRACELOG(RL_LOG_INFO, "RLGL_GLOBAL_DATA: Render batch vertex buffers loaded successfully in VRAM (GPU)"); + RL_TRACELOG(LOG_INFO, "GLOBAL_DATA: Render batch vertex buffers loaded successfully in VRAM (GPU)"); // Unbind the current VAO - if (RLGL_GLOBAL_DATA.ExtSupported.vao) glBindVertexArray(0); + if (GLOBAL_DATA.ExtSupported.vao) glBindVertexArray(0); //-------------------------------------------------------------------------------------------- // Init draw calls tracking system //-------------------------------------------------------------------------------------------- - batch.draws = (RLGL_DrawCall *)RL_MALLOC(RL_DEFAULT_BATCH_DRAWCALLS*sizeof(RLGL_DrawCall)); + batch.draws = (draw_call *)RL_MALLOC(RL_DEFAULT_BATCH_DRAWCALLS*sizeof(draw_call)); for (int i = 0; i < RL_DEFAULT_BATCH_DRAWCALLS; i++) { @@ -2666,9 +2705,9 @@ RLGL_RenderBatch RLGL_LoadRenderBatch(int numBuffers, int bufferElements) batch.draws[i].vertexAlignment = 0; //batch.draws[i].vaoId = 0; //batch.draws[i].shaderId = 0; - batch.draws[i].textureId = RLGL_GLOBAL_DATA.State.defaultTextureId; - //batch.draws[i].RLGL_GLOBAL_DATA.State.projection = RLGL_MatrixIdentity(); - //batch.draws[i].RLGL_GLOBAL_DATA.State.modelview = RLGL_MatrixIdentity(); + batch.draws[i].textureId = GLOBAL_DATA.State.defaultTextureId; + //batch.draws[i].GLOBAL_DATA.State.projection = internal_matrix_identity(); + //batch.draws[i].GLOBAL_DATA.State.modelview = internal_matrix_identity(); } batch.bufferCount = numBuffers; // Record buffer count @@ -2681,7 +2720,7 @@ RLGL_RenderBatch RLGL_LoadRenderBatch(int numBuffers, int bufferElements) } // Unload default internal buffers vertex data from CPU and GPU -void RLGL_UnloadRenderBatch(RLGL_RenderBatch batch) +void unload_render_batch(render_batch batch) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) // Unbind everything @@ -2692,7 +2731,7 @@ void RLGL_UnloadRenderBatch(RLGL_RenderBatch batch) for (int i = 0; i < batch.bufferCount; i++) { // Unbind VAO attribs data - if (RLGL_GLOBAL_DATA.ExtSupported.vao) + if (GLOBAL_DATA.ExtSupported.vao) { glBindVertexArray(batch.vertexBuffer[i].vaoId); glDisableVertexAttribArray(0); @@ -2709,7 +2748,7 @@ void RLGL_UnloadRenderBatch(RLGL_RenderBatch batch) glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[3]); // Delete VAOs from GPU (VRAM) - if (RLGL_GLOBAL_DATA.ExtSupported.vao) glDeleteVertexArrays(1, &batch.vertexBuffer[i].vaoId); + if (GLOBAL_DATA.ExtSupported.vao) glDeleteVertexArrays(1, &batch.vertexBuffer[i].vaoId); // Free vertex arrays memory from CPU (RAM) RL_FREE(batch.vertexBuffer[i].vertices); @@ -2726,31 +2765,31 @@ void RLGL_UnloadRenderBatch(RLGL_RenderBatch batch) // Draw render batch // NOTE: We require a pointer to reset batch and increase current buffer (multi-buffer) -void RLGL_DrawRenderBatch(RLGL_RenderBatch *batch) +void draw_render_batch(render_batch *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_GLOBAL_DATA.State.vertexCounter > 0) + if (GLOBAL_DATA.State.vertexCounter > 0) { // Activate elements VAO - if (RLGL_GLOBAL_DATA.ExtSupported.vao) glBindVertexArray(batch->vertexBuffer[batch->currentBuffer].vaoId); + if (GLOBAL_DATA.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_GLOBAL_DATA.State.vertexCounter*3*sizeof(float), batch->vertexBuffer[batch->currentBuffer].vertices); + glBufferSubData(GL_ARRAY_BUFFER, 0, GLOBAL_DATA.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_GLOBAL_DATA.State.vertexCounter*2*sizeof(float), batch->vertexBuffer[batch->currentBuffer].texcoords); + glBufferSubData(GL_ARRAY_BUFFER, 0, GLOBAL_DATA.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 // Colors buffer glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[2]); - glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL_GLOBAL_DATA.State.vertexCounter*4*sizeof(unsigned char), batch->vertexBuffer[batch->currentBuffer].colors); + glBufferSubData(GL_ARRAY_BUFFER, 0, GLOBAL_DATA.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. @@ -2769,80 +2808,80 @@ void RLGL_DrawRenderBatch(RLGL_RenderBatch *batch) // glUnmapBuffer(GL_ARRAY_BUFFER); // Unbind the current VAO - if (RLGL_GLOBAL_DATA.ExtSupported.vao) glBindVertexArray(0); + if (GLOBAL_DATA.ExtSupported.vao) glBindVertexArray(0); } //------------------------------------------------------------------------------------------------------------ // Draw batch vertex buffers (considering VR stereo if required) //------------------------------------------------------------------------------------------------------------ - RL_Matrix matProjection = RLGL_GLOBAL_DATA.State.projection; - RL_Matrix matModelView = RLGL_GLOBAL_DATA.State.modelview; + Matrix matProjection = GLOBAL_DATA.State.projection; + Matrix matModelView = GLOBAL_DATA.State.modelview; int eyeCount = 1; - if (RLGL_GLOBAL_DATA.State.stereoRender) eyeCount = 2; + if (GLOBAL_DATA.State.stereoRender) eyeCount = 2; for (int eye = 0; eye < eyeCount; eye++) { if (eyeCount == 2) { // Setup current eye viewport (half screen width) - RLGL_Viewport(eye*RLGL_GLOBAL_DATA.State.framebufferWidth/2, 0, RLGL_GLOBAL_DATA.State.framebufferWidth/2, RLGL_GLOBAL_DATA.State.framebufferHeight); + viewport(eye*GLOBAL_DATA.State.framebufferWidth/2, 0, GLOBAL_DATA.State.framebufferWidth/2, GLOBAL_DATA.State.framebufferHeight); // Set current eye view offset to modelview matrix - RLGL_SetMatrixModelview(RLGL_MatrixMultiply(matModelView, RLGL_GLOBAL_DATA.State.viewOffsetStereo[eye])); + set_matrix_modelview(internal_matrix_multiply(matModelView, GLOBAL_DATA.State.viewOffsetStereo[eye])); // Set current eye projection matrix - RLGL_SetMatrixProjection(RLGL_GLOBAL_DATA.State.projectionStereo[eye]); + set_matrix_projection(GLOBAL_DATA.State.projectionStereo[eye]); } // Draw buffers - if (RLGL_GLOBAL_DATA.State.vertexCounter > 0) + if (GLOBAL_DATA.State.vertexCounter > 0) { // Set current shader and upload current MVP matrix - glUseProgram(RLGL_GLOBAL_DATA.State.currentShaderId); + glUseProgram(GLOBAL_DATA.State.currentShaderId); // Create modelview-projection matrix and upload to shader - RL_Matrix matMVP = RLGL_MatrixMultiply(RLGL_GLOBAL_DATA.State.modelview, RLGL_GLOBAL_DATA.State.projection); + Matrix matMVP = internal_matrix_multiply(GLOBAL_DATA.State.modelview, GLOBAL_DATA.State.projection); float matMVPfloat[16] = { matMVP.m0, matMVP.m1, matMVP.m2, matMVP.m3, matMVP.m4, matMVP.m5, matMVP.m6, matMVP.m7, matMVP.m8, matMVP.m9, matMVP.m10, matMVP.m11, matMVP.m12, matMVP.m13, matMVP.m14, matMVP.m15 }; - glUniformMatrix4fv(RLGL_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MVP], 1, false, matMVPfloat); + glUniformMatrix4fv(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_MATRIX_MVP], 1, false, matMVPfloat); - if (RLGL_GLOBAL_DATA.ExtSupported.vao) glBindVertexArray(batch->vertexBuffer[batch->currentBuffer].vaoId); + if (GLOBAL_DATA.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_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); - glEnableVertexAttribArray(RLGL_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION]); + glVertexAttribPointer(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_VERTEX_POSITION]); // Bind vertex attrib: texcoord (shader-location = 1) glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[1]); - glVertexAttribPointer(RLGL_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); - glEnableVertexAttribArray(RLGL_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01]); + glVertexAttribPointer(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_VERTEX_TEXCOORD01]); // Bind vertex attrib: color (shader-location = 3) glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[2]); - glVertexAttribPointer(RLGL_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); - glEnableVertexAttribArray(RLGL_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR]); + glVertexAttribPointer(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); + glEnableVertexAttribArray(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_VERTEX_COLOR]); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[3]); } // Setup some default shader values - glUniform4f(RLGL_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_COLOR_DIFFUSE], 1.0f, 1.0f, 1.0f, 1.0f); - glUniform1i(RLGL_GLOBAL_DATA.State.currentShaderLocs[RL_SHADER_LOC_MAP_DIFFUSE], 0); // Active default sampler2D: texture0 + glUniform4f(GLOBAL_DATA.State.currentShaderLocs[SHADER_LOC_COLOR_DIFFUSE], 1.0f, 1.0f, 1.0f, 1.0f); + glUniform1i(GLOBAL_DATA.State.currentShaderLocs[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_GLOBAL_DATA.State.activeTextureId[i] > 0) + if (GLOBAL_DATA.State.activeTextureId[i] > 0) { glActiveTexture(GL_TEXTURE0 + 1 + i); - glBindTexture(GL_TEXTURE_2D, RLGL_GLOBAL_DATA.State.activeTextureId[i]); + glBindTexture(GL_TEXTURE_2D, GLOBAL_DATA.State.activeTextureId[i]); } } @@ -2872,7 +2911,7 @@ void RLGL_DrawRenderBatch(RLGL_RenderBatch *batch) vertexOffset += (batch->draws[i].vertexCount + batch->draws[i].vertexAlignment); } - if (!RLGL_GLOBAL_DATA.ExtSupported.vao) + if (!GLOBAL_DATA.ExtSupported.vao) { glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); @@ -2881,37 +2920,37 @@ void RLGL_DrawRenderBatch(RLGL_RenderBatch *batch) glBindTexture(GL_TEXTURE_2D, 0); // Unbind textures } - if (RLGL_GLOBAL_DATA.ExtSupported.vao) glBindVertexArray(0); // Unbind VAO + if (GLOBAL_DATA.ExtSupported.vao) glBindVertexArray(0); // Unbind VAO glUseProgram(0); // Unbind shader program } // Restore viewport to default measures - if (eyeCount == 2) RLGL_Viewport(0, 0, RLGL_GLOBAL_DATA.State.framebufferWidth, RLGL_GLOBAL_DATA.State.framebufferHeight); + if (eyeCount == 2) viewport(0, 0, GLOBAL_DATA.State.framebufferWidth, GLOBAL_DATA.State.framebufferHeight); //------------------------------------------------------------------------------------------------------------ // Reset batch buffers //------------------------------------------------------------------------------------------------------------ // Reset vertex counter for next frame - RLGL_GLOBAL_DATA.State.vertexCounter = 0; + GLOBAL_DATA.State.vertexCounter = 0; // Reset depth for next draw batch->currentDepth = -1.0f; // Restore projection/modelview matrices - RLGL_GLOBAL_DATA.State.projection = matProjection; - RLGL_GLOBAL_DATA.State.modelview = matModelView; + GLOBAL_DATA.State.projection = matProjection; + GLOBAL_DATA.State.modelview = matModelView; - // Reset RLGL_GLOBAL_DATA.currentBatch->draws array + // Reset GLOBAL_DATA.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_GLOBAL_DATA.State.defaultTextureId; + batch->draws[i].textureId = GLOBAL_DATA.State.defaultTextureId; } // Reset active texture units for next batch - for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) RLGL_GLOBAL_DATA.State.activeTextureId[i] = 0; + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) GLOBAL_DATA.State.activeTextureId[i] = 0; // Reset draws counter to one draw for the batch batch->drawCounter = 1; @@ -2923,46 +2962,46 @@ void RLGL_DrawRenderBatch(RLGL_RenderBatch *batch) #endif } -// Set the active render batch for RLGL_gl -void RLGL_SetRenderBatchActive(RLGL_RenderBatch *batch) +// Set the active render batch for rlgl +void set_render_batch_active(render_batch *batch) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - RLGL_DrawRenderBatch(RLGL_GLOBAL_DATA.currentBatch); + draw_render_batch(GLOBAL_DATA.currentBatch); - if (batch != NULL) RLGL_GLOBAL_DATA.currentBatch = batch; - else RLGL_GLOBAL_DATA.currentBatch = &RLGL_GLOBAL_DATA.defaultBatch; + if (batch != NULL) GLOBAL_DATA.currentBatch = batch; + else GLOBAL_DATA.currentBatch = &GLOBAL_DATA.defaultBatch; #endif } // Update and draw internal render batch -void RLGL_DrawRenderBatchActive(void) +void draw_render_batch_active(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - RLGL_DrawRenderBatch(RLGL_GLOBAL_DATA.currentBatch); // NOTE: Stereo rendering is checked inside + draw_render_batch(GLOBAL_DATA.currentBatch); // NOTE: Stereo rendering is checked inside #endif } // Check internal buffer overflow for a given number of vertex -// and force a RLGL_RenderBatch draw call if required -bool RLGL_CheckRenderBatchLimit(int vCount) +// and force a render_batch draw call if required +bool check_render_batch_limit(int vCount) { bool overflow = false; #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - if ((RLGL_GLOBAL_DATA.State.vertexCounter + vCount) >= - (RLGL_GLOBAL_DATA.currentBatch->vertexBuffer[RLGL_GLOBAL_DATA.currentBatch->currentBuffer].elementCount*4)) + if ((GLOBAL_DATA.State.vertexCounter + vCount) >= + (GLOBAL_DATA.currentBatch->vertexBuffer[GLOBAL_DATA.currentBatch->currentBuffer].elementCount*4)) { overflow = true; // Store current primitive drawing mode and texture id - int currentMode = RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].mode; - int currentTexture = RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].textureId; + int currentMode = GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].mode; + int currentTexture = GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].textureId; - RLGL_DrawRenderBatch(RLGL_GLOBAL_DATA.currentBatch); // NOTE: Stereo rendering is checked inside + draw_render_batch(GLOBAL_DATA.currentBatch); // NOTE: Stereo rendering is checked inside // Restore state of last batch so we can continue adding vertices - RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].mode = currentMode; - RLGL_GLOBAL_DATA.currentBatch->draws[RLGL_GLOBAL_DATA.currentBatch->drawCounter - 1].textureId = currentTexture; + GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].mode = currentMode; + GLOBAL_DATA.currentBatch->draws[GLOBAL_DATA.currentBatch->drawCounter - 1].textureId = currentTexture; } #endif @@ -2972,7 +3011,7 @@ bool RLGL_CheckRenderBatchLimit(int vCount) // Textures data management //----------------------------------------------------------------------------------------- // Convert image data to OpenGL texture (returns OpenGL valid Id) -unsigned int RLGL_LoadTexture(const void *data, int width, int height, int format, int mipmapCount) +unsigned int load_texture(const void *data, int width, int height, int format, int mipmapCount) { unsigned int id = 0; @@ -2980,40 +3019,40 @@ unsigned int RLGL_LoadTexture(const void *data, int width, int height, int forma // 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) + if (format >= PIXELFORMAT_COMPRESSED_DXT1_RGB) { - RL_TRACELOG(RL_LOG_WARNING, "GL: OpenGL 1.1 does not support GPU compressed texture formats"); + RL_TRACELOG(LOG_WARNING, "GL: OpenGL 1.1 does not support GPU compressed texture formats"); return id; } #else - if ((!RLGL_GLOBAL_DATA.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))) + if ((!GLOBAL_DATA.ExtSupported.texCompDXT) && ((format == PIXELFORMAT_COMPRESSED_DXT1_RGB) || (format == PIXELFORMAT_COMPRESSED_DXT1_RGBA) || + (format == PIXELFORMAT_COMPRESSED_DXT3_RGBA) || (format == PIXELFORMAT_COMPRESSED_DXT5_RGBA))) { - RL_TRACELOG(RL_LOG_WARNING, "GL: DXT compressed texture format not supported"); + RL_TRACELOG(LOG_WARNING, "GL: DXT compressed texture format not supported"); return id; } #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - if ((!RLGL_GLOBAL_DATA.ExtSupported.texCompETC1) && (format == RL_PIXELFORMAT_COMPRESSED_ETC1_RGB)) + if ((!GLOBAL_DATA.ExtSupported.texCompETC1) && (format == PIXELFORMAT_COMPRESSED_ETC1_RGB)) { - RL_TRACELOG(RL_LOG_WARNING, "GL: ETC1 compressed texture format not supported"); + RL_TRACELOG(LOG_WARNING, "GL: ETC1 compressed texture format not supported"); return id; } - if ((!RLGL_GLOBAL_DATA.ExtSupported.texCompETC2) && ((format == RL_PIXELFORMAT_COMPRESSED_ETC2_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA))) + if ((!GLOBAL_DATA.ExtSupported.texCompETC2) && ((format == PIXELFORMAT_COMPRESSED_ETC2_RGB) || (format == PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA))) { - RL_TRACELOG(RL_LOG_WARNING, "GL: ETC2 compressed texture format not supported"); + RL_TRACELOG(LOG_WARNING, "GL: ETC2 compressed texture format not supported"); return id; } - if ((!RLGL_GLOBAL_DATA.ExtSupported.texCompPVRT) && ((format == RL_PIXELFORMAT_COMPRESSED_PVRT_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA))) + if ((!GLOBAL_DATA.ExtSupported.texCompPVRT) && ((format == PIXELFORMAT_COMPRESSED_PVRT_RGB) || (format == PIXELFORMAT_COMPRESSED_PVRT_RGBA))) { - RL_TRACELOG(RL_LOG_WARNING, "GL: PVRT compressed texture format not supported"); + RL_TRACELOG(LOG_WARNING, "GL: PVRT compressed texture format not supported"); return id; } - if ((!RLGL_GLOBAL_DATA.ExtSupported.texCompASTC) && ((format == RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA) || (format == RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA))) + if ((!GLOBAL_DATA.ExtSupported.texCompASTC) && ((format == PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA) || (format == PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA))) { - RL_TRACELOG(RL_LOG_WARNING, "GL: ASTC compressed texture format not supported"); + RL_TRACELOG(LOG_WARNING, "GL: ASTC compressed texture format not supported"); return id; } #endif @@ -3036,27 +3075,27 @@ unsigned int RLGL_LoadTexture(const void *data, int width, int height, int forma // Load the different mipmap levels for (int i = 0; i < mipmapCount; i++) { - unsigned int mipSize = RLGL_GetPixelDataSize(mipWidth, mipHeight, format); + unsigned int mipSize = internal_get_pixel_data_size(mipWidth, mipHeight, format); unsigned int glInternalFormat, glFormat, glType; - RLGL_GetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + get_gl_texture_formats(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 (format < 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) + if (format == 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) + else if (format == PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA) { #if defined(GRAPHICS_API_OPENGL_21) GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA }; @@ -3082,7 +3121,7 @@ unsigned int RLGL_LoadTexture(const void *data, int width, int height, int forma // 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_GLOBAL_DATA.ExtSupported.texNPOT) + if (GLOBAL_DATA.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 @@ -3118,21 +3157,21 @@ unsigned int RLGL_LoadTexture(const void *data, int width, int height, int forma // Unbind current texture glBindTexture(GL_TEXTURE_2D, 0); - if (id > 0) RL_TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Texture loaded successfully (%ix%i | %s | %i mipmaps)", id, width, height, RLGL_GetPixelFormatName(format), mipmapCount); - else RL_TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load texture"); + if (id > 0) RL_TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Texture loaded successfully (%ix%i | %s | %i mipmaps)", id, width, height, get_pixel_format_name(format), mipmapCount); + else RL_TRACELOG(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 RLGL_LoadTextureDepth(int width, int height, bool useRenderBuffer) +unsigned int load_texture_depth(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_GLOBAL_DATA.ExtSupported.texDepth) useRenderBuffer = true; + if (!GLOBAL_DATA.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 @@ -3141,15 +3180,15 @@ unsigned int RLGL_LoadTextureDepth(int width, int height, bool useRenderBuffer) #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_GLOBAL_DATA.ExtSupported.texDepthWebGL || useRenderBuffer) + if (!GLOBAL_DATA.ExtSupported.texDepthWebGL || useRenderBuffer) { - if (RLGL_GLOBAL_DATA.ExtSupported.maxDepthBits == 32) glInternalFormat = GL_DEPTH_COMPONENT32_OES; - else if (RLGL_GLOBAL_DATA.ExtSupported.maxDepthBits == 24) glInternalFormat = GL_DEPTH_COMPONENT24_OES; + if (GLOBAL_DATA.ExtSupported.maxDepthBits == 32) glInternalFormat = GL_DEPTH_COMPONENT32_OES; + else if (GLOBAL_DATA.ExtSupported.maxDepthBits == 24) glInternalFormat = GL_DEPTH_COMPONENT24_OES; else glInternalFormat = GL_DEPTH_COMPONENT16; } #endif - if (!useRenderBuffer && RLGL_GLOBAL_DATA.ExtSupported.texDepth) + if (!useRenderBuffer && GLOBAL_DATA.ExtSupported.texDepth) { glGenTextures(1, &id); glBindTexture(GL_TEXTURE_2D, id); @@ -3162,7 +3201,7 @@ unsigned int RLGL_LoadTextureDepth(int width, int height, bool useRenderBuffer) glBindTexture(GL_TEXTURE_2D, 0); - RL_TRACELOG(RL_LOG_INFO, "TEXTURE: Depth texture loaded successfully"); + RL_TRACELOG(LOG_INFO, "TEXTURE: Depth texture loaded successfully"); } else { @@ -3174,7 +3213,7 @@ unsigned int RLGL_LoadTextureDepth(int width, int height, bool useRenderBuffer) glBindRenderbuffer(GL_RENDERBUFFER, 0); - RL_TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Depth renderbuffer loaded successfully (%i bits)", id, (RLGL_GLOBAL_DATA.ExtSupported.maxDepthBits >= 24)? RLGL_GLOBAL_DATA.ExtSupported.maxDepthBits : 16); + RL_TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Depth renderbuffer loaded successfully (%i bits)", id, (GLOBAL_DATA.ExtSupported.maxDepthBits >= 24)? GLOBAL_DATA.ExtSupported.maxDepthBits : 16); } #endif @@ -3184,18 +3223,18 @@ unsigned int RLGL_LoadTextureDepth(int width, int height, bool useRenderBuffer) // 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 RLGL_LoadTextureCubemap(const void *data, int size, int format) +unsigned int load_texture_cubemap(const void *data, int size, int format) { unsigned int id = 0; #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - unsigned int dataSize = RLGL_GetPixelDataSize(size, size, format); + unsigned int dataSize = internal_get_pixel_data_size(size, size, format); glGenTextures(1, &id); glBindTexture(GL_TEXTURE_CUBE_MAP, id); unsigned int glInternalFormat, glFormat, glType; - RLGL_GetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + get_gl_texture_formats(format, &glInternalFormat, &glFormat, &glType); if (glInternalFormat != 0) { @@ -3204,28 +3243,28 @@ unsigned int RLGL_LoadTextureCubemap(const void *data, int size, int format) { if (data == NULL) { - if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) + if (format < 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)) - RL_TRACELOG(RL_LOG_WARNING, "TEXTURES: Cubemap requested format not supported"); + if ((format == PIXELFORMAT_UNCOMPRESSED_R32) || (format == PIXELFORMAT_UNCOMPRESSED_R32G32B32A32) + || (format == PIXELFORMAT_UNCOMPRESSED_R16) || (format == PIXELFORMAT_UNCOMPRESSED_R16G16B16A16)) + RL_TRACELOG(LOG_WARNING, "TEXTURES: Cubemap requested format not supported"); else glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, size, size, 0, glFormat, glType, NULL); } - else RL_TRACELOG(RL_LOG_WARNING, "TEXTURES: Empty cubemap creation does not support compressed format"); + else RL_TRACELOG(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 + i, 0, glInternalFormat, size, size, 0, glFormat, glType, (unsigned char *)data + i*dataSize); + if (format < PIXELFORMAT_COMPRESSED_DXT1_RGB) glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, size, size, 0, glFormat, glType, (unsigned char *)data + i*dataSize); else glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, size, size, 0, dataSize, (unsigned char *)data + i*dataSize); } #if defined(GRAPHICS_API_OPENGL_33) - if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE) + if (format == 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) + else if (format == PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA) { #if defined(GRAPHICS_API_OPENGL_21) GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA }; @@ -3250,30 +3289,30 @@ unsigned int RLGL_LoadTextureCubemap(const void *data, int size, int format) glBindTexture(GL_TEXTURE_CUBE_MAP, 0); #endif - if (id > 0) RL_TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Cubemap texture loaded successfully (%ix%i)", id, size, size); - else RL_TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load cubemap texture"); + if (id > 0) RL_TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Cubemap texture loaded successfully (%ix%i)", id, size, size); + else RL_TRACELOG(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 RLGL_UpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int height, int format, const void *data) +void update_texture(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; - RLGL_GetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + get_gl_texture_formats(format, &glInternalFormat, &glFormat, &glType); - if ((glInternalFormat != 0) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)) + if ((glInternalFormat != 0) && (format < PIXELFORMAT_COMPRESSED_DXT1_RGB)) { glTexSubImage2D(GL_TEXTURE_2D, 0, offsetX, offsetY, width, height, glFormat, glType, data); } - else RL_TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Failed to update for current texture format (%i)", id, format); + else RL_TRACELOG(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 RLGL_GetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned int *glFormat, unsigned int *glType) +void get_gl_texture_formats(int format, unsigned int *glInternalFormat, unsigned int *glFormat, unsigned int *glType) { *glInternalFormat = 0; *glFormat = 0; @@ -3283,77 +3322,77 @@ void RLGL_GetGlTextureFormats(int format, unsigned int *glInternalFormat, unsign { #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; + case PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_UNSIGNED_BYTE; break; + case PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: *glInternalFormat = GL_LUMINANCE_ALPHA; *glFormat = GL_LUMINANCE_ALPHA; *glType = GL_UNSIGNED_BYTE; break; + case PIXELFORMAT_UNCOMPRESSED_R5G6B5: *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_UNSIGNED_SHORT_5_6_5; break; + case PIXELFORMAT_UNCOMPRESSED_R8G8B8: *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_UNSIGNED_BYTE; break; + case PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_5_5_5_1; break; + case PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_4_4_4_4; break; + case 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_GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_R32F_EXT; *glFormat = GL_RED_EXT; *glType = GL_FLOAT; break; - case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL_GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F_EXT; *glFormat = GL_RGB; *glType = GL_FLOAT; break; - case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL_GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F_EXT; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; - case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL_GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_R16F_EXT; *glFormat = GL_RED_EXT; *glType = GL_HALF_FLOAT; break; - case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL_GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F_EXT; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT; break; - case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL_GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F_EXT; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT; break; + case PIXELFORMAT_UNCOMPRESSED_R32: if (GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_R32F_EXT; *glFormat = GL_RED_EXT; *glType = GL_FLOAT; break; + case PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F_EXT; *glFormat = GL_RGB; *glType = GL_FLOAT; break; + case PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F_EXT; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; + case PIXELFORMAT_UNCOMPRESSED_R16: if (GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_R16F_EXT; *glFormat = GL_RED_EXT; *glType = GL_HALF_FLOAT; break; + case PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F_EXT; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT; break; + case PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F_EXT; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT; break; #else - case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL_GLOBAL_DATA.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_GLOBAL_DATA.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_GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float + case PIXELFORMAT_UNCOMPRESSED_R32: if (GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float + case PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float + case PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (GLOBAL_DATA.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_GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_ARB; break; - case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL_GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_ARB; break; - case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL_GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT_ARB; break; + case PIXELFORMAT_UNCOMPRESSED_R16: if (GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_ARB; break; + case PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_ARB; break; + case PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (GLOBAL_DATA.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_GLOBAL_DATA.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_GLOBAL_DATA.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_GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float + case PIXELFORMAT_UNCOMPRESSED_R16: if (GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float + case PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float + case PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (GLOBAL_DATA.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_GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_R32F; *glFormat = GL_RED; *glType = GL_FLOAT; break; - case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL_GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F; *glFormat = GL_RGB; *glType = GL_FLOAT; break; - case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL_GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; - case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL_GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_R16F; *glFormat = GL_RED; *glType = GL_HALF_FLOAT; break; - case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL_GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT; break; - case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL_GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT; break; + case PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_R8; *glFormat = GL_RED; *glType = GL_UNSIGNED_BYTE; break; + case PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: *glInternalFormat = GL_RG8; *glFormat = GL_RG; *glType = GL_UNSIGNED_BYTE; break; + case PIXELFORMAT_UNCOMPRESSED_R5G6B5: *glInternalFormat = GL_RGB565; *glFormat = GL_RGB; *glType = GL_UNSIGNED_SHORT_5_6_5; break; + case PIXELFORMAT_UNCOMPRESSED_R8G8B8: *glInternalFormat = GL_RGB8; *glFormat = GL_RGB; *glType = GL_UNSIGNED_BYTE; break; + case PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: *glInternalFormat = GL_RGB5_A1; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_5_5_5_1; break; + case PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: *glInternalFormat = GL_RGBA4; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_4_4_4_4; break; + case PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: *glInternalFormat = GL_RGBA8; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_BYTE; break; + case PIXELFORMAT_UNCOMPRESSED_R32: if (GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_R32F; *glFormat = GL_RED; *glType = GL_FLOAT; break; + case PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F; *glFormat = GL_RGB; *glType = GL_FLOAT; break; + case PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (GLOBAL_DATA.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; + case PIXELFORMAT_UNCOMPRESSED_R16: if (GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_R16F; *glFormat = GL_RED; *glType = GL_HALF_FLOAT; break; + case PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (GLOBAL_DATA.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT; break; + case PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (GLOBAL_DATA.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_GLOBAL_DATA.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break; - case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: if (RLGL_GLOBAL_DATA.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break; - case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: if (RLGL_GLOBAL_DATA.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break; - case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA: if (RLGL_GLOBAL_DATA.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break; - case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB: if (RLGL_GLOBAL_DATA.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_GLOBAL_DATA.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_GLOBAL_DATA.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_GLOBAL_DATA.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; break; // NOTE: Requires PowerVR GPU - case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: if (RLGL_GLOBAL_DATA.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; break; // NOTE: Requires PowerVR GPU - case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: if (RLGL_GLOBAL_DATA.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_GLOBAL_DATA.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3 + case PIXELFORMAT_COMPRESSED_DXT1_RGB: if (GLOBAL_DATA.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break; + case PIXELFORMAT_COMPRESSED_DXT1_RGBA: if (GLOBAL_DATA.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break; + case PIXELFORMAT_COMPRESSED_DXT3_RGBA: if (GLOBAL_DATA.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break; + case PIXELFORMAT_COMPRESSED_DXT5_RGBA: if (GLOBAL_DATA.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break; + case PIXELFORMAT_COMPRESSED_ETC1_RGB: if (GLOBAL_DATA.ExtSupported.texCompETC1) *glInternalFormat = GL_ETC1_RGB8_OES; break; // NOTE: Requires OpenGL ES 2.0 or OpenGL 4.3 + case PIXELFORMAT_COMPRESSED_ETC2_RGB: if (GLOBAL_DATA.ExtSupported.texCompETC2) *glInternalFormat = GL_COMPRESSED_RGB8_ETC2; break; // NOTE: Requires OpenGL ES 3.0 or OpenGL 4.3 + case PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: if (GLOBAL_DATA.ExtSupported.texCompETC2) *glInternalFormat = GL_COMPRESSED_RGBA8_ETC2_EAC; break; // NOTE: Requires OpenGL ES 3.0 or OpenGL 4.3 + case PIXELFORMAT_COMPRESSED_PVRT_RGB: if (GLOBAL_DATA.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; break; // NOTE: Requires PowerVR GPU + case PIXELFORMAT_COMPRESSED_PVRT_RGBA: if (GLOBAL_DATA.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; break; // NOTE: Requires PowerVR GPU + case PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: if (GLOBAL_DATA.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3 + case PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: if (GLOBAL_DATA.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3 #endif - default: RL_TRACELOG(RL_LOG_WARNING, "TEXTURE: Current format not supported (%i)", format); break; + default: RL_TRACELOG(LOG_WARNING, "TEXTURE: Current format not supported (%i)", format); break; } } // Unload texture from GPU memory -void RLGL_UnloadTexture(unsigned int id) +void unload_texture(unsigned int id) { glDeleteTextures(1, &id); } // Generate mipmap data for selected texture // NOTE: Only supports GPU mipmap generation -void RLGL_GenTextureMipmaps(unsigned int id, int width, int height, int format, int *mipmaps) +void gen_texture_mipmaps(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); @@ -3364,7 +3403,7 @@ void RLGL_GenTextureMipmaps(unsigned int id, int width, int height, int format, if (((width > 0) && ((width & (width - 1)) == 0)) && ((height > 0) && ((height & (height - 1)) == 0))) texIsPOT = true; - if ((texIsPOT) || (RLGL_GLOBAL_DATA.ExtSupported.texNPOT)) + if ((texIsPOT) || (GLOBAL_DATA.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 @@ -3373,19 +3412,19 @@ void RLGL_GenTextureMipmaps(unsigned int id, int width, int height, int format, #define MAX(a,b) (((a)>(b))? (a):(b)) *mipmaps = 1 + (int)floor(log(MAX(width, height))/log(2)); - RL_TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Mipmaps generated automatically, total: %i", id, *mipmaps); + RL_TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Mipmaps generated automatically, total: %i", id, *mipmaps); } - else RL_TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Failed to generate mipmaps", id); + else RL_TRACELOG(LOG_WARNING, "TEXTURE: [ID %i] Failed to generate mipmaps", id); glBindTexture(GL_TEXTURE_2D, 0); #else - RL_TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] GPU mipmap generation not supported", id); + RL_TRACELOG(LOG_WARNING, "TEXTURE: [ID %i] GPU mipmap generation not supported", id); #endif } // Read texture pixel data -void *RLGL_ReadTexturePixels(unsigned int id, int width, int height, int format) +void *read_texture_pixels(unsigned int id, int width, int height, int format) { void *pixels = NULL; @@ -3406,15 +3445,15 @@ void *RLGL_ReadTexturePixels(unsigned int id, int width, int height, int format) glPixelStorei(GL_PACK_ALIGNMENT, 1); unsigned int glInternalFormat, glFormat, glType; - RLGL_GetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); - unsigned int size = RLGL_GetPixelDataSize(width, height, format); + get_gl_texture_formats(format, &glInternalFormat, &glFormat, &glType); + unsigned int size = internal_get_pixel_data_size(width, height, format); - if ((glInternalFormat != 0) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)) + if ((glInternalFormat != 0) && (format < PIXELFORMAT_COMPRESSED_DXT1_RGB)) { pixels = RL_MALLOC(size); glGetTexImage(GL_TEXTURE_2D, 0, glFormat, glType, pixels); } - else RL_TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Data retrieval not suported for pixel format (%i)", id, format); + else RL_TRACELOG(LOG_WARNING, "TEXTURE: [ID %i] Data retrieval not suported for pixel format (%i)", id, format); glBindTexture(GL_TEXTURE_2D, 0); #endif @@ -3427,7 +3466,7 @@ void *RLGL_ReadTexturePixels(unsigned int id, int width, int height, int format) // 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 = RLGL_LoadFramebuffer(width, height); + unsigned int fboId = load_framebuffer(width, height); glBindFramebuffer(GL_FRAMEBUFFER, fboId); glBindTexture(GL_TEXTURE_2D, 0); @@ -3436,20 +3475,20 @@ void *RLGL_ReadTexturePixels(unsigned int id, int width, int height, int format) 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(RLGL_GetPixelDataSize(width, height, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8)); + pixels = (unsigned char *)RL_MALLOC(internal_get_pixel_data_size(width, height, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8)); glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); glBindFramebuffer(GL_FRAMEBUFFER, 0); // Clean up temporal fbo - RLGL_UnloadFramebuffer(fboId); + unload_framebuffer(fboId); #endif return pixels; } // Read screen pixel data (color buffer) -unsigned char *RLGL_ReadScreenPixels(int width, int height) +unsigned char *read_screen_pixels(int width, int height) { unsigned char *screenData = (unsigned char *)RL_CALLOC(width*height*4, sizeof(unsigned char)); @@ -3481,7 +3520,7 @@ unsigned char *RLGL_ReadScreenPixels(int width, int height) //----------------------------------------------------------------------------------------- // Load a framebuffer to be used for rendering // NOTE: No textures attached -unsigned int RLGL_LoadFramebuffer(int width, int height) +unsigned int load_framebuffer(int width, int height) { unsigned int fboId = 0; @@ -3495,37 +3534,37 @@ unsigned int RLGL_LoadFramebuffer(int width, int height) // Attach color buffer texture to an fbo (unloads previous attachment) // NOTE: Attach type: 0-Color, 1-Depth renderbuffer, 2-Depth texture -void RLGL_FramebufferAttach(unsigned int fboId, unsigned int texId, int attachType, int texType, int mipLevel) +void framebuffer_attach(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: + case ATTACHMENT_COLOR_CHANNEL0: + case ATTACHMENT_COLOR_CHANNEL1: + case ATTACHMENT_COLOR_CHANNEL2: + case ATTACHMENT_COLOR_CHANNEL3: + case ATTACHMENT_COLOR_CHANNEL4: + case ATTACHMENT_COLOR_CHANNEL5: + case ATTACHMENT_COLOR_CHANNEL6: + case 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); + if (texType == ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_TEXTURE_2D, texId, mipLevel); + else if (texType == ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_RENDERBUFFER, texId); + else if (texType >= 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: + case 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); + if (texType == ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texId, mipLevel); + else if (texType == ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, texId); } break; - case RL_ATTACHMENT_STENCIL: + case 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); + if (texType == ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texId, mipLevel); + else if (texType == ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, texId); } break; default: break; @@ -3536,7 +3575,7 @@ void RLGL_FramebufferAttach(unsigned int fboId, unsigned int texId, int attachTy } // Verify render texture is complete -bool RLGL_FramebufferComplete(unsigned int id) +bool framebuffer_complete(unsigned int id) { bool result = false; @@ -3549,12 +3588,12 @@ bool RLGL_FramebufferComplete(unsigned int id) { switch (status) { - case GL_FRAMEBUFFER_UNSUPPORTED: RL_TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer is unsupported", id); break; - case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: RL_TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer has incomplete attachment", id); break; + case GL_FRAMEBUFFER_UNSUPPORTED: RL_TRACELOG(LOG_WARNING, "FBO: [ID %i] Framebuffer is unsupported", id); break; + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: RL_TRACELOG(LOG_WARNING, "FBO: [ID %i] Framebuffer has incomplete attachment", id); break; #if defined(GRAPHICS_API_OPENGL_ES2) - case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: RL_TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer has incomplete dimensions", id); break; + case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: RL_TRACELOG(LOG_WARNING, "FBO: [ID %i] Framebuffer has incomplete dimensions", id); break; #endif - case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: RL_TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer has a missing attachment", id); break; + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: RL_TRACELOG(LOG_WARNING, "FBO: [ID %i] Framebuffer has a missing attachment", id); break; default: break; } } @@ -3569,7 +3608,7 @@ bool RLGL_FramebufferComplete(unsigned int id) // Unload framebuffer from GPU memory // NOTE: All attached textures/cubemaps/renderbuffers are also deleted -void RLGL_UnloadFramebuffer(unsigned int id) +void unload_framebuffer(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 @@ -3592,14 +3631,14 @@ void RLGL_UnloadFramebuffer(unsigned int id) glBindFramebuffer(GL_FRAMEBUFFER, 0); glDeleteFramebuffers(1, &id); - RL_TRACELOG(RL_LOG_INFO, "FBO: [ID %i] Unloaded framebuffer from VRAM (GPU)", id); + RL_TRACELOG(LOG_INFO, "FBO: [ID %i] Unloaded framebuffer from VRAM (GPU)", id); #endif } // Vertex data management //----------------------------------------------------------------------------------------- // Load a new attributes buffer -unsigned int RLGL_LoadVertexBuffer(const void *buffer, int size, bool dynamic) +unsigned int load_vertex_buffer(const void *buffer, int size, bool dynamic) { unsigned int id = 0; @@ -3613,7 +3652,7 @@ unsigned int RLGL_LoadVertexBuffer(const void *buffer, int size, bool dynamic) } // Load a new attributes element buffer -unsigned int RLGL_LoadVertexBufferElement(const void *buffer, int size, bool dynamic) +unsigned int load_vertex_buffer_element(const void *buffer, int size, bool dynamic) { unsigned int id = 0; @@ -3627,7 +3666,7 @@ unsigned int RLGL_LoadVertexBufferElement(const void *buffer, int size, bool dyn } // Enable vertex buffer (VBO) -void RLGL_EnableVertexBuffer(unsigned int id) +void enable_vertex_buffer(unsigned int id) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glBindBuffer(GL_ARRAY_BUFFER, id); @@ -3635,7 +3674,7 @@ void RLGL_EnableVertexBuffer(unsigned int id) } // Disable vertex buffer (VBO) -void RLGL_DisableVertexBuffer(void) +void disable_vertex_buffer(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -3643,7 +3682,7 @@ void RLGL_DisableVertexBuffer(void) } // Enable vertex buffer element (VBO element) -void RLGL_EnableVertexBufferElement(unsigned int id) +void enable_vertex_buffer_element(unsigned int id) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); @@ -3651,7 +3690,7 @@ void RLGL_EnableVertexBufferElement(unsigned int id) } // Disable vertex buffer element (VBO element) -void RLGL_DisableVertexBufferElement(void) +void disable_vertex_buffer_element(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); @@ -3660,7 +3699,7 @@ void RLGL_DisableVertexBufferElement(void) // Update vertex buffer with new data // NOTE: dataSize and offset must be provided in bytes -void RLGL_UpdateVertexBuffer(unsigned int id, const void *data, int dataSize, int offset) +void update_vertex_buffer(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); @@ -3670,7 +3709,7 @@ void RLGL_UpdateVertexBuffer(unsigned int id, const void *data, int dataSize, in // Update vertex buffer elements with new data // NOTE: dataSize and offset must be provided in bytes -void RLGL_UpdateVertexBufferElements(unsigned int id, const void *data, int dataSize, int offset) +void update_vertex_buffer_elements(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); @@ -3679,11 +3718,11 @@ void RLGL_UpdateVertexBufferElements(unsigned int id, const void *data, int data } // Enable vertex array object (VAO) -bool RLGL_EnableVertexArray(unsigned int vaoId) +bool enable_vertex_array(unsigned int vaoId) { bool result = false; #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - if (RLGL_GLOBAL_DATA.ExtSupported.vao) + if (GLOBAL_DATA.ExtSupported.vao) { glBindVertexArray(vaoId); result = true; @@ -3693,15 +3732,15 @@ bool RLGL_EnableVertexArray(unsigned int vaoId) } // Disable vertex array object (VAO) -void RLGL_DisableVertexArray(void) +void disable_vertex_array(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - if (RLGL_GLOBAL_DATA.ExtSupported.vao) glBindVertexArray(0); + if (GLOBAL_DATA.ExtSupported.vao) glBindVertexArray(0); #endif } // Enable vertex attribute index -void RLGL_EnableVertexAttribute(unsigned int index) +void enable_vertex_attribute(unsigned int index) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glEnableVertexAttribArray(index); @@ -3709,7 +3748,7 @@ void RLGL_EnableVertexAttribute(unsigned int index) } // Disable vertex attribute index -void RLGL_DisableVertexAttribute(unsigned int index) +void disable_vertex_attribute(unsigned int index) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glDisableVertexAttribArray(index); @@ -3717,13 +3756,13 @@ void RLGL_DisableVertexAttribute(unsigned int index) } // Draw vertex array -void RLGL_DrawVertexArray(int offset, int count) +void draw_vertex_array(int offset, int count) { glDrawArrays(GL_TRIANGLES, offset, count); } // Draw vertex array elements -void RLGL_DrawVertexArrayElements(int offset, int count, const void *buffer) +void draw_vertex_array_elements(int offset, int count, const void *buffer) { // NOTE: Added pointer math separately from function to avoid UBSAN complaining unsigned short *bufferPtr = (unsigned short *)buffer; @@ -3733,7 +3772,7 @@ void RLGL_DrawVertexArrayElements(int offset, int count, const void *buffer) } // Draw vertex array instanced -void RLGL_DrawVertexArrayInstanced(int offset, int count, int instances) +void draw_vertex_array_instanced(int offset, int count, int instances) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glDrawArraysInstanced(GL_TRIANGLES, 0, count, instances); @@ -3741,7 +3780,7 @@ void RLGL_DrawVertexArrayInstanced(int offset, int count, int instances) } // Draw vertex array elements instanced -void RLGL_DrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances) +void draw_vertex_array_elements_instanced(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 @@ -3754,7 +3793,7 @@ void RLGL_DrawVertexArrayElementsInstanced(int offset, int count, const void *bu #if defined(GRAPHICS_API_OPENGL_11) // Enable vertex state pointer -void RLGL_EnableStatePointer(int vertexAttribType, void *buffer) +void enable_state_pointer(int vertexAttribType, void *buffer) { if (buffer != NULL) glEnableClientState(vertexAttribType); switch (vertexAttribType) @@ -3769,18 +3808,18 @@ void RLGL_EnableStatePointer(int vertexAttribType, void *buffer) } // Disable vertex state pointer -void RLGL_DisableStatePointer(int vertexAttribType) +void disable_state_pointer(int vertexAttribType) { glDisableClientState(vertexAttribType); } #endif // Load vertex array object (VAO) -unsigned int RLGL_LoadVertexArray(void) +unsigned int load_vertex_array(void) { unsigned int vaoId = 0; #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - if (RLGL_GLOBAL_DATA.ExtSupported.vao) + if (GLOBAL_DATA.ExtSupported.vao) { glGenVertexArrays(1, &vaoId); } @@ -3789,7 +3828,7 @@ unsigned int RLGL_LoadVertexArray(void) } // Set vertex attribute -void RLGL_SetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int stride, const void *pointer) +void set_vertex_attribute(unsigned int index, int compSize, int type, bool normalized, int stride, const void *pointer) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glVertexAttribPointer(index, compSize, type, normalized, stride, pointer); @@ -3797,7 +3836,7 @@ void RLGL_SetVertexAttribute(unsigned int index, int compSize, int type, bool no } // Set vertex attribute divisor -void RLGL_SetVertexAttributeDivisor(unsigned int index, int divisor) +void set_vertex_attribute_divisor(unsigned int index, int divisor) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glVertexAttribDivisor(index, divisor); @@ -3805,24 +3844,24 @@ void RLGL_SetVertexAttributeDivisor(unsigned int index, int divisor) } // Unload vertex array object (VAO) -void RLGL_UnloadVertexArray(unsigned int vaoId) +void unload_vertex_array(unsigned int vaoId) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - if (RLGL_GLOBAL_DATA.ExtSupported.vao) + if (GLOBAL_DATA.ExtSupported.vao) { glBindVertexArray(0); glDeleteVertexArrays(1, &vaoId); - RL_TRACELOG(RL_LOG_INFO, "VAO: [ID %i] Unloaded vertex array data from VRAM (GPU)", vaoId); + RL_TRACELOG(LOG_INFO, "VAO: [ID %i] Unloaded vertex array data from VRAM (GPU)", vaoId); } #endif } // Unload vertex buffer (VBO) -void RLGL_UnloadVertexBuffer(unsigned int vboId) +void unload_vertex_buffer(unsigned int vboId) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glDeleteBuffers(1, &vboId); - //RL_TRACELOG(RL_LOG_INFO, "VBO: Unloaded vertex data from VRAM (GPU)"); + //RL_TRACELOG(LOG_INFO, "VBO: Unloaded vertex data from VRAM (GPU)"); #endif } @@ -3830,7 +3869,7 @@ void RLGL_UnloadVertexBuffer(unsigned int vboId) //----------------------------------------------------------------------------------------------- // Load shader from code strings // NOTE: If shader string is NULL, using default vertex/fragment shaders -unsigned int RLGL_LoadShaderCode(const char *vsCode, const char *fsCode) +unsigned int load_shader_code(const char *vsCode, const char *fsCode) { unsigned int id = 0; @@ -3839,31 +3878,31 @@ unsigned int RLGL_LoadShaderCode(const char *vsCode, const char *fsCode) unsigned int fragmentShaderId = 0; // Compile vertex shader (if provided) - if (vsCode != NULL) vertexShaderId = RLGL_CompileShader(vsCode, GL_VERTEX_SHADER); + if (vsCode != NULL) vertexShaderId = compile_shader(vsCode, GL_VERTEX_SHADER); // In case no vertex shader was provided or compilation failed, we use default vertex shader - if (vertexShaderId == 0) vertexShaderId = RLGL_GLOBAL_DATA.State.defaultVShaderId; + if (vertexShaderId == 0) vertexShaderId = GLOBAL_DATA.State.defaultVShaderId; // Compile fragment shader (if provided) - if (fsCode != NULL) fragmentShaderId = RLGL_CompileShader(fsCode, GL_FRAGMENT_SHADER); + if (fsCode != NULL) fragmentShaderId = compile_shader(fsCode, GL_FRAGMENT_SHADER); // In case no fragment shader was provided or compilation failed, we use default fragment shader - if (fragmentShaderId == 0) fragmentShaderId = RLGL_GLOBAL_DATA.State.defaultFShaderId; + if (fragmentShaderId == 0) fragmentShaderId = GLOBAL_DATA.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_GLOBAL_DATA.State.defaultVShaderId) && (fragmentShaderId == RLGL_GLOBAL_DATA.State.defaultFShaderId)) id = RLGL_GLOBAL_DATA.State.defaultShaderId; + if ((vertexShaderId == GLOBAL_DATA.State.defaultVShaderId) && (fragmentShaderId == GLOBAL_DATA.State.defaultFShaderId)) id = GLOBAL_DATA.State.defaultShaderId; else { // One of or both shader are new, we need to compile a new shader program - id = RLGL_LoadShaderProgram(vertexShaderId, fragmentShaderId); + id = load_shader_program(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_GLOBAL_DATA.State.defaultVShaderId) + if (vertexShaderId != GLOBAL_DATA.State.defaultVShaderId) { // WARNING: Shader program linkage could fail and returned id is 0 if (id > 0) glDetachShader(id, vertexShaderId); glDeleteShader(vertexShaderId); } - if (fragmentShaderId != RLGL_GLOBAL_DATA.State.defaultFShaderId) + if (fragmentShaderId != GLOBAL_DATA.State.defaultFShaderId) { // WARNING: Shader program linkage could fail and returned id is 0 if (id > 0) glDetachShader(id, fragmentShaderId); @@ -3874,8 +3913,8 @@ unsigned int RLGL_LoadShaderCode(const char *vsCode, const char *fsCode) if (id == 0) { // In case shader loading fails, we return the default shader - RL_TRACELOG(RL_LOG_WARNING, "SHADER: Failed to load custom shader code, using default shader"); - id = RLGL_GLOBAL_DATA.State.defaultShaderId; + RL_TRACELOG(LOG_WARNING, "SHADER: Failed to load custom shader code, using default shader"); + id = GLOBAL_DATA.State.defaultShaderId; } /* else @@ -3907,7 +3946,7 @@ unsigned int RLGL_LoadShaderCode(const char *vsCode, const char *fsCode) } // Compile custom shader and return shader id -unsigned int RLGL_CompileShader(const char *shaderCode, int type) +unsigned int compile_shader(const char *shaderCode, int type) { unsigned int shader = 0; @@ -3923,11 +3962,11 @@ unsigned int RLGL_CompileShader(const char *shaderCode, int type) { switch (type) { - case GL_VERTEX_SHADER: RL_TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile vertex shader code", shader); break; - case GL_FRAGMENT_SHADER: RL_TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile fragment shader code", shader); break; + case GL_VERTEX_SHADER: RL_TRACELOG(LOG_WARNING, "SHADER: [ID %i] Failed to compile vertex shader code", shader); break; + case GL_FRAGMENT_SHADER: RL_TRACELOG(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: RL_TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile compute shader code", shader); break; + case GL_COMPUTE_SHADER: RL_TRACELOG(LOG_WARNING, "SHADER: [ID %i] Failed to compile compute shader code", shader); break; #endif default: break; } @@ -3940,7 +3979,7 @@ unsigned int RLGL_CompileShader(const char *shaderCode, int type) int length = 0; char *log = (char *)RL_CALLOC(maxLength, sizeof(char)); glGetShaderInfoLog(shader, maxLength, &length, log); - RL_TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Compile error: %s", shader, log); + RL_TRACELOG(LOG_WARNING, "SHADER: [ID %i] Compile error: %s", shader, log); RL_FREE(log); } } @@ -3948,11 +3987,11 @@ unsigned int RLGL_CompileShader(const char *shaderCode, int type) { switch (type) { - case GL_VERTEX_SHADER: RL_TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Vertex shader compiled successfully", shader); break; - case GL_FRAGMENT_SHADER: RL_TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Fragment shader compiled successfully", shader); break; + case GL_VERTEX_SHADER: RL_TRACELOG(LOG_INFO, "SHADER: [ID %i] Vertex shader compiled successfully", shader); break; + case GL_FRAGMENT_SHADER: RL_TRACELOG(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: RL_TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Compute shader compiled successfully", shader); break; + case GL_COMPUTE_SHADER: RL_TRACELOG(LOG_INFO, "SHADER: [ID %i] Compute shader compiled successfully", shader); break; #endif default: break; } @@ -3963,7 +4002,7 @@ unsigned int RLGL_CompileShader(const char *shaderCode, int type) } // Load custom shader strings and return program id -unsigned int RLGL_LoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId) +unsigned int load_shader_program(unsigned int vShaderId, unsigned int fShaderId) { unsigned int program = 0; @@ -3992,7 +4031,7 @@ unsigned int RLGL_LoadShaderProgram(unsigned int vShaderId, unsigned int fShader if (success == GL_FALSE) { - RL_TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to link shader program", program); + RL_TRACELOG(LOG_WARNING, "SHADER: [ID %i] Failed to link shader program", program); int maxLength = 0; glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength); @@ -4002,7 +4041,7 @@ unsigned int RLGL_LoadShaderProgram(unsigned int vShaderId, unsigned int fShader int length = 0; char *log = (char *)RL_CALLOC(maxLength, sizeof(char)); glGetProgramInfoLog(program, maxLength, &length, log); - RL_TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Link error: %s", program, log); + RL_TRACELOG(LOG_WARNING, "SHADER: [ID %i] Link error: %s", program, log); RL_FREE(log); } @@ -4017,85 +4056,85 @@ unsigned int RLGL_LoadShaderProgram(unsigned int vShaderId, unsigned int fShader //GLint binarySize = 0; //glGetProgramiv(id, GL_PROGRAM_BINARY_LENGTH, &binarySize); - RL_TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Program shader loaded successfully", program); + RL_TRACELOG(LOG_INFO, "SHADER: [ID %i] Program shader loaded successfully", program); } #endif return program; } // Unload shader program -void RLGL_UnloadShaderProgram(unsigned int id) +void unload_shader_program(unsigned int id) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glDeleteProgram(id); - RL_TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Unloaded shader program data from VRAM (GPU)", id); + RL_TRACELOG(LOG_INFO, "SHADER: [ID %i] Unloaded shader program data from VRAM (GPU)", id); #endif } // Get shader location uniform -int RLGL_GetLocationUniform(unsigned int shaderId, const char *uniformName) +int get_location_uniform(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) RL_TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to find shader uniform: %s", shaderId, uniformName); - //else RL_TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Shader uniform (%s) set at location: %i", shaderId, uniformName, location); + //if (location == -1) RL_TRACELOG(LOG_WARNING, "SHADER: [ID %i] Failed to find shader uniform: %s", shaderId, uniformName); + //else RL_TRACELOG(LOG_INFO, "SHADER: [ID %i] Shader uniform (%s) set at location: %i", shaderId, uniformName, location); #endif return location; } // Get shader location attribute -int RLGL_GetLocationAttrib(unsigned int shaderId, const char *attribName) +int get_location_attrib(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) RL_TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to find shader attribute: %s", shaderId, attribName); - //else RL_TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Shader attribute (%s) set at location: %i", shaderId, attribName, location); + //if (location == -1) RL_TRACELOG(LOG_WARNING, "SHADER: [ID %i] Failed to find shader attribute: %s", shaderId, attribName); + //else RL_TRACELOG(LOG_INFO, "SHADER: [ID %i] Shader attribute (%s) set at location: %i", shaderId, attribName, location); #endif return location; } // Set shader value uniform -void RLGL_SetUniform(int locIndex, const void *value, int uniformType, int count) +void set_uniform(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; - case RL_SHADER_UNIFORM_SAMPLER2D: glUniform1iv(locIndex, count, (int *)value); break; - default: RL_TRACELOG(RL_LOG_WARNING, "SHADER: Failed to set uniform value, data type not recognized"); + case SHADER_UNIFORM_FLOAT: glUniform1fv(locIndex, count, (float *)value); break; + case SHADER_UNIFORM_VEC2: glUniform2fv(locIndex, count, (float *)value); break; + case SHADER_UNIFORM_VEC3: glUniform3fv(locIndex, count, (float *)value); break; + case SHADER_UNIFORM_VEC4: glUniform4fv(locIndex, count, (float *)value); break; + case SHADER_UNIFORM_INT: glUniform1iv(locIndex, count, (int *)value); break; + case SHADER_UNIFORM_IVEC2: glUniform2iv(locIndex, count, (int *)value); break; + case SHADER_UNIFORM_IVEC3: glUniform3iv(locIndex, count, (int *)value); break; + case SHADER_UNIFORM_IVEC4: glUniform4iv(locIndex, count, (int *)value); break; + case SHADER_UNIFORM_SAMPLER2D: glUniform1iv(locIndex, count, (int *)value); break; + default: RL_TRACELOG(LOG_WARNING, "SHADER: Failed to set uniform value, data type not recognized"); } #endif } // Set shader value attribute -void RLGL_SetVertexAttributeDefault(int locIndex, const void *value, int attribType, int count) +void set_vertex_attribute_default(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: RL_TRACELOG(RL_LOG_WARNING, "SHADER: Failed to set attrib default value, data type not recognized"); + case SHADER_ATTRIB_FLOAT: if (count == 1) glVertexAttrib1fv(locIndex, (float *)value); break; + case SHADER_ATTRIB_VEC2: if (count == 2) glVertexAttrib2fv(locIndex, (float *)value); break; + case SHADER_ATTRIB_VEC3: if (count == 3) glVertexAttrib3fv(locIndex, (float *)value); break; + case SHADER_ATTRIB_VEC4: if (count == 4) glVertexAttrib4fv(locIndex, (float *)value); break; + default: RL_TRACELOG(LOG_WARNING, "SHADER: Failed to set attrib default value, data type not recognized"); } #endif } // Set shader value uniform matrix -void RLGL_SetUniformMatrix(int locIndex, RL_Matrix mat) +void set_uniform_matrix(int locIndex, Matrix mat) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) float matfloat[16] = { @@ -4109,20 +4148,20 @@ void RLGL_SetUniformMatrix(int locIndex, RL_Matrix mat) } // Set shader value uniform sampler -void RLGL_SetUniformSampler(int locIndex, unsigned int textureId) +void set_uniform_sampler(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_GLOBAL_DATA.State.activeTextureId[i] == textureId) return; + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) if (GLOBAL_DATA.State.activeTextureId[i] == textureId) 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_GLOBAL_DATA.State.activeTextureId[i] == 0) + if (GLOBAL_DATA.State.activeTextureId[i] == 0) { glUniform1i(locIndex, 1 + i); // Activate new texture unit - RLGL_GLOBAL_DATA.State.activeTextureId[i] = textureId; // Save texture id for binding on drawing + GLOBAL_DATA.State.activeTextureId[i] = textureId; // Save texture id for binding on drawing break; } } @@ -4130,20 +4169,20 @@ void RLGL_SetUniformSampler(int locIndex, unsigned int textureId) } // Set shader currently active (id and locations) -void RLGL_SetShader(unsigned int id, int *locs) +void set_shader(unsigned int id, int *locs) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - if (RLGL_GLOBAL_DATA.State.currentShaderId != id) + if (GLOBAL_DATA.State.currentShaderId != id) { - RLGL_DrawRenderBatch(RLGL_GLOBAL_DATA.currentBatch); - RLGL_GLOBAL_DATA.State.currentShaderId = id; - RLGL_GLOBAL_DATA.State.currentShaderLocs = locs; + draw_render_batch(GLOBAL_DATA.currentBatch); + GLOBAL_DATA.State.currentShaderId = id; + GLOBAL_DATA.State.currentShaderLocs = locs; } #endif } // Load compute shader program -unsigned int RLGL_LoadComputeShaderProgram(unsigned int shaderId) +unsigned int load_compute_shader_program(unsigned int shaderId) { unsigned int program = 0; @@ -4159,7 +4198,7 @@ unsigned int RLGL_LoadComputeShaderProgram(unsigned int shaderId) if (success == GL_FALSE) { - RL_TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to link compute shader program", program); + RL_TRACELOG(LOG_WARNING, "SHADER: [ID %i] Failed to link compute shader program", program); int maxLength = 0; glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength); @@ -4169,7 +4208,7 @@ unsigned int RLGL_LoadComputeShaderProgram(unsigned int shaderId) int length = 0; char *log = (char *)RL_CALLOC(maxLength, sizeof(char)); glGetProgramInfoLog(program, maxLength, &length, log); - RL_TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Link error: %s", program, log); + RL_TRACELOG(LOG_WARNING, "SHADER: [ID %i] Link error: %s", program, log); RL_FREE(log); } @@ -4184,7 +4223,7 @@ unsigned int RLGL_LoadComputeShaderProgram(unsigned int shaderId) //GLint binarySize = 0; //glGetProgramiv(id, GL_PROGRAM_BINARY_LENGTH, &binarySize); - RL_TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Compute shader program loaded successfully", program); + RL_TRACELOG(LOG_INFO, "SHADER: [ID %i] Compute shader program loaded successfully", program); } #endif @@ -4192,7 +4231,7 @@ unsigned int RLGL_LoadComputeShaderProgram(unsigned int shaderId) } // Dispatch compute shader (equivalent to *draw* for graphics pilepine) -void RLGL_ComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ) +void compute_shader_dispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ) { #if defined(GRAPHICS_API_OPENGL_43) glDispatchCompute(groupX, groupY, groupZ); @@ -4200,7 +4239,7 @@ void RLGL_ComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsign } // Load shader storage buffer object (SSBO) -unsigned int RLGL_LoadShaderBuffer(unsigned int size, const void *data, int usageHint) +unsigned int load_shader_buffer(unsigned int size, const void *data, int usageHint) { unsigned int ssbo = 0; @@ -4216,7 +4255,7 @@ unsigned int RLGL_LoadShaderBuffer(unsigned int size, const void *data, int usag } // Unload shader storage buffer object (SSBO) -void RLGL_UnloadShaderBuffer(unsigned int ssboId) +void unload_shader_buffer(unsigned int ssboId) { #if defined(GRAPHICS_API_OPENGL_43) glDeleteBuffers(1, &ssboId); @@ -4224,7 +4263,7 @@ void RLGL_UnloadShaderBuffer(unsigned int ssboId) } // Update SSBO buffer data -void RLGL_UpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int offset) +void update_shader_buffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int offset) { #if defined(GRAPHICS_API_OPENGL_43) glBindBuffer(GL_SHADER_STORAGE_BUFFER, id); @@ -4233,7 +4272,7 @@ void RLGL_UpdateShaderBuffer(unsigned int id, const void *data, unsigned int dat } // Get SSBO buffer size -unsigned int RLGL_GetShaderBufferSize(unsigned int id) +unsigned int get_shader_buffer_size(unsigned int id) { long long size = 0; @@ -4246,7 +4285,7 @@ unsigned int RLGL_GetShaderBufferSize(unsigned int id) } // Read SSBO buffer data (GPU->CPU) -void RLGL_ReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsigned int offset) +void read_shader_buffer(unsigned int id, void *dest, unsigned int count, unsigned int offset) { #if defined(GRAPHICS_API_OPENGL_43) glBindBuffer(GL_SHADER_STORAGE_BUFFER, id); @@ -4255,7 +4294,7 @@ void RLGL_ReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsi } // Bind SSBO buffer -void RLGL_BindShaderBuffer(unsigned int id, unsigned int index) +void bind_shader_buffer(unsigned int id, unsigned int index) { #if defined(GRAPHICS_API_OPENGL_43) glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, id); @@ -4263,7 +4302,7 @@ void RLGL_BindShaderBuffer(unsigned int id, unsigned int index) } // Copy SSBO buffer data -void RLGL_CopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, unsigned int srcOffset, unsigned int count) +void copy_shader_buffer(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); @@ -4273,22 +4312,22 @@ void RLGL_CopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int } // Bind image texture -void RLGL_BindImageTexture(unsigned int id, unsigned int index, int format, bool readonly) +void bind_image_texture(unsigned int id, unsigned int index, int format, bool readonly) { #if defined(GRAPHICS_API_OPENGL_43) unsigned int glInternalFormat = 0, glFormat = 0, glType = 0; - RLGL_GetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + get_gl_texture_formats(format, &glInternalFormat, &glFormat, &glType); glBindImageTexture(index, id, 0, 0, 0, readonly? GL_READ_ONLY : GL_READ_WRITE, glInternalFormat); #endif } -// RL_Matrix state management +// Matrix state management //----------------------------------------------------------------------------------------- // Get internal modelview matrix -RL_Matrix RLGL_GetMatrixModelview(void) +Matrix get_matrix_modelview(void) { - RL_Matrix matrix = RLGL_MatrixIdentity(); + Matrix matrix = internal_matrix_identity(); #if defined(GRAPHICS_API_OPENGL_11) float mat[16]; glGetFloatv(GL_MODELVIEW_MATRIX, mat); @@ -4309,18 +4348,18 @@ RL_Matrix RLGL_GetMatrixModelview(void) matrix.m14 = mat[14]; matrix.m15 = mat[15]; #else - matrix = RLGL_GLOBAL_DATA.State.modelview; + matrix = GLOBAL_DATA.State.modelview; #endif return matrix; } // Get internal projection matrix -RL_Matrix RLGL_GetMatrixProjection(void) +Matrix get_matrix_projection(void) { #if defined(GRAPHICS_API_OPENGL_11) float mat[16]; glGetFloatv(GL_PROJECTION_MATRIX,mat); - RL_Matrix m; + Matrix m; m.m0 = mat[0]; m.m1 = mat[1]; m.m2 = mat[2]; @@ -4339,80 +4378,80 @@ RL_Matrix RLGL_GetMatrixProjection(void) m.m15 = mat[15]; return m; #else - return RLGL_GLOBAL_DATA.State.projection; + return GLOBAL_DATA.State.projection; #endif } // Get internal accumulated transform matrix -RL_Matrix RLGL_GetMatrixTransform(void) +Matrix get_matrix_transform(void) { - RL_Matrix mat = RLGL_MatrixIdentity(); + Matrix mat = internal_matrix_identity(); #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - // TODO: Consider possible transform matrices in the RLGL_GLOBAL_DATA.State.stack + // TODO: Consider possible transform matrices in the GLOBAL_DATA.State.stack // Is this the right order? or should we start with the first stored matrix instead of the last one? - //RL_Matrix matStackTransform = RLGL_MatrixIdentity(); - //for (int i = RLGL_GLOBAL_DATA.State.stackCounter; i > 0; i--) matStackTransform = RLGL_MatrixMultiply(RLGL_GLOBAL_DATA.State.stack[i], matStackTransform); - mat = RLGL_GLOBAL_DATA.State.transform; + //Matrix matStackTransform = internal_matrix_identity(); + //for (int i = GLOBAL_DATA.State.stackCounter; i > 0; i--) matStackTransform = internal_matrix_multiply(GLOBAL_DATA.State.stack[i], matStackTransform); + mat = GLOBAL_DATA.State.transform; #endif return mat; } // Get internal projection matrix for stereo render (selected eye) -RLAPI RL_Matrix RLGL_GetMatrixProjectionStereo(int eye) +RLAPI Matrix get_matrix_projection_stereo(int eye) { - RL_Matrix mat = RLGL_MatrixIdentity(); + Matrix mat = internal_matrix_identity(); #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - mat = RLGL_GLOBAL_DATA.State.projectionStereo[eye]; + mat = GLOBAL_DATA.State.projectionStereo[eye]; #endif return mat; } // Get internal view offset matrix for stereo render (selected eye) -RLAPI RL_Matrix RLGL_GetMatrixViewOffsetStereo(int eye) +RLAPI Matrix get_matrix_view_offset_stereo(int eye) { - RL_Matrix mat = RLGL_MatrixIdentity(); + Matrix mat = internal_matrix_identity(); #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - mat = RLGL_GLOBAL_DATA.State.viewOffsetStereo[eye]; + mat = GLOBAL_DATA.State.viewOffsetStereo[eye]; #endif return mat; } // Set a custom modelview matrix (replaces internal modelview matrix) -void RLGL_SetMatrixModelview(RL_Matrix view) +void set_matrix_modelview(Matrix view) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - RLGL_GLOBAL_DATA.State.modelview = view; + GLOBAL_DATA.State.modelview = view; #endif } // Set a custom projection matrix (replaces internal projection matrix) -void RLGL_SetMatrixProjection(RL_Matrix projection) +void set_matrix_projection(Matrix projection) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - RLGL_GLOBAL_DATA.State.projection = projection; + GLOBAL_DATA.State.projection = projection; #endif } // Set eyes projection matrices for stereo rendering -void RLGL_SetMatrixProjectionStereo(RL_Matrix right, RL_Matrix left) +void set_matrix_projection_stereo(Matrix right, Matrix left) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - RLGL_GLOBAL_DATA.State.projectionStereo[0] = right; - RLGL_GLOBAL_DATA.State.projectionStereo[1] = left; + GLOBAL_DATA.State.projectionStereo[0] = right; + GLOBAL_DATA.State.projectionStereo[1] = left; #endif } // Set eyes view offsets matrices for stereo rendering -void RLGL_SetMatrixViewOffsetStereo(RL_Matrix right, RL_Matrix left) +void set_matrix_view_offset_stereo(Matrix right, Matrix left) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - RLGL_GLOBAL_DATA.State.viewOffsetStereo[0] = right; - RLGL_GLOBAL_DATA.State.viewOffsetStereo[1] = left; + GLOBAL_DATA.State.viewOffsetStereo[0] = right; + GLOBAL_DATA.State.viewOffsetStereo[1] = left; #endif } // Load and draw a quad in NDC -void RLGL_LoadDrawQuad(void) +void load_draw_quad(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) unsigned int quadVAO = 0; @@ -4453,7 +4492,7 @@ void RLGL_LoadDrawQuad(void) } // Load and draw a cube in NDC -void RLGL_LoadDrawCube(void) +void load_draw_cube(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) unsigned int cubeVAO = 0; @@ -4531,34 +4570,34 @@ void RLGL_LoadDrawCube(void) } // Get name string for pixel format -const char *RLGL_GetPixelFormatName(unsigned int format) +const char *get_pixel_format_name(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 + case PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: return "GRAYSCALE"; break; // 8 bit per pixel (no alpha) + case PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: return "GRAY_ALPHA"; break; // 8*2 bpp (2 channels) + case PIXELFORMAT_UNCOMPRESSED_R5G6B5: return "R5G6B5"; break; // 16 bpp + case PIXELFORMAT_UNCOMPRESSED_R8G8B8: return "R8G8B8"; break; // 24 bpp + case PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: return "R5G5B5A1"; break; // 16 bpp (1 bit alpha) + case PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: return "R4G4B4A4"; break; // 16 bpp (4 bit alpha) + case PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: return "R8G8B8A8"; break; // 32 bpp + case PIXELFORMAT_UNCOMPRESSED_R32: return "R32"; break; // 32 bpp (1 channel - float) + case PIXELFORMAT_UNCOMPRESSED_R32G32B32: return "R32G32B32"; break; // 32*3 bpp (3 channels - float) + case PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: return "R32G32B32A32"; break; // 32*4 bpp (4 channels - float) + case PIXELFORMAT_UNCOMPRESSED_R16: return "R16"; break; // 16 bpp (1 channel - half float) + case PIXELFORMAT_UNCOMPRESSED_R16G16B16: return "R16G16B16"; break; // 16*3 bpp (3 channels - half float) + case PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: return "R16G16B16A16"; break; // 16*4 bpp (4 channels - half float) + case PIXELFORMAT_COMPRESSED_DXT1_RGB: return "DXT1_RGB"; break; // 4 bpp (no alpha) + case PIXELFORMAT_COMPRESSED_DXT1_RGBA: return "DXT1_RGBA"; break; // 4 bpp (1 bit alpha) + case PIXELFORMAT_COMPRESSED_DXT3_RGBA: return "DXT3_RGBA"; break; // 8 bpp + case PIXELFORMAT_COMPRESSED_DXT5_RGBA: return "DXT5_RGBA"; break; // 8 bpp + case PIXELFORMAT_COMPRESSED_ETC1_RGB: return "ETC1_RGB"; break; // 4 bpp + case PIXELFORMAT_COMPRESSED_ETC2_RGB: return "ETC2_RGB"; break; // 4 bpp + case PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: return "ETC2_RGBA"; break; // 8 bpp + case PIXELFORMAT_COMPRESSED_PVRT_RGB: return "PVRT_RGB"; break; // 4 bpp + case PIXELFORMAT_COMPRESSED_PVRT_RGBA: return "PVRT_RGBA"; break; // 4 bpp + case PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: return "ASTC_4x4_RGBA"; break; // 8 bpp + case PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: return "ASTC_8x8_RGBA"; break; // 2 bpp default: return "UNKNOWN"; break; } } @@ -4569,13 +4608,13 @@ const char *RLGL_GetPixelFormatName(unsigned int format) #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_GLOBAL_DATA.State.defaultShaderId, RLGL_GLOBAL_DATA.State.defaultShaderLocs -static void RLGL_LoadShaderDefault(void) +// NOTE: Loaded: GLOBAL_DATA.State.defaultShaderId, GLOBAL_DATA.State.defaultShaderLocs +static void load_shader_default(void) { - RLGL_GLOBAL_DATA.State.defaultShaderLocs = (int *)RL_CALLOC(RL_MAX_SHADER_LOCATIONS, sizeof(int)); + GLOBAL_DATA.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_GLOBAL_DATA.State.defaultShaderLocs[i] = -1; + for (int i = 0; i < RL_MAX_SHADER_LOCATIONS; i++) GLOBAL_DATA.State.defaultShaderLocs[i] = -1; // Vertex shader directly defined, no external file required const char *defaultVShaderCode = @@ -4653,49 +4692,49 @@ static void RLGL_LoadShaderDefault(void) // NOTE: Compiled vertex/fragment shaders are not deleted, // they are kept for re-use as default shaders in case some shader loading fails - RLGL_GLOBAL_DATA.State.defaultVShaderId = RLGL_CompileShader(defaultVShaderCode, GL_VERTEX_SHADER); // Compile default vertex shader - RLGL_GLOBAL_DATA.State.defaultFShaderId = RLGL_CompileShader(defaultFShaderCode, GL_FRAGMENT_SHADER); // Compile default fragment shader + GLOBAL_DATA.State.defaultVShaderId = compile_shader(defaultVShaderCode, GL_VERTEX_SHADER); // Compile default vertex shader + GLOBAL_DATA.State.defaultFShaderId = compile_shader(defaultFShaderCode, GL_FRAGMENT_SHADER); // Compile default fragment shader - RLGL_GLOBAL_DATA.State.defaultShaderId = RLGL_LoadShaderProgram(RLGL_GLOBAL_DATA.State.defaultVShaderId, RLGL_GLOBAL_DATA.State.defaultFShaderId); + GLOBAL_DATA.State.defaultShaderId = load_shader_program(GLOBAL_DATA.State.defaultVShaderId, GLOBAL_DATA.State.defaultFShaderId); - if (RLGL_GLOBAL_DATA.State.defaultShaderId > 0) + if (GLOBAL_DATA.State.defaultShaderId > 0) { - RL_TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Default shader loaded successfully", RLGL_GLOBAL_DATA.State.defaultShaderId); + RL_TRACELOG(LOG_INFO, "SHADER: [ID %i] Default shader loaded successfully", GLOBAL_DATA.State.defaultShaderId); // Set default shader locations: attributes locations - RLGL_GLOBAL_DATA.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_POSITION] = glGetAttribLocation(RLGL_GLOBAL_DATA.State.defaultShaderId, "vertexPosition"); - RLGL_GLOBAL_DATA.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01] = glGetAttribLocation(RLGL_GLOBAL_DATA.State.defaultShaderId, "vertexTexCoord"); - RLGL_GLOBAL_DATA.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_COLOR] = glGetAttribLocation(RLGL_GLOBAL_DATA.State.defaultShaderId, "vertexColor"); + GLOBAL_DATA.State.defaultShaderLocs[SHADER_LOC_VERTEX_POSITION] = glGetAttribLocation(GLOBAL_DATA.State.defaultShaderId, "vertexPosition"); + GLOBAL_DATA.State.defaultShaderLocs[SHADER_LOC_VERTEX_TEXCOORD01] = glGetAttribLocation(GLOBAL_DATA.State.defaultShaderId, "vertexTexCoord"); + GLOBAL_DATA.State.defaultShaderLocs[SHADER_LOC_VERTEX_COLOR] = glGetAttribLocation(GLOBAL_DATA.State.defaultShaderId, "vertexColor"); // Set default shader locations: uniform locations - RLGL_GLOBAL_DATA.State.defaultShaderLocs[RL_SHADER_LOC_MATRIX_MVP] = glGetUniformLocation(RLGL_GLOBAL_DATA.State.defaultShaderId, "mvp"); - RLGL_GLOBAL_DATA.State.defaultShaderLocs[RL_SHADER_LOC_COLOR_DIFFUSE] = glGetUniformLocation(RLGL_GLOBAL_DATA.State.defaultShaderId, "colDiffuse"); - RLGL_GLOBAL_DATA.State.defaultShaderLocs[RL_SHADER_LOC_MAP_DIFFUSE] = glGetUniformLocation(RLGL_GLOBAL_DATA.State.defaultShaderId, "texture0"); + GLOBAL_DATA.State.defaultShaderLocs[SHADER_LOC_MATRIX_MVP] = glGetUniformLocation(GLOBAL_DATA.State.defaultShaderId, "mvp"); + GLOBAL_DATA.State.defaultShaderLocs[SHADER_LOC_COLOR_DIFFUSE] = glGetUniformLocation(GLOBAL_DATA.State.defaultShaderId, "colDiffuse"); + GLOBAL_DATA.State.defaultShaderLocs[SHADER_LOC_MAP_DIFFUSE] = glGetUniformLocation(GLOBAL_DATA.State.defaultShaderId, "texture0"); } - else RL_TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to load default shader", RLGL_GLOBAL_DATA.State.defaultShaderId); + else RL_TRACELOG(LOG_WARNING, "SHADER: [ID %i] Failed to load default shader", GLOBAL_DATA.State.defaultShaderId); } // Unload default shader -// NOTE: Unloads: RLGL_GLOBAL_DATA.State.defaultShaderId, RLGL_GLOBAL_DATA.State.defaultShaderLocs -static void RLGL_UnloadShaderDefault(void) +// NOTE: Unloads: GLOBAL_DATA.State.defaultShaderId, GLOBAL_DATA.State.defaultShaderLocs +static void unload_shader_default(void) { glUseProgram(0); - glDetachShader(RLGL_GLOBAL_DATA.State.defaultShaderId, RLGL_GLOBAL_DATA.State.defaultVShaderId); - glDetachShader(RLGL_GLOBAL_DATA.State.defaultShaderId, RLGL_GLOBAL_DATA.State.defaultFShaderId); - glDeleteShader(RLGL_GLOBAL_DATA.State.defaultVShaderId); - glDeleteShader(RLGL_GLOBAL_DATA.State.defaultFShaderId); + glDetachShader(GLOBAL_DATA.State.defaultShaderId, GLOBAL_DATA.State.defaultVShaderId); + glDetachShader(GLOBAL_DATA.State.defaultShaderId, GLOBAL_DATA.State.defaultFShaderId); + glDeleteShader(GLOBAL_DATA.State.defaultVShaderId); + glDeleteShader(GLOBAL_DATA.State.defaultFShaderId); - glDeleteProgram(RLGL_GLOBAL_DATA.State.defaultShaderId); + glDeleteProgram(GLOBAL_DATA.State.defaultShaderId); - RL_FREE(RLGL_GLOBAL_DATA.State.defaultShaderLocs); + RL_FREE(GLOBAL_DATA.State.defaultShaderLocs); - RL_TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Default shader unloaded successfully", RLGL_GLOBAL_DATA.State.defaultShaderId); + RL_TRACELOG(LOG_INFO, "SHADER: [ID %i] Default shader unloaded successfully", GLOBAL_DATA.State.defaultShaderId); } #if defined(RLGL_SHOW_GL_DETAILS_INFO) // Get compressed format official GL identifier name -static const char *RLGL_GetCompressedFormatName(int format) +static const char *GetCompressedFormatName(int format) { switch (format) { @@ -4773,37 +4812,37 @@ static const char *RLGL_GetCompressedFormatName(int format) // Get pixel data size in bytes (image or texture) // NOTE: Size depends on pixel format -static int RLGL_GetPixelDataSize(int width, int height, int format) +static int internal_get_pixel_data_size(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; + case PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8; break; + case PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: + case PIXELFORMAT_UNCOMPRESSED_R5G6B5: + case PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: + case PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16; break; + case PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32; break; + case PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24; break; + case PIXELFORMAT_UNCOMPRESSED_R32: bpp = 32; break; + case PIXELFORMAT_UNCOMPRESSED_R32G32B32: bpp = 32*3; break; + case PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: bpp = 32*4; break; + case PIXELFORMAT_UNCOMPRESSED_R16: bpp = 16; break; + case PIXELFORMAT_UNCOMPRESSED_R16G16B16: bpp = 16*3; break; + case PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: bpp = 16*4; break; + case PIXELFORMAT_COMPRESSED_DXT1_RGB: + case PIXELFORMAT_COMPRESSED_DXT1_RGBA: + case PIXELFORMAT_COMPRESSED_ETC1_RGB: + case PIXELFORMAT_COMPRESSED_ETC2_RGB: + case PIXELFORMAT_COMPRESSED_PVRT_RGB: + case PIXELFORMAT_COMPRESSED_PVRT_RGBA: bpp = 4; break; + case PIXELFORMAT_COMPRESSED_DXT3_RGBA: + case PIXELFORMAT_COMPRESSED_DXT5_RGBA: + case PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: + case PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: bpp = 8; break; + case PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: bpp = 2; break; default: break; } @@ -4813,8 +4852,8 @@ static int RLGL_GetPixelDataSize(int width, int height, int format) // 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; + if ((format >= PIXELFORMAT_COMPRESSED_DXT1_RGB) && (format < PIXELFORMAT_COMPRESSED_DXT3_RGBA)) dataSize = 8; + else if ((format >= PIXELFORMAT_COMPRESSED_DXT3_RGBA) && (format < PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA)) dataSize = 16; } return dataSize; @@ -4822,10 +4861,12 @@ static int RLGL_GetPixelDataSize(int width, int height, int format) // Auxiliar math functions +// #if !defined(RAYMATH_H) && !defined(RL_REFACTORED_C) && !defined(RL_REFACTORED_CPP) + // Get identity matrix -static RL_Matrix RLGL_MatrixIdentity(void) +static Matrix internal_matrix_identity(void) { - RL_Matrix result = { + 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, @@ -4837,9 +4878,9 @@ static RL_Matrix RLGL_MatrixIdentity(void) // Get two matrix multiplication // NOTE: When multiplying matrices... the order matters! -static RL_Matrix RLGL_MatrixMultiply(RL_Matrix left, RL_Matrix right) +static Matrix internal_matrix_multiply(Matrix left, Matrix right) { - RL_Matrix result = { 0 }; + 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; @@ -4860,5 +4901,10 @@ static RL_Matrix RLGL_MatrixMultiply(RL_Matrix left, RL_Matrix right) return result; } +// #endif + +RLGL_EXTERN_C_END + +RLGL_NS_END #endif // RLGL_IMPLEMENTATION diff --git a/project/auxillary/vis_ast/dependencies/raylib/include/utils.h b/project/auxillary/vis_ast/dependencies/raylib/include/utils.h index 397a4af..7253ea1 100644 --- a/project/auxillary/vis_ast/dependencies/raylib/include/utils.h +++ b/project/auxillary/vis_ast/dependencies/raylib/include/utils.h @@ -33,10 +33,10 @@ #endif #if defined(RL_SUPPORT_TRACELOG) - #define RL_TRACELOG(level, ...) RL_TraceLog(level, __VA_ARGS__) + #define RL_TRACELOG(level, ...) RL_NS(trace_log)(level, __VA_ARGS__) #if defined(RL_SUPPORT_TRACELOG_DEBUG) - #define TRACELOGD(...) RL_TraceLog(RL_LOG_DEBUG, __VA_ARGS__) + #define TRACELOGD(...) RL_NS(trace_log)(LOG_DEBUG, __VA_ARGS__) #else #define TRACELOGD(...) (void)0 #endif @@ -70,7 +70,7 @@ extern "C" { // Prevents name mangling of functions #endif #if defined(PLATFORM_ANDROID) -void InitAssetManager(AAssetManager *manager, const char *dataPath); // Initialize asset manager from android app +void init_asset_manager(AAssetManager *manager, const char *dataPath); // Initialize asset manager from android app FILE *android_fopen(const char *fileName, const char *mode); // Replacement for fopen() -> Read-only! #endif diff --git a/project/auxillary/vis_ast/dependencies/raylib/lib/raylib.exp b/project/auxillary/vis_ast/dependencies/raylib/lib/raylib.exp new file mode 100644 index 0000000000000000000000000000000000000000..ed2035b7f53c9277959339ceeb08c343f32927ea GIT binary patch literal 165744 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 Q{AZv2jXHKx5