From d45e2a91cacf22b0951fc7748b2388a145d79939 Mon Sep 17 00:00:00 2001 From: igor Date: Mon, 2 Mar 2026 15:00:51 -0800 Subject: [PATCH] Added raylib library. Removed third_party dir. --- raylib/include/config.h | 372 ++ raylib/include/raylib.h | 1740 +++++++++ raylib/include/raymath.h | 3146 ++++++++++++++++ raylib/include/rcamera.h | 563 +++ raylib/include/rgestures.h | 555 +++ raylib/include/rlgl.h | 5392 +++++++++++++++++++++++++++ raylib/lib/x86_64-linux/libraylib.a | Bin 0 -> 2811812 bytes 7 files changed, 11768 insertions(+) create mode 100644 raylib/include/config.h create mode 100644 raylib/include/raylib.h create mode 100644 raylib/include/raymath.h create mode 100644 raylib/include/rcamera.h create mode 100644 raylib/include/rgestures.h create mode 100644 raylib/include/rlgl.h create mode 100644 raylib/lib/x86_64-linux/libraylib.a diff --git a/raylib/include/config.h b/raylib/include/config.h new file mode 100644 index 0000000..9e0b6d8 --- /dev/null +++ b/raylib/include/config.h @@ -0,0 +1,372 @@ +/********************************************************************************************** +* +* raylib configuration flags +* +* This file defines the configuration flags for different raylib features per-module +* +* NOTE: Additional values are configured per-module and can be set on compile time +* +* LICENSE: zlib/libpng +* +* Copyright (c) 2018-2026 Ahmad Fatoum and Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef CONFIG_H +#define CONFIG_H + +#if !defined(EXTERNAL_CONFIG_FLAGS) + +//------------------------------------------------------------------------------------ +// Module selection - Some modules could be avoided +// Mandatory modules: rcore, rlgl +//------------------------------------------------------------------------------------ +#ifndef SUPPORT_MODULE_RSHAPES + #define SUPPORT_MODULE_RSHAPES 1 +#endif +#ifndef SUPPORT_MODULE_RTEXTURES + #define SUPPORT_MODULE_RTEXTURES 1 +#endif +#ifndef SUPPORT_MODULE_RTEXT + #define SUPPORT_MODULE_RTEXT 1 // WARNING: It requires SUPPORT_MODULE_RTEXTURES to load sprite font textures +#endif +#ifndef SUPPORT_MODULE_RMODELS + #define SUPPORT_MODULE_RMODELS 1 +#endif +#ifndef SUPPORT_MODULE_RAUDIO + #define SUPPORT_MODULE_RAUDIO 1 +#endif + +//------------------------------------------------------------------------------------ +// Module: rcore - Configuration Flags +//------------------------------------------------------------------------------------ +#ifndef SUPPORT_TRACELOG + // Show TRACELOG() output messages + #define SUPPORT_TRACELOG 1 +#endif +#ifndef SUPPORT_CAMERA_SYSTEM + // Camera module is included (rcamera.h) and multiple predefined + // cameras are available: free, 1st/3rd person, orbital + #define SUPPORT_CAMERA_SYSTEM 1 +#endif +#ifndef SUPPORT_GESTURES_SYSTEM + // Gestures module is included (rgestures.h) to support gestures detection: tap, hold, swipe, drag + #define SUPPORT_GESTURES_SYSTEM 1 +#endif +#ifndef SUPPORT_RPRAND_GENERATOR + // Include pseudo-random numbers generator (rprand.h), based on Xoshiro128** and SplitMix64 + #define SUPPORT_RPRAND_GENERATOR 1 +#endif +#ifndef SUPPORT_MOUSE_GESTURES + // Mouse gestures are directly mapped like touches and processed by gestures system + #define SUPPORT_MOUSE_GESTURES 1 +#endif +#ifndef SUPPORT_SSH_KEYBOARD_RPI + // Reconfigure standard input to receive key inputs, works with SSH connection + #define SUPPORT_SSH_KEYBOARD_RPI 1 +#endif +#ifndef SUPPORT_WINMM_HIGHRES_TIMER + // Setting a higher resolution can improve the accuracy of time-out intervals in wait functions + // However, it can also reduce overall system performance, because the thread scheduler switches tasks more often + #define SUPPORT_WINMM_HIGHRES_TIMER 1 +#endif +#if !SUPPORT_BUSY_WAIT_LOOP && !SUPPORT_PARTIALBUSY_WAIT_LOOP + // Use busy wait loop for timing sync, if not defined, a high-resolution timer is set up and used + #define SUPPORT_BUSY_WAIT_LOOP 0 // Disabled by default +#endif +#if !SUPPORT_PARTIALBUSY_WAIT_LOOP && !SUPPORT_BUSY_WAIT_LOOP + // 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 SUPPORT_PARTIALBUSY_WAIT_LOOP 1 +#endif +#ifndef SUPPORT_SCREEN_CAPTURE + // Allow automatic screen capture of current screen pressing F12, defined in KeyCallback() + // WARNING: It requires SUPPORT_FILEFORMAT_PNG flag + #define SUPPORT_SCREEN_CAPTURE 1 +#endif +#ifndef SUPPORT_COMPRESSION_API + // Support CompressData() and DecompressData() functions + #define SUPPORT_COMPRESSION_API 1 +#endif +#ifndef SUPPORT_AUTOMATION_EVENTS + // Support automatic generated events, loading and recording of those events when required + #define SUPPORT_AUTOMATION_EVENTS 1 +#endif +#ifndef SUPPORT_CUSTOM_FRAME_CONTROL + // Support custom frame control, only for advanced users + // By default EndDrawing() does this job: draws everything + SwapScreenBuffer() + manage frame timing + PollInputEvents() + // Enabling this flag allows manual control of the frame processes, use at your own risk + #define SUPPORT_CUSTOM_FRAME_CONTROL 0 // Disabled by default +#endif +#ifndef SUPPORT_CLIPBOARD_IMAGE + // Support for clipboard image loading + // NOTE: Only working on SDL3, GLFW (Windows) and RGFW (Windows) + // WARNING: It requires support for some additional flags: + // - SUPPORT_MODULE_RTEXTURES + // - SUPPORT_FILEFORMAT_BMP (Windows clipboard) + // - SUPPORT_FILEFORMAT_PNG (Wayland clipboard) + // - SUPPORT_FILEFORMAT_JPG + #define SUPPORT_CLIPBOARD_IMAGE 1 +#endif + +// rcore: Configuration values +// NOTE: Below values are alread defined inside [rcore.c] so there is no need to be +// redefined here, in case it must be done, just uncomment the required line and update +// the value; it can also be done on compilation with -DVALUE_TO_REDEFINE=128 +//------------------------------------------------------------------------------------ +//#define MAX_TRACELOG_MSG_LENGTH 256 // Max length of one trace-log message +//#define MAX_FILEPATH_CAPACITY 8192 // Maximum file paths capacity +//#define MAX_FILEPATH_LENGTH 4096 // Maximum length for filepaths (Linux PATH_MAX default value) +//#define MAX_KEYBOARD_KEYS 512 // Maximum number of keyboard keys supported +//#define MAX_MOUSE_BUTTONS 8 // Maximum number of mouse buttons supported +//#define MAX_GAMEPADS 4 // Maximum number of gamepads supported +//#define MAX_GAMEPAD_AXES 8 // Maximum number of axes supported (per gamepad) +//#define MAX_GAMEPAD_BUTTONS 32 // Maximum number of buttons supported (per gamepad) +//#define MAX_GAMEPAD_VIBRATION_TIME 2.0f // Maximum vibration time in seconds +//#define MAX_TOUCH_POINTS 10 // Maximum number of touch points supported +//#define MAX_KEY_PRESSED_QUEUE 16 // Maximum number of keys in the key input queue +//#define MAX_CHAR_PRESSED_QUEUE 16 // Maximum number of characters in the char input queue +//#define MAX_DECOMPRESSION_SIZE 64 // Max size allocated for decompression in MB +//#define MAX_AUTOMATION_EVENTS 16384 // Maximum number of automation events to record +//------------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------------ +// Module: rlgl - Configuration values +//------------------------------------------------------------------------------------ +#ifndef RLGL_ENABLE_OPENGL_DEBUG_CONTEXT + // Request OpenGL debug context (only available on OpenGL 4.3) + #define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT 0 +#endif +#ifndef RLGL_SHOW_GL_DETAILS_INFO + // Show OpenGL detailed info on initialization, + // supported GL extensions and GL capabilities + #define RLGL_SHOW_GL_DETAILS_INFO 0 +#endif + +// rlgl: Configuration values +// NOTE: Below values are alread defined inside [rlgl.h] so there is no need to be +// redefined here, in case it must be done, just uncomment the required line and update +// the value; it can also be done on compilation with -DVALUE_TO_REDEFINE=128 +//------------------------------------------------------------------------------------ +//#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 (SetShaderValueTexture()) +//#define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of internal Matrix stack +//#define RL_MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported +//#define RL_CULL_DISTANCE_NEAR 0.05 // Default projection matrix near cull distance +//#define RL_CULL_DISTANCE_FAR 4000.0 // Default projection matrix far cull distance + +// Default shader vertex attribute locations +//#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION 0 +//#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD 1 +//#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL 2 +//#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR 3 +//#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT 4 +//#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 5 +//#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES 6 +//#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES 7 +//#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS 8 +//#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORM 9 + +// Default shader vertex attribute/uniform names to set location points +// NOTE: When a new shader is loaded, locations are tried to be set for convenience, looking for the names defined here +// In case custom shader names are used, it's up to the user to set locations with GetShaderLocation*() functions +//#define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION +//#define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD +//#define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL +//#define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR +//#define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT +//#define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 +//#define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES "vertexBoneIndices" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES +//#define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS "vertexBoneWeights" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS +//#define RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCETRANSFORM "instanceTransform" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORM +//#define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp" // model-view-projection matrix +//#define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView" // view matrix +//#define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection" // projection matrix +//#define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel" // model matrix +//#define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal" // normal matrix (transpose(inverse(matModelView)) +//#define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (tint color, multiplied by texture color) +//#define RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES "boneMatrices" // bone matrices +//#define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0) +//#define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1" // texture1 (texture slot active 1) +//#define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) +//------------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------------ +// Module: rshapes - Configuration Flags +//------------------------------------------------------------------------------------ +#ifndef SUPPORT_QUADS_DRAW_MODE + // Use QUADS instead of TRIANGLES for drawing when possible + // Some lines-based shapes could still use lines + #define SUPPORT_QUADS_DRAW_MODE 1 +#endif + +//------------------------------------------------------------------------------------ +// Module: rtextures - Configuration Flags +//------------------------------------------------------------------------------------ +// Selected desired fileformats to be supported for image data loading +#ifndef SUPPORT_FILEFORMAT_PNG + #define SUPPORT_FILEFORMAT_PNG 1 +#endif +#ifndef SUPPORT_FILEFORMAT_BMP + // NOTE: BMP support required for clipboard images on Windows + #define SUPPORT_FILEFORMAT_BMP 1 +#endif +#ifndef SUPPORT_FILEFORMAT_TGA + #define SUPPORT_FILEFORMAT_TGA 0 // Disabled by default +#endif +#ifndef SUPPORT_FILEFORMAT_JPG + #define SUPPORT_FILEFORMAT_JPG 0 // Disabled by default +#endif +#ifndef SUPPORT_FILEFORMAT_GIF + #define SUPPORT_FILEFORMAT_GIF 1 +#endif +#ifndef SUPPORT_FILEFORMAT_QOI + #define SUPPORT_FILEFORMAT_QOI 1 +#endif +#ifndef SUPPORT_FILEFORMAT_PSD + #define SUPPORT_FILEFORMAT_PSD 0 // Disabled by default +#endif +#ifndef SUPPORT_FILEFORMAT_DDS + #define SUPPORT_FILEFORMAT_DDS 1 +#endif +#ifndef SUPPORT_FILEFORMAT_HDR + #define SUPPORT_FILEFORMAT_HDR 0 // Disabled by default +#endif +#ifndef SUPPORT_FILEFORMAT_PIC + #define SUPPORT_FILEFORMAT_PIC 0 // Disabled by default +#endif +#ifndef SUPPORT_FILEFORMAT_KTX + #define SUPPORT_FILEFORMAT_KTX 0 // Disabled by default +#endif +#ifndef SUPPORT_FILEFORMAT_ASTC + #define SUPPORT_FILEFORMAT_ASTC 0 // Disabled by default +#endif +#ifndef SUPPORT_FILEFORMAT_PKM + #define SUPPORT_FILEFORMAT_PKM 0 // Disabled by default +#endif +#ifndef SUPPORT_FILEFORMAT_PVR + #define SUPPORT_FILEFORMAT_PVR 0 // Disabled by default +#endif + +#ifndef SUPPORT_IMAGE_EXPORT + // Support image export functionality (.png, .bmp, .tga, .jpg, .qoi) + // NOTE: Image export requires stb_image_write.h library + #define SUPPORT_IMAGE_EXPORT 1 +#endif +#ifndef SUPPORT_IMAGE_GENERATION + // Support procedural image generation functionality: gradient, spot, perlin-noise, cellular... + // NOTE: Perlin noise requires stb_perlin.h library + #define SUPPORT_IMAGE_GENERATION 1 +#endif + +//------------------------------------------------------------------------------------ +// Module: rtext - Configuration Flags +//------------------------------------------------------------------------------------ +// Selected desired font fileformats to be supported for loading +#ifndef SUPPORT_FILEFORMAT_TTF + #define SUPPORT_FILEFORMAT_TTF 1 +#endif +#ifndef SUPPORT_FILEFORMAT_FNT + #define SUPPORT_FILEFORMAT_FNT 1 +#endif +#ifndef SUPPORT_FILEFORMAT_BDF + #define SUPPORT_FILEFORMAT_BDF 0 // Disabled by default +#endif + +//------------------------------------------------------------------------------------ +// Module: rmodels - Configuration Flags +//------------------------------------------------------------------------------------ +// Selected desired model fileformats to be supported for loading +#ifndef SUPPORT_FILEFORMAT_OBJ + #define SUPPORT_FILEFORMAT_OBJ 1 +#endif +#ifndef SUPPORT_FILEFORMAT_MTL + #define SUPPORT_FILEFORMAT_MTL 1 +#endif +#ifndef SUPPORT_FILEFORMAT_IQM + #define SUPPORT_FILEFORMAT_IQM 1 +#endif +#ifndef SUPPORT_FILEFORMAT_GLTF + #define SUPPORT_FILEFORMAT_GLTF 1 +#endif +#ifndef SUPPORT_FILEFORMAT_VOX + #define SUPPORT_FILEFORMAT_VOX 1 +#endif +#ifndef SUPPORT_FILEFORMAT_M3D + #define SUPPORT_FILEFORMAT_M3D 1 +#endif +#ifndef SUPPORT_MESH_GENERATION + // Support procedural mesh generation functions, uses external par_shapes.h library + // NOTE: Some generated meshes DO NOT include generated texture coordinates + #define SUPPORT_MESH_GENERATION 1 +#endif +#ifndef SUPPORT_GPU_SKINNING + // GPU skinning disabled by default, some GPUs do not support more than 8 VBOs + #define SUPPORT_GPU_SKINNING 0 +#endif + +//------------------------------------------------------------------------------------ +// Module: raudio - Configuration Flags +//------------------------------------------------------------------------------------ +// Desired audio fileformats to be supported for loading +#ifndef SUPPORT_FILEFORMAT_WAV + #define SUPPORT_FILEFORMAT_WAV 1 +#endif +#ifndef SUPPORT_FILEFORMAT_OGG + #define SUPPORT_FILEFORMAT_OGG 1 +#endif +#ifndef SUPPORT_FILEFORMAT_MP3 + #define SUPPORT_FILEFORMAT_MP3 1 +#endif +#ifndef SUPPORT_FILEFORMAT_QOA + #define SUPPORT_FILEFORMAT_QOA 1 +#endif +#ifndef SUPPORT_FILEFORMAT_FLAC + #define SUPPORT_FILEFORMAT_FLAC 0 // Disabled by default +#endif +#ifndef SUPPORT_FILEFORMAT_XM + #define SUPPORT_FILEFORMAT_XM 1 +#endif +#ifndef SUPPORT_FILEFORMAT_MOD + #define SUPPORT_FILEFORMAT_MOD 1 +#endif + +// raudio: Configuration values +// NOTE: Below values are alread defined inside [rlgl.h] so there is no need to be +// redefined here, in case it must be done, just uncomment the required line and update +// the value; it can also be done on compilation with -DVALUE_TO_REDEFINE=128 +//------------------------------------------------------------------------------------ +//#define AUDIO_DEVICE_FORMAT ma_format_f32 // Device output format (miniaudio: float-32bit) +//#define AUDIO_DEVICE_CHANNELS 2 // Device output channels: stereo +//#define AUDIO_DEVICE_SAMPLE_RATE 0 // Device sample rate (device default) +//#define AUDIO_DEVICE_PERIOD_SIZE_IN_FRAMES 0 // Device period size (controls latency, 0 defaults to 10ms) +//#define MAX_AUDIO_BUFFER_POOL_CHANNELS 16 // Maximum number of audio pool channels +//------------------------------------------------------------------------------------ +#endif // !EXTERNAL_CONFIG_FLAGS + +// NOTE: Following macro depends on config flag that can +// be externally defined, so, it needs to be outside EXTERNAL_CONFIG_FLAGS +#if SUPPORT_TRACELOG + #define TRACELOG(level, ...) TraceLog(level, __VA_ARGS__) +#else + #define TRACELOG(level, ...) (void)0 +#endif + +#endif // CONFIG_H diff --git a/raylib/include/raylib.h b/raylib/include/raylib.h new file mode 100644 index 0000000..e542ad5 --- /dev/null +++ b/raylib/include/raylib.h @@ -0,0 +1,1740 @@ +/********************************************************************************************** +* +* raylib v6.0 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com) +* +* FEATURES: +* - NO external dependencies, all required libraries included with raylib +* - Multiplatform: Windows, Linux, macOS, FreeBSD, Web, Android, Raspberry Pi, DRM native... +* - Written in plain C code (C99) in PascalCase/camelCase notation +* - Hardware accelerated with OpenGL (1.1, 2.1, 3.3, 4.3, ES2, ES3 - choose at compile) +* - Custom OpenGL abstraction layer (usable as standalone module): [rlgl] +* - Multiple Fonts formats supported (TTF, OTF, FNT, BDF, Sprite fonts) +* - Many texture formats supportted, including compressed formats (DXT, ETC, ASTC) +* - Full 3d support for 3d Shapes, Models, Billboards, Heightmaps and more! +* - Flexible Materials system, supporting classic maps and PBR maps +* - Animated 3D models supported (skeletal bones animation) (IQM, M3D, GLTF) +* - Shaders support, including Model shaders and Postprocessing shaders +* - Powerful math module for Vector, Matrix and Quaternion operations: [raymath] +* - Audio loading and playing with streaming support (WAV, OGG, MP3, FLAC, QOA, XM, MOD) +* - VR stereo rendering with configurable HMD device parameters +* - Bindings to multiple programming languages available! +* +* NOTES: +* - One default Font is loaded on InitWindow()->LoadFontDefault() [core, text] +* - One default Texture2D is loaded on rlglInit(), 1x1 white pixel R8G8B8A8 [rlgl] (OpenGL 3.3 or ES2) +* - One default Shader is loaded on rlglInit()->rlLoadShaderDefault() [rlgl] (OpenGL 3.3 or ES2) +* - One default RenderBatch is loaded on rlglInit()->rlLoadRenderBatch() [rlgl] (OpenGL 3.3 or ES2) +* +* DEPENDENCIES: +* [rcore] Depends on the selected platform backend, check rcore.c header for details +* [rlgl] glad/glad_gles2 (David Herberth - github.com/Dav1dde/glad) for OpenGL extensions loading +* [raudio] miniaudio (David Reid - github.com/mackron/miniaudio) for audio device/context management +* +* OPTIONAL DEPENDENCIES (included): +* [rcore] sinfl (Micha Mettke) for DEFLATE decompression algorithm +* [rcore] sdefl (Micha Mettke) for DEFLATE compression algorithm +* [rcore] rprand (Ramon Santamaria) for pseudo-random numbers generation +* [rtextures] qoi (Dominic Szablewski - https://phoboslab.org) for QOI image manage +* [rtextures] stb_image (Sean Barret) for images loading (BMP, TGA, PNG, JPEG, HDR...) +* [rtextures] stb_image_write (Sean Barret) for image writing (BMP, TGA, PNG, JPG) +* [rtextures] stb_image_resize2 (Sean Barret) for image resizing algorithms +* [rtextures] stb_perlin (Sean Barret) for Perlin Noise image generation +* [rtextures] rl_gputex (Ramon Santamaria) for GPU-compressed texture formats +* [rtext] stb_truetype (Sean Barret) for ttf fonts loading +* [rtext] stb_rect_pack (Sean Barret) for rectangles packing +* [rmodels] par_shapes (Philip Rideout) for parametric 3d shapes generation +* [rmodels] tinyobj_loader_c (Syoyo Fujita) for models loading (OBJ, MTL) +* [rmodels] cgltf (Johannes Kuhlmann) for models loading (glTF) +* [rmodels] m3d (bzt) for models loading (M3D, https://bztsrc.gitlab.io/model3d) +* [rmodels] vox_loader (Johann Nadalutti) for models loading (VOX) +* [raudio] dr_wav (David Reid) for WAV audio file loading +* [raudio] dr_flac (David Reid) for FLAC audio file loading +* [raudio] dr_mp3 (David Reid) for MP3 audio file loading +* [raudio] stb_vorbis (Sean Barret) for OGG audio loading +* [raudio] jar_xm (Joshua Reisenauer) for XM audio module loading +* [raudio] jar_mod (Joshua Reisenauer) for MOD audio module loading +* [raudio] qoa (Dominic Szablewski - https://phoboslab.org) for QOA audio manage +* +* +* LICENSE: zlib/libpng +* +* raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software: +* +* Copyright (c) 2013-2026 Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RAYLIB_H +#define RAYLIB_H + +#include // Required for: va_list - Only used by TraceLogCallback + +#define RAYLIB_VERSION_MAJOR 6 +#define RAYLIB_VERSION_MINOR 0 +#define RAYLIB_VERSION_PATCH 0 +#define RAYLIB_VERSION "6.0" + +// Function specifiers in case library is build/used as a shared library +// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll +// NOTE: visibility("default") attribute makes symbols "visible" when compiled with -fvisibility=hidden +#if defined(_WIN32) + #if defined(__TINYC__) + #define __declspec(x) __attribute__((x)) + #endif + #if defined(BUILD_LIBTYPE_SHARED) + #define RLAPI __declspec(dllexport) // Building the library as a Win32 shared library (.dll) + #elif defined(USE_LIBTYPE_SHARED) + #define RLAPI __declspec(dllimport) // Using the library as a Win32 shared library (.dll) + #endif +#else + #if defined(BUILD_LIBTYPE_SHARED) + #define RLAPI __attribute__((visibility("default"))) // Building as a Unix shared library (.so/.dylib) + #endif +#endif + +#ifndef RLAPI + #define RLAPI // Functions defined as 'extern' by default (implicit specifiers) +#endif + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#ifndef PI + #define PI 3.14159265358979323846f +#endif +#ifndef DEG2RAD + #define DEG2RAD (PI/180.0f) +#endif +#ifndef RAD2DEG + #define RAD2DEG (180.0f/PI) +#endif + +// Allow custom memory allocators +// NOTE: Require recompiling raylib sources +#ifndef RL_MALLOC + #define RL_MALLOC(sz) malloc(sz) +#endif +#ifndef RL_CALLOC + #define RL_CALLOC(n,sz) calloc(n,sz) +#endif +#ifndef RL_REALLOC + #define RL_REALLOC(ptr,sz) realloc(ptr,sz) +#endif +#ifndef RL_FREE + #define RL_FREE(ptr) free(ptr) +#endif + +// NOTE: MSVC C++ compiler does not support compound literals (C99 feature) +// Plain structures in C++ (without constructors) can be initialized with { } +// This is called aggregate initialization (C++11 feature) +#if defined(__cplusplus) + #define CLITERAL(type) type +#else + #define CLITERAL(type) (type) +#endif + +// Some compilers (mostly macos clang) default to C++98, +// where aggregate initialization can't be used +// So, give a more clear error stating how to fix this +#if !defined(_MSC_VER) && (defined(__cplusplus) && __cplusplus < 201103L) + #error "C++11 or later is required. Add -std=c++11" +#endif + +// NOTE: Set some defines with some data types declared by raylib +// Other modules (raymath, rlgl) also require some of those types, so, +// to be able to use those other modules as standalone (not depending on raylib) +// this defines are very useful for internal check and avoid type (re)definitions +#define RL_COLOR_TYPE +#define RL_RECTANGLE_TYPE +#define RL_VECTOR2_TYPE +#define RL_VECTOR3_TYPE +#define RL_VECTOR4_TYPE +#define RL_QUATERNION_TYPE +#define RL_MATRIX_TYPE + +// Some Basic Colors +// NOTE: Custom raylib color palette for amazing visuals on WHITE background +#define LIGHTGRAY CLITERAL(Color){ 200, 200, 200, 255 } // Light Gray +#define GRAY CLITERAL(Color){ 130, 130, 130, 255 } // Gray +#define DARKGRAY CLITERAL(Color){ 80, 80, 80, 255 } // Dark Gray +#define YELLOW CLITERAL(Color){ 253, 249, 0, 255 } // Yellow +#define GOLD CLITERAL(Color){ 255, 203, 0, 255 } // Gold +#define ORANGE CLITERAL(Color){ 255, 161, 0, 255 } // Orange +#define PINK CLITERAL(Color){ 255, 109, 194, 255 } // Pink +#define RED CLITERAL(Color){ 230, 41, 55, 255 } // Red +#define MAROON CLITERAL(Color){ 190, 33, 55, 255 } // Maroon +#define GREEN CLITERAL(Color){ 0, 228, 48, 255 } // Green +#define LIME CLITERAL(Color){ 0, 158, 47, 255 } // Lime +#define DARKGREEN CLITERAL(Color){ 0, 117, 44, 255 } // Dark Green +#define SKYBLUE CLITERAL(Color){ 102, 191, 255, 255 } // Sky Blue +#define BLUE CLITERAL(Color){ 0, 121, 241, 255 } // Blue +#define DARKBLUE CLITERAL(Color){ 0, 82, 172, 255 } // Dark Blue +#define PURPLE CLITERAL(Color){ 200, 122, 255, 255 } // Purple +#define VIOLET CLITERAL(Color){ 135, 60, 190, 255 } // Violet +#define DARKPURPLE CLITERAL(Color){ 112, 31, 126, 255 } // Dark Purple +#define BEIGE CLITERAL(Color){ 211, 176, 131, 255 } // Beige +#define BROWN CLITERAL(Color){ 127, 106, 79, 255 } // Brown +#define DARKBROWN CLITERAL(Color){ 76, 63, 47, 255 } // Dark Brown + +#define WHITE CLITERAL(Color){ 255, 255, 255, 255 } // White +#define BLACK CLITERAL(Color){ 0, 0, 0, 255 } // Black +#define BLANK CLITERAL(Color){ 0, 0, 0, 0 } // Blank (Transparent) +#define MAGENTA CLITERAL(Color){ 255, 0, 255, 255 } // Magenta +#define RAYWHITE CLITERAL(Color){ 245, 245, 245, 255 } // My own White (raylib logo) + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +// Boolean type +#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) || (defined(_MSC_VER) && _MSC_VER >= 1800) + #include +#elif !defined(__cplusplus) && !defined(bool) + typedef enum bool { false = 0, true = !false } bool; + #define RL_BOOL_TYPE +#endif + +// Vector2, 2 components +typedef struct Vector2 { + float x; // Vector x component + float y; // Vector y component +} Vector2; + +// Vector3, 3 components +typedef struct Vector3 { + float x; // Vector x component + float y; // Vector y component + float z; // Vector z component +} Vector3; + +// Vector4, 4 components +typedef struct Vector4 { + float x; // Vector x component + float y; // Vector y component + float z; // Vector z component + float w; // Vector w component +} Vector4; + +// Quaternion, 4 components (Vector4 alias) +typedef Vector4 Quaternion; + +// Matrix, 4x4 components, column major, OpenGL style, right-handed +typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) +} Matrix; + +// Color, 4 components, R8G8B8A8 (32bit) +typedef struct Color { + unsigned char r; // Color red value + unsigned char g; // Color green value + unsigned char b; // Color blue value + unsigned char a; // Color alpha value +} Color; + +// Rectangle, 4 components +typedef struct Rectangle { + float x; // Rectangle top-left corner position x + float y; // Rectangle top-left corner position y + float width; // Rectangle width + float height; // Rectangle height +} Rectangle; + +// Image, pixel data stored in CPU memory (RAM) +typedef struct Image { + void *data; // Image raw data + int width; // Image base width + int height; // Image base height + int mipmaps; // Mipmap levels, 1 by default + int format; // Data format (PixelFormat type) +} Image; + +// Texture, tex data stored in GPU memory (VRAM) +typedef struct Texture { + unsigned int id; // OpenGL texture id + int width; // Texture base width + int height; // Texture base height + int mipmaps; // Mipmap levels, 1 by default + int format; // Data format (PixelFormat type) +} Texture; + +// Texture2D, same as Texture +typedef Texture Texture2D; + +// TextureCubemap, same as Texture +typedef Texture TextureCubemap; + +// RenderTexture, fbo for texture rendering +typedef struct RenderTexture { + unsigned int id; // OpenGL framebuffer object id + Texture texture; // Color buffer attachment texture + Texture depth; // Depth buffer attachment texture +} RenderTexture; + +// RenderTexture2D, same as RenderTexture +typedef RenderTexture RenderTexture2D; + +// NPatchInfo, n-patch layout info +typedef struct NPatchInfo { + Rectangle source; // Texture source rectangle + int left; // Left border offset + int top; // Top border offset + int right; // Right border offset + int bottom; // Bottom border offset + int layout; // Layout of the n-patch: 3x3, 1x3 or 3x1 +} NPatchInfo; + +// GlyphInfo, font characters glyphs info +typedef struct GlyphInfo { + int value; // Character value (Unicode) + int offsetX; // Character offset X when drawing + int offsetY; // Character offset Y when drawing + int advanceX; // Character advance position X + Image image; // Character image data +} GlyphInfo; + +// Font, font texture and GlyphInfo array data +typedef struct Font { + int baseSize; // Base size (default chars height) + int glyphCount; // Number of glyph characters + int glyphPadding; // Padding around the glyph characters + Texture2D texture; // Texture atlas containing the glyphs + Rectangle *recs; // Rectangles in texture for the glyphs + GlyphInfo *glyphs; // Glyphs info data +} Font; + +// Camera, defines position/orientation in 3d space +typedef struct Camera3D { + Vector3 position; // Camera position + Vector3 target; // Camera target it looks-at + Vector3 up; // Camera up vector (rotation over its axis) + float fovy; // Camera field-of-view aperture in Y (degrees) in perspective, used as near plane height in world units in orthographic + int projection; // Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC +} Camera3D; + +typedef Camera3D Camera; // Camera type fallback, defaults to Camera3D + +// Camera2D, defines position/orientation in 2d space +typedef struct Camera2D { + Vector2 offset; // Camera offset (screen space offset from window origin) + Vector2 target; // Camera target (world space target point that is mapped to screen space offset) + float rotation; // Camera rotation in degrees (pivots around target) + float zoom; // Camera zoom (scaling around target), must not be set to 0, set to 1.0f for no scale +} Camera2D; + +// Mesh, vertex data and vao/vbo +typedef struct Mesh { + int vertexCount; // Number of vertices stored in arrays + int triangleCount; // Number of triangles stored (indexed or not) + + // Vertex attributes data + float *vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) + float *texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) + float *texcoords2; // Vertex texture second coordinates (UV - 2 components per vertex) (shader-location = 5) + float *normals; // Vertex normals (XYZ - 3 components per vertex) (shader-location = 2) + float *tangents; // Vertex tangents (XYZW - 4 components per vertex) (shader-location = 4) + unsigned char *colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) + unsigned short *indices; // Vertex indices (in case vertex data comes indexed) + + // Skin data for animation + int boneCount; // Number of bones (MAX: 256 bones) + unsigned char *boneIndices; // Vertex bone indices, up to 4 bones influence by vertex (skinning) (shader-location = 6) + float *boneWeights; // Vertex bone weight, up to 4 bones influence by vertex (skinning) (shader-location = 7) + + // Runtime animation vertex data (CPU skinning) + // NOTE: In case of GPU skinning, not used, pointers are NULL + float *animVertices; // Animated vertex positions (after bones transformations) + float *animNormals; // Animated normals (after bones transformations) + + // OpenGL identifiers + unsigned int vaoId; // OpenGL Vertex Array Object id + unsigned int *vboId; // OpenGL Vertex Buffer Objects id (default vertex data) +} Mesh; + +// Shader +typedef struct Shader { + unsigned int id; // Shader program id + int *locs; // Shader locations array (RL_MAX_SHADER_LOCATIONS) +} Shader; + +// MaterialMap +typedef struct MaterialMap { + Texture2D texture; // Material map texture + Color color; // Material map color + float value; // Material map value +} MaterialMap; + +// Material, includes shader and maps +typedef struct Material { + Shader shader; // Material shader + MaterialMap *maps; // Material maps array (MAX_MATERIAL_MAPS) + float params[4]; // Material generic parameters (if required) +} Material; + +// Transform, vertex transformation data +typedef struct Transform { + Vector3 translation; // Translation + Quaternion rotation; // Rotation + Vector3 scale; // Scale +} Transform; + +// Anim pose, an array of Transform[] +typedef Transform *ModelAnimPose; + +// Bone, skeletal animation bone +typedef struct BoneInfo { + char name[32]; // Bone name + int parent; // Bone parent +} BoneInfo; + +// Skeleton, animation bones hierarchy +typedef struct ModelSkeleton { + int boneCount; // Number of bones + BoneInfo *bones; // Bones information (skeleton) + ModelAnimPose bindPose; // Bones base transformation (Transform[]) +} ModelSkeleton; + +// Model, meshes, materials and animation data +typedef struct Model { + Matrix transform; // Local transform matrix + + int meshCount; // Number of meshes + int materialCount; // Number of materials + Mesh *meshes; // Meshes array + Material *materials; // Materials array + int *meshMaterial; // Mesh material number + + // Animation data + ModelSkeleton skeleton; // Skeleton for animation + + // Runtime animation data (CPU/GPU skinning) + ModelAnimPose currentPose; // Current animation pose (Transform[]) + Matrix *boneMatrices; // Bones animated transformation matrices +} Model; + +// ModelAnimation, contains a full animation sequence +typedef struct ModelAnimation { + char name[32]; // Animation name + + int boneCount; // Number of bones (per pose) + int keyframeCount; // Number of animation key frames + ModelAnimPose *keyframePoses; // Animation sequence keyframe poses [keyframe][pose] +} ModelAnimation; + +// Ray, ray for raycasting +typedef struct Ray { + Vector3 position; // Ray position (origin) + Vector3 direction; // Ray direction (normalized) +} Ray; + +// RayCollision, ray hit information +typedef struct RayCollision { + bool hit; // Did the ray hit something? + float distance; // Distance to the nearest hit + Vector3 point; // Point of the nearest hit + Vector3 normal; // Surface normal of hit +} RayCollision; + +// BoundingBox +typedef struct BoundingBox { + Vector3 min; // Minimum vertex box-corner + Vector3 max; // Maximum vertex box-corner +} BoundingBox; + +// Wave, audio wave data +typedef struct Wave { + unsigned int frameCount; // Total number of frames (considering channels) + unsigned int sampleRate; // Frequency (samples per second) + unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + unsigned int channels; // Number of channels (1-mono, 2-stereo, ...) + void *data; // Buffer data pointer +} Wave; + +// Opaque structs declaration +// NOTE: Actual structs are defined internally in raudio module +typedef struct rAudioBuffer rAudioBuffer; +typedef struct rAudioProcessor rAudioProcessor; + +// AudioStream, custom audio stream +typedef struct AudioStream { + rAudioBuffer *buffer; // Pointer to internal data used by the audio system + rAudioProcessor *processor; // Pointer to internal data processor, useful for audio effects + + unsigned int sampleRate; // Frequency (samples per second) + unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + unsigned int channels; // Number of channels (1-mono, 2-stereo, ...) +} AudioStream; + +// Sound +typedef struct Sound { + AudioStream stream; // Audio stream + unsigned int frameCount; // Total number of frames (considering channels) +} Sound; + +// Music, audio stream, anything longer than ~10 seconds should be streamed +typedef struct Music { + AudioStream stream; // Audio stream + unsigned int frameCount; // Total number of frames (considering channels) + bool looping; // Music looping enable + + int ctxType; // Type of music context (audio filetype) + void *ctxData; // Audio context data, depends on type +} Music; + +// VrDeviceInfo, Head-Mounted-Display device parameters +typedef struct VrDeviceInfo { + int hResolution; // Horizontal resolution in pixels + int vResolution; // Vertical resolution in pixels + float hScreenSize; // Horizontal size in meters + float vScreenSize; // Vertical size in meters + float eyeToScreenDistance; // Distance between eye and display in meters + float lensSeparationDistance; // Lens separation distance in meters + float interpupillaryDistance; // IPD (distance between pupils) in meters + float lensDistortionValues[4]; // Lens distortion constant parameters + float chromaAbCorrection[4]; // Chromatic aberration correction parameters +} VrDeviceInfo; + +// VrStereoConfig, VR stereo rendering configuration for simulator +typedef struct VrStereoConfig { + Matrix projection[2]; // VR projection matrices (per eye) + Matrix viewOffset[2]; // VR view offset matrices (per eye) + float leftLensCenter[2]; // VR left lens center + float rightLensCenter[2]; // VR right lens center + float leftScreenCenter[2]; // VR left screen center + float rightScreenCenter[2]; // VR right screen center + float scale[2]; // VR distortion scale + float scaleIn[2]; // VR distortion scale in +} VrStereoConfig; + +// File path list +typedef struct FilePathList { + unsigned int count; // Filepaths entries count + char **paths; // Filepaths entries +} FilePathList; + +// Automation event +typedef struct AutomationEvent { + unsigned int frame; // Event frame + unsigned int type; // Event type (AutomationEventType) + int params[4]; // Event parameters (if required) +} AutomationEvent; + +// Automation event list +typedef struct AutomationEventList { + unsigned int capacity; // Events max entries (MAX_AUTOMATION_EVENTS) + unsigned int count; // Events entries count + AutomationEvent *events; // Events entries +} AutomationEventList; + +//---------------------------------------------------------------------------------- +// Enumerators Definition +//---------------------------------------------------------------------------------- +// System/Window config flags +// NOTE: Every bit registers one state (use it with bit masks) +// By default all flags are set to 0 +typedef enum { + FLAG_VSYNC_HINT = 0x00000040, // Set to try enabling V-Sync on GPU + FLAG_FULLSCREEN_MODE = 0x00000002, // Set to run program in fullscreen + FLAG_WINDOW_RESIZABLE = 0x00000004, // Set to allow resizable window + FLAG_WINDOW_UNDECORATED = 0x00000008, // Set to disable window decoration (frame and buttons) + FLAG_WINDOW_HIDDEN = 0x00000080, // Set to hide window + FLAG_WINDOW_MINIMIZED = 0x00000200, // Set to minimize window (iconify) + FLAG_WINDOW_MAXIMIZED = 0x00000400, // Set to maximize window (expanded to monitor) + FLAG_WINDOW_UNFOCUSED = 0x00000800, // Set to window non focused + FLAG_WINDOW_TOPMOST = 0x00001000, // Set to window always on top + FLAG_WINDOW_ALWAYS_RUN = 0x00000100, // Set to allow windows running while minimized + FLAG_WINDOW_TRANSPARENT = 0x00000010, // Set to allow transparent framebuffer + FLAG_WINDOW_HIGHDPI = 0x00002000, // Set to support HighDPI + FLAG_WINDOW_MOUSE_PASSTHROUGH = 0x00004000, // Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED + FLAG_BORDERLESS_WINDOWED_MODE = 0x00008000, // Set to run program in borderless windowed mode + FLAG_MSAA_4X_HINT = 0x00000020, // Set to try enabling MSAA 4X + FLAG_INTERLACED_HINT = 0x00010000 // Set to try enabling interlaced video format (for V3D) +} ConfigFlags; + +// Trace log level +// NOTE: Organized by priority level +typedef enum { + LOG_ALL = 0, // Display all logs + LOG_TRACE, // Trace logging, intended for internal use only + LOG_DEBUG, // Debug logging, used for internal debugging, it should be disabled on release builds + LOG_INFO, // Info logging, used for program execution info + LOG_WARNING, // Warning logging, used on recoverable failures + LOG_ERROR, // Error logging, used on unrecoverable failures + LOG_FATAL, // Fatal logging, used to abort program: exit(EXIT_FAILURE) + LOG_NONE // Disable logging +} TraceLogLevel; + +// Keyboard keys (US keyboard layout) +// NOTE: Use GetKeyPressed() to allow redefining required keys for alternative layouts +typedef enum { + KEY_NULL = 0, // Key: NULL, used for no key pressed + // Alphanumeric keys + KEY_APOSTROPHE = 39, // Key: ' + KEY_COMMA = 44, // Key: , + KEY_MINUS = 45, // Key: - + KEY_PERIOD = 46, // Key: . + KEY_SLASH = 47, // Key: / + KEY_ZERO = 48, // Key: 0 + KEY_ONE = 49, // Key: 1 + KEY_TWO = 50, // Key: 2 + KEY_THREE = 51, // Key: 3 + KEY_FOUR = 52, // Key: 4 + KEY_FIVE = 53, // Key: 5 + KEY_SIX = 54, // Key: 6 + KEY_SEVEN = 55, // Key: 7 + KEY_EIGHT = 56, // Key: 8 + KEY_NINE = 57, // Key: 9 + KEY_SEMICOLON = 59, // Key: ; + KEY_EQUAL = 61, // Key: = + KEY_A = 65, // Key: A | a + KEY_B = 66, // Key: B | b + KEY_C = 67, // Key: C | c + KEY_D = 68, // Key: D | d + KEY_E = 69, // Key: E | e + KEY_F = 70, // Key: F | f + KEY_G = 71, // Key: G | g + KEY_H = 72, // Key: H | h + KEY_I = 73, // Key: I | i + KEY_J = 74, // Key: J | j + KEY_K = 75, // Key: K | k + KEY_L = 76, // Key: L | l + KEY_M = 77, // Key: M | m + KEY_N = 78, // Key: N | n + KEY_O = 79, // Key: O | o + KEY_P = 80, // Key: P | p + KEY_Q = 81, // Key: Q | q + KEY_R = 82, // Key: R | r + KEY_S = 83, // Key: S | s + KEY_T = 84, // Key: T | t + KEY_U = 85, // Key: U | u + KEY_V = 86, // Key: V | v + KEY_W = 87, // Key: W | w + KEY_X = 88, // Key: X | x + KEY_Y = 89, // Key: Y | y + KEY_Z = 90, // Key: Z | z + KEY_LEFT_BRACKET = 91, // Key: [ + KEY_BACKSLASH = 92, // Key: '\' + KEY_RIGHT_BRACKET = 93, // Key: ] + KEY_GRAVE = 96, // Key: ` + // Function keys + KEY_SPACE = 32, // Key: Space + KEY_ESCAPE = 256, // Key: Esc + KEY_ENTER = 257, // Key: Enter + KEY_TAB = 258, // Key: Tab + KEY_BACKSPACE = 259, // Key: Backspace + KEY_INSERT = 260, // Key: Ins + KEY_DELETE = 261, // Key: Del + KEY_RIGHT = 262, // Key: Cursor right + KEY_LEFT = 263, // Key: Cursor left + KEY_DOWN = 264, // Key: Cursor down + KEY_UP = 265, // Key: Cursor up + KEY_PAGE_UP = 266, // Key: Page up + KEY_PAGE_DOWN = 267, // Key: Page down + KEY_HOME = 268, // Key: Home + KEY_END = 269, // Key: End + KEY_CAPS_LOCK = 280, // Key: Caps lock + KEY_SCROLL_LOCK = 281, // Key: Scroll down + KEY_NUM_LOCK = 282, // Key: Num lock + KEY_PRINT_SCREEN = 283, // Key: Print screen + KEY_PAUSE = 284, // Key: Pause + KEY_F1 = 290, // Key: F1 + KEY_F2 = 291, // Key: F2 + KEY_F3 = 292, // Key: F3 + KEY_F4 = 293, // Key: F4 + KEY_F5 = 294, // Key: F5 + KEY_F6 = 295, // Key: F6 + KEY_F7 = 296, // Key: F7 + KEY_F8 = 297, // Key: F8 + KEY_F9 = 298, // Key: F9 + KEY_F10 = 299, // Key: F10 + KEY_F11 = 300, // Key: F11 + KEY_F12 = 301, // Key: F12 + KEY_LEFT_SHIFT = 340, // Key: Shift left + KEY_LEFT_CONTROL = 341, // Key: Control left + KEY_LEFT_ALT = 342, // Key: Alt left + KEY_LEFT_SUPER = 343, // Key: Super left + KEY_RIGHT_SHIFT = 344, // Key: Shift right + KEY_RIGHT_CONTROL = 345, // Key: Control right + KEY_RIGHT_ALT = 346, // Key: Alt right + KEY_RIGHT_SUPER = 347, // Key: Super right + KEY_KB_MENU = 348, // Key: KB menu + // Keypad keys + KEY_KP_0 = 320, // Key: Keypad 0 + KEY_KP_1 = 321, // Key: Keypad 1 + KEY_KP_2 = 322, // Key: Keypad 2 + KEY_KP_3 = 323, // Key: Keypad 3 + KEY_KP_4 = 324, // Key: Keypad 4 + KEY_KP_5 = 325, // Key: Keypad 5 + KEY_KP_6 = 326, // Key: Keypad 6 + KEY_KP_7 = 327, // Key: Keypad 7 + KEY_KP_8 = 328, // Key: Keypad 8 + KEY_KP_9 = 329, // Key: Keypad 9 + KEY_KP_DECIMAL = 330, // Key: Keypad . + KEY_KP_DIVIDE = 331, // Key: Keypad / + KEY_KP_MULTIPLY = 332, // Key: Keypad * + KEY_KP_SUBTRACT = 333, // Key: Keypad - + KEY_KP_ADD = 334, // Key: Keypad + + KEY_KP_ENTER = 335, // Key: Keypad Enter + KEY_KP_EQUAL = 336, // Key: Keypad = + // Android key buttons + KEY_BACK = 4, // Key: Android back button + KEY_MENU = 5, // Key: Android menu button + KEY_VOLUME_UP = 24, // Key: Android volume up button + KEY_VOLUME_DOWN = 25 // Key: Android volume down button +} KeyboardKey; + +// Add backwards compatibility support for deprecated names +#define MOUSE_LEFT_BUTTON MOUSE_BUTTON_LEFT +#define MOUSE_RIGHT_BUTTON MOUSE_BUTTON_RIGHT +#define MOUSE_MIDDLE_BUTTON MOUSE_BUTTON_MIDDLE + +// Mouse buttons +typedef enum { + MOUSE_BUTTON_LEFT = 0, // Mouse button left + MOUSE_BUTTON_RIGHT = 1, // Mouse button right + MOUSE_BUTTON_MIDDLE = 2, // Mouse button middle (pressed wheel) + MOUSE_BUTTON_SIDE = 3, // Mouse button side (advanced mouse device) + MOUSE_BUTTON_EXTRA = 4, // Mouse button extra (advanced mouse device) + MOUSE_BUTTON_FORWARD = 5, // Mouse button forward (advanced mouse device) + MOUSE_BUTTON_BACK = 6, // Mouse button back (advanced mouse device) +} MouseButton; + +// Mouse cursor +typedef enum { + MOUSE_CURSOR_DEFAULT = 0, // Default pointer shape + MOUSE_CURSOR_ARROW = 1, // Arrow shape + MOUSE_CURSOR_IBEAM = 2, // Text writing cursor shape + MOUSE_CURSOR_CROSSHAIR = 3, // Cross shape + MOUSE_CURSOR_POINTING_HAND = 4, // Pointing hand cursor + MOUSE_CURSOR_RESIZE_EW = 5, // Horizontal resize/move arrow shape + MOUSE_CURSOR_RESIZE_NS = 6, // Vertical resize/move arrow shape + MOUSE_CURSOR_RESIZE_NWSE = 7, // Top-left to bottom-right diagonal resize/move arrow shape + MOUSE_CURSOR_RESIZE_NESW = 8, // The top-right to bottom-left diagonal resize/move arrow shape + MOUSE_CURSOR_RESIZE_ALL = 9, // The omnidirectional resize/move cursor shape + MOUSE_CURSOR_NOT_ALLOWED = 10 // The operation-not-allowed shape +} MouseCursor; + +// Gamepad buttons +typedef enum { + GAMEPAD_BUTTON_UNKNOWN = 0, // Unknown button, just for error checking + GAMEPAD_BUTTON_LEFT_FACE_UP, // Gamepad left DPAD up button + GAMEPAD_BUTTON_LEFT_FACE_RIGHT, // Gamepad left DPAD right button + GAMEPAD_BUTTON_LEFT_FACE_DOWN, // Gamepad left DPAD down button + GAMEPAD_BUTTON_LEFT_FACE_LEFT, // Gamepad left DPAD left button + GAMEPAD_BUTTON_RIGHT_FACE_UP, // Gamepad right button up (i.e. PS3: Triangle, Xbox: Y) + GAMEPAD_BUTTON_RIGHT_FACE_RIGHT, // Gamepad right button right (i.e. PS3: Circle, Xbox: B) + GAMEPAD_BUTTON_RIGHT_FACE_DOWN, // Gamepad right button down (i.e. PS3: Cross, Xbox: A) + GAMEPAD_BUTTON_RIGHT_FACE_LEFT, // Gamepad right button left (i.e. PS3: Square, Xbox: X) + GAMEPAD_BUTTON_LEFT_TRIGGER_1, // Gamepad top/back trigger left (first), it could be a trailing button + GAMEPAD_BUTTON_LEFT_TRIGGER_2, // Gamepad top/back trigger left (second), it could be a trailing button + GAMEPAD_BUTTON_RIGHT_TRIGGER_1, // Gamepad top/back trigger right (first), it could be a trailing button + GAMEPAD_BUTTON_RIGHT_TRIGGER_2, // Gamepad top/back trigger right (second), it could be a trailing button + GAMEPAD_BUTTON_MIDDLE_LEFT, // Gamepad center buttons, left one (i.e. PS3: Select) + GAMEPAD_BUTTON_MIDDLE, // Gamepad center buttons, middle one (i.e. PS3: PS, Xbox: XBOX) + GAMEPAD_BUTTON_MIDDLE_RIGHT, // Gamepad center buttons, right one (i.e. PS3: Start) + GAMEPAD_BUTTON_LEFT_THUMB, // Gamepad joystick pressed button left + GAMEPAD_BUTTON_RIGHT_THUMB // Gamepad joystick pressed button right +} GamepadButton; + +// Gamepad axes +typedef enum { + GAMEPAD_AXIS_LEFT_X = 0, // Gamepad left stick X axis + GAMEPAD_AXIS_LEFT_Y = 1, // Gamepad left stick Y axis + GAMEPAD_AXIS_RIGHT_X = 2, // Gamepad right stick X axis + GAMEPAD_AXIS_RIGHT_Y = 3, // Gamepad right stick Y axis + GAMEPAD_AXIS_LEFT_TRIGGER = 4, // Gamepad back trigger left, pressure level: [1..-1] + GAMEPAD_AXIS_RIGHT_TRIGGER = 5 // Gamepad back trigger right, pressure level: [1..-1] +} GamepadAxis; + +// Material map index +typedef enum { + MATERIAL_MAP_ALBEDO = 0, // Albedo material (same as: MATERIAL_MAP_DIFFUSE) + MATERIAL_MAP_METALNESS, // Metalness material (same as: MATERIAL_MAP_SPECULAR) + MATERIAL_MAP_NORMAL, // Normal material + MATERIAL_MAP_ROUGHNESS, // Roughness material + MATERIAL_MAP_OCCLUSION, // Ambient occlusion material + MATERIAL_MAP_EMISSION, // Emission material + MATERIAL_MAP_HEIGHT, // Heightmap material + MATERIAL_MAP_CUBEMAP, // Cubemap material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_IRRADIANCE, // Irradiance material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_PREFILTER, // Prefilter material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_BRDF // Brdf material +} MaterialMapIndex; + +#define MATERIAL_MAP_DIFFUSE MATERIAL_MAP_ALBEDO +#define MATERIAL_MAP_SPECULAR MATERIAL_MAP_METALNESS + +// Shader location index +// NOTE: Some locations are tried to be set automatically on shader loading, +// but only if default attributes/uniforms names are found, check config.h for names +typedef enum { + SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position + SHADER_LOC_VERTEX_TEXCOORD01, // Shader location: vertex attribute: texcoord01 + SHADER_LOC_VERTEX_TEXCOORD02, // Shader location: vertex attribute: texcoord02 + SHADER_LOC_VERTEX_NORMAL, // Shader location: vertex attribute: normal + SHADER_LOC_VERTEX_TANGENT, // Shader location: vertex attribute: tangent + SHADER_LOC_VERTEX_COLOR, // Shader location: vertex attribute: color + SHADER_LOC_MATRIX_MVP, // Shader location: matrix uniform: model-view-projection + SHADER_LOC_MATRIX_VIEW, // Shader location: matrix uniform: view (camera transform) + SHADER_LOC_MATRIX_PROJECTION, // Shader location: matrix uniform: projection + SHADER_LOC_MATRIX_MODEL, // Shader location: matrix uniform: model (transform) + SHADER_LOC_MATRIX_NORMAL, // Shader location: matrix uniform: normal + SHADER_LOC_VECTOR_VIEW, // Shader location: vector uniform: view + SHADER_LOC_COLOR_DIFFUSE, // Shader location: vector uniform: diffuse color + SHADER_LOC_COLOR_SPECULAR, // Shader location: vector uniform: specular color + SHADER_LOC_COLOR_AMBIENT, // Shader location: vector uniform: ambient color + SHADER_LOC_MAP_ALBEDO, // Shader location: sampler2d texture: albedo (same as: SHADER_LOC_MAP_DIFFUSE) + SHADER_LOC_MAP_METALNESS, // Shader location: sampler2d texture: metalness (same as: SHADER_LOC_MAP_SPECULAR) + SHADER_LOC_MAP_NORMAL, // Shader location: sampler2d texture: normal + SHADER_LOC_MAP_ROUGHNESS, // Shader location: sampler2d texture: roughness + SHADER_LOC_MAP_OCCLUSION, // Shader location: sampler2d texture: occlusion + SHADER_LOC_MAP_EMISSION, // Shader location: sampler2d texture: emission + SHADER_LOC_MAP_HEIGHT, // Shader location: sampler2d texture: heightmap + SHADER_LOC_MAP_CUBEMAP, // Shader location: samplerCube texture: cubemap + SHADER_LOC_MAP_IRRADIANCE, // Shader location: samplerCube texture: irradiance + SHADER_LOC_MAP_PREFILTER, // Shader location: samplerCube texture: prefilter + SHADER_LOC_MAP_BRDF, // Shader location: sampler2d texture: brdf + SHADER_LOC_VERTEX_BONEIDS, // Shader location: vertex attribute: bone indices + SHADER_LOC_VERTEX_BONEWEIGHTS, // Shader location: vertex attribute: bone weights + SHADER_LOC_MATRIX_BONETRANSFORMS, // Shader location: matrix attribute: bone transforms (animation) + SHADER_LOC_VERTEX_INSTANCETRANSFORM // Shader location: vertex attribute: instance transforms +} ShaderLocationIndex; + +#define SHADER_LOC_MAP_DIFFUSE SHADER_LOC_MAP_ALBEDO +#define SHADER_LOC_MAP_SPECULAR SHADER_LOC_MAP_METALNESS + +// Shader uniform data type +typedef enum { + SHADER_UNIFORM_FLOAT = 0, // Shader uniform type: float + SHADER_UNIFORM_VEC2, // Shader uniform type: vec2 (2 float) + SHADER_UNIFORM_VEC3, // Shader uniform type: vec3 (3 float) + SHADER_UNIFORM_VEC4, // Shader uniform type: vec4 (4 float) + SHADER_UNIFORM_INT, // Shader uniform type: int + SHADER_UNIFORM_IVEC2, // Shader uniform type: ivec2 (2 int) + SHADER_UNIFORM_IVEC3, // Shader uniform type: ivec3 (3 int) + SHADER_UNIFORM_IVEC4, // Shader uniform type: ivec4 (4 int) + SHADER_UNIFORM_UINT, // Shader uniform type: unsigned int + SHADER_UNIFORM_UIVEC2, // Shader uniform type: uivec2 (2 unsigned int) + SHADER_UNIFORM_UIVEC3, // Shader uniform type: uivec3 (3 unsigned int) + SHADER_UNIFORM_UIVEC4, // Shader uniform type: uivec4 (4 unsigned int) + SHADER_UNIFORM_SAMPLER2D // Shader uniform type: sampler2d +} ShaderUniformDataType; + +// Shader attribute data types +typedef enum { + SHADER_ATTRIB_FLOAT = 0, // Shader attribute type: float + SHADER_ATTRIB_VEC2, // Shader attribute type: vec2 (2 float) + SHADER_ATTRIB_VEC3, // Shader attribute type: vec3 (3 float) + SHADER_ATTRIB_VEC4 // Shader attribute type: vec4 (4 float) +} ShaderAttributeDataType; + +// Pixel formats +// NOTE: Support depends on OpenGL version and platform +typedef enum { + PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha) + PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels) + PIXELFORMAT_UNCOMPRESSED_R5G6B5, // 16 bpp + PIXELFORMAT_UNCOMPRESSED_R8G8B8, // 24 bpp + PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, // 16 bpp (1 bit alpha) + PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, // 16 bpp (4 bit alpha) + PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, // 32 bpp + PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float) + PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float) + PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float) + PIXELFORMAT_UNCOMPRESSED_R16, // 16 bpp (1 channel - half float) + PIXELFORMAT_UNCOMPRESSED_R16G16B16, // 16*3 bpp (3 channels - half float) + PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, // 16*4 bpp (4 channels - half float) + PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha) + PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha) + PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_DXT5_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_ETC1_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_ETC2_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_PVRT_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_PVRT_RGBA, // 4 bpp + PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA // 2 bpp +} PixelFormat; + +// Texture parameters: filter mode +// NOTE 1: Filtering considers mipmaps if available in the texture +// NOTE 2: Filter is accordingly set for minification and magnification +typedef enum { + TEXTURE_FILTER_POINT = 0, // No filter, just pixel approximation + TEXTURE_FILTER_BILINEAR, // Linear filtering + TEXTURE_FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps) + TEXTURE_FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x + TEXTURE_FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x + TEXTURE_FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x +} TextureFilter; + +// Texture parameters: wrap mode +typedef enum { + TEXTURE_WRAP_REPEAT = 0, // Repeats texture in tiled mode + TEXTURE_WRAP_CLAMP, // Clamps texture to edge pixel in tiled mode + TEXTURE_WRAP_MIRROR_REPEAT, // Mirrors and repeats the texture in tiled mode + TEXTURE_WRAP_MIRROR_CLAMP // Mirrors and clamps to border the texture in tiled mode +} TextureWrap; + +// Cubemap layouts +typedef enum { + CUBEMAP_LAYOUT_AUTO_DETECT = 0, // Automatically detect layout type + CUBEMAP_LAYOUT_LINE_VERTICAL, // Layout is defined by a vertical line with faces + CUBEMAP_LAYOUT_LINE_HORIZONTAL, // Layout is defined by a horizontal line with faces + CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR, // Layout is defined by a 3x4 cross with cubemap faces + CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE // Layout is defined by a 4x3 cross with cubemap faces +} CubemapLayout; + +// Font type, defines generation method +typedef enum { + FONT_DEFAULT = 0, // Default font generation, anti-aliased + FONT_BITMAP, // Bitmap font generation, no anti-aliasing + FONT_SDF // SDF font generation, requires external shader +} FontType; + +// Color blending modes (pre-defined) +typedef enum { + BLEND_ALPHA = 0, // Blend textures considering alpha (default) + BLEND_ADDITIVE, // Blend textures adding colors + BLEND_MULTIPLIED, // Blend textures multiplying colors + BLEND_ADD_COLORS, // Blend textures adding colors (alternative) + BLEND_SUBTRACT_COLORS, // Blend textures subtracting colors (alternative) + BLEND_ALPHA_PREMULTIPLY, // Blend premultiplied textures considering alpha + BLEND_CUSTOM, // Blend textures using custom src/dst factors (use rlSetBlendFactors()) + BLEND_CUSTOM_SEPARATE // Blend textures using custom rgb/alpha separate src/dst factors (use rlSetBlendFactorsSeparate()) +} BlendMode; + +// Gesture +// NOTE: Provided as bit-wise flags to enable only desired gestures +typedef enum { + GESTURE_NONE = 0, // No gesture + GESTURE_TAP = 1, // Tap gesture + GESTURE_DOUBLETAP = 2, // Double tap gesture + GESTURE_HOLD = 4, // Hold gesture + GESTURE_DRAG = 8, // Drag gesture + GESTURE_SWIPE_RIGHT = 16, // Swipe right gesture + GESTURE_SWIPE_LEFT = 32, // Swipe left gesture + GESTURE_SWIPE_UP = 64, // Swipe up gesture + GESTURE_SWIPE_DOWN = 128, // Swipe down gesture + GESTURE_PINCH_IN = 256, // Pinch in gesture + GESTURE_PINCH_OUT = 512 // Pinch out gesture +} Gesture; + +// Camera system modes +typedef enum { + CAMERA_CUSTOM = 0, // Camera custom, controlled by user (UpdateCamera() does nothing) + CAMERA_FREE, // Camera free mode + CAMERA_ORBITAL, // Camera orbital, around target, zoom supported + CAMERA_FIRST_PERSON, // Camera first person + CAMERA_THIRD_PERSON // Camera third person +} CameraMode; + +// Camera projection +typedef enum { + CAMERA_PERSPECTIVE = 0, // Perspective projection + CAMERA_ORTHOGRAPHIC // Orthographic projection +} CameraProjection; + +// N-patch layout +typedef enum { + NPATCH_NINE_PATCH = 0, // Npatch layout: 3x3 tiles + NPATCH_THREE_PATCH_VERTICAL, // Npatch layout: 1x3 tiles + NPATCH_THREE_PATCH_HORIZONTAL // Npatch layout: 3x1 tiles +} NPatchLayout; + +// Callbacks to hook some internal functions +// WARNING: These callbacks are intended for advanced users +typedef void (*TraceLogCallback)(int logLevel, const char *text, va_list args); // Logging: Redirect trace log messages +typedef unsigned char *(*LoadFileDataCallback)(const char *fileName, int *dataSize); // FileIO: Load binary data +typedef bool (*SaveFileDataCallback)(const char *fileName, void *data, int dataSize); // FileIO: Save binary data +typedef char *(*LoadFileTextCallback)(const char *fileName); // FileIO: Load text data +typedef bool (*SaveFileTextCallback)(const char *fileName, const char *text); // FileIO: Save text data + +//------------------------------------------------------------------------------------ +// Global Variables Definition +//------------------------------------------------------------------------------------ +// It's lonely here... + +//------------------------------------------------------------------------------------ +// Window and Graphics Device Functions (Module: core) +//------------------------------------------------------------------------------------ + +#if defined(__cplusplus) +extern "C" { // Prevents name mangling of functions +#endif + +// Window-related functions +RLAPI void InitWindow(int width, int height, const char *title); // Initialize window and OpenGL context +RLAPI void CloseWindow(void); // Close window and unload OpenGL context +RLAPI bool WindowShouldClose(void); // Check if application should close (KEY_ESCAPE pressed or windows close icon clicked) +RLAPI bool IsWindowReady(void); // Check if window has been initialized successfully +RLAPI bool IsWindowFullscreen(void); // Check if window is currently fullscreen +RLAPI bool IsWindowHidden(void); // Check if window is currently hidden +RLAPI bool IsWindowMinimized(void); // Check if window is currently minimized +RLAPI bool IsWindowMaximized(void); // Check if window is currently maximized +RLAPI bool IsWindowFocused(void); // Check if window is currently focused +RLAPI bool IsWindowResized(void); // Check if window has been resized last frame +RLAPI bool IsWindowState(unsigned int flag); // Check if one specific window flag is enabled +RLAPI void SetWindowState(unsigned int flags); // Set window configuration state using flags +RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags +RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed, resizes monitor to match window resolution +RLAPI void ToggleBorderlessWindowed(void); // Toggle window state: borderless windowed, resizes window to match monitor resolution +RLAPI void MaximizeWindow(void); // Set window state: maximized, if resizable +RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable +RLAPI void RestoreWindow(void); // Restore window from being minimized/maximized +RLAPI void SetWindowIcon(Image image); // Set icon for window (single image, RGBA 32bit) +RLAPI void SetWindowIcons(Image *images, int count); // Set icon for window (multiple images, RGBA 32bit) +RLAPI void SetWindowTitle(const char *title); // Set title for window +RLAPI void SetWindowPosition(int x, int y); // Set window position on screen +RLAPI void SetWindowMonitor(int monitor); // Set monitor for the current window +RLAPI void SetWindowMinSize(int width, int height); // Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE) +RLAPI void SetWindowMaxSize(int width, int height); // Set window maximum dimensions (for FLAG_WINDOW_RESIZABLE) +RLAPI void SetWindowSize(int width, int height); // Set window dimensions +RLAPI void SetWindowOpacity(float opacity); // Set window opacity [0.0f..1.0f] +RLAPI void SetWindowFocused(void); // Set window focused +RLAPI void *GetWindowHandle(void); // Get native window handle +RLAPI int GetScreenWidth(void); // Get current screen width +RLAPI int GetScreenHeight(void); // Get current screen height +RLAPI int GetRenderWidth(void); // Get current render width (it considers HiDPI) +RLAPI int GetRenderHeight(void); // Get current render height (it considers HiDPI) +RLAPI int GetMonitorCount(void); // Get number of connected monitors +RLAPI int GetCurrentMonitor(void); // Get current monitor where window is placed +RLAPI Vector2 GetMonitorPosition(int monitor); // Get specified monitor position +RLAPI int GetMonitorWidth(int monitor); // Get specified monitor width (current video mode used by monitor) +RLAPI int GetMonitorHeight(int monitor); // Get specified monitor height (current video mode used by monitor) +RLAPI int GetMonitorPhysicalWidth(int monitor); // Get specified monitor physical width in millimetres +RLAPI int GetMonitorPhysicalHeight(int monitor); // Get specified monitor physical height in millimetres +RLAPI int GetMonitorRefreshRate(int monitor); // Get specified monitor refresh rate +RLAPI Vector2 GetWindowPosition(void); // Get window position XY on monitor +RLAPI Vector2 GetWindowScaleDPI(void); // Get window scale DPI factor +RLAPI const char *GetMonitorName(int monitor); // Get the human-readable, UTF-8 encoded name of the specified monitor +RLAPI void SetClipboardText(const char *text); // Set clipboard text content +RLAPI const char *GetClipboardText(void); // Get clipboard text content +RLAPI Image GetClipboardImage(void); // Get clipboard image content +RLAPI void EnableEventWaiting(void); // Enable waiting for events on EndDrawing(), no automatic event polling +RLAPI void DisableEventWaiting(void); // Disable waiting for events on EndDrawing(), automatic events polling + +// Cursor-related functions +RLAPI void ShowCursor(void); // Shows cursor +RLAPI void HideCursor(void); // Hides cursor +RLAPI bool IsCursorHidden(void); // Check if cursor is not visible +RLAPI void EnableCursor(void); // Enables cursor (unlock cursor) +RLAPI void DisableCursor(void); // Disables cursor (lock cursor) +RLAPI bool IsCursorOnScreen(void); // Check if cursor is on the screen + +// Drawing-related functions +RLAPI void ClearBackground(Color color); // Set background color (framebuffer clear color) +RLAPI void BeginDrawing(void); // Setup canvas (framebuffer) to start drawing +RLAPI void EndDrawing(void); // End canvas drawing and swap buffers (double buffering) +RLAPI void BeginMode2D(Camera2D camera); // Begin 2D mode with custom camera (2D) +RLAPI void EndMode2D(void); // Ends 2D mode with custom camera +RLAPI void BeginMode3D(Camera3D camera); // Begin 3D mode with custom camera (3D) +RLAPI void EndMode3D(void); // Ends 3D mode and returns to default 2D orthographic mode +RLAPI void BeginTextureMode(RenderTexture2D target); // Begin drawing to render texture +RLAPI void EndTextureMode(void); // Ends drawing to render texture +RLAPI void BeginShaderMode(Shader shader); // Begin custom shader drawing +RLAPI void EndShaderMode(void); // End custom shader drawing (use default shader) +RLAPI void BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied, subtract, custom) +RLAPI void EndBlendMode(void); // End blending mode (reset to default: alpha blending) +RLAPI void BeginScissorMode(int x, int y, int width, int height); // Begin scissor mode (define screen area for following drawing) +RLAPI void EndScissorMode(void); // End scissor mode +RLAPI void BeginVrStereoMode(VrStereoConfig config); // Begin stereo rendering (requires VR simulator) +RLAPI void EndVrStereoMode(void); // End stereo rendering (requires VR simulator) + +// VR stereo config functions for VR simulator +RLAPI VrStereoConfig LoadVrStereoConfig(VrDeviceInfo device); // Load VR stereo config for VR simulator device parameters +RLAPI void UnloadVrStereoConfig(VrStereoConfig config); // Unload VR stereo config + +// Shader management functions +// NOTE: Shader functionality is not available on OpenGL 1.1 +RLAPI Shader LoadShader(const char *vsFileName, const char *fsFileName); // Load shader from files and bind default locations +RLAPI Shader LoadShaderFromMemory(const char *vsCode, const char *fsCode); // Load shader from code strings and bind default locations +RLAPI bool IsShaderValid(Shader shader); // Check if a shader is valid (loaded on GPU) +RLAPI int GetShaderLocation(Shader shader, const char *uniformName); // Get shader uniform location +RLAPI int GetShaderLocationAttrib(Shader shader, const char *attribName); // Get shader attribute location +RLAPI void SetShaderValue(Shader shader, int locIndex, const void *value, int uniformType); // Set shader uniform value +RLAPI void SetShaderValueV(Shader shader, int locIndex, const void *value, int uniformType, int count); // Set shader uniform value vector +RLAPI void SetShaderValueMatrix(Shader shader, int locIndex, Matrix mat); // Set shader uniform value (matrix 4x4) +RLAPI void SetShaderValueTexture(Shader shader, int locIndex, Texture2D texture); // Set shader uniform value and bind the texture (sampler2d) +RLAPI void UnloadShader(Shader shader); // Unload shader from GPU memory (VRAM) + +// Screen-space-related functions +#define GetMouseRay GetScreenToWorldRay // Compatibility hack for previous raylib versions +RLAPI Ray GetScreenToWorldRay(Vector2 position, Camera camera); // Get a ray trace from screen position (i.e mouse) +RLAPI Ray GetScreenToWorldRayEx(Vector2 position, Camera camera, int width, int height); // Get a ray trace from screen position (i.e mouse) in a viewport +RLAPI Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Get the screen space position for a 3d world space position +RLAPI Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height); // Get size position for a 3d world space position +RLAPI Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); // Get the screen space position for a 2d camera world space position +RLAPI Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera); // Get the world space position for a 2d camera screen space position +RLAPI Matrix GetCameraMatrix(Camera camera); // Get camera transform matrix (view matrix) +RLAPI Matrix GetCameraMatrix2D(Camera2D camera); // Get camera 2d transform matrix + +// Timing-related functions +RLAPI void SetTargetFPS(int fps); // Set target FPS (maximum) +RLAPI float GetFrameTime(void); // Get time in seconds for last frame drawn (delta time) +RLAPI double GetTime(void); // Get elapsed time in seconds since InitWindow() +RLAPI int GetFPS(void); // Get current FPS + +// Custom frame control functions +// NOTE: Those functions are intended for advanced users that want full control over the frame processing +// By default EndDrawing() does this job: draws everything + SwapScreenBuffer() + manage frame timing + PollInputEvents() +// To avoid that behaviour and control frame processes manually, enable in config.h: SUPPORT_CUSTOM_FRAME_CONTROL +RLAPI void SwapScreenBuffer(void); // Swap back buffer with front buffer (screen drawing) +RLAPI void PollInputEvents(void); // Register all input events +RLAPI void WaitTime(double seconds); // Wait for some time (halt program execution) + +// Random values generation functions +RLAPI void SetRandomSeed(unsigned int seed); // Set the seed for the random number generator +RLAPI int GetRandomValue(int min, int max); // Get a random value between min and max (both included) +RLAPI int *LoadRandomSequence(unsigned int count, int min, int max); // Load random values sequence, no values repeated +RLAPI void UnloadRandomSequence(int *sequence); // Unload random values sequence + +// Misc. functions +RLAPI void TakeScreenshot(const char *fileName); // Takes a screenshot of current screen (filename extension defines format) +RLAPI void SetConfigFlags(unsigned int flags); // Setup init configuration flags (view FLAGS) +RLAPI void OpenURL(const char *url); // Open URL with default system browser (if available) + +// Logging system +RLAPI void SetTraceLogLevel(int logLevel); // Set the current threshold (minimum) log level +RLAPI void TraceLog(int logLevel, const char *text, ...); // Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...) +RLAPI void SetTraceLogCallback(TraceLogCallback callback); // Set custom trace log + +// Memory management, using internal allocators +RLAPI void *MemAlloc(unsigned int size); // Internal memory allocator +RLAPI void *MemRealloc(void *ptr, unsigned int size); // Internal memory reallocator +RLAPI void MemFree(void *ptr); // Internal memory free + +// File system management functions +RLAPI unsigned char *LoadFileData(const char *fileName, int *dataSize); // Load file data as byte array (read) +RLAPI void UnloadFileData(unsigned char *data); // Unload file data allocated by LoadFileData() +RLAPI bool SaveFileData(const char *fileName, void *data, int dataSize); // Save data to file from byte array (write), returns true on success +RLAPI bool ExportDataAsCode(const unsigned char *data, int dataSize, const char *fileName); // Export data to code (.h), returns true on success +RLAPI char *LoadFileText(const char *fileName); // Load text data from file (read), returns a '\0' terminated string +RLAPI void UnloadFileText(char *text); // Unload file text data allocated by LoadFileText() +RLAPI bool SaveFileText(const char *fileName, const char *text); // Save text data to file (write), string must be '\0' terminated, returns true on success + +// File access custom callbacks +// WARNING: Callbacks setup is intended for advanced users +RLAPI void SetLoadFileDataCallback(LoadFileDataCallback callback); // Set custom file binary data loader +RLAPI void SetSaveFileDataCallback(SaveFileDataCallback callback); // Set custom file binary data saver +RLAPI void SetLoadFileTextCallback(LoadFileTextCallback callback); // Set custom file text data loader +RLAPI void SetSaveFileTextCallback(SaveFileTextCallback callback); // Set custom file text data saver + +RLAPI int FileRename(const char *fileName, const char *fileRename); // Rename file (if exists) +RLAPI int FileRemove(const char *fileName); // Remove file (if exists) +RLAPI int FileCopy(const char *srcPath, const char *dstPath); // Copy file from one path to another, dstPath created if it doesn't exist +RLAPI int FileMove(const char *srcPath, const char *dstPath); // Move file from one directory to another, dstPath created if it doesn't exist +RLAPI int FileTextReplace(const char *fileName, const char *search, const char *replacement); // Replace text in an existing file +RLAPI int FileTextFindIndex(const char *fileName, const char *search); // Find text in existing file +RLAPI bool FileExists(const char *fileName); // Check if file exists +RLAPI bool DirectoryExists(const char *dirPath); // Check if a directory path exists +RLAPI bool IsFileExtension(const char *fileName, const char *ext); // Check file extension (recommended include point: .png, .wav) +RLAPI int GetFileLength(const char *fileName); // Get file length in bytes (NOTE: GetFileSize() conflicts with windows.h) +RLAPI long GetFileModTime(const char *fileName); // Get file modification time (last write time) +RLAPI const char *GetFileExtension(const char *fileName); // Get pointer to extension for a filename string (includes dot: '.png') +RLAPI const char *GetFileName(const char *filePath); // Get pointer to filename for a path string +RLAPI const char *GetFileNameWithoutExt(const char *filePath); // Get filename string without extension (uses static string) +RLAPI const char *GetDirectoryPath(const char *filePath); // Get full path for a given fileName with path (uses static string) +RLAPI const char *GetPrevDirectoryPath(const char *dirPath); // Get previous directory path for a given path (uses static string) +RLAPI const char *GetWorkingDirectory(void); // Get current working directory (uses static string) +RLAPI const char *GetApplicationDirectory(void); // Get the directory of the running application (uses static string) +RLAPI int MakeDirectory(const char *dirPath); // Create directories (including full path requested), returns 0 on success +RLAPI bool ChangeDirectory(const char *dirPath); // Change working directory, return true on success +RLAPI bool IsPathFile(const char *path); // Check if a given path is a file or a directory +RLAPI bool IsFileNameValid(const char *fileName); // Check if fileName is valid for the platform/OS +RLAPI FilePathList LoadDirectoryFiles(const char *dirPath); // Load directory filepaths +RLAPI FilePathList LoadDirectoryFilesEx(const char *basePath, const char *filter, bool scanSubdirs); // Load directory filepaths with extension filtering and recursive directory scan. Use 'DIR' in the filter string to include directories in the result +RLAPI void UnloadDirectoryFiles(FilePathList files); // Unload filepaths +RLAPI bool IsFileDropped(void); // Check if a file has been dropped into window +RLAPI FilePathList LoadDroppedFiles(void); // Load dropped filepaths +RLAPI void UnloadDroppedFiles(FilePathList files); // Unload dropped filepaths +RLAPI unsigned int GetDirectoryFileCount(const char *dirPath); // Get the file count in a directory +RLAPI unsigned int GetDirectoryFileCountEx(const char *basePath, const char *filter, bool scanSubdirs);// Get the file count in a directory with extension filtering and recursive directory scan. Use 'DIR' in the filter string to include directories in the result + +// Compression/Encoding functionality +RLAPI unsigned char *CompressData(const unsigned char *data, int dataSize, int *compDataSize); // Compress data (DEFLATE algorithm), memory must be MemFree() +RLAPI unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // Decompress data (DEFLATE algorithm), memory must be MemFree() +RLAPI char *EncodeDataBase64(const unsigned char *data, int dataSize, int *outputSize); // Encode data to Base64 string (includes NULL terminator), memory must be MemFree() +RLAPI unsigned char *DecodeDataBase64(const char *text, int *outputSize); // Decode Base64 string (expected NULL terminated), memory must be MemFree() +RLAPI unsigned int ComputeCRC32(unsigned char *data, int dataSize); // Compute CRC32 hash code +RLAPI unsigned int *ComputeMD5(unsigned char *data, int dataSize); // Compute MD5 hash code, returns static int[4] (16 bytes) +RLAPI unsigned int *ComputeSHA1(unsigned char *data, int dataSize); // Compute SHA1 hash code, returns static int[5] (20 bytes) +RLAPI unsigned int *ComputeSHA256(unsigned char *data, int dataSize); // Compute SHA256 hash code, returns static int[8] (32 bytes) + +// Automation events functionality +RLAPI AutomationEventList LoadAutomationEventList(const char *fileName); // Load automation events list from file, NULL for empty list, capacity = MAX_AUTOMATION_EVENTS +RLAPI void UnloadAutomationEventList(AutomationEventList list); // Unload automation events list from file +RLAPI bool ExportAutomationEventList(AutomationEventList list, const char *fileName); // Export automation events list as text file +RLAPI void SetAutomationEventList(AutomationEventList *list); // Set automation event list to record to +RLAPI void SetAutomationEventBaseFrame(int frame); // Set automation event internal base frame to start recording +RLAPI void StartAutomationEventRecording(void); // Start recording automation events (AutomationEventList must be set) +RLAPI void StopAutomationEventRecording(void); // Stop recording automation events +RLAPI void PlayAutomationEvent(AutomationEvent event); // Play a recorded automation event + +//------------------------------------------------------------------------------------ +// Input Handling Functions (Module: core) +//------------------------------------------------------------------------------------ + +// Input-related functions: keyboard +RLAPI bool IsKeyPressed(int key); // Check if a key has been pressed once +RLAPI bool IsKeyPressedRepeat(int key); // Check if a key has been pressed again +RLAPI bool IsKeyDown(int key); // Check if a key is being pressed +RLAPI bool IsKeyReleased(int key); // Check if a key has been released once +RLAPI bool IsKeyUp(int key); // Check if a key is NOT being pressed +RLAPI int GetKeyPressed(void); // Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty +RLAPI int GetCharPressed(void); // Get char pressed (unicode), call it multiple times for chars queued, returns 0 when the queue is empty +RLAPI const char *GetKeyName(int key); // Get name of a QWERTY key on the current keyboard layout (eg returns string 'q' for KEY_A on an AZERTY keyboard) +RLAPI void SetExitKey(int key); // Set a custom key to exit program (default is ESC) + +// Input-related functions: gamepads +RLAPI bool IsGamepadAvailable(int gamepad); // Check if a gamepad is available +RLAPI const char *GetGamepadName(int gamepad); // Get gamepad internal name id +RLAPI bool IsGamepadButtonPressed(int gamepad, int button); // Check if a gamepad button has been pressed once +RLAPI bool IsGamepadButtonDown(int gamepad, int button); // Check if a gamepad button is being pressed +RLAPI bool IsGamepadButtonReleased(int gamepad, int button); // Check if a gamepad button has been released once +RLAPI bool IsGamepadButtonUp(int gamepad, int button); // Check if a gamepad button is NOT being pressed +RLAPI int GetGamepadButtonPressed(void); // Get the last gamepad button pressed +RLAPI int GetGamepadAxisCount(int gamepad); // Get axis count for a gamepad +RLAPI float GetGamepadAxisMovement(int gamepad, int axis); // Get movement value for a gamepad axis +RLAPI int SetGamepadMappings(const char *mappings); // Set internal gamepad mappings (SDL_GameControllerDB) +RLAPI void SetGamepadVibration(int gamepad, float leftMotor, float rightMotor, float duration); // Set gamepad vibration for both motors (duration in seconds) + +// Input-related functions: mouse +RLAPI bool IsMouseButtonPressed(int button); // Check if a mouse button has been pressed once +RLAPI bool IsMouseButtonDown(int button); // Check if a mouse button is being pressed +RLAPI bool IsMouseButtonReleased(int button); // Check if a mouse button has been released once +RLAPI bool IsMouseButtonUp(int button); // Check if a mouse button is NOT being pressed +RLAPI int GetMouseX(void); // Get mouse position X +RLAPI int GetMouseY(void); // Get mouse position Y +RLAPI Vector2 GetMousePosition(void); // Get mouse position XY +RLAPI Vector2 GetMouseDelta(void); // Get mouse delta between frames +RLAPI void SetMousePosition(int x, int y); // Set mouse position XY +RLAPI void SetMouseOffset(int offsetX, int offsetY); // Set mouse offset +RLAPI void SetMouseScale(float scaleX, float scaleY); // Set mouse scaling +RLAPI float GetMouseWheelMove(void); // Get mouse wheel movement for X or Y, whichever is larger +RLAPI Vector2 GetMouseWheelMoveV(void); // Get mouse wheel movement for both X and Y +RLAPI void SetMouseCursor(int cursor); // Set mouse cursor + +// Input-related functions: touch +RLAPI int GetTouchX(void); // Get touch position X for touch point 0 (relative to screen size) +RLAPI int GetTouchY(void); // Get touch position Y for touch point 0 (relative to screen size) +RLAPI Vector2 GetTouchPosition(int index); // Get touch position XY for a touch point index (relative to screen size) +RLAPI int GetTouchPointId(int index); // Get touch point identifier for given index +RLAPI int GetTouchPointCount(void); // Get number of touch points + +//------------------------------------------------------------------------------------ +// Gestures and Touch Handling Functions (Module: rgestures) +//------------------------------------------------------------------------------------ +RLAPI void SetGesturesEnabled(unsigned int flags); // Enable a set of gestures using flags +RLAPI bool IsGestureDetected(unsigned int gesture); // Check if a gesture have been detected +RLAPI int GetGestureDetected(void); // Get latest detected gesture +RLAPI float GetGestureHoldDuration(void); // Get gesture hold time in seconds +RLAPI Vector2 GetGestureDragVector(void); // Get gesture drag vector +RLAPI float GetGestureDragAngle(void); // Get gesture drag angle +RLAPI Vector2 GetGesturePinchVector(void); // Get gesture pinch delta +RLAPI float GetGesturePinchAngle(void); // Get gesture pinch angle + +//------------------------------------------------------------------------------------ +// Camera System Functions (Module: rcamera) +//------------------------------------------------------------------------------------ +RLAPI void UpdateCamera(Camera *camera, int mode); // Update camera position for selected mode +RLAPI void UpdateCameraPro(Camera *camera, Vector3 movement, Vector3 rotation, float zoom); // Update camera movement/rotation + +//------------------------------------------------------------------------------------ +// Basic Shapes Drawing Functions (Module: shapes) +//------------------------------------------------------------------------------------ +// Set texture and rectangle to be used on shapes drawing +// NOTE: It can be useful when using basic shapes and one single font, +// defining a font char white rectangle would allow drawing everything in a single draw call +RLAPI void SetShapesTexture(Texture2D texture, Rectangle source); // Set texture and rectangle to be used on shapes drawing +RLAPI Texture2D GetShapesTexture(void); // Get texture that is used for shapes drawing +RLAPI Rectangle GetShapesTextureRectangle(void); // Get texture source rectangle that is used for shapes drawing + +// Basic shapes drawing functions +RLAPI void DrawPixel(int posX, int posY, Color color); // Draw a pixel using geometry [Can be slow, use with care] +RLAPI void DrawPixelV(Vector2 position, Color color); // Draw a pixel using geometry (Vector version) [Can be slow, use with care] +RLAPI void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw a line +RLAPI void DrawLineV(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (using gl lines) +RLAPI void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line (using triangles/quads) +RLAPI void DrawLineStrip(const Vector2 *points, int pointCount, Color color); // Draw lines sequence (using gl lines) +RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw line segment cubic-bezier in-out interpolation +RLAPI void DrawLineDashed(Vector2 startPos, Vector2 endPos, int dashSize, int spaceSize, Color color); // Draw a dashed line +RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle +RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle +RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline +RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color inner, Color outer); // Draw a gradient-filled circle +RLAPI void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version) +RLAPI void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline +RLAPI void DrawCircleLinesV(Vector2 center, float radius, Color color); // Draw circle outline (Vector version) +RLAPI void DrawEllipse(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse +RLAPI void DrawEllipseV(Vector2 center, float radiusH, float radiusV, Color color); // Draw ellipse (Vector version) +RLAPI void DrawEllipseLines(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse outline +RLAPI void DrawEllipseLinesV(Vector2 center, float radiusH, float radiusV, Color color); // Draw ellipse outline (Vector version) +RLAPI void DrawRing(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring +RLAPI void DrawRingLines(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring outline +RLAPI void DrawRectangle(int posX, int posY, int width, int height, Color color); // Draw a color-filled rectangle +RLAPI void DrawRectangleV(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version) +RLAPI void DrawRectangleRec(Rectangle rec, Color color); // Draw a color-filled rectangle +RLAPI void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color); // Draw a color-filled rectangle with pro parameters +RLAPI void DrawRectangleGradientV(int posX, int posY, int width, int height, Color top, Color bottom); // Draw a vertical-gradient-filled rectangle +RLAPI void DrawRectangleGradientH(int posX, int posY, int width, int height, Color left, Color right); // Draw a horizontal-gradient-filled rectangle +RLAPI void DrawRectangleGradientEx(Rectangle rec, Color topLeft, Color bottomLeft, Color bottomRight, Color topRight); // Draw a gradient-filled rectangle with custom vertex colors +RLAPI void DrawRectangleLines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline +RLAPI void DrawRectangleLinesEx(Rectangle rec, float lineThick, Color color); // Draw rectangle outline with extended parameters +RLAPI void DrawRectangleRounded(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle with rounded edges +RLAPI void DrawRectangleRoundedLines(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle lines with rounded edges +RLAPI void DrawRectangleRoundedLinesEx(Rectangle rec, float roundness, int segments, float lineThick, Color color); // Draw rectangle with rounded edges outline +RLAPI void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +RLAPI void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline (vertex in counter-clockwise order!) +RLAPI void DrawTriangleFan(const Vector2 *points, int pointCount, Color color); // Draw a triangle fan defined by points (first vertex is the center) +RLAPI void DrawTriangleStrip(const Vector2 *points, int pointCount, Color color); // Draw a triangle strip defined by points +RLAPI void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a regular polygon (Vector version) +RLAPI void DrawPolyLines(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a polygon outline of n sides +RLAPI void DrawPolyLinesEx(Vector2 center, int sides, float radius, float rotation, float lineThick, Color color); // Draw a polygon outline of n sides with extended parameters + +// Splines drawing functions +RLAPI void DrawSplineLinear(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Linear, minimum 2 points +RLAPI void DrawSplineBasis(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: B-Spline, minimum 4 points +RLAPI void DrawSplineCatmullRom(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Catmull-Rom, minimum 4 points +RLAPI void DrawSplineBezierQuadratic(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Quadratic Bezier, minimum 3 points (1 control point): [p1, c2, p3, c4...] +RLAPI void DrawSplineBezierCubic(const Vector2 *points, int pointCount, float thick, Color color); // Draw spline: Cubic Bezier, minimum 4 points (2 control points): [p1, c2, c3, p4, c5, c6...] +RLAPI void DrawSplineSegmentLinear(Vector2 p1, Vector2 p2, float thick, Color color); // Draw spline segment: Linear, 2 points +RLAPI void DrawSplineSegmentBasis(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float thick, Color color); // Draw spline segment: B-Spline, 4 points +RLAPI void DrawSplineSegmentCatmullRom(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float thick, Color color); // Draw spline segment: Catmull-Rom, 4 points +RLAPI void DrawSplineSegmentBezierQuadratic(Vector2 p1, Vector2 c2, Vector2 p3, float thick, Color color); // Draw spline segment: Quadratic Bezier, 2 points, 1 control point +RLAPI void DrawSplineSegmentBezierCubic(Vector2 p1, Vector2 c2, Vector2 c3, Vector2 p4, float thick, Color color); // Draw spline segment: Cubic Bezier, 2 points, 2 control points + +// Spline segment point evaluation functions, for a given t [0.0f .. 1.0f] +RLAPI Vector2 GetSplinePointLinear(Vector2 startPos, Vector2 endPos, float t); // Get (evaluate) spline point: Linear +RLAPI Vector2 GetSplinePointBasis(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float t); // Get (evaluate) spline point: B-Spline +RLAPI Vector2 GetSplinePointCatmullRom(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4, float t); // Get (evaluate) spline point: Catmull-Rom +RLAPI Vector2 GetSplinePointBezierQuad(Vector2 p1, Vector2 c2, Vector2 p3, float t); // Get (evaluate) spline point: Quadratic Bezier +RLAPI Vector2 GetSplinePointBezierCubic(Vector2 p1, Vector2 c2, Vector2 c3, Vector2 p4, float t); // Get (evaluate) spline point: Cubic Bezier + +// Basic shapes collision detection functions +RLAPI bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles +RLAPI bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles +RLAPI bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec); // Check collision between circle and rectangle +RLAPI bool CheckCollisionCircleLine(Vector2 center, float radius, Vector2 p1, Vector2 p2); // Check if circle collides with a line created betweeen two points [p1] and [p2] +RLAPI bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle +RLAPI bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius); // Check if point is inside circle +RLAPI bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); // Check if point is inside a triangle +RLAPI bool CheckCollisionPointLine(Vector2 point, Vector2 p1, Vector2 p2, int threshold); // Check if point belongs to line created between two points [p1] and [p2] with defined margin in pixels [threshold] +RLAPI bool CheckCollisionPointPoly(Vector2 point, const Vector2 *points, int pointCount); // Check if point is within a polygon described by array of vertices +RLAPI bool CheckCollisionLines(Vector2 startPos1, Vector2 endPos1, Vector2 startPos2, Vector2 endPos2, Vector2 *collisionPoint); // Check the collision between two lines defined by two points each, returns collision point by reference +RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2); // Get collision rectangle for two rectangles collision + +//------------------------------------------------------------------------------------ +// Texture Loading and Drawing Functions (Module: textures) +//------------------------------------------------------------------------------------ + +// Image loading functions +// NOTE: These functions do not require GPU access +RLAPI Image LoadImage(const char *fileName); // Load image from file into CPU memory (RAM) +RLAPI Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image from RAW file data +RLAPI Image LoadImageAnim(const char *fileName, int *frames); // Load image sequence from file (frames appended to image.data) +RLAPI Image LoadImageAnimFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int *frames); // Load image sequence from memory buffer +RLAPI Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load image from memory buffer, fileType refers to extension: i.e. '.png' +RLAPI Image LoadImageFromTexture(Texture2D texture); // Load image from GPU texture data +RLAPI Image LoadImageFromScreen(void); // Load image from screen buffer and (screenshot) +RLAPI bool IsImageValid(Image image); // Check if an image is valid (data and parameters) +RLAPI void UnloadImage(Image image); // Unload image from CPU memory (RAM) +RLAPI bool ExportImage(Image image, const char *fileName); // Export image data to file, returns true on success +RLAPI unsigned char *ExportImageToMemory(Image image, const char *fileType, int *fileSize); // Export image to memory buffer +RLAPI bool ExportImageAsCode(Image image, const char *fileName); // Export image as code file defining an array of bytes, returns true on success + +// Image generation functions +RLAPI Image GenImageColor(int width, int height, Color color); // Generate image: plain color +RLAPI Image GenImageGradientLinear(int width, int height, int direction, Color start, Color end); // Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient +RLAPI Image GenImageGradientRadial(int width, int height, float density, Color inner, Color outer); // Generate image: radial gradient +RLAPI Image GenImageGradientSquare(int width, int height, float density, Color inner, Color outer); // Generate image: square gradient +RLAPI Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color col2); // Generate image: checked +RLAPI Image GenImageWhiteNoise(int width, int height, float factor); // Generate image: white noise +RLAPI Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float scale); // Generate image: perlin noise +RLAPI Image GenImageCellular(int width, int height, int tileSize); // Generate image: cellular algorithm, bigger tileSize means bigger cells +RLAPI Image GenImageText(int width, int height, const char *text); // Generate image: grayscale image from text data + +// Image manipulation functions +RLAPI Image ImageCopy(Image image); // Create an image duplicate (useful for transformations) +RLAPI Image ImageFromImage(Image image, Rectangle rec); // Create an image from another image piece +RLAPI Image ImageFromChannel(Image image, int selectedChannel); // Create an image from a selected channel of another image (GRAYSCALE) +RLAPI Image ImageText(const char *text, int fontSize, Color color); // Create an image from text (default font) +RLAPI Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Color tint); // Create an image from text (custom sprite font) +RLAPI void ImageFormat(Image *image, int newFormat); // Convert image data to desired format +RLAPI void ImageToPOT(Image *image, Color fill); // Convert image to POT (power-of-two) +RLAPI void ImageCrop(Image *image, Rectangle crop); // Crop an image to a defined rectangle +RLAPI void ImageAlphaCrop(Image *image, float threshold); // Crop image depending on alpha value +RLAPI void ImageAlphaClear(Image *image, Color color, float threshold); // Clear alpha channel to desired color +RLAPI void ImageAlphaMask(Image *image, Image alphaMask); // Apply alpha mask to image +RLAPI void ImageAlphaPremultiply(Image *image); // Premultiply alpha channel +RLAPI void ImageBlurGaussian(Image *image, int blurSize); // Apply Gaussian blur using a box blur approximation +RLAPI void ImageKernelConvolution(Image *image, const float *kernel, int kernelSize); // Apply custom square convolution kernel to image +RLAPI void ImageResize(Image *image, int newWidth, int newHeight); // Resize image (Bicubic scaling algorithm) +RLAPI void ImageResizeNN(Image *image, int newWidth, int newHeight); // Resize image (Nearest-Neighbor scaling algorithm) +RLAPI void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color fill); // Resize canvas and fill with color +RLAPI void ImageMipmaps(Image *image); // Compute all mipmap levels for a provided image +RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) +RLAPI void ImageFlipVertical(Image *image); // Flip image vertically +RLAPI void ImageFlipHorizontal(Image *image); // Flip image horizontally +RLAPI void ImageRotate(Image *image, int degrees); // Rotate image by input angle in degrees (-359 to 359) +RLAPI void ImageRotateCW(Image *image); // Rotate image clockwise 90deg +RLAPI void ImageRotateCCW(Image *image); // Rotate image counter-clockwise 90deg +RLAPI void ImageColorTint(Image *image, Color color); // Modify image color: tint +RLAPI void ImageColorInvert(Image *image); // Modify image color: invert +RLAPI void ImageColorGrayscale(Image *image); // Modify image color: grayscale +RLAPI void ImageColorContrast(Image *image, float contrast); // Modify image color: contrast (-100 to 100) +RLAPI void ImageColorBrightness(Image *image, int brightness); // Modify image color: brightness (-255 to 255) +RLAPI void ImageColorReplace(Image *image, Color color, Color replace); // Modify image color: replace color +RLAPI Color *LoadImageColors(Image image); // Load color data from image as a Color array (RGBA - 32bit) +RLAPI Color *LoadImagePalette(Image image, int maxPaletteSize, int *colorCount); // Load colors palette from image as a Color array (RGBA - 32bit) +RLAPI void UnloadImageColors(Color *colors); // Unload color data loaded with LoadImageColors() +RLAPI void UnloadImagePalette(Color *colors); // Unload colors palette loaded with LoadImagePalette() +RLAPI Rectangle GetImageAlphaBorder(Image image, float threshold); // Get image alpha border rectangle +RLAPI Color GetImageColor(Image image, int x, int y); // Get image pixel color at (x, y) position + +// Image drawing functions +// NOTE: Image software-rendering functions (CPU) +RLAPI void ImageClearBackground(Image *dst, Color color); // Clear image background with given color +RLAPI void ImageDrawPixel(Image *dst, int posX, int posY, Color color); // Draw pixel within an image +RLAPI void ImageDrawPixelV(Image *dst, Vector2 position, Color color); // Draw pixel within an image (Vector version) +RLAPI void ImageDrawLine(Image *dst, int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw line within an image +RLAPI void ImageDrawLineV(Image *dst, Vector2 start, Vector2 end, Color color); // Draw line within an image (Vector version) +RLAPI void ImageDrawLineEx(Image *dst, Vector2 start, Vector2 end, int thick, Color color); // Draw a line defining thickness within an image +RLAPI void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color color); // Draw a filled circle within an image +RLAPI void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color); // Draw a filled circle within an image (Vector version) +RLAPI void ImageDrawCircleLines(Image *dst, int centerX, int centerY, int radius, Color color); // Draw circle outline within an image +RLAPI void ImageDrawCircleLinesV(Image *dst, Vector2 center, int radius, Color color); // Draw circle outline within an image (Vector version) +RLAPI void ImageDrawRectangle(Image *dst, int posX, int posY, int width, int height, Color color); // Draw rectangle within an image +RLAPI void ImageDrawRectangleV(Image *dst, Vector2 position, Vector2 size, Color color); // Draw rectangle within an image (Vector version) +RLAPI void ImageDrawRectangleRec(Image *dst, Rectangle rec, Color color); // Draw rectangle within an image +RLAPI void ImageDrawRectangleLines(Image *dst, Rectangle rec, int thick, Color color); // Draw rectangle lines within an image +RLAPI void ImageDrawTriangle(Image *dst, Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle within an image +RLAPI void ImageDrawTriangleEx(Image *dst, Vector2 v1, Vector2 v2, Vector2 v3, Color c1, Color c2, Color c3); // Draw triangle with interpolated colors within an image +RLAPI void ImageDrawTriangleLines(Image *dst, Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline within an image +RLAPI void ImageDrawTriangleFan(Image *dst, const Vector2 *points, int pointCount, Color color); // Draw a triangle fan defined by points within an image (first vertex is the center) +RLAPI void ImageDrawTriangleStrip(Image *dst, const Vector2 *points, int pointCount, Color color); // Draw a triangle strip defined by points within an image +RLAPI void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint); // Draw a source image within a destination image (tint applied to source) +RLAPI void ImageDrawText(Image *dst, const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) within an image (destination) +RLAPI void ImageDrawTextEx(Image *dst, Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text (custom sprite font) within an image (destination) + +// Texture loading functions +// NOTE: These functions require GPU access +RLAPI Texture2D LoadTexture(const char *fileName); // Load texture from file into GPU memory (VRAM) +RLAPI Texture2D LoadTextureFromImage(Image image); // Load texture from image data +RLAPI TextureCubemap LoadTextureCubemap(Image image, int layout); // Load cubemap from image, multiple image cubemap layouts supported +RLAPI RenderTexture2D LoadRenderTexture(int width, int height); // Load texture for rendering (framebuffer) +RLAPI bool IsTextureValid(Texture2D texture); // Check if a texture is valid (loaded in GPU) +RLAPI void UnloadTexture(Texture2D texture); // Unload texture from GPU memory (VRAM) +RLAPI bool IsRenderTextureValid(RenderTexture2D target); // Check if a render texture is valid (loaded in GPU) +RLAPI void UnloadRenderTexture(RenderTexture2D target); // Unload render texture from GPU memory (VRAM) +RLAPI void UpdateTexture(Texture2D texture, const void *pixels); // Update GPU texture with new data (pixels should be able to fill texture) +RLAPI void UpdateTextureRec(Texture2D texture, Rectangle rec, const void *pixels); // Update GPU texture rectangle with new data (pixels and rec should fit in texture) + +// Texture configuration functions +RLAPI void GenTextureMipmaps(Texture2D *texture); // Generate GPU mipmaps for a texture +RLAPI void SetTextureFilter(Texture2D texture, int filter); // Set texture scaling filter mode +RLAPI void SetTextureWrap(Texture2D texture, int wrap); // Set texture wrapping mode + +// Texture drawing functions +RLAPI void DrawTexture(Texture2D texture, int posX, int posY, Color tint); // Draw a Texture2D +RLAPI void DrawTextureV(Texture2D texture, Vector2 position, Color tint); // Draw a Texture2D with position defined as Vector2 +RLAPI void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint); // Draw a Texture2D with extended parameters +RLAPI void DrawTextureRec(Texture2D texture, Rectangle source, Vector2 position, Color tint); // Draw a part of a texture defined by a rectangle +RLAPI void DrawTexturePro(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draw a part of a texture defined by a rectangle with 'pro' parameters +RLAPI void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draws a texture (or part of it) that stretches or shrinks nicely + +// Color/pixel related functions +RLAPI bool ColorIsEqual(Color col1, Color col2); // Check if two colors are equal +RLAPI Color Fade(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f +RLAPI int ColorToInt(Color color); // Get hexadecimal value for a Color (0xRRGGBBAA) +RLAPI Vector4 ColorNormalize(Color color); // Get Color normalized as float [0..1] +RLAPI Color ColorFromNormalized(Vector4 normalized); // Get Color from normalized values [0..1] +RLAPI Vector3 ColorToHSV(Color color); // Get HSV values for a Color, hue [0..360], saturation/value [0..1] +RLAPI Color ColorFromHSV(float hue, float saturation, float value); // Get a Color from HSV values, hue [0..360], saturation/value [0..1] +RLAPI Color ColorTint(Color color, Color tint); // Get color multiplied with another color +RLAPI Color ColorBrightness(Color color, float factor); // Get color with brightness correction, brightness factor goes from -1.0f to 1.0f +RLAPI Color ColorContrast(Color color, float contrast); // Get color with contrast correction, contrast values between -1.0f and 1.0f +RLAPI Color ColorAlpha(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f +RLAPI Color ColorAlphaBlend(Color dst, Color src, Color tint); // Get src alpha-blended into dst color with tint +RLAPI Color ColorLerp(Color color1, Color color2, float factor); // Get color lerp interpolation between two colors, factor [0.0f..1.0f] +RLAPI Color GetColor(unsigned int hexValue); // Get Color structure from hexadecimal value +RLAPI Color GetPixelColor(void *srcPtr, int format); // Get Color from a source pixel pointer of certain format +RLAPI void SetPixelColor(void *dstPtr, Color color, int format); // Set color formatted into destination pixel pointer +RLAPI int GetPixelDataSize(int width, int height, int format); // Get pixel data size in bytes for certain format + +//------------------------------------------------------------------------------------ +// Font Loading and Text Drawing Functions (Module: text) +//------------------------------------------------------------------------------------ + +// Font loading/unloading functions +RLAPI Font GetFontDefault(void); // Get the default Font +RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM) +RLAPI Font LoadFontEx(const char *fileName, int fontSize, const int *codepoints, int codepointCount); // Load font from file with extended parameters, use NULL for codepoints and 0 for codepointCount to load the default character set, font size is provided in pixels height +RLAPI Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style) +RLAPI Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, const int *codepoints, int codepointCount); // Load font from memory buffer, fileType refers to extension: i.e. '.ttf' +RLAPI bool IsFontValid(Font font); // Check if a font is valid (font data loaded, WARNING: GPU texture not checked) +RLAPI GlyphInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, const int *codepoints, int codepointCount, int type, int *glyphCount); // Load font data for further use +RLAPI Image GenImageFontAtlas(const GlyphInfo *glyphs, Rectangle **glyphRecs, int glyphCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info +RLAPI void UnloadFontData(GlyphInfo *glyphs, int glyphCount); // Unload font chars info data (RAM) +RLAPI void UnloadFont(Font font); // Unload font from GPU memory (VRAM) +RLAPI bool ExportFontAsCode(Font font, const char *fileName); // Export font as code file, returns true on success + +// Text drawing functions +RLAPI void DrawFPS(int posX, int posY); // Draw current FPS +RLAPI void DrawText(const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) +RLAPI void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text using font and additional parameters +RLAPI void DrawTextPro(Font font, const char *text, Vector2 position, Vector2 origin, float rotation, float fontSize, float spacing, Color tint); // Draw text using Font and pro parameters (rotation) +RLAPI void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint); // Draw one character (codepoint) +RLAPI void DrawTextCodepoints(Font font, const int *codepoints, int codepointCount, Vector2 position, float fontSize, float spacing, Color tint); // Draw multiple character (codepoint) + +// Text font info functions +RLAPI void SetTextLineSpacing(int spacing); // Set vertical line spacing when drawing with line-breaks +RLAPI int MeasureText(const char *text, int fontSize); // Measure string width for default font +RLAPI Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // Measure string size for Font +RLAPI int GetGlyphIndex(Font font, int codepoint); // Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found +RLAPI GlyphInfo GetGlyphInfo(Font font, int codepoint); // Get glyph font info data for a codepoint (unicode character), fallback to '?' if not found +RLAPI Rectangle GetGlyphAtlasRec(Font font, int codepoint); // Get glyph rectangle in font atlas for a codepoint (unicode character), fallback to '?' if not found + +// Text codepoints management functions (unicode characters) +RLAPI char *LoadUTF8(const int *codepoints, int length); // Load UTF-8 text encoded from codepoints array +RLAPI void UnloadUTF8(char *text); // Unload UTF-8 text encoded from codepoints array +RLAPI int *LoadCodepoints(const char *text, int *count); // Load all codepoints from a UTF-8 text string, codepoints count returned by parameter +RLAPI void UnloadCodepoints(int *codepoints); // Unload codepoints data from memory +RLAPI int GetCodepointCount(const char *text); // Get total number of codepoints in a UTF-8 encoded string +RLAPI int GetCodepoint(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI int GetCodepointNext(const char *text, int *codepointSize); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI int GetCodepointPrevious(const char *text, int *codepointSize); // Get previous codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI const char *CodepointToUTF8(int codepoint, int *utf8Size); // Encode one codepoint into UTF-8 byte array (array length returned as parameter) + +// Text strings management functions (no UTF-8 strings, only byte chars) +// WARNING 1: Most of these functions use internal static buffers[], it's recommended to store returned data on user-side for re-use +// WARNING 2: Some strings allocate memory internally for the returned strings, those strings must be free by user using MemFree() +RLAPI char **LoadTextLines(const char *text, int *count); // Load text as separate lines ('\n') +RLAPI void UnloadTextLines(char **text, int lineCount); // Unload text lines +RLAPI int TextCopy(char *dst, const char *src); // Copy one string to another, returns bytes copied +RLAPI bool TextIsEqual(const char *text1, const char *text2); // Check if two text string are equal +RLAPI unsigned int TextLength(const char *text); // Get text length, checks for '\0' ending +RLAPI const char *TextFormat(const char *text, ...); // Text formatting with variables (sprintf() style) +RLAPI const char *TextSubtext(const char *text, int position, int length); // Get a piece of a text string +RLAPI const char *TextRemoveSpaces(const char *text); // Remove text spaces, concat words +RLAPI char *GetTextBetween(const char *text, const char *begin, const char *end); // Get text between two strings +RLAPI char *TextReplace(const char *text, const char *search, const char *replacement); // Replace text string (WARNING: memory must be freed!) +RLAPI char *TextReplaceBetween(const char *text, const char *begin, const char *end, const char *replacement); // Replace text between two specific strings (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 char *TextJoin(char **textList, int count, const char *delimiter); // Join text strings with delimiter +RLAPI char **TextSplit(const char *text, char delimiter, int *count); // Split text into multiple strings, using MAX_TEXTSPLIT_COUNT static strings +RLAPI void TextAppend(char *text, const char *append, int *position); // Append text at specific position and move cursor +RLAPI int TextFindIndex(const char *text, const char *search); // Find first text occurrence within a string, -1 if not found +RLAPI char *TextToUpper(const char *text); // Get upper case version of provided string +RLAPI char *TextToLower(const char *text); // Get lower case version of provided string +RLAPI char *TextToPascal(const char *text); // Get Pascal case notation version of provided string +RLAPI char *TextToSnake(const char *text); // Get Snake case notation version of provided string +RLAPI char *TextToCamel(const char *text); // Get Camel case notation version of provided string +RLAPI int TextToInteger(const char *text); // Get integer value from text +RLAPI float TextToFloat(const char *text); // Get float value from text + +//------------------------------------------------------------------------------------ +// Basic 3d Shapes Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ + +// Basic geometric 3D shapes drawing functions +RLAPI void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space +RLAPI void DrawPoint3D(Vector3 position, Color color); // Draw a point in 3D space, actually a small line +RLAPI void DrawCircle3D(Vector3 center, float radius, Vector3 rotationAxis, float rotationAngle, Color color); // Draw a circle in 3D world space +RLAPI void DrawTriangle3D(Vector3 v1, Vector3 v2, Vector3 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +RLAPI void DrawTriangleStrip3D(const Vector3 *points, int pointCount, Color color); // Draw a triangle strip defined by points +RLAPI void DrawCube(Vector3 position, float width, float height, float length, Color color); // Draw cube +RLAPI void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version) +RLAPI void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); // Draw cube wires +RLAPI void DrawCubeWiresV(Vector3 position, Vector3 size, Color color); // Draw cube wires (Vector version) +RLAPI void DrawSphere(Vector3 centerPos, float radius, Color color); // Draw sphere +RLAPI void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters +RLAPI void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires +RLAPI void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone +RLAPI void DrawCylinderEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder with base at startPos and top at endPos +RLAPI void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires +RLAPI void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder wires with base at startPos and top at endPos +RLAPI void DrawCapsule(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Color color); // Draw a capsule with the center of its sphere caps at startPos and endPos +RLAPI void DrawCapsuleWires(Vector3 startPos, Vector3 endPos, float radius, int slices, int rings, Color color); // Draw capsule wireframe with the center of its sphere caps at startPos and endPos +RLAPI void DrawPlane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ +RLAPI void DrawRay(Ray ray, Color color); // Draw a ray line +RLAPI void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0)) + +//------------------------------------------------------------------------------------ +// Model 3d Loading and Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ + +// Model management functions +RLAPI Model LoadModel(const char *fileName); // Load model from files (meshes and materials) +RLAPI Model LoadModelFromMesh(Mesh mesh); // Load model from generated mesh (default material) +RLAPI bool IsModelValid(Model model); // Check if a model is valid (loaded in GPU, VAO/VBOs) +RLAPI void UnloadModel(Model model); // Unload model (including meshes) from memory (RAM and/or VRAM) +RLAPI BoundingBox GetModelBoundingBox(Model model); // Compute model bounding box limits (considers all meshes) + +// Model drawing functions +RLAPI void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set) +RLAPI void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters +RLAPI void DrawModelWires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set) +RLAPI void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model wires (with texture if set) with extended parameters +RLAPI void DrawModelPoints(Model model, Vector3 position, float scale, Color tint); // Draw a model as points +RLAPI void DrawModelPointsEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model as points with extended parameters +RLAPI void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires) +RLAPI void DrawBillboard(Camera camera, Texture2D texture, Vector3 position, float scale, Color tint); // Draw a billboard texture +RLAPI void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector2 size, Color tint); // Draw a billboard texture defined by source +RLAPI void DrawBillboardPro(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector3 up, Vector2 size, Vector2 origin, float rotation, Color tint); // Draw a billboard texture defined by source and rotation + +// Mesh management functions +RLAPI void UploadMesh(Mesh *mesh, bool dynamic); // Upload mesh vertex data in GPU and provide VAO/VBO ids +RLAPI void UpdateMeshBuffer(Mesh mesh, int index, const void *data, int dataSize, int offset); // Update mesh vertex data in GPU for a specific buffer index +RLAPI void UnloadMesh(Mesh mesh); // Unload mesh data from CPU and GPU +RLAPI void DrawMesh(Mesh mesh, Material material, Matrix transform); // Draw a 3d mesh with material and transform +RLAPI void DrawMeshInstanced(Mesh mesh, Material material, const Matrix *transforms, int instances); // Draw multiple mesh instances with material and different transforms +RLAPI BoundingBox GetMeshBoundingBox(Mesh mesh); // Compute mesh bounding box limits +RLAPI void GenMeshTangents(Mesh *mesh); // Compute mesh tangents +RLAPI bool ExportMesh(Mesh mesh, const char *fileName); // Export mesh data to file, returns true on success +RLAPI bool ExportMeshAsCode(Mesh mesh, const char *fileName); // Export mesh as code file (.h) defining multiple arrays of vertex attributes + +// Mesh generation functions +RLAPI Mesh GenMeshPoly(int sides, float radius); // Generate polygonal mesh +RLAPI Mesh GenMeshPlane(float width, float length, int resX, int resZ); // Generate plane mesh (with subdivisions) +RLAPI Mesh GenMeshCube(float width, float height, float length); // Generate cuboid mesh +RLAPI Mesh GenMeshSphere(float radius, int rings, int slices); // Generate sphere mesh (standard sphere) +RLAPI Mesh GenMeshHemiSphere(float radius, int rings, int slices); // Generate half-sphere mesh (no bottom cap) +RLAPI Mesh GenMeshCylinder(float radius, float height, int slices); // Generate cylinder mesh +RLAPI Mesh GenMeshCone(float radius, float height, int slices); // Generate cone/pyramid mesh +RLAPI Mesh GenMeshTorus(float radius, float size, int radSeg, int sides); // Generate torus mesh +RLAPI Mesh GenMeshKnot(float radius, float size, int radSeg, int sides); // Generate trefoil knot mesh +RLAPI Mesh GenMeshHeightmap(Image heightmap, Vector3 size); // Generate heightmap mesh from image data +RLAPI Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize); // Generate cubes-based map mesh from image data + +// Material loading/unloading functions +RLAPI Material *LoadMaterials(const char *fileName, int *materialCount); // Load materials from model file +RLAPI Material LoadMaterialDefault(void); // Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps) +RLAPI bool IsMaterialValid(Material material); // Check if a material is valid (shader assigned, map textures loaded in GPU) +RLAPI void UnloadMaterial(Material material); // Unload material from GPU memory (VRAM) +RLAPI void SetMaterialTexture(Material *material, int mapType, Texture2D texture); // Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...) +RLAPI void SetModelMeshMaterial(Model *model, int meshId, int materialId); // Set material for a mesh + +// Model animations loading/unloading functions +RLAPI ModelAnimation *LoadModelAnimations(const char *fileName, int *animCount); // Load model animations from file +RLAPI void UpdateModelAnimation(Model model, ModelAnimation anim, float frame); // Update model animation pose (vertex buffers and bone matrices) +RLAPI void UpdateModelAnimationEx(Model model, ModelAnimation animA, float frameA, ModelAnimation animB, float frameB, float blend); // Update model animation pose, blending two animations +RLAPI void UnloadModelAnimations(ModelAnimation *animations, int animCount); // Unload animation array data +RLAPI bool IsModelAnimationValid(Model model, ModelAnimation anim); // Check model animation skeleton match + +// Collision detection functions +RLAPI bool CheckCollisionSpheres(Vector3 center1, float radius1, Vector3 center2, float radius2); // Check collision between two spheres +RLAPI bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); // Check collision between two bounding boxes +RLAPI bool CheckCollisionBoxSphere(BoundingBox box, Vector3 center, float radius); // Check collision between box and sphere +RLAPI RayCollision GetRayCollisionSphere(Ray ray, Vector3 center, float radius); // Get collision info between ray and sphere +RLAPI RayCollision GetRayCollisionBox(Ray ray, BoundingBox box); // Get collision info between ray and box +RLAPI RayCollision GetRayCollisionMesh(Ray ray, Mesh mesh, Matrix transform); // Get collision info between ray and mesh +RLAPI RayCollision GetRayCollisionTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3); // Get collision info between ray and triangle +RLAPI RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4); // Get collision info between ray and quad + +//------------------------------------------------------------------------------------ +// Audio Loading and Playing Functions (Module: audio) +//------------------------------------------------------------------------------------ +typedef void (*AudioCallback)(void *bufferData, unsigned int frames); + +// Audio device management functions +RLAPI void InitAudioDevice(void); // Initialize audio device and context +RLAPI void CloseAudioDevice(void); // Close the audio device and context +RLAPI bool IsAudioDeviceReady(void); // Check if audio device has been initialized successfully +RLAPI void SetMasterVolume(float volume); // Set master volume (listener) +RLAPI float GetMasterVolume(void); // Get master volume (listener) + +// Wave/Sound loading/unloading functions +RLAPI Wave LoadWave(const char *fileName); // Load wave data from file +RLAPI Wave LoadWaveFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load wave from memory buffer, fileType refers to extension: i.e. '.wav' +RLAPI bool IsWaveValid(Wave wave); // Checks if wave data is valid (data loaded and parameters) +RLAPI Sound LoadSound(const char *fileName); // Load sound from file +RLAPI Sound LoadSoundFromWave(Wave wave); // Load sound from wave data +RLAPI Sound LoadSoundAlias(Sound source); // Create a new sound that shares the same sample data as the source sound, does not own the sound data +RLAPI bool IsSoundValid(Sound sound); // Checks if a sound is valid (data loaded and buffers initialized) +RLAPI void UpdateSound(Sound sound, const void *data, int sampleCount); // Update sound buffer with new data (default data format: 32 bit float, stereo) +RLAPI void UnloadWave(Wave wave); // Unload wave data +RLAPI void UnloadSound(Sound sound); // Unload sound +RLAPI void UnloadSoundAlias(Sound alias); // Unload a sound alias (does not deallocate sample data) +RLAPI bool ExportWave(Wave wave, const char *fileName); // Export wave data to file, returns true on success +RLAPI bool ExportWaveAsCode(Wave wave, const char *fileName); // Export wave sample data to code (.h), returns true on success + +// Wave/Sound management functions +RLAPI void PlaySound(Sound sound); // Play a sound +RLAPI void StopSound(Sound sound); // Stop playing a sound +RLAPI void PauseSound(Sound sound); // Pause a sound +RLAPI void ResumeSound(Sound sound); // Resume a paused sound +RLAPI bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing +RLAPI void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level) +RLAPI void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level) +RLAPI void SetSoundPan(Sound sound, float pan); // Set pan for a sound (-1.0 left, 0.0 center, 1.0 right) +RLAPI Wave WaveCopy(Wave wave); // Copy a wave to a new wave +RLAPI void WaveCrop(Wave *wave, int initFrame, int finalFrame); // Crop a wave to defined frames range +RLAPI void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels); // Convert wave data to desired format +RLAPI float *LoadWaveSamples(Wave wave); // Load samples data from wave as a 32bit float data array +RLAPI void UnloadWaveSamples(float *samples); // Unload samples data loaded with LoadWaveSamples() + +// Music management functions +RLAPI Music LoadMusicStream(const char *fileName); // Load music stream from file +RLAPI Music LoadMusicStreamFromMemory(const char *fileType, const unsigned char *data, int dataSize); // Load music stream from data +RLAPI bool IsMusicValid(Music music); // Checks if a music stream is valid (context and buffers initialized) +RLAPI void UnloadMusicStream(Music music); // Unload music stream +RLAPI void PlayMusicStream(Music music); // Start music playing +RLAPI bool IsMusicStreamPlaying(Music music); // Check if music is playing +RLAPI void UpdateMusicStream(Music music); // Updates buffers for music streaming +RLAPI void StopMusicStream(Music music); // Stop music playing +RLAPI void PauseMusicStream(Music music); // Pause music playing +RLAPI void ResumeMusicStream(Music music); // Resume playing paused music +RLAPI void SeekMusicStream(Music music, float position); // Seek music to a position (in seconds) +RLAPI void SetMusicVolume(Music music, float volume); // Set volume for music (1.0 is max level) +RLAPI void SetMusicPitch(Music music, float pitch); // Set pitch for a music (1.0 is base level) +RLAPI void SetMusicPan(Music music, float pan); // Set pan for a music (-1.0 left, 0.0 center, 1.0 right) +RLAPI float GetMusicTimeLength(Music music); // Get music time length (in seconds) +RLAPI float GetMusicTimePlayed(Music music); // Get current music time played (in seconds) + +// AudioStream management functions +RLAPI AudioStream LoadAudioStream(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels); // Load audio stream (to stream raw audio pcm data) +RLAPI bool IsAudioStreamValid(AudioStream stream); // Checks if an audio stream is valid (buffers initialized) +RLAPI void UnloadAudioStream(AudioStream stream); // Unload audio stream and free memory +RLAPI void UpdateAudioStream(AudioStream stream, const void *data, int frameCount); // Update audio stream buffers with data +RLAPI bool IsAudioStreamProcessed(AudioStream stream); // Check if any audio stream buffers requires refill +RLAPI void PlayAudioStream(AudioStream stream); // Play audio stream +RLAPI void PauseAudioStream(AudioStream stream); // Pause audio stream +RLAPI void ResumeAudioStream(AudioStream stream); // Resume audio stream +RLAPI bool IsAudioStreamPlaying(AudioStream stream); // Check if audio stream is playing +RLAPI void StopAudioStream(AudioStream stream); // Stop audio stream +RLAPI void SetAudioStreamVolume(AudioStream stream, float volume); // Set volume for audio stream (1.0 is max level) +RLAPI void SetAudioStreamPitch(AudioStream stream, float pitch); // Set pitch for audio stream (1.0 is base level) +RLAPI void SetAudioStreamPan(AudioStream stream, float pan); // Set pan for audio stream (0.5 is centered) +RLAPI void SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams +RLAPI void SetAudioStreamCallback(AudioStream stream, AudioCallback callback); // Audio thread callback to request new data + +RLAPI void AttachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Attach audio stream processor to stream, receives frames x 2 samples as 'float' (stereo) +RLAPI void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Detach audio stream processor from stream + +RLAPI void AttachAudioMixedProcessor(AudioCallback processor); // Attach audio stream processor to the entire audio pipeline, receives frames x 2 samples as 'float' (stereo) +RLAPI void DetachAudioMixedProcessor(AudioCallback processor); // Detach audio stream processor from the entire audio pipeline + +#if defined(__cplusplus) +} +#endif + +#endif // RAYLIB_H diff --git a/raylib/include/raymath.h b/raylib/include/raymath.h new file mode 100644 index 0000000..b0b8dd1 --- /dev/null +++ b/raylib/include/raymath.h @@ -0,0 +1,3146 @@ +/********************************************************************************************** +* +* raymath v2.0 - Math functions to work with Vector2, Vector3, Matrix and Quaternions +* +* CONVENTIONS: +* - Matrix structure is defined as row-major (memory layout) but parameters naming AND all +* math operations performed by the library consider the structure as it was column-major +* It is like transposed versions of the matrices are used for all the maths +* It benefits some functions making them cache-friendly and also avoids matrix +* transpositions sometimes required by OpenGL +* Example: In memory order, row0 is [m0 m4 m8 m12] but in semantic math row0 is [m0 m1 m2 m3] +* - Functions are always self-contained, no function use another raymath function inside, +* required code is directly re-implemented inside +* - Functions input parameters are always received by value (2 unavoidable exceptions) +* - Functions use always a "result" variable for return (except C++ operators) +* - Functions are always defined inline +* - Angles are always in radians (DEG2RAD/RAD2DEG macros provided for convenience) +* - No compound literals used to make sure libray is compatible with C++ +* +* CONFIGURATION: +* #define RAYMATH_IMPLEMENTATION +* Generates the implementation of the library into the included file +* If not defined, the library is in header only mode and can be included in other headers +* or source files without problems. But only ONE file should hold the implementation +* +* #define RAYMATH_STATIC_INLINE +* Define static inline functions code, so #include header suffices for use +* This may use up lots of memory +* +* #define RAYMATH_DISABLE_CPP_OPERATORS +* Disables C++ operator overloads for raymath types. +* +* #define RAYMATH_USE_SIMD_INTRINSICS 1 +* Try to enable SIMD intrinsics for MatrixMultiply() +* Note that users enabling it must be aware of the target platform where application will +* run to support the selected SIMD intrinsic, for now, only SSE is supported +* +* LICENSE: zlib/libpng +* +* Copyright (c) 2015-2026 Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RAYMATH_H +#define RAYMATH_H + +#if defined(RAYMATH_IMPLEMENTATION) && defined(RAYMATH_STATIC_INLINE) + #error "Specifying both RAYMATH_IMPLEMENTATION and RAYMATH_STATIC_INLINE is contradictory" +#endif + +// Function specifiers definition +#if defined(RAYMATH_IMPLEMENTATION) + #if defined(_WIN32) && defined(BUILD_LIBTYPE_SHARED) + #define RMAPI __declspec(dllexport) extern inline // Building raylib as a Win32 shared library (.dll) + #elif defined(BUILD_LIBTYPE_SHARED) + #define RMAPI __attribute__((visibility("default"))) // Building raylib as a Unix shared library (.so/.dylib) + #elif defined(_WIN32) && defined(USE_LIBTYPE_SHARED) + #define RMAPI __declspec(dllimport) // Using raylib as a Win32 shared library (.dll) + #else + #define RMAPI extern inline // Provide external definition + #endif +#elif defined(RAYMATH_STATIC_INLINE) + #define RMAPI static inline // Functions may be inlined, no external out-of-line definition +#else + #if defined(__TINYC__) + #define RMAPI static inline // plain inline not supported by tinycc (See issue #435) + #else + #define RMAPI inline // Functions may be inlined or external definition used + #endif +#endif + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#ifndef PI + #define PI 3.14159265358979323846f +#endif + +#ifndef EPSILON + #define EPSILON 0.000001f +#endif + +#ifndef DEG2RAD + #define DEG2RAD (PI/180.0f) +#endif + +#ifndef RAD2DEG + #define RAD2DEG (180.0f/PI) +#endif + +// Get float vector for Matrix +#ifndef MatrixToFloat + #define MatrixToFloat(mat) (MatrixToFloatV(mat).v) +#endif + +// Get float vector for Vector3 +#ifndef Vector3ToFloat + #define Vector3ToFloat(vec) (Vector3ToFloatV(vec).v) +#endif + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +#if !defined(RL_VECTOR2_TYPE) +// Vector2 type +typedef struct Vector2 { + float x; + float y; +} Vector2; +#define RL_VECTOR2_TYPE +#endif + +#if !defined(RL_VECTOR3_TYPE) +// Vector3 type +typedef struct Vector3 { + float x; + float y; + float z; +} Vector3; +#define RL_VECTOR3_TYPE +#endif + +#if !defined(RL_VECTOR4_TYPE) +// Vector4 type +typedef struct Vector4 { + float x; + float y; + float z; + float w; +} Vector4; +#define RL_VECTOR4_TYPE +#endif + +#if !defined(RL_QUATERNION_TYPE) +// Quaternion type +typedef Vector4 Quaternion; +#define RL_QUATERNION_TYPE +#endif + +#if !defined(RL_MATRIX_TYPE) +// Matrix type (OpenGL style 4x4 - right handed, column major) +typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) +} Matrix; +#define RL_MATRIX_TYPE +#endif + +// NOTE: Helper types to be used instead of array return types for *ToFloat functions +#if !defined(RL_FLOAT3_TYPE) +typedef struct float3 { + float v[3]; +} float3; +#define RL_FLOAT3_TYPE +#endif + +#if !defined(RL_FLOAT16_TYPE) +typedef struct float16 { + float v[16]; +} float16; +#define RL_FLOAT16_TYPE +#endif + +#include // Required for: sinf(), cosf(), tan(), atan2f(), sqrtf(), floor(), fminf(), fmaxf(), fabsf() + +#if RAYMATH_USE_SIMD_INTRINSICS + // SIMD is used on the most costly raymath function MatrixMultiply() + // NOTE: Only SSE intrinsics support implemented + // TODO: Consider support for other SIMD instrinsics: + // - SSEx, AVX, AVX2, FMA, NEON, RVV + /* + #if defined(__SSE4_2__) + #include + #define RAYMATH_SSE42_ENABLED + #elif defined(__SSE4_1__) + #include + #define RAYMATH_SSE41_ENABLED + #elif defined(__SSSE3__) + #include + #define RAYMATH_SSSE3_ENABLED + #elif defined(__SSE3__) + #include + #define RAYMATH_SSE3_ENABLED + #elif defined(__SSE2__) || (defined(_M_AMD64) || defined(_M_X64)) // SSE2 x64 + #include + #define RAYMATH_SSE2_ENABLED + #endif + */ + #if defined(__SSE__) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) + #include + #define RAYMATH_SSE_ENABLED + #endif +#endif + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Utils math +//---------------------------------------------------------------------------------- + +// Clamp float value +RMAPI float Clamp(float value, float min, float max) +{ + float result = (value < min)? min : value; + + if (result > max) result = max; + + return result; +} + +// Calculate linear interpolation between two floats +RMAPI float Lerp(float start, float end, float amount) +{ + float result = start + amount*(end - start); + + return result; +} + +// Normalize input value within input range +RMAPI float Normalize(float value, float start, float end) +{ + float result = (value - start)/(end - start); + + return result; +} + +// Remap input value within input range to output range +RMAPI float Remap(float value, float inputStart, float inputEnd, float outputStart, float outputEnd) +{ + float result = (value - inputStart)/(inputEnd - inputStart)*(outputEnd - outputStart) + outputStart; + + return result; +} + +// Wrap input value from min to max +RMAPI float Wrap(float value, float min, float max) +{ + float result = value - (max - min)*floorf((value - min)/(max - min)); + + return result; +} + +// Check whether two given floats are almost equal +RMAPI int FloatEquals(float x, float y) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = (fabsf(x - y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(x), fabsf(y)))); + + return result; +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Vector2 math +//---------------------------------------------------------------------------------- + +// Vector with components value 0.0f +RMAPI Vector2 Vector2Zero(void) +{ + Vector2 result = { 0.0f, 0.0f }; + + return result; +} + +// Vector with components value 1.0f +RMAPI Vector2 Vector2One(void) +{ + Vector2 result = { 1.0f, 1.0f }; + + return result; +} + +// Add two vectors (v1 + v2) +RMAPI Vector2 Vector2Add(Vector2 v1, Vector2 v2) +{ + Vector2 result = { v1.x + v2.x, v1.y + v2.y }; + + return result; +} + +// Add vector and float value +RMAPI Vector2 Vector2AddValue(Vector2 v, float add) +{ + Vector2 result = { v.x + add, v.y + add }; + + return result; +} + +// Subtract two vectors (v1 - v2) +RMAPI Vector2 Vector2Subtract(Vector2 v1, Vector2 v2) +{ + Vector2 result = { v1.x - v2.x, v1.y - v2.y }; + + return result; +} + +// Subtract vector by float value +RMAPI Vector2 Vector2SubtractValue(Vector2 v, float sub) +{ + Vector2 result = { v.x - sub, v.y - sub }; + + return result; +} + +// Calculate vector length +RMAPI float Vector2Length(Vector2 v) +{ + float result = sqrtf((v.x*v.x) + (v.y*v.y)); + + return result; +} + +// Calculate vector square length +RMAPI float Vector2LengthSqr(Vector2 v) +{ + float result = (v.x*v.x) + (v.y*v.y); + + return result; +} + +// Calculate two vectors dot product +RMAPI float Vector2DotProduct(Vector2 v1, Vector2 v2) +{ + float result = (v1.x*v2.x + v1.y*v2.y); + + return result; +} + +// Calculate two vectors cross product +RMAPI float Vector2CrossProduct(Vector2 v1, Vector2 v2) +{ + float result = (v1.x*v2.y - v1.y*v2.x); + + return result; +} + +// Calculate distance between two vectors +RMAPI float Vector2Distance(Vector2 v1, Vector2 v2) +{ + float result = sqrtf((v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y)); + + return result; +} + +// Calculate square distance between two vectors +RMAPI float Vector2DistanceSqr(Vector2 v1, Vector2 v2) +{ + float result = ((v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y)); + + return result; +} + +// Calculate the signed angle from v1 to v2, relative to the origin (0, 0) +// NOTE: Coordinate system convention: positive X right, positive Y down +// positive angles appear clockwise, and negative angles appear counterclockwise +RMAPI float Vector2Angle(Vector2 v1, Vector2 v2) +{ + float result = 0.0f; + + float dot = v1.x*v2.x + v1.y*v2.y; + float det = v1.x*v2.y - v1.y*v2.x; + + result = atan2f(det, dot); + + return result; +} + +// Calculate angle defined by a two vectors line +// NOTE: Parameters need to be normalized +// Current implementation should be aligned with glm::angle +RMAPI float Vector2LineAngle(Vector2 start, Vector2 end) +{ + float result = 0.0f; + + // TODO(10/9/2023): Currently angles move clockwise, determine if this is wanted behavior + result = -atan2f(end.y - start.y, end.x - start.x); + + return result; +} + +// Scale vector (multiply by value) +RMAPI Vector2 Vector2Scale(Vector2 v, float scale) +{ + Vector2 result = { v.x*scale, v.y*scale }; + + return result; +} + +// Multiply vector by vector +RMAPI Vector2 Vector2Multiply(Vector2 v1, Vector2 v2) +{ + Vector2 result = { v1.x*v2.x, v1.y*v2.y }; + + return result; +} + +// Negate vector +RMAPI Vector2 Vector2Negate(Vector2 v) +{ + Vector2 result = { -v.x, -v.y }; + + return result; +} + +// Divide vector by vector +RMAPI Vector2 Vector2Divide(Vector2 v1, Vector2 v2) +{ + Vector2 result = { v1.x/v2.x, v1.y/v2.y }; + + return result; +} + +// Normalize provided vector +RMAPI Vector2 Vector2Normalize(Vector2 v) +{ + Vector2 result = { 0 }; + float length = sqrtf((v.x*v.x) + (v.y*v.y)); + + if (length > 0) + { + float ilength = 1.0f/length; + result.x = v.x*ilength; + result.y = v.y*ilength; + } + + return result; +} + +// Transforms a Vector2 by a given Matrix +RMAPI Vector2 Vector2Transform(Vector2 v, Matrix mat) +{ + Vector2 result = { 0 }; + + float x = v.x; + float y = v.y; + float z = 0; + + result.x = mat.m0*x + mat.m4*y + mat.m8*z + mat.m12; + result.y = mat.m1*x + mat.m5*y + mat.m9*z + mat.m13; + + return result; +} + +// Calculate linear interpolation between two vectors +RMAPI Vector2 Vector2Lerp(Vector2 v1, Vector2 v2, float amount) +{ + Vector2 result = { 0 }; + + result.x = v1.x + amount*(v2.x - v1.x); + result.y = v1.y + amount*(v2.y - v1.y); + + return result; +} + +// Calculate reflected vector to normal +RMAPI Vector2 Vector2Reflect(Vector2 v, Vector2 normal) +{ + Vector2 result = { 0 }; + + float dotProduct = (v.x*normal.x + v.y*normal.y); // Dot product + + result.x = v.x - (2.0f*normal.x)*dotProduct; + result.y = v.y - (2.0f*normal.y)*dotProduct; + + return result; +} + +// Get min value for each pair of components +RMAPI Vector2 Vector2Min(Vector2 v1, Vector2 v2) +{ + Vector2 result = { 0 }; + + result.x = fminf(v1.x, v2.x); + result.y = fminf(v1.y, v2.y); + + return result; +} + +// Get max value for each pair of components +RMAPI Vector2 Vector2Max(Vector2 v1, Vector2 v2) +{ + Vector2 result = { 0 }; + + result.x = fmaxf(v1.x, v2.x); + result.y = fmaxf(v1.y, v2.y); + + return result; +} + +// Rotate vector by angle +RMAPI Vector2 Vector2Rotate(Vector2 v, float angle) +{ + Vector2 result = { 0 }; + + float cosres = cosf(angle); + float sinres = sinf(angle); + + result.x = v.x*cosres - v.y*sinres; + result.y = v.x*sinres + v.y*cosres; + + return result; +} + +// Move Vector towards target +RMAPI Vector2 Vector2MoveTowards(Vector2 v, Vector2 target, float maxDistance) +{ + Vector2 result = { 0 }; + + float dx = target.x - v.x; + float dy = target.y - v.y; + float value = (dx*dx) + (dy*dy); + + if ((value == 0) || ((maxDistance >= 0) && (value <= maxDistance*maxDistance))) return target; + + float dist = sqrtf(value); + + result.x = v.x + dx/dist*maxDistance; + result.y = v.y + dy/dist*maxDistance; + + return result; +} + +// Invert the given vector +RMAPI Vector2 Vector2Invert(Vector2 v) +{ + Vector2 result = { 1.0f/v.x, 1.0f/v.y }; + + return result; +} + +// Clamp the components of the vector between +// min and max values specified by the given vectors +RMAPI Vector2 Vector2Clamp(Vector2 v, Vector2 min, Vector2 max) +{ + Vector2 result = { 0 }; + + result.x = fminf(max.x, fmaxf(min.x, v.x)); + result.y = fminf(max.y, fmaxf(min.y, v.y)); + + return result; +} + +// Clamp the magnitude of the vector between two min and max values +RMAPI Vector2 Vector2ClampValue(Vector2 v, float min, float max) +{ + Vector2 result = v; + + float length = (v.x*v.x) + (v.y*v.y); + if (length > 0.0f) + { + length = sqrtf(length); + + float scale = 1; // By default, 1 as the neutral element. + if (length < min) + { + scale = min/length; + } + else if (length > max) + { + scale = max/length; + } + + result.x = v.x*scale; + result.y = v.y*scale; + } + + return result; +} + +// Check whether two given vectors are almost equal +RMAPI int Vector2Equals(Vector2 p, Vector2 q) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))); + + return result; +} + +// Compute the direction of a refracted ray +// v: normalized direction of the incoming ray +// n: normalized normal vector of the interface of two optical media +// r: ratio of the refractive index of the medium from where the ray comes +// to the refractive index of the medium on the other side of the surface +RMAPI Vector2 Vector2Refract(Vector2 v, Vector2 n, float r) +{ + Vector2 result = { 0 }; + + float dot = v.x*n.x + v.y*n.y; + float d = 1.0f - r*r*(1.0f - dot*dot); + + if (d >= 0.0f) + { + d = sqrtf(d); + v.x = r*v.x - (r*dot + d)*n.x; + v.y = r*v.y - (r*dot + d)*n.y; + + result = v; + } + + return result; +} + + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Vector3 math +//---------------------------------------------------------------------------------- + +// Vector with components value 0.0f +RMAPI Vector3 Vector3Zero(void) +{ + Vector3 result = { 0.0f, 0.0f, 0.0f }; + + return result; +} + +// Vector with components value 1.0f +RMAPI Vector3 Vector3One(void) +{ + Vector3 result = { 1.0f, 1.0f, 1.0f }; + + return result; +} + +// Add two vectors +RMAPI Vector3 Vector3Add(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.x + v2.x, v1.y + v2.y, v1.z + v2.z }; + + return result; +} + +// Add vector and float value +RMAPI Vector3 Vector3AddValue(Vector3 v, float add) +{ + Vector3 result = { v.x + add, v.y + add, v.z + add }; + + return result; +} + +// Subtract two vectors +RMAPI Vector3 Vector3Subtract(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.x - v2.x, v1.y - v2.y, v1.z - v2.z }; + + return result; +} + +// Subtract vector by float value +RMAPI Vector3 Vector3SubtractValue(Vector3 v, float sub) +{ + Vector3 result = { v.x - sub, v.y - sub, v.z - sub }; + + return result; +} + +// Multiply vector by scalar +RMAPI Vector3 Vector3Scale(Vector3 v, float scalar) +{ + Vector3 result = { v.x*scalar, v.y*scalar, v.z*scalar }; + + return result; +} + +// Multiply vector by vector +RMAPI Vector3 Vector3Multiply(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.x*v2.x, v1.y*v2.y, v1.z*v2.z }; + + return result; +} + +// Calculate two vectors cross product +RMAPI Vector3 Vector3CrossProduct(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x }; + + return result; +} + +// Calculate one vector perpendicular vector +RMAPI Vector3 Vector3Perpendicular(Vector3 v) +{ + Vector3 result = { 0 }; + + float min = fabsf(v.x); + Vector3 cardinalAxis = {1.0f, 0.0f, 0.0f}; + + if (fabsf(v.y) < min) + { + min = fabsf(v.y); + Vector3 tmp = {0.0f, 1.0f, 0.0f}; + cardinalAxis = tmp; + } + + if (fabsf(v.z) < min) + { + Vector3 tmp = {0.0f, 0.0f, 1.0f}; + cardinalAxis = tmp; + } + + // Cross product between vectors + result.x = v.y*cardinalAxis.z - v.z*cardinalAxis.y; + result.y = v.z*cardinalAxis.x - v.x*cardinalAxis.z; + result.z = v.x*cardinalAxis.y - v.y*cardinalAxis.x; + + return result; +} + +// Calculate vector length +RMAPI float Vector3Length(const Vector3 v) +{ + float result = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + + return result; +} + +// Calculate vector square length +RMAPI float Vector3LengthSqr(const Vector3 v) +{ + float result = v.x*v.x + v.y*v.y + v.z*v.z; + + return result; +} + +// Calculate two vectors dot product +RMAPI float Vector3DotProduct(Vector3 v1, Vector3 v2) +{ + float result = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + + return result; +} + +// Calculate distance between two vectors +RMAPI float Vector3Distance(Vector3 v1, Vector3 v2) +{ + float result = 0.0f; + + float dx = v2.x - v1.x; + float dy = v2.y - v1.y; + float dz = v2.z - v1.z; + result = sqrtf(dx*dx + dy*dy + dz*dz); + + return result; +} + +// Calculate square distance between two vectors +RMAPI float Vector3DistanceSqr(Vector3 v1, Vector3 v2) +{ + float result = 0.0f; + + float dx = v2.x - v1.x; + float dy = v2.y - v1.y; + float dz = v2.z - v1.z; + result = dx*dx + dy*dy + dz*dz; + + return result; +} + +// Calculate angle between two vectors +RMAPI float Vector3Angle(Vector3 v1, Vector3 v2) +{ + float result = 0.0f; + + Vector3 cross = { v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x }; + float len = sqrtf(cross.x*cross.x + cross.y*cross.y + cross.z*cross.z); + float dot = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + result = atan2f(len, dot); + + return result; +} + +// Negate provided vector (invert direction) +RMAPI Vector3 Vector3Negate(Vector3 v) +{ + Vector3 result = { -v.x, -v.y, -v.z }; + + return result; +} + +// Divide vector by vector +RMAPI Vector3 Vector3Divide(Vector3 v1, Vector3 v2) +{ + Vector3 result = { v1.x/v2.x, v1.y/v2.y, v1.z/v2.z }; + + return result; +} + +// Normalize provided vector +RMAPI Vector3 Vector3Normalize(Vector3 v) +{ + Vector3 result = v; + + float length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length != 0.0f) + { + float ilength = 1.0f/length; + + result.x *= ilength; + result.y *= ilength; + result.z *= ilength; + } + + return result; +} + +//Calculate the projection of the vector v1 on to v2 +RMAPI Vector3 Vector3Project(Vector3 v1, Vector3 v2) +{ + Vector3 result = { 0 }; + + float v1dv2 = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + float v2dv2 = (v2.x*v2.x + v2.y*v2.y + v2.z*v2.z); + + float mag = v1dv2/v2dv2; + + result.x = v2.x*mag; + result.y = v2.y*mag; + result.z = v2.z*mag; + + return result; +} + +//Calculate the rejection of the vector v1 on to v2 +RMAPI Vector3 Vector3Reject(Vector3 v1, Vector3 v2) +{ + Vector3 result = { 0 }; + + float v1dv2 = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z); + float v2dv2 = (v2.x*v2.x + v2.y*v2.y + v2.z*v2.z); + + float mag = v1dv2/v2dv2; + + result.x = v1.x - (v2.x*mag); + result.y = v1.y - (v2.y*mag); + result.z = v1.z - (v2.z*mag); + + return result; +} + +// Orthonormalize provided vectors +// Makes vectors normalized and orthogonal to each other +// Gram-Schmidt function implementation +RMAPI void Vector3OrthoNormalize(Vector3 *v1, Vector3 *v2) +{ + float length = 0.0f; + float ilength = 0.0f; + + // Vector3Normalize(*v1); + Vector3 v = *v1; + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + v1->x *= ilength; + v1->y *= ilength; + v1->z *= ilength; + + // Vector3CrossProduct(*v1, *v2) + Vector3 vn1 = { v1->y*v2->z - v1->z*v2->y, v1->z*v2->x - v1->x*v2->z, v1->x*v2->y - v1->y*v2->x }; + + // Vector3Normalize(vn1); + v = vn1; + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + vn1.x *= ilength; + vn1.y *= ilength; + vn1.z *= ilength; + + // Vector3CrossProduct(vn1, *v1) + Vector3 vn2 = { vn1.y*v1->z - vn1.z*v1->y, vn1.z*v1->x - vn1.x*v1->z, vn1.x*v1->y - vn1.y*v1->x }; + + *v2 = vn2; +} + +// Transforms a Vector3 by a given Matrix +RMAPI Vector3 Vector3Transform(Vector3 v, Matrix mat) +{ + Vector3 result = { 0 }; + + float x = v.x; + float y = v.y; + float z = v.z; + + result.x = mat.m0*x + mat.m4*y + mat.m8*z + mat.m12; + result.y = mat.m1*x + mat.m5*y + mat.m9*z + mat.m13; + result.z = mat.m2*x + mat.m6*y + mat.m10*z + mat.m14; + + return result; +} + +// Transform a vector by quaternion rotation +RMAPI Vector3 Vector3RotateByQuaternion(Vector3 v, Quaternion q) +{ + Vector3 result = { 0 }; + + result.x = v.x*(q.x*q.x + q.w*q.w - q.y*q.y - q.z*q.z) + v.y*(2*q.x*q.y - 2*q.w*q.z) + v.z*(2*q.x*q.z + 2*q.w*q.y); + result.y = v.x*(2*q.w*q.z + 2*q.x*q.y) + v.y*(q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z) + v.z*(-2*q.w*q.x + 2*q.y*q.z); + result.z = v.x*(-2*q.w*q.y + 2*q.x*q.z) + v.y*(2*q.w*q.x + 2*q.y*q.z)+ v.z*(q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z); + + return result; +} + +// Rotates a vector around an axis +RMAPI Vector3 Vector3RotateByAxisAngle(Vector3 v, Vector3 axis, float angle) +{ + // Using Euler-Rodrigues Formula + // Ref.: https://en.wikipedia.org/w/index.php?title=Euler%E2%80%93Rodrigues_formula + + Vector3 result = v; + + // Vector3Normalize(axis); + float length = sqrtf(axis.x*axis.x + axis.y*axis.y + axis.z*axis.z); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + axis.x *= ilength; + axis.y *= ilength; + axis.z *= ilength; + + angle /= 2.0f; + float a = sinf(angle); + float b = axis.x*a; + float c = axis.y*a; + float d = axis.z*a; + a = cosf(angle); + Vector3 w = { b, c, d }; + + // Vector3CrossProduct(w, v) + Vector3 wv = { w.y*v.z - w.z*v.y, w.z*v.x - w.x*v.z, w.x*v.y - w.y*v.x }; + + // Vector3CrossProduct(w, wv) + Vector3 wwv = { w.y*wv.z - w.z*wv.y, w.z*wv.x - w.x*wv.z, w.x*wv.y - w.y*wv.x }; + + // Vector3Scale(wv, 2*a) + a *= 2; + wv.x *= a; + wv.y *= a; + wv.z *= a; + + // Vector3Scale(wwv, 2) + wwv.x *= 2; + wwv.y *= 2; + wwv.z *= 2; + + result.x += wv.x; + result.y += wv.y; + result.z += wv.z; + + result.x += wwv.x; + result.y += wwv.y; + result.z += wwv.z; + + return result; +} + +// Move Vector towards target +RMAPI Vector3 Vector3MoveTowards(Vector3 v, Vector3 target, float maxDistance) +{ + Vector3 result = { 0 }; + + float dx = target.x - v.x; + float dy = target.y - v.y; + float dz = target.z - v.z; + float value = (dx*dx) + (dy*dy) + (dz*dz); + + if ((value == 0) || ((maxDistance >= 0) && (value <= maxDistance*maxDistance))) return target; + + float dist = sqrtf(value); + + result.x = v.x + dx/dist*maxDistance; + result.y = v.y + dy/dist*maxDistance; + result.z = v.z + dz/dist*maxDistance; + + return result; +} + +// Calculate linear interpolation between two vectors +RMAPI Vector3 Vector3Lerp(Vector3 v1, Vector3 v2, float amount) +{ + Vector3 result = { 0 }; + + result.x = v1.x + amount*(v2.x - v1.x); + result.y = v1.y + amount*(v2.y - v1.y); + result.z = v1.z + amount*(v2.z - v1.z); + + return result; +} + +// Calculate cubic hermite interpolation between two vectors and their tangents +// as described in the GLTF 2.0 specification: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#interpolation-cubic +RMAPI Vector3 Vector3CubicHermite(Vector3 v1, Vector3 tangent1, Vector3 v2, Vector3 tangent2, float amount) +{ + Vector3 result = { 0 }; + + float amountPow2 = amount*amount; + float amountPow3 = amount*amount*amount; + + result.x = (2*amountPow3 - 3*amountPow2 + 1)*v1.x + (amountPow3 - 2*amountPow2 + amount)*tangent1.x + (-2*amountPow3 + 3*amountPow2)*v2.x + (amountPow3 - amountPow2)*tangent2.x; + result.y = (2*amountPow3 - 3*amountPow2 + 1)*v1.y + (amountPow3 - 2*amountPow2 + amount)*tangent1.y + (-2*amountPow3 + 3*amountPow2)*v2.y + (amountPow3 - amountPow2)*tangent2.y; + result.z = (2*amountPow3 - 3*amountPow2 + 1)*v1.z + (amountPow3 - 2*amountPow2 + amount)*tangent1.z + (-2*amountPow3 + 3*amountPow2)*v2.z + (amountPow3 - amountPow2)*tangent2.z; + + return result; +} + +// Calculate reflected vector to normal +RMAPI Vector3 Vector3Reflect(Vector3 v, Vector3 normal) +{ + Vector3 result = { 0 }; + + // I is the original vector + // N is the normal of the incident plane + // R = I - (2*N*(DotProduct[I, N])) + + float dotProduct = (v.x*normal.x + v.y*normal.y + v.z*normal.z); + + result.x = v.x - (2.0f*normal.x)*dotProduct; + result.y = v.y - (2.0f*normal.y)*dotProduct; + result.z = v.z - (2.0f*normal.z)*dotProduct; + + return result; +} + +// Get min value for each pair of components +RMAPI Vector3 Vector3Min(Vector3 v1, Vector3 v2) +{ + Vector3 result = { 0 }; + + result.x = fminf(v1.x, v2.x); + result.y = fminf(v1.y, v2.y); + result.z = fminf(v1.z, v2.z); + + return result; +} + +// Get max value for each pair of components +RMAPI Vector3 Vector3Max(Vector3 v1, Vector3 v2) +{ + Vector3 result = { 0 }; + + result.x = fmaxf(v1.x, v2.x); + result.y = fmaxf(v1.y, v2.y); + result.z = fmaxf(v1.z, v2.z); + + return result; +} + +// Compute barycenter coordinates (u, v, w) for point p with respect to triangle (a, b, c) +// NOTE: Assumes P is on the plane of the triangle +RMAPI Vector3 Vector3Barycenter(Vector3 p, Vector3 a, Vector3 b, Vector3 c) +{ + Vector3 result = { 0 }; + + Vector3 v0 = { b.x - a.x, b.y - a.y, b.z - a.z }; // Vector3Subtract(b, a) + Vector3 v1 = { c.x - a.x, c.y - a.y, c.z - a.z }; // Vector3Subtract(c, a) + Vector3 v2 = { p.x - a.x, p.y - a.y, p.z - a.z }; // Vector3Subtract(p, a) + float d00 = (v0.x*v0.x + v0.y*v0.y + v0.z*v0.z); // Vector3DotProduct(v0, v0) + float d01 = (v0.x*v1.x + v0.y*v1.y + v0.z*v1.z); // Vector3DotProduct(v0, v1) + float d11 = (v1.x*v1.x + v1.y*v1.y + v1.z*v1.z); // Vector3DotProduct(v1, v1) + float d20 = (v2.x*v0.x + v2.y*v0.y + v2.z*v0.z); // Vector3DotProduct(v2, v0) + float d21 = (v2.x*v1.x + v2.y*v1.y + v2.z*v1.z); // Vector3DotProduct(v2, v1) + + float denom = d00*d11 - d01*d01; + + result.y = (d11*d20 - d01*d21)/denom; + result.z = (d00*d21 - d01*d20)/denom; + result.x = 1.0f - (result.z + result.y); + + return result; +} + +// Projects a Vector3 from screen space into object space +// NOTE: Self-contained function, no other raymath functions are called +RMAPI Vector3 Vector3Unproject(Vector3 source, Matrix projection, Matrix view) +{ + Vector3 result = { 0 }; + + // Calculate unprojected matrix (multiply view matrix by projection matrix) and invert it + Matrix matViewProj = { // MatrixMultiply(view, projection); + view.m0*projection.m0 + view.m1*projection.m4 + view.m2*projection.m8 + view.m3*projection.m12, + view.m0*projection.m1 + view.m1*projection.m5 + view.m2*projection.m9 + view.m3*projection.m13, + view.m0*projection.m2 + view.m1*projection.m6 + view.m2*projection.m10 + view.m3*projection.m14, + view.m0*projection.m3 + view.m1*projection.m7 + view.m2*projection.m11 + view.m3*projection.m15, + view.m4*projection.m0 + view.m5*projection.m4 + view.m6*projection.m8 + view.m7*projection.m12, + view.m4*projection.m1 + view.m5*projection.m5 + view.m6*projection.m9 + view.m7*projection.m13, + view.m4*projection.m2 + view.m5*projection.m6 + view.m6*projection.m10 + view.m7*projection.m14, + view.m4*projection.m3 + view.m5*projection.m7 + view.m6*projection.m11 + view.m7*projection.m15, + view.m8*projection.m0 + view.m9*projection.m4 + view.m10*projection.m8 + view.m11*projection.m12, + view.m8*projection.m1 + view.m9*projection.m5 + view.m10*projection.m9 + view.m11*projection.m13, + view.m8*projection.m2 + view.m9*projection.m6 + view.m10*projection.m10 + view.m11*projection.m14, + view.m8*projection.m3 + view.m9*projection.m7 + view.m10*projection.m11 + view.m11*projection.m15, + view.m12*projection.m0 + view.m13*projection.m4 + view.m14*projection.m8 + view.m15*projection.m12, + view.m12*projection.m1 + view.m13*projection.m5 + view.m14*projection.m9 + view.m15*projection.m13, + view.m12*projection.m2 + view.m13*projection.m6 + view.m14*projection.m10 + view.m15*projection.m14, + view.m12*projection.m3 + view.m13*projection.m7 + view.m14*projection.m11 + view.m15*projection.m15 }; + + // Calculate inverted matrix -> MatrixInvert(matViewProj); + // Cache the matrix values (speed optimization) + float a00 = matViewProj.m0, a01 = matViewProj.m1, a02 = matViewProj.m2, a03 = matViewProj.m3; + float a10 = matViewProj.m4, a11 = matViewProj.m5, a12 = matViewProj.m6, a13 = matViewProj.m7; + float a20 = matViewProj.m8, a21 = matViewProj.m9, a22 = matViewProj.m10, a23 = matViewProj.m11; + float a30 = matViewProj.m12, a31 = matViewProj.m13, a32 = matViewProj.m14, a33 = matViewProj.m15; + + float b00 = a00*a11 - a01*a10; + float b01 = a00*a12 - a02*a10; + float b02 = a00*a13 - a03*a10; + float b03 = a01*a12 - a02*a11; + float b04 = a01*a13 - a03*a11; + float b05 = a02*a13 - a03*a12; + float b06 = a20*a31 - a21*a30; + float b07 = a20*a32 - a22*a30; + float b08 = a20*a33 - a23*a30; + float b09 = a21*a32 - a22*a31; + float b10 = a21*a33 - a23*a31; + float b11 = a22*a33 - a23*a32; + + // Calculate the invert determinant (inlined to avoid double-caching) + float invDet = 1.0f/(b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06); + + Matrix matViewProjInv = { + (a11*b11 - a12*b10 + a13*b09)*invDet, + (-a01*b11 + a02*b10 - a03*b09)*invDet, + (a31*b05 - a32*b04 + a33*b03)*invDet, + (-a21*b05 + a22*b04 - a23*b03)*invDet, + (-a10*b11 + a12*b08 - a13*b07)*invDet, + (a00*b11 - a02*b08 + a03*b07)*invDet, + (-a30*b05 + a32*b02 - a33*b01)*invDet, + (a20*b05 - a22*b02 + a23*b01)*invDet, + (a10*b10 - a11*b08 + a13*b06)*invDet, + (-a00*b10 + a01*b08 - a03*b06)*invDet, + (a30*b04 - a31*b02 + a33*b00)*invDet, + (-a20*b04 + a21*b02 - a23*b00)*invDet, + (-a10*b09 + a11*b07 - a12*b06)*invDet, + (a00*b09 - a01*b07 + a02*b06)*invDet, + (-a30*b03 + a31*b01 - a32*b00)*invDet, + (a20*b03 - a21*b01 + a22*b00)*invDet }; + + // Create quaternion from source point + Quaternion quat = { source.x, source.y, source.z, 1.0f }; + + // Multiply quat point by unprojecte matrix + Quaternion qtransformed = { // QuaternionTransform(quat, matViewProjInv) + matViewProjInv.m0*quat.x + matViewProjInv.m4*quat.y + matViewProjInv.m8*quat.z + matViewProjInv.m12*quat.w, + matViewProjInv.m1*quat.x + matViewProjInv.m5*quat.y + matViewProjInv.m9*quat.z + matViewProjInv.m13*quat.w, + matViewProjInv.m2*quat.x + matViewProjInv.m6*quat.y + matViewProjInv.m10*quat.z + matViewProjInv.m14*quat.w, + matViewProjInv.m3*quat.x + matViewProjInv.m7*quat.y + matViewProjInv.m11*quat.z + matViewProjInv.m15*quat.w }; + + // Normalized world points in vectors + result.x = qtransformed.x/qtransformed.w; + result.y = qtransformed.y/qtransformed.w; + result.z = qtransformed.z/qtransformed.w; + + return result; +} + +// Get Vector3 as float array +RMAPI float3 Vector3ToFloatV(Vector3 v) +{ + float3 buffer = { 0 }; + + buffer.v[0] = v.x; + buffer.v[1] = v.y; + buffer.v[2] = v.z; + + return buffer; +} + +// Invert the given vector +RMAPI Vector3 Vector3Invert(Vector3 v) +{ + Vector3 result = { 1.0f/v.x, 1.0f/v.y, 1.0f/v.z }; + + return result; +} + +// Clamp the components of the vector between +// min and max values specified by the given vectors +RMAPI Vector3 Vector3Clamp(Vector3 v, Vector3 min, Vector3 max) +{ + Vector3 result = { 0 }; + + result.x = fminf(max.x, fmaxf(min.x, v.x)); + result.y = fminf(max.y, fmaxf(min.y, v.y)); + result.z = fminf(max.z, fmaxf(min.z, v.z)); + + return result; +} + +// Clamp the magnitude of the vector between two values +RMAPI Vector3 Vector3ClampValue(Vector3 v, float min, float max) +{ + Vector3 result = v; + + float length = (v.x*v.x) + (v.y*v.y) + (v.z*v.z); + if (length > 0.0f) + { + length = sqrtf(length); + + float scale = 1; // By default, 1 as the neutral element. + if (length < min) + { + scale = min/length; + } + else if (length > max) + { + scale = max/length; + } + + result.x = v.x*scale; + result.y = v.y*scale; + result.z = v.z*scale; + } + + return result; +} + +// Check whether two given vectors are almost equal +RMAPI int Vector3Equals(Vector3 p, Vector3 q) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && + ((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))); + + return result; +} + +// Compute the direction of a refracted ray +// v: normalized direction of the incoming ray +// n: normalized normal vector of the interface of two optical media +// r: ratio of the refractive index of the medium from where the ray comes +// to the refractive index of the medium on the other side of the surface +RMAPI Vector3 Vector3Refract(Vector3 v, Vector3 n, float r) +{ + Vector3 result = { 0 }; + + float dot = v.x*n.x + v.y*n.y + v.z*n.z; + float d = 1.0f - r*r*(1.0f - dot*dot); + + if (d >= 0.0f) + { + d = sqrtf(d); + v.x = r*v.x - (r*dot + d)*n.x; + v.y = r*v.y - (r*dot + d)*n.y; + v.z = r*v.z - (r*dot + d)*n.z; + + result = v; + } + + return result; +} + + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Vector4 math +//---------------------------------------------------------------------------------- + +RMAPI Vector4 Vector4Zero(void) +{ + Vector4 result = { 0.0f, 0.0f, 0.0f, 0.0f }; + return result; +} + +RMAPI Vector4 Vector4One(void) +{ + Vector4 result = { 1.0f, 1.0f, 1.0f, 1.0f }; + return result; +} + +RMAPI Vector4 Vector4Add(Vector4 v1, Vector4 v2) +{ + Vector4 result = { + v1.x + v2.x, + v1.y + v2.y, + v1.z + v2.z, + v1.w + v2.w + }; + return result; +} + +RMAPI Vector4 Vector4AddValue(Vector4 v, float add) +{ + Vector4 result = { + v.x + add, + v.y + add, + v.z + add, + v.w + add + }; + return result; +} + +RMAPI Vector4 Vector4Subtract(Vector4 v1, Vector4 v2) +{ + Vector4 result = { + v1.x - v2.x, + v1.y - v2.y, + v1.z - v2.z, + v1.w - v2.w + }; + return result; +} + +RMAPI Vector4 Vector4SubtractValue(Vector4 v, float add) +{ + Vector4 result = { + v.x - add, + v.y - add, + v.z - add, + v.w - add + }; + return result; +} + +RMAPI float Vector4Length(Vector4 v) +{ + float result = sqrtf((v.x*v.x) + (v.y*v.y) + (v.z*v.z) + (v.w*v.w)); + return result; +} + +RMAPI float Vector4LengthSqr(Vector4 v) +{ + float result = (v.x*v.x) + (v.y*v.y) + (v.z*v.z) + (v.w*v.w); + return result; +} + +RMAPI float Vector4DotProduct(Vector4 v1, Vector4 v2) +{ + float result = (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z + v1.w*v2.w); + return result; +} + +// Calculate distance between two vectors +RMAPI float Vector4Distance(Vector4 v1, Vector4 v2) +{ + float result = sqrtf( + (v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y) + + (v1.z - v2.z)*(v1.z - v2.z) + (v1.w - v2.w)*(v1.w - v2.w)); + return result; +} + +// Calculate square distance between two vectors +RMAPI float Vector4DistanceSqr(Vector4 v1, Vector4 v2) +{ + float result = + (v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y) + + (v1.z - v2.z)*(v1.z - v2.z) + (v1.w - v2.w)*(v1.w - v2.w); + + return result; +} + +RMAPI Vector4 Vector4Scale(Vector4 v, float scale) +{ + Vector4 result = { v.x*scale, v.y*scale, v.z*scale, v.w*scale }; + return result; +} + +// Multiply vector by vector +RMAPI Vector4 Vector4Multiply(Vector4 v1, Vector4 v2) +{ + Vector4 result = { v1.x*v2.x, v1.y*v2.y, v1.z*v2.z, v1.w*v2.w }; + return result; +} + +// Negate vector +RMAPI Vector4 Vector4Negate(Vector4 v) +{ + Vector4 result = { -v.x, -v.y, -v.z, -v.w }; + return result; +} + +// Divide vector by vector +RMAPI Vector4 Vector4Divide(Vector4 v1, Vector4 v2) +{ + Vector4 result = { v1.x/v2.x, v1.y/v2.y, v1.z/v2.z, v1.w/v2.w }; + return result; +} + +// Normalize provided vector +RMAPI Vector4 Vector4Normalize(Vector4 v) +{ + Vector4 result = { 0 }; + float length = sqrtf((v.x*v.x) + (v.y*v.y) + (v.z*v.z) + (v.w*v.w)); + + if (length > 0) + { + float ilength = 1.0f/length; + result.x = v.x*ilength; + result.y = v.y*ilength; + result.z = v.z*ilength; + result.w = v.w*ilength; + } + + return result; +} + +// Get min value for each pair of components +RMAPI Vector4 Vector4Min(Vector4 v1, Vector4 v2) +{ + Vector4 result = { 0 }; + + result.x = fminf(v1.x, v2.x); + result.y = fminf(v1.y, v2.y); + result.z = fminf(v1.z, v2.z); + result.w = fminf(v1.w, v2.w); + + return result; +} + +// Get max value for each pair of components +RMAPI Vector4 Vector4Max(Vector4 v1, Vector4 v2) +{ + Vector4 result = { 0 }; + + result.x = fmaxf(v1.x, v2.x); + result.y = fmaxf(v1.y, v2.y); + result.z = fmaxf(v1.z, v2.z); + result.w = fmaxf(v1.w, v2.w); + + return result; +} + +// Calculate linear interpolation between two vectors +RMAPI Vector4 Vector4Lerp(Vector4 v1, Vector4 v2, float amount) +{ + Vector4 result = { 0 }; + + result.x = v1.x + amount*(v2.x - v1.x); + result.y = v1.y + amount*(v2.y - v1.y); + result.z = v1.z + amount*(v2.z - v1.z); + result.w = v1.w + amount*(v2.w - v1.w); + + return result; +} + +// Move Vector towards target +RMAPI Vector4 Vector4MoveTowards(Vector4 v, Vector4 target, float maxDistance) +{ + Vector4 result = { 0 }; + + float dx = target.x - v.x; + float dy = target.y - v.y; + float dz = target.z - v.z; + float dw = target.w - v.w; + float value = (dx*dx) + (dy*dy) + (dz*dz) + (dw*dw); + + if ((value == 0) || ((maxDistance >= 0) && (value <= maxDistance*maxDistance))) return target; + + float dist = sqrtf(value); + + result.x = v.x + dx/dist*maxDistance; + result.y = v.y + dy/dist*maxDistance; + result.z = v.z + dz/dist*maxDistance; + result.w = v.w + dw/dist*maxDistance; + + return result; +} + +// Invert the given vector +RMAPI Vector4 Vector4Invert(Vector4 v) +{ + Vector4 result = { 1.0f/v.x, 1.0f/v.y, 1.0f/v.z, 1.0f/v.w }; + return result; +} + +// Check whether two given vectors are almost equal +RMAPI int Vector4Equals(Vector4 p, Vector4 q) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = ((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && + ((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) && + ((fabsf(p.w - q.w)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.w), fabsf(q.w))))); + return result; +} + + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Matrix math +//---------------------------------------------------------------------------------- + +// Compute matrix determinant +RMAPI float MatrixDeterminant(Matrix mat) +{ + float result = 0.0f; +/* + // Cache the matrix values (speed optimization) + float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3; + float a10 = mat.m4, a11 = mat.m5, a12 = mat.m6, a13 = mat.m7; + float a20 = mat.m8, a21 = mat.m9, a22 = mat.m10, a23 = mat.m11; + float a30 = mat.m12, a31 = mat.m13, a32 = mat.m14, a33 = mat.m15; + + // NOTE: It takes 72 multiplication to calculate 4x4 matrix determinant + result = a30*a21*a12*a03 - a20*a31*a12*a03 - a30*a11*a22*a03 + a10*a31*a22*a03 + + a20*a11*a32*a03 - a10*a21*a32*a03 - a30*a21*a02*a13 + a20*a31*a02*a13 + + a30*a01*a22*a13 - a00*a31*a22*a13 - a20*a01*a32*a13 + a00*a21*a32*a13 + + a30*a11*a02*a23 - a10*a31*a02*a23 - a30*a01*a12*a23 + a00*a31*a12*a23 + + a10*a01*a32*a23 - a00*a11*a32*a23 - a20*a11*a02*a33 + a10*a21*a02*a33 + + a20*a01*a12*a33 - a00*a21*a12*a33 - a10*a01*a22*a33 + a00*a11*a22*a33; +*/ + // Using Laplace expansion (https://en.wikipedia.org/wiki/Laplace_expansion), + // previous operation can be simplified to 40 multiplications, decreasing matrix + // size from 4x4 to 2x2 using minors + + // Cache the matrix values (speed optimization) + float m0 = mat.m0, m1 = mat.m1, m2 = mat.m2, m3 = mat.m3; + float m4 = mat.m4, m5 = mat.m5, m6 = mat.m6, m7 = mat.m7; + float m8 = mat.m8, m9 = mat.m9, m10 = mat.m10, m11 = mat.m11; + float m12 = mat.m12, m13 = mat.m13, m14 = mat.m14, m15 = mat.m15; + + result = (m0*((m5*(m10*m15 - m11*m14) - m9*(m6*m15 - m7*m14) + m13*(m6*m11 - m7*m10))) - + m4*((m1*(m10*m15 - m11*m14) - m9*(m2*m15 - m3*m14) + m13*(m2*m11 - m3*m10))) + + m8*((m1*(m6*m15 - m7*m14) - m5*(m2*m15 - m3*m14) + m13*(m2*m7 - m3*m6))) - + m12*((m1*(m6*m11 - m7*m10) - m5*(m2*m11 - m3*m10) + m9*(m2*m7 - m3*m6)))); + + return result; +} + +// Get the trace of the matrix (sum of the values along the diagonal) +RMAPI float MatrixTrace(Matrix mat) +{ + float result = (mat.m0 + mat.m5 + mat.m10 + mat.m15); + + return result; +} + +// Transposes provided matrix +RMAPI Matrix MatrixTranspose(Matrix mat) +{ + Matrix result = { 0 }; + + result.m0 = mat.m0; + result.m1 = mat.m4; + result.m2 = mat.m8; + result.m3 = mat.m12; + result.m4 = mat.m1; + result.m5 = mat.m5; + result.m6 = mat.m9; + result.m7 = mat.m13; + result.m8 = mat.m2; + result.m9 = mat.m6; + result.m10 = mat.m10; + result.m11 = mat.m14; + result.m12 = mat.m3; + result.m13 = mat.m7; + result.m14 = mat.m11; + result.m15 = mat.m15; + + return result; +} + +// Invert provided matrix +RMAPI Matrix MatrixInvert(Matrix mat) +{ + Matrix result = { 0 }; + + // Cache the matrix values (speed optimization) + float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3; + float a10 = mat.m4, a11 = mat.m5, a12 = mat.m6, a13 = mat.m7; + float a20 = mat.m8, a21 = mat.m9, a22 = mat.m10, a23 = mat.m11; + float a30 = mat.m12, a31 = mat.m13, a32 = mat.m14, a33 = mat.m15; + + float b00 = a00*a11 - a01*a10; + float b01 = a00*a12 - a02*a10; + float b02 = a00*a13 - a03*a10; + float b03 = a01*a12 - a02*a11; + float b04 = a01*a13 - a03*a11; + float b05 = a02*a13 - a03*a12; + float b06 = a20*a31 - a21*a30; + float b07 = a20*a32 - a22*a30; + float b08 = a20*a33 - a23*a30; + float b09 = a21*a32 - a22*a31; + float b10 = a21*a33 - a23*a31; + float b11 = a22*a33 - a23*a32; + + // Calculate the invert determinant (inlined to avoid double-caching) + float invDet = 1.0f/(b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06); + + result.m0 = (a11*b11 - a12*b10 + a13*b09)*invDet; + result.m1 = (-a01*b11 + a02*b10 - a03*b09)*invDet; + result.m2 = (a31*b05 - a32*b04 + a33*b03)*invDet; + result.m3 = (-a21*b05 + a22*b04 - a23*b03)*invDet; + result.m4 = (-a10*b11 + a12*b08 - a13*b07)*invDet; + result.m5 = (a00*b11 - a02*b08 + a03*b07)*invDet; + result.m6 = (-a30*b05 + a32*b02 - a33*b01)*invDet; + result.m7 = (a20*b05 - a22*b02 + a23*b01)*invDet; + result.m8 = (a10*b10 - a11*b08 + a13*b06)*invDet; + result.m9 = (-a00*b10 + a01*b08 - a03*b06)*invDet; + result.m10 = (a30*b04 - a31*b02 + a33*b00)*invDet; + result.m11 = (-a20*b04 + a21*b02 - a23*b00)*invDet; + result.m12 = (-a10*b09 + a11*b07 - a12*b06)*invDet; + result.m13 = (a00*b09 - a01*b07 + a02*b06)*invDet; + result.m14 = (-a30*b03 + a31*b01 - a32*b00)*invDet; + result.m15 = (a20*b03 - a21*b01 + a22*b00)*invDet; + + return result; +} + +// Get identity matrix +RMAPI Matrix MatrixIdentity(void) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; + + return result; +} + +// Add two matrices +RMAPI Matrix MatrixAdd(Matrix left, Matrix right) +{ + Matrix result = { 0 }; + + result.m0 = left.m0 + right.m0; + result.m1 = left.m1 + right.m1; + result.m2 = left.m2 + right.m2; + result.m3 = left.m3 + right.m3; + result.m4 = left.m4 + right.m4; + result.m5 = left.m5 + right.m5; + result.m6 = left.m6 + right.m6; + result.m7 = left.m7 + right.m7; + result.m8 = left.m8 + right.m8; + result.m9 = left.m9 + right.m9; + result.m10 = left.m10 + right.m10; + result.m11 = left.m11 + right.m11; + result.m12 = left.m12 + right.m12; + result.m13 = left.m13 + right.m13; + result.m14 = left.m14 + right.m14; + result.m15 = left.m15 + right.m15; + + return result; +} + +// Subtract two matrices (left - right) +RMAPI Matrix MatrixSubtract(Matrix left, Matrix right) +{ + Matrix result = { 0 }; + + result.m0 = left.m0 - right.m0; + result.m1 = left.m1 - right.m1; + result.m2 = left.m2 - right.m2; + result.m3 = left.m3 - right.m3; + result.m4 = left.m4 - right.m4; + result.m5 = left.m5 - right.m5; + result.m6 = left.m6 - right.m6; + result.m7 = left.m7 - right.m7; + result.m8 = left.m8 - right.m8; + result.m9 = left.m9 - right.m9; + result.m10 = left.m10 - right.m10; + result.m11 = left.m11 - right.m11; + result.m12 = left.m12 - right.m12; + result.m13 = left.m13 - right.m13; + result.m14 = left.m14 - right.m14; + result.m15 = left.m15 - right.m15; + + return result; +} + +// Get two matrix multiplication +// NOTE: When multiplying matrices... the order matters! +RMAPI Matrix MatrixMultiply(Matrix left, Matrix right) +{ + Matrix result = { 0 }; + +#if defined(RAYMATH_SSE_ENABLED) + // Load left side and right side + __m128 c0 = _mm_set_ps(right.m12, right.m8, right.m4, right.m0); + __m128 c1 = _mm_set_ps(right.m13, right.m9, right.m5, right.m1); + __m128 c2 = _mm_set_ps(right.m14, right.m10, right.m6, right.m2); + __m128 c3 = _mm_set_ps(right.m15, right.m11, right.m7, right.m3); + + // Transpose so c0..c3 become *rows* of the right matrix in semantic order + _MM_TRANSPOSE4_PS(c0, c1, c2, c3); + + float tmp[4] = { 0 }; + __m128 row; + + // Row 0 of result: [m0, m1, m2, m3] + row = _mm_mul_ps(_mm_set1_ps(left.m0), c0); + row = _mm_add_ps(row, _mm_mul_ps(_mm_set1_ps(left.m1), c1)); + row = _mm_add_ps(row, _mm_mul_ps(_mm_set1_ps(left.m2), c2)); + row = _mm_add_ps(row, _mm_mul_ps(_mm_set1_ps(left.m3), c3)); + _mm_storeu_ps(tmp, row); + result.m0 = tmp[0]; + result.m1 = tmp[1]; + result.m2 = tmp[2]; + result.m3 = tmp[3]; + + // Row 1 of result: [m4, m5, m6, m7] + row = _mm_mul_ps(_mm_set1_ps(left.m4), c0); + row = _mm_add_ps(row, _mm_mul_ps(_mm_set1_ps(left.m5), c1)); + row = _mm_add_ps(row, _mm_mul_ps(_mm_set1_ps(left.m6), c2)); + row = _mm_add_ps(row, _mm_mul_ps(_mm_set1_ps(left.m7), c3)); + _mm_storeu_ps(tmp, row); + result.m4 = tmp[0]; + result.m5 = tmp[1]; + result.m6 = tmp[2]; + result.m7 = tmp[3]; + + // Row 2 of result: [m8, m9, m10, m11] + row = _mm_mul_ps(_mm_set1_ps(left.m8), c0); + row = _mm_add_ps(row, _mm_mul_ps(_mm_set1_ps(left.m9), c1)); + row = _mm_add_ps(row, _mm_mul_ps(_mm_set1_ps(left.m10), c2)); + row = _mm_add_ps(row, _mm_mul_ps(_mm_set1_ps(left.m11), c3)); + _mm_storeu_ps(tmp, row); + result.m8 = tmp[0]; + result.m9 = tmp[1]; + result.m10 = tmp[2]; + result.m11 = tmp[3]; + + // Row 3 of result: [m12, m13, m14, m15] + row = _mm_mul_ps(_mm_set1_ps(left.m12), c0); + row = _mm_add_ps(row, _mm_mul_ps(_mm_set1_ps(left.m13), c1)); + row = _mm_add_ps(row, _mm_mul_ps(_mm_set1_ps(left.m14), c2)); + row = _mm_add_ps(row, _mm_mul_ps(_mm_set1_ps(left.m15), c3)); + _mm_storeu_ps(tmp, row); + result.m12 = tmp[0]; + result.m13 = tmp[1]; + result.m14 = tmp[2]; + result.m15 = tmp[3]; +#else + result.m0 = left.m0*right.m0 + left.m1*right.m4 + left.m2*right.m8 + left.m3*right.m12; + result.m1 = left.m0*right.m1 + left.m1*right.m5 + left.m2*right.m9 + left.m3*right.m13; + result.m2 = left.m0*right.m2 + left.m1*right.m6 + left.m2*right.m10 + left.m3*right.m14; + result.m3 = left.m0*right.m3 + left.m1*right.m7 + left.m2*right.m11 + left.m3*right.m15; + result.m4 = left.m4*right.m0 + left.m5*right.m4 + left.m6*right.m8 + left.m7*right.m12; + result.m5 = left.m4*right.m1 + left.m5*right.m5 + left.m6*right.m9 + left.m7*right.m13; + result.m6 = left.m4*right.m2 + left.m5*right.m6 + left.m6*right.m10 + left.m7*right.m14; + result.m7 = left.m4*right.m3 + left.m5*right.m7 + left.m6*right.m11 + left.m7*right.m15; + result.m8 = left.m8*right.m0 + left.m9*right.m4 + left.m10*right.m8 + left.m11*right.m12; + result.m9 = left.m8*right.m1 + left.m9*right.m5 + left.m10*right.m9 + left.m11*right.m13; + result.m10 = left.m8*right.m2 + left.m9*right.m6 + left.m10*right.m10 + left.m11*right.m14; + result.m11 = left.m8*right.m3 + left.m9*right.m7 + left.m10*right.m11 + left.m11*right.m15; + result.m12 = left.m12*right.m0 + left.m13*right.m4 + left.m14*right.m8 + left.m15*right.m12; + result.m13 = left.m12*right.m1 + left.m13*right.m5 + left.m14*right.m9 + left.m15*right.m13; + result.m14 = left.m12*right.m2 + left.m13*right.m6 + left.m14*right.m10 + left.m15*right.m14; + result.m15 = left.m12*right.m3 + left.m13*right.m7 + left.m14*right.m11 + left.m15*right.m15; +#endif + + return result; +} + +RMAPI Matrix MatrixMultiplyValue(Matrix left, float value) +{ + Matrix result = { + left.m0 * value, left.m4 * value, left.m8 * value, left.m12 * value, + left.m1 * value, left.m5 * value, left.m9 * value, left.m13 * value, + left.m2 * value, left.m6 * value, left.m10 * value, left.m14 * value, + left.m3 * value, left.m7 * value, left.m11 * value, left.m15 * value + }; + + return result; +} + +// Get translation matrix +RMAPI Matrix MatrixTranslate(float x, float y, float z) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, x, + 0.0f, 1.0f, 0.0f, y, + 0.0f, 0.0f, 1.0f, z, + 0.0f, 0.0f, 0.0f, 1.0f }; + + return result; +} + +// Create rotation matrix from axis and angle +// NOTE: Angle should be provided in radians +RMAPI Matrix MatrixRotate(Vector3 axis, float angle) +{ + Matrix result = { 0 }; + + float x = axis.x, y = axis.y, z = axis.z; + + float lengthSquared = x*x + y*y + z*z; + + if ((lengthSquared != 1.0f) && (lengthSquared != 0.0f)) + { + float ilength = 1.0f/sqrtf(lengthSquared); + x *= ilength; + y *= ilength; + z *= ilength; + } + + float sinres = sinf(angle); + float cosres = cosf(angle); + float t = 1.0f - cosres; + + result.m0 = x*x*t + cosres; + result.m1 = y*x*t + z*sinres; + result.m2 = z*x*t - y*sinres; + result.m3 = 0.0f; + + result.m4 = x*y*t - z*sinres; + result.m5 = y*y*t + cosres; + result.m6 = z*y*t + x*sinres; + result.m7 = 0.0f; + + result.m8 = x*z*t + y*sinres; + result.m9 = y*z*t - x*sinres; + result.m10 = z*z*t + cosres; + result.m11 = 0.0f; + + result.m12 = 0.0f; + result.m13 = 0.0f; + result.m14 = 0.0f; + result.m15 = 1.0f; + + return result; +} + +// Get x-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateX(float angle) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float cosres = cosf(angle); + float sinres = sinf(angle); + + result.m5 = cosres; + result.m6 = sinres; + result.m9 = -sinres; + result.m10 = cosres; + + return result; +} + +// Get y-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateY(float angle) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float cosres = cosf(angle); + float sinres = sinf(angle); + + result.m0 = cosres; + result.m2 = -sinres; + result.m8 = sinres; + result.m10 = cosres; + + return result; +} + +// Get z-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateZ(float angle) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float cosres = cosf(angle); + float sinres = sinf(angle); + + result.m0 = cosres; + result.m1 = sinres; + result.m4 = -sinres; + result.m5 = cosres; + + return result; +} + + +// Get xyz-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateXYZ(Vector3 angle) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float cosz = cosf(-angle.z); + float sinz = sinf(-angle.z); + float cosy = cosf(-angle.y); + float siny = sinf(-angle.y); + float cosx = cosf(-angle.x); + float sinx = sinf(-angle.x); + + result.m0 = cosz*cosy; + result.m1 = (cosz*siny*sinx) - (sinz*cosx); + result.m2 = (cosz*siny*cosx) + (sinz*sinx); + + result.m4 = sinz*cosy; + result.m5 = (sinz*siny*sinx) + (cosz*cosx); + result.m6 = (sinz*siny*cosx) - (cosz*sinx); + + result.m8 = -siny; + result.m9 = cosy*sinx; + result.m10= cosy*cosx; + + return result; +} + +// Get zyx-rotation matrix +// NOTE: Angle must be provided in radians +RMAPI Matrix MatrixRotateZYX(Vector3 angle) +{ + Matrix result = { 0 }; + + float cz = cosf(angle.z); + float sz = sinf(angle.z); + float cy = cosf(angle.y); + float sy = sinf(angle.y); + float cx = cosf(angle.x); + float sx = sinf(angle.x); + + result.m0 = cz*cy; + result.m4 = cz*sy*sx - cx*sz; + result.m8 = sz*sx + cz*cx*sy; + result.m12 = 0; + + result.m1 = cy*sz; + result.m5 = cz*cx + sz*sy*sx; + result.m9 = cx*sz*sy - cz*sx; + result.m13 = 0; + + result.m2 = -sy; + result.m6 = cy*sx; + result.m10 = cy*cx; + result.m14 = 0; + + result.m3 = 0; + result.m7 = 0; + result.m11 = 0; + result.m15 = 1; + + return result; +} + +// Get scaling matrix +RMAPI Matrix MatrixScale(float x, float y, float z) +{ + Matrix result = { x, 0.0f, 0.0f, 0.0f, + 0.0f, y, 0.0f, 0.0f, + 0.0f, 0.0f, z, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; + + return result; +} + +// Get perspective projection matrix +RMAPI Matrix MatrixFrustum(double left, double right, double bottom, double top, double nearPlane, double farPlane) +{ + Matrix result = { 0 }; + + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(farPlane - nearPlane); + + result.m0 = ((float)nearPlane*2.0f)/rl; + result.m1 = 0.0f; + result.m2 = 0.0f; + result.m3 = 0.0f; + + result.m4 = 0.0f; + result.m5 = ((float)nearPlane*2.0f)/tb; + result.m6 = 0.0f; + result.m7 = 0.0f; + + result.m8 = ((float)right + (float)left)/rl; + result.m9 = ((float)top + (float)bottom)/tb; + result.m10 = -((float)farPlane + (float)nearPlane)/fn; + result.m11 = -1.0f; + + result.m12 = 0.0f; + result.m13 = 0.0f; + result.m14 = -((float)farPlane*(float)nearPlane*2.0f)/fn; + result.m15 = 0.0f; + + return result; +} + +// Get perspective projection matrix +// NOTE: Fovy angle must be provided in radians +RMAPI Matrix MatrixPerspective(double fovY, double aspect, double nearPlane, double farPlane) +{ + Matrix result = { 0 }; + + double top = nearPlane*tan(fovY*0.5); + double bottom = -top; + double right = top*aspect; + double left = -right; + + // MatrixFrustum(-right, right, -top, top, near, far); + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(farPlane - nearPlane); + + result.m0 = ((float)nearPlane*2.0f)/rl; + result.m5 = ((float)nearPlane*2.0f)/tb; + result.m8 = ((float)right + (float)left)/rl; + result.m9 = ((float)top + (float)bottom)/tb; + result.m10 = -((float)farPlane + (float)nearPlane)/fn; + result.m11 = -1.0f; + result.m14 = -((float)farPlane*(float)nearPlane*2.0f)/fn; + + return result; +} + +// Get orthographic projection matrix +RMAPI Matrix MatrixOrtho(double left, double right, double bottom, double top, double nearPlane, double farPlane) +{ + Matrix result = { 0 }; + + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(farPlane - nearPlane); + + result.m0 = 2.0f/rl; + result.m1 = 0.0f; + result.m2 = 0.0f; + result.m3 = 0.0f; + result.m4 = 0.0f; + result.m5 = 2.0f/tb; + result.m6 = 0.0f; + result.m7 = 0.0f; + result.m8 = 0.0f; + result.m9 = 0.0f; + result.m10 = -2.0f/fn; + result.m11 = 0.0f; + result.m12 = -((float)left + (float)right)/rl; + result.m13 = -((float)top + (float)bottom)/tb; + result.m14 = -((float)farPlane + (float)nearPlane)/fn; + result.m15 = 1.0f; + + return result; +} + +// Get camera look-at matrix (view matrix) +RMAPI Matrix MatrixLookAt(Vector3 eye, Vector3 target, Vector3 up) +{ + Matrix result = { 0 }; + + float length = 0.0f; + float ilength = 0.0f; + + // Vector3Subtract(eye, target) + Vector3 vz = { eye.x - target.x, eye.y - target.y, eye.z - target.z }; + + // Vector3Normalize(vz) + Vector3 v = vz; + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + vz.x *= ilength; + vz.y *= ilength; + vz.z *= ilength; + + // Vector3CrossProduct(up, vz) + Vector3 vx = { up.y*vz.z - up.z*vz.y, up.z*vz.x - up.x*vz.z, up.x*vz.y - up.y*vz.x }; + + // Vector3Normalize(x) + v = vx; + length = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + vx.x *= ilength; + vx.y *= ilength; + vx.z *= ilength; + + // Vector3CrossProduct(vz, vx) + Vector3 vy = { vz.y*vx.z - vz.z*vx.y, vz.z*vx.x - vz.x*vx.z, vz.x*vx.y - vz.y*vx.x }; + + result.m0 = vx.x; + result.m1 = vy.x; + result.m2 = vz.x; + result.m3 = 0.0f; + result.m4 = vx.y; + result.m5 = vy.y; + result.m6 = vz.y; + result.m7 = 0.0f; + result.m8 = vx.z; + result.m9 = vy.z; + result.m10 = vz.z; + result.m11 = 0.0f; + result.m12 = -(vx.x*eye.x + vx.y*eye.y + vx.z*eye.z); // Vector3DotProduct(vx, eye) + result.m13 = -(vy.x*eye.x + vy.y*eye.y + vy.z*eye.z); // Vector3DotProduct(vy, eye) + result.m14 = -(vz.x*eye.x + vz.y*eye.y + vz.z*eye.z); // Vector3DotProduct(vz, eye) + result.m15 = 1.0f; + + return result; +} + +// Get float array of matrix data +RMAPI float16 MatrixToFloatV(Matrix mat) +{ + float16 result = { 0 }; + + result.v[0] = mat.m0; + result.v[1] = mat.m1; + result.v[2] = mat.m2; + result.v[3] = mat.m3; + result.v[4] = mat.m4; + result.v[5] = mat.m5; + result.v[6] = mat.m6; + result.v[7] = mat.m7; + result.v[8] = mat.m8; + result.v[9] = mat.m9; + result.v[10] = mat.m10; + result.v[11] = mat.m11; + result.v[12] = mat.m12; + result.v[13] = mat.m13; + result.v[14] = mat.m14; + result.v[15] = mat.m15; + + return result; +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Quaternion math +//---------------------------------------------------------------------------------- + +// Add two quaternions +RMAPI Quaternion QuaternionAdd(Quaternion q1, Quaternion q2) +{ + Quaternion result = {q1.x + q2.x, q1.y + q2.y, q1.z + q2.z, q1.w + q2.w}; + + return result; +} + +// Add quaternion and float value +RMAPI Quaternion QuaternionAddValue(Quaternion q, float add) +{ + Quaternion result = {q.x + add, q.y + add, q.z + add, q.w + add}; + + return result; +} + +// Subtract two quaternions +RMAPI Quaternion QuaternionSubtract(Quaternion q1, Quaternion q2) +{ + Quaternion result = {q1.x - q2.x, q1.y - q2.y, q1.z - q2.z, q1.w - q2.w}; + + return result; +} + +// Subtract quaternion and float value +RMAPI Quaternion QuaternionSubtractValue(Quaternion q, float sub) +{ + Quaternion result = {q.x - sub, q.y - sub, q.z - sub, q.w - sub}; + + return result; +} + +// Get identity quaternion +RMAPI Quaternion QuaternionIdentity(void) +{ + Quaternion result = { 0.0f, 0.0f, 0.0f, 1.0f }; + + return result; +} + +// Computes the length of a quaternion +RMAPI float QuaternionLength(Quaternion q) +{ + float result = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + + return result; +} + +// Normalize provided quaternion +RMAPI Quaternion QuaternionNormalize(Quaternion q) +{ + Quaternion result = { 0 }; + + float length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + + result.x = q.x*ilength; + result.y = q.y*ilength; + result.z = q.z*ilength; + result.w = q.w*ilength; + + return result; +} + +// Invert provided quaternion +RMAPI Quaternion QuaternionInvert(Quaternion q) +{ + Quaternion result = q; + + float lengthSq = q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w; + + if (lengthSq != 0.0f) + { + float invLength = 1.0f/lengthSq; + + result.x *= -invLength; + result.y *= -invLength; + result.z *= -invLength; + result.w *= invLength; + } + + return result; +} + +// Calculate two quaternion multiplication +RMAPI Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2) +{ + Quaternion result = { 0 }; + + float qax = q1.x, qay = q1.y, qaz = q1.z, qaw = q1.w; + float qbx = q2.x, qby = q2.y, qbz = q2.z, qbw = q2.w; + + result.x = qax*qbw + qaw*qbx + qay*qbz - qaz*qby; + result.y = qay*qbw + qaw*qby + qaz*qbx - qax*qbz; + result.z = qaz*qbw + qaw*qbz + qax*qby - qay*qbx; + result.w = qaw*qbw - qax*qbx - qay*qby - qaz*qbz; + + return result; +} + +// Scale quaternion by float value +RMAPI Quaternion QuaternionScale(Quaternion q, float mul) +{ + Quaternion result = { 0 }; + + result.x = q.x*mul; + result.y = q.y*mul; + result.z = q.z*mul; + result.w = q.w*mul; + + return result; +} + +// Divide two quaternions +RMAPI Quaternion QuaternionDivide(Quaternion q1, Quaternion q2) +{ + Quaternion result = { q1.x/q2.x, q1.y/q2.y, q1.z/q2.z, q1.w/q2.w }; + + return result; +} + +// Calculate linear interpolation between two quaternions +RMAPI Quaternion QuaternionLerp(Quaternion q1, Quaternion q2, float amount) +{ + Quaternion result = { 0 }; + + result.x = q1.x + amount*(q2.x - q1.x); + result.y = q1.y + amount*(q2.y - q1.y); + result.z = q1.z + amount*(q2.z - q1.z); + result.w = q1.w + amount*(q2.w - q1.w); + + return result; +} + +// Calculate slerp-optimized interpolation between two quaternions +RMAPI Quaternion QuaternionNlerp(Quaternion q1, Quaternion q2, float amount) +{ + Quaternion result = { 0 }; + + // QuaternionLerp(q1, q2, amount) + result.x = q1.x + amount*(q2.x - q1.x); + result.y = q1.y + amount*(q2.y - q1.y); + result.z = q1.z + amount*(q2.z - q1.z); + result.w = q1.w + amount*(q2.w - q1.w); + + // QuaternionNormalize(q); + Quaternion q = result; + float length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + + result.x = q.x*ilength; + result.y = q.y*ilength; + result.z = q.z*ilength; + result.w = q.w*ilength; + + return result; +} + +// Calculates spherical linear interpolation between two quaternions +RMAPI Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount) +{ + Quaternion result = { 0 }; + +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + float cosHalfTheta = q1.x*q2.x + q1.y*q2.y + q1.z*q2.z + q1.w*q2.w; + + if (cosHalfTheta < 0) + { + q2.x = -q2.x; q2.y = -q2.y; q2.z = -q2.z; q2.w = -q2.w; + cosHalfTheta = -cosHalfTheta; + } + + if (fabsf(cosHalfTheta) >= 1.0f) result = q1; + else if (cosHalfTheta > 0.95f) result = QuaternionNlerp(q1, q2, amount); + else + { + float halfTheta = acosf(cosHalfTheta); + float sinHalfTheta = sqrtf(1.0f - cosHalfTheta*cosHalfTheta); + + if (fabsf(sinHalfTheta) < EPSILON) + { + result.x = (q1.x*0.5f + q2.x*0.5f); + result.y = (q1.y*0.5f + q2.y*0.5f); + result.z = (q1.z*0.5f + q2.z*0.5f); + result.w = (q1.w*0.5f + q2.w*0.5f); + } + else + { + float ratioA = sinf((1 - amount)*halfTheta)/sinHalfTheta; + float ratioB = sinf(amount*halfTheta)/sinHalfTheta; + + result.x = (q1.x*ratioA + q2.x*ratioB); + result.y = (q1.y*ratioA + q2.y*ratioB); + result.z = (q1.z*ratioA + q2.z*ratioB); + result.w = (q1.w*ratioA + q2.w*ratioB); + } + } + + return result; +} + +// Calculate quaternion cubic spline interpolation using Cubic Hermite Spline algorithm +// as described in the GLTF 2.0 specification: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#interpolation-cubic +RMAPI Quaternion QuaternionCubicHermiteSpline(Quaternion q1, Quaternion outTangent1, Quaternion q2, Quaternion inTangent2, float t) +{ + float t2 = t*t; + float t3 = t2*t; + float h00 = 2*t3 - 3*t2 + 1; + float h10 = t3 - 2*t2 + t; + float h01 = -2*t3 + 3*t2; + float h11 = t3 - t2; + + Quaternion p0 = QuaternionScale(q1, h00); + Quaternion m0 = QuaternionScale(outTangent1, h10); + Quaternion p1 = QuaternionScale(q2, h01); + Quaternion m1 = QuaternionScale(inTangent2, h11); + + Quaternion result = { 0 }; + + result = QuaternionAdd(p0, m0); + result = QuaternionAdd(result, p1); + result = QuaternionAdd(result, m1); + result = QuaternionNormalize(result); + + return result; +} + +// Calculate quaternion based on the rotation from one vector to another +RMAPI Quaternion QuaternionFromVector3ToVector3(Vector3 from, Vector3 to) +{ + Quaternion result = { 0 }; + + float cos2Theta = (from.x*to.x + from.y*to.y + from.z*to.z); // Vector3DotProduct(from, to) + Vector3 cross = { from.y*to.z - from.z*to.y, from.z*to.x - from.x*to.z, from.x*to.y - from.y*to.x }; // Vector3CrossProduct(from, to) + + result.x = cross.x; + result.y = cross.y; + result.z = cross.z; + result.w = sqrtf(cross.x*cross.x + cross.y*cross.y + cross.z*cross.z + cos2Theta*cos2Theta) + cos2Theta; + + // QuaternionNormalize(q); + // NOTE: Normalize to essentially nlerp the original and identity to 0.5 + Quaternion q = result; + float length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + + result.x = q.x*ilength; + result.y = q.y*ilength; + result.z = q.z*ilength; + result.w = q.w*ilength; + + return result; +} + +// Get a quaternion for a given rotation matrix +RMAPI Quaternion QuaternionFromMatrix(Matrix mat) +{ + Quaternion result = { 0 }; + + float fourWSquaredMinus1 = mat.m0 + mat.m5 + mat.m10; + float fourXSquaredMinus1 = mat.m0 - mat.m5 - mat.m10; + float fourYSquaredMinus1 = mat.m5 - mat.m0 - mat.m10; + float fourZSquaredMinus1 = mat.m10 - mat.m0 - mat.m5; + + int biggestIndex = 0; + float fourBiggestSquaredMinus1 = fourWSquaredMinus1; + if (fourXSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourXSquaredMinus1; + biggestIndex = 1; + } + + if (fourYSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourYSquaredMinus1; + biggestIndex = 2; + } + + if (fourZSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourZSquaredMinus1; + biggestIndex = 3; + } + + float biggestVal = sqrtf(fourBiggestSquaredMinus1 + 1.0f)*0.5f; + float mult = 0.25f/biggestVal; + + switch (biggestIndex) + { + case 0: + result.w = biggestVal; + result.x = (mat.m6 - mat.m9)*mult; + result.y = (mat.m8 - mat.m2)*mult; + result.z = (mat.m1 - mat.m4)*mult; + break; + case 1: + result.x = biggestVal; + result.w = (mat.m6 - mat.m9)*mult; + result.y = (mat.m1 + mat.m4)*mult; + result.z = (mat.m8 + mat.m2)*mult; + break; + case 2: + result.y = biggestVal; + result.w = (mat.m8 - mat.m2)*mult; + result.x = (mat.m1 + mat.m4)*mult; + result.z = (mat.m6 + mat.m9)*mult; + break; + case 3: + result.z = biggestVal; + result.w = (mat.m1 - mat.m4)*mult; + result.x = (mat.m8 + mat.m2)*mult; + result.y = (mat.m6 + mat.m9)*mult; + break; + } + + return result; +} + +// Get a matrix for a given quaternion +RMAPI Matrix QuaternionToMatrix(Quaternion q) +{ + Matrix result = { 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; // MatrixIdentity() + + float a2 = q.x*q.x; + float b2 = q.y*q.y; + float c2 = q.z*q.z; + float ac = q.x*q.z; + float ab = q.x*q.y; + float bc = q.y*q.z; + float ad = q.w*q.x; + float bd = q.w*q.y; + float cd = q.w*q.z; + + result.m0 = 1 - 2*(b2 + c2); + result.m1 = 2*(ab + cd); + result.m2 = 2*(ac - bd); + + result.m4 = 2*(ab - cd); + result.m5 = 1 - 2*(a2 + c2); + result.m6 = 2*(bc + ad); + + result.m8 = 2*(ac + bd); + result.m9 = 2*(bc - ad); + result.m10 = 1 - 2*(a2 + b2); + + return result; +} + +// Get rotation quaternion for an angle and axis +// NOTE: Angle must be provided in radians +RMAPI Quaternion QuaternionFromAxisAngle(Vector3 axis, float angle) +{ + Quaternion result = { 0.0f, 0.0f, 0.0f, 1.0f }; + + float axisLength = sqrtf(axis.x*axis.x + axis.y*axis.y + axis.z*axis.z); + + if (axisLength != 0.0f) + { + angle *= 0.5f; + + float length = 0.0f; + float ilength = 0.0f; + + // Vector3Normalize(axis) + length = axisLength; + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + axis.x *= ilength; + axis.y *= ilength; + axis.z *= ilength; + + float sinres = sinf(angle); + float cosres = cosf(angle); + + result.x = axis.x*sinres; + result.y = axis.y*sinres; + result.z = axis.z*sinres; + result.w = cosres; + + // QuaternionNormalize(q); + Quaternion q = result; + length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + ilength = 1.0f/length; + result.x = q.x*ilength; + result.y = q.y*ilength; + result.z = q.z*ilength; + result.w = q.w*ilength; + } + + return result; +} + +// Get the rotation angle and axis for a given quaternion +RMAPI void QuaternionToAxisAngle(Quaternion q, Vector3 *outAxis, float *outAngle) +{ + if (fabsf(q.w) > 1.0f) + { + // QuaternionNormalize(q); + float length = sqrtf(q.x*q.x + q.y*q.y + q.z*q.z + q.w*q.w); + if (length == 0.0f) length = 1.0f; + float ilength = 1.0f/length; + + q.x = q.x*ilength; + q.y = q.y*ilength; + q.z = q.z*ilength; + q.w = q.w*ilength; + } + + Vector3 resAxis = { 0.0f, 0.0f, 0.0f }; + float resAngle = 2.0f*acosf(q.w); + float den = sqrtf(1.0f - q.w*q.w); + + if (den > EPSILON) + { + resAxis.x = q.x/den; + resAxis.y = q.y/den; + resAxis.z = q.z/den; + } + else + { + // This occurs when the angle is zero. + // Not a problem: just set an arbitrary normalized axis. + resAxis.x = 1.0f; + } + + *outAxis = resAxis; + *outAngle = resAngle; +} + +// Get the quaternion equivalent to Euler angles +// NOTE: Rotation order is ZYX +RMAPI Quaternion QuaternionFromEuler(float pitch, float yaw, float roll) +{ + Quaternion result = { 0 }; + + float x0 = cosf(pitch*0.5f); + float x1 = sinf(pitch*0.5f); + float y0 = cosf(yaw*0.5f); + float y1 = sinf(yaw*0.5f); + float z0 = cosf(roll*0.5f); + float z1 = sinf(roll*0.5f); + + result.x = x1*y0*z0 - x0*y1*z1; + result.y = x0*y1*z0 + x1*y0*z1; + result.z = x0*y0*z1 - x1*y1*z0; + result.w = x0*y0*z0 + x1*y1*z1; + + return result; +} + +// Get the Euler angles equivalent to quaternion (roll, pitch, yaw) +// NOTE: Angles are returned in a Vector3 struct in radians +RMAPI Vector3 QuaternionToEuler(Quaternion q) +{ + Vector3 result = { 0 }; + + // Roll (x-axis rotation) + float x0 = 2.0f*(q.w*q.x + q.y*q.z); + float x1 = 1.0f - 2.0f*(q.x*q.x + q.y*q.y); + result.x = atan2f(x0, x1); + + // Pitch (y-axis rotation) + float y0 = 2.0f*(q.w*q.y - q.z*q.x); + y0 = y0 > 1.0f ? 1.0f : y0; + y0 = y0 < -1.0f ? -1.0f : y0; + result.y = asinf(y0); + + // Yaw (z-axis rotation) + float z0 = 2.0f*(q.w*q.z + q.x*q.y); + float z1 = 1.0f - 2.0f*(q.y*q.y + q.z*q.z); + result.z = atan2f(z0, z1); + + return result; +} + +// Transform a quaternion given a transformation matrix +RMAPI Quaternion QuaternionTransform(Quaternion q, Matrix mat) +{ + Quaternion result = { 0 }; + + result.x = mat.m0*q.x + mat.m4*q.y + mat.m8*q.z + mat.m12*q.w; + result.y = mat.m1*q.x + mat.m5*q.y + mat.m9*q.z + mat.m13*q.w; + result.z = mat.m2*q.x + mat.m6*q.y + mat.m10*q.z + mat.m14*q.w; + result.w = mat.m3*q.x + mat.m7*q.y + mat.m11*q.z + mat.m15*q.w; + + return result; +} + +// Check whether two given quaternions are almost equal +RMAPI int QuaternionEquals(Quaternion p, Quaternion q) +{ +#if !defined(EPSILON) + #define EPSILON 0.000001f +#endif + + int result = (((fabsf(p.x - q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y - q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && + ((fabsf(p.z - q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) && + ((fabsf(p.w - q.w)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.w), fabsf(q.w)))))) || + (((fabsf(p.x + q.x)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.x), fabsf(q.x))))) && + ((fabsf(p.y + q.y)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.y), fabsf(q.y))))) && + ((fabsf(p.z + q.z)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.z), fabsf(q.z))))) && + ((fabsf(p.w + q.w)) <= (EPSILON*fmaxf(1.0f, fmaxf(fabsf(p.w), fabsf(q.w)))))); + + return result; +} + +// Compose a transformation matrix from rotational, translational and scaling components +// TODO: This function is not following raymath conventions defined in header: NOT self-contained +RMAPI Matrix MatrixCompose(Vector3 translation, Quaternion rotation, Vector3 scale) +{ + // Initialize vectors + Vector3 right = { 1.0f, 0.0f, 0.0f }; + Vector3 up = { 0.0f, 1.0f, 0.0f }; + Vector3 forward = { 0.0f, 0.0f, 1.0f }; + + // Scale vectors + right = Vector3Scale(right, scale.x); + up = Vector3Scale(up, scale.y); + forward = Vector3Scale(forward , scale.z); + + // Rotate vectors + right = Vector3RotateByQuaternion(right, rotation); + up = Vector3RotateByQuaternion(up, rotation); + forward = Vector3RotateByQuaternion(forward, rotation); + + // Set result matrix output + Matrix result = { + right.x, up.x, forward.x, translation.x, + right.y, up.y, forward.y, translation.y, + right.z, up.z, forward.z, translation.z, + 0.0f, 0.0f, 0.0f, 1.0f + }; + + return result; +} + +// Decompose a transformation matrix into its rotational, translational and scaling components and remove shear +// TODO: This function is not following raymath conventions defined in header: NOT self-contained +RMAPI void MatrixDecompose(Matrix mat, Vector3 *translation, Quaternion *rotation, Vector3 *scale) +{ + float eps = (float)1e-9; + + // Extract Translation + translation->x = mat.m12; + translation->y = mat.m13; + translation->z = mat.m14; + + // Matrix Columns - Rotation will be extracted into here. + Vector3 matColumns[3] = { { mat.m0, mat.m4, mat.m8 }, + { mat.m1, mat.m5, mat.m9 }, + { mat.m2, mat.m6, mat.m10 } }; + + // Shear Parameters XY, XZ, and YZ (extract and ignored) + float shear[3] = { 0 }; + + // Normalized Scale Parameters + Vector3 scl = { 0 }; + + // Max-Normalizing helps numerical stability + float stabilizer = eps; + for (int i = 0; i < 3; i++) + { + stabilizer = fmaxf(stabilizer, fabsf(matColumns[i].x)); + stabilizer = fmaxf(stabilizer, fabsf(matColumns[i].y)); + stabilizer = fmaxf(stabilizer, fabsf(matColumns[i].z)); + } + matColumns[0] = Vector3Scale(matColumns[0], 1.0f / stabilizer); + matColumns[1] = Vector3Scale(matColumns[1], 1.0f / stabilizer); + matColumns[2] = Vector3Scale(matColumns[2], 1.0f / stabilizer); + + // X Scale + scl.x = Vector3Length(matColumns[0]); + if (scl.x > eps) matColumns[0] = Vector3Scale(matColumns[0], 1.0f / scl.x); + + // Compute XY shear and make col2 orthogonal + shear[0] = Vector3DotProduct(matColumns[0], matColumns[1]); + matColumns[1] = Vector3Subtract(matColumns[1], Vector3Scale(matColumns[0], shear[0])); + + // Y Scale + scl.y = Vector3Length(matColumns[1]); + if (scl.y > eps) + { + matColumns[1] = Vector3Scale(matColumns[1], 1.0f / scl.y); + shear[0] /= scl.y; // Correct XY shear + } + + // Compute XZ and YZ shears and make col3 orthogonal + shear[1] = Vector3DotProduct(matColumns[0], matColumns[2]); + matColumns[2] = Vector3Subtract(matColumns[2], Vector3Scale(matColumns[0], shear[1])); + shear[2] = Vector3DotProduct(matColumns[1], matColumns[2]); + matColumns[2] = Vector3Subtract(matColumns[2], Vector3Scale(matColumns[1], shear[2])); + + // Z Scale + scl.z = Vector3Length(matColumns[2]); + if (scl.z > eps) + { + matColumns[2] = Vector3Scale(matColumns[2], 1.0f / scl.z); + shear[1] /= scl.z; // Correct XZ shear + shear[2] /= scl.z; // Correct YZ shear + } + + // matColumns are now orthonormal in O(3). Now ensure its in SO(3) by enforcing det = 1. + if (Vector3DotProduct(matColumns[0], Vector3CrossProduct(matColumns[1], matColumns[2])) < 0) + { + scl = Vector3Negate(scl); + matColumns[0] = Vector3Negate(matColumns[0]); + matColumns[1] = Vector3Negate(matColumns[1]); + matColumns[2] = Vector3Negate(matColumns[2]); + } + + // Set Scale + *scale = Vector3Scale(scl, stabilizer); + + // Extract Rotation + Matrix rotationMatrix = { matColumns[0].x, matColumns[0].y, matColumns[0].z, 0, + matColumns[1].x, matColumns[1].y, matColumns[1].z, 0, + matColumns[2].x, matColumns[2].y, matColumns[2].z, 0, + 0, 0, 0, 1 }; + *rotation = QuaternionFromMatrix(rotationMatrix); +} + +#if defined(__cplusplus) && !defined(RAYMATH_DISABLE_CPP_OPERATORS) + +// Optional C++ math operators +//------------------------------------------------------------------------------- + +// Vector2 operators +static constexpr Vector2 Vector2Zeros = { 0, 0 }; +static constexpr Vector2 Vector2Ones = { 1, 1 }; +static constexpr Vector2 Vector2UnitX = { 1, 0 }; +static constexpr Vector2 Vector2UnitY = { 0, 1 }; + +inline Vector2 operator + (const Vector2& lhs, const Vector2& rhs) +{ + return Vector2Add(lhs, rhs); +} + +inline const Vector2& operator += (Vector2& lhs, const Vector2& rhs) +{ + lhs = Vector2Add(lhs, rhs); + return lhs; +} + +inline Vector2 operator - (const Vector2& lhs, const Vector2& rhs) +{ + return Vector2Subtract(lhs, rhs); +} + +inline const Vector2& operator -= (Vector2& lhs, const Vector2& rhs) +{ + lhs = Vector2Subtract(lhs, rhs); + return lhs; +} + +inline Vector2 operator * (const Vector2& lhs, const float& rhs) +{ + return Vector2Scale(lhs, rhs); +} + +inline const Vector2& operator *= (Vector2& lhs, const float& rhs) +{ + lhs = Vector2Scale(lhs, rhs); + return lhs; +} + +inline Vector2 operator * (const Vector2& lhs, const Vector2& rhs) +{ + return Vector2Multiply(lhs, rhs); +} + +inline const Vector2& operator *= (Vector2& lhs, const Vector2& rhs) +{ + lhs = Vector2Multiply(lhs, rhs); + return lhs; +} + +inline Vector2 operator * (const Vector2& lhs, const Matrix& rhs) +{ + return Vector2Transform(lhs, rhs); +} + +inline const Vector2& operator *= (Vector2& lhs, const Matrix& rhs) +{ + lhs = Vector2Transform(lhs, rhs); + return lhs; +} + +inline Vector2 operator / (const Vector2& lhs, const float& rhs) +{ + return Vector2Scale(lhs, 1.0f/rhs); +} + +inline const Vector2& operator /= (Vector2& lhs, const float& rhs) +{ + lhs = Vector2Scale(lhs, 1.0f/rhs); + return lhs; +} + +inline Vector2 operator / (const Vector2& lhs, const Vector2& rhs) +{ + return Vector2Divide(lhs, rhs); +} + +inline const Vector2& operator /= (Vector2& lhs, const Vector2& rhs) +{ + lhs = Vector2Divide(lhs, rhs); + return lhs; +} + +inline bool operator == (const Vector2& lhs, const Vector2& rhs) +{ + return FloatEquals(lhs.x, rhs.x) && FloatEquals(lhs.y, rhs.y); +} + +inline bool operator != (const Vector2& lhs, const Vector2& rhs) +{ + return !FloatEquals(lhs.x, rhs.x) || !FloatEquals(lhs.y, rhs.y); +} + +// Vector3 operators +static constexpr Vector3 Vector3Zeros = { 0, 0, 0 }; +static constexpr Vector3 Vector3Ones = { 1, 1, 1 }; +static constexpr Vector3 Vector3UnitX = { 1, 0, 0 }; +static constexpr Vector3 Vector3UnitY = { 0, 1, 0 }; +static constexpr Vector3 Vector3UnitZ = { 0, 0, 1 }; + +inline Vector3 operator + (const Vector3& lhs, const Vector3& rhs) +{ + return Vector3Add(lhs, rhs); +} + +inline const Vector3& operator += (Vector3& lhs, const Vector3& rhs) +{ + lhs = Vector3Add(lhs, rhs); + return lhs; +} + +inline Vector3 operator - (const Vector3& lhs, const Vector3& rhs) +{ + return Vector3Subtract(lhs, rhs); +} + +inline const Vector3& operator -= (Vector3& lhs, const Vector3& rhs) +{ + lhs = Vector3Subtract(lhs, rhs); + return lhs; +} + +inline Vector3 operator * (const Vector3& lhs, const float& rhs) +{ + return Vector3Scale(lhs, rhs); +} + +inline const Vector3& operator *= (Vector3& lhs, const float& rhs) +{ + lhs = Vector3Scale(lhs, rhs); + return lhs; +} + +inline Vector3 operator * (const Vector3& lhs, const Vector3& rhs) +{ + return Vector3Multiply(lhs, rhs); +} + +inline const Vector3& operator *= (Vector3& lhs, const Vector3& rhs) +{ + lhs = Vector3Multiply(lhs, rhs); + return lhs; +} + +inline Vector3 operator * (const Vector3& lhs, const Matrix& rhs) +{ + return Vector3Transform(lhs, rhs); +} + +inline const Vector3& operator *= (Vector3& lhs, const Matrix& rhs) +{ + lhs = Vector3Transform(lhs, rhs); + return lhs; +} + +inline Vector3 operator / (const Vector3& lhs, const float& rhs) +{ + return Vector3Scale(lhs, 1.0f/rhs); +} + +inline const Vector3& operator /= (Vector3& lhs, const float& rhs) +{ + lhs = Vector3Scale(lhs, 1.0f/rhs); + return lhs; +} + +inline Vector3 operator / (const Vector3& lhs, const Vector3& rhs) +{ + return Vector3Divide(lhs, rhs); +} + +inline const Vector3& operator /= (Vector3& lhs, const Vector3& rhs) +{ + lhs = Vector3Divide(lhs, rhs); + return lhs; +} + +inline bool operator == (const Vector3& lhs, const Vector3& rhs) +{ + return FloatEquals(lhs.x, rhs.x) && FloatEquals(lhs.y, rhs.y) && FloatEquals(lhs.z, rhs.z); +} + +inline bool operator != (const Vector3& lhs, const Vector3& rhs) +{ + return !FloatEquals(lhs.x, rhs.x) || !FloatEquals(lhs.y, rhs.y) || !FloatEquals(lhs.z, rhs.z); +} + +// Vector4 operators +static constexpr Vector4 Vector4Zeros = { 0, 0, 0, 0 }; +static constexpr Vector4 Vector4Ones = { 1, 1, 1, 1 }; +static constexpr Vector4 Vector4UnitX = { 1, 0, 0, 0 }; +static constexpr Vector4 Vector4UnitY = { 0, 1, 0, 0 }; +static constexpr Vector4 Vector4UnitZ = { 0, 0, 1, 0 }; +static constexpr Vector4 Vector4UnitW = { 0, 0, 0, 1 }; + +inline Vector4 operator + (const Vector4& lhs, const Vector4& rhs) +{ + return Vector4Add(lhs, rhs); +} + +inline const Vector4& operator += (Vector4& lhs, const Vector4& rhs) +{ + lhs = Vector4Add(lhs, rhs); + return lhs; +} + +inline Vector4 operator - (const Vector4& lhs, const Vector4& rhs) +{ + return Vector4Subtract(lhs, rhs); +} + +inline const Vector4& operator -= (Vector4& lhs, const Vector4& rhs) +{ + lhs = Vector4Subtract(lhs, rhs); + return lhs; +} + +inline Vector4 operator * (const Vector4& lhs, const float& rhs) +{ + return Vector4Scale(lhs, rhs); +} + +inline const Vector4& operator *= (Vector4& lhs, const float& rhs) +{ + lhs = Vector4Scale(lhs, rhs); + return lhs; +} + +inline Vector4 operator * (const Vector4& lhs, const Vector4& rhs) +{ + return Vector4Multiply(lhs, rhs); +} + +inline const Vector4& operator *= (Vector4& lhs, const Vector4& rhs) +{ + lhs = Vector4Multiply(lhs, rhs); + return lhs; +} + +inline Vector4 operator / (const Vector4& lhs, const float& rhs) +{ + return Vector4Scale(lhs, 1.0f/rhs); +} + +inline const Vector4& operator /= (Vector4& lhs, const float& rhs) +{ + lhs = Vector4Scale(lhs, 1.0f/rhs); + return lhs; +} + +inline Vector4 operator / (const Vector4& lhs, const Vector4& rhs) +{ + return Vector4Divide(lhs, rhs); +} + +inline const Vector4& operator /= (Vector4& lhs, const Vector4& rhs) +{ + lhs = Vector4Divide(lhs, rhs); + return lhs; +} + +inline bool operator == (const Vector4& lhs, const Vector4& rhs) +{ + return FloatEquals(lhs.x, rhs.x) && FloatEquals(lhs.y, rhs.y) && FloatEquals(lhs.z, rhs.z) && FloatEquals(lhs.w, rhs.w); +} + +inline bool operator != (const Vector4& lhs, const Vector4& rhs) +{ + return !FloatEquals(lhs.x, rhs.x) || !FloatEquals(lhs.y, rhs.y) || !FloatEquals(lhs.z, rhs.z) || !FloatEquals(lhs.w, rhs.w); +} + +// Quaternion operators +static constexpr Quaternion QuaternionZeros = { 0, 0, 0, 0 }; +static constexpr Quaternion QuaternionOnes = { 1, 1, 1, 1 }; +static constexpr Quaternion QuaternionUnitX = { 0, 0, 0, 1 }; + +inline Quaternion operator + (const Quaternion& lhs, const float& rhs) +{ + return QuaternionAddValue(lhs, rhs); +} + +inline const Quaternion& operator += (Quaternion& lhs, const float& rhs) +{ + lhs = QuaternionAddValue(lhs, rhs); + return lhs; +} + +inline Quaternion operator - (const Quaternion& lhs, const float& rhs) +{ + return QuaternionSubtractValue(lhs, rhs); +} + +inline const Quaternion& operator -= (Quaternion& lhs, const float& rhs) +{ + lhs = QuaternionSubtractValue(lhs, rhs); + return lhs; +} + +inline Quaternion operator * (const Quaternion& lhs, const Matrix& rhs) +{ + return QuaternionTransform(lhs, rhs); +} + +inline const Quaternion& operator *= (Quaternion& lhs, const Matrix& rhs) +{ + lhs = QuaternionTransform(lhs, rhs); + return lhs; +} + +// Matrix operators +static constexpr Matrix MatrixUnit = { 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 }; + +inline Matrix operator + (const Matrix& lhs, const Matrix& rhs) +{ + return MatrixAdd(lhs, rhs); +} + +inline const Matrix& operator += (Matrix& lhs, const Matrix& rhs) +{ + lhs = MatrixAdd(lhs, rhs); + return lhs; +} + +inline Matrix operator - (const Matrix& lhs, const Matrix& rhs) +{ + return MatrixSubtract(lhs, rhs); +} + +inline const Matrix& operator -= (Matrix& lhs, const Matrix& rhs) +{ + lhs = MatrixSubtract(lhs, rhs); + return lhs; +} + +inline Matrix operator * (const Matrix& lhs, const Matrix& rhs) +{ + return MatrixMultiply(lhs, rhs); +} + +inline const Matrix& operator *= (Matrix& lhs, const Matrix& rhs) +{ + lhs = MatrixMultiply(lhs, rhs); + return lhs; +} + +inline Matrix operator * (const Matrix& lhs, const float value) +{ + return MatrixMultiplyValue(lhs, value); +} + +inline const Matrix& operator *= (Matrix& lhs, const float value) +{ + lhs = MatrixMultiplyValue(lhs, value); + return lhs; +} + +//------------------------------------------------------------------------------- +#endif // C++ operators + +#endif // RAYMATH_H diff --git a/raylib/include/rcamera.h b/raylib/include/rcamera.h new file mode 100644 index 0000000..3c880ba --- /dev/null +++ b/raylib/include/rcamera.h @@ -0,0 +1,563 @@ +/******************************************************************************************* +* +* rcamera - Basic camera system with support for multiple camera modes +* +* CONFIGURATION: +* #define RCAMERA_IMPLEMENTATION +* Generates the implementation of the library into the included file. +* If not defined, the library is in header only mode and can be included in other headers +* or source files without problems. But only ONE file should hold the implementation. +* +* #define RCAMERA_STANDALONE +* If defined, the library can be used as standalone as a camera system but some +* functions must be redefined to manage inputs accordingly. +* +* CONTRIBUTORS: +* Ramon Santamaria: Supervision, review, update and maintenance +* Christoph Wagner: Complete redesign, using raymath (2022) +* Marc Palau: Initial implementation (2014) +* +* +* LICENSE: zlib/libpng +* +* Copyright (c) 2022-2026 Christoph Wagner (@Crydsch) and Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RCAMERA_H +#define RCAMERA_H + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +// Function specifiers definition + +// Function specifiers in case library is build/used as a shared library (Windows) +// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll +#if defined(_WIN32) + #if defined(BUILD_LIBTYPE_SHARED) + #if defined(__TINYC__) + #define __declspec(x) __attribute__((x)) + #endif + #define RLAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) + #elif defined(USE_LIBTYPE_SHARED) + #define RLAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) + #endif +#endif + +#ifndef RLAPI + #define RLAPI // Functions defined as 'extern' by default (implicit specifiers) +#endif + +#if defined(RCAMERA_STANDALONE) + #define CAMERA_CULL_DISTANCE_NEAR 0.05 + #define CAMERA_CULL_DISTANCE_FAR 4000.0 +#else + #define CAMERA_CULL_DISTANCE_NEAR RL_CULL_DISTANCE_NEAR + #define CAMERA_CULL_DISTANCE_FAR RL_CULL_DISTANCE_FAR +#endif + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +// NOTE: Below types are required for standalone usage +//---------------------------------------------------------------------------------- +#if defined(RCAMERA_STANDALONE) + // Vector2, 2 components + typedef struct Vector2 { + float x; // Vector x component + float y; // Vector y component + } Vector2; + + // Vector3, 3 components + typedef struct Vector3 { + float x; // Vector x component + float y; // Vector y component + float z; // Vector z component + } Vector3; + + // Matrix, 4x4 components, column major, OpenGL style, right-handed + typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) + } Matrix; + + // Camera type, defines a camera position/orientation in 3d space + typedef struct Camera3D { + Vector3 position; // Camera position + Vector3 target; // Camera target it looks-at + Vector3 up; // Camera up vector (rotation over its axis) + float fovy; // Camera field-of-view apperture in Y (degrees) in perspective, used as near plane width in orthographic + int projection; // Camera projection type: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC + } Camera3D; + + typedef Camera3D Camera; // Camera type fallback, defaults to Camera3D + + // Camera projection + typedef enum { + CAMERA_PERSPECTIVE = 0, // Perspective projection + CAMERA_ORTHOGRAPHIC // Orthographic projection + } CameraProjection; + + // Camera system modes + typedef enum { + CAMERA_CUSTOM = 0, // Camera custom, controlled by user (UpdateCamera() does nothing) + CAMERA_FREE, // Camera free mode + CAMERA_ORBITAL, // Camera orbital, around target, zoom supported + CAMERA_FIRST_PERSON, // Camera first person + CAMERA_THIRD_PERSON // Camera third person + } CameraMode; +#endif + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +//... + +//---------------------------------------------------------------------------------- +// Module Functions Declaration +//---------------------------------------------------------------------------------- + +#if defined(__cplusplus) +extern "C" { // Prevents name mangling of functions +#endif + +RLAPI Vector3 GetCameraForward(Camera *camera); +RLAPI Vector3 GetCameraUp(Camera *camera); +RLAPI Vector3 GetCameraRight(Camera *camera); + +// Camera movement +RLAPI void CameraMoveForward(Camera *camera, float distance, bool moveInWorldPlane); +RLAPI void CameraMoveUp(Camera *camera, float distance); +RLAPI void CameraMoveRight(Camera *camera, float distance, bool moveInWorldPlane); +RLAPI void CameraMoveToTarget(Camera *camera, float delta); + +// Camera rotation +RLAPI void CameraYaw(Camera *camera, float angle, bool rotateAroundTarget); +RLAPI void CameraPitch(Camera *camera, float angle, bool lockView, bool rotateAroundTarget, bool rotateUp); +RLAPI void CameraRoll(Camera *camera, float angle); + +RLAPI Matrix GetCameraViewMatrix(Camera *camera); +RLAPI Matrix GetCameraProjectionMatrix(Camera *camera, float aspect); + +#if defined(__cplusplus) +} +#endif + +#endif // RCAMERA_H + +/*********************************************************************************** +* +* CAMERA IMPLEMENTATION +* +************************************************************************************/ + +#if defined(RCAMERA_IMPLEMENTATION) + +#include "raymath.h" // Required for vector maths: + // Vector3Add() + // Vector3Subtract() + // Vector3Scale() + // Vector3Normalize() + // Vector3Distance() + // Vector3CrossProduct() + // Vector3RotateByAxisAngle() + // Vector3Angle() + // Vector3Negate() + // MatrixLookAt() + // MatrixPerspective() + // MatrixOrtho() + // MatrixIdentity() + +// raylib required functionality: + // GetMouseDelta() + // GetMouseWheelMove() + // IsKeyDown() + // IsKeyPressed() + // GetFrameTime() + +#include // Required for: fabsf() + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#define CAMERA_MOVE_SPEED 5.4f // Units per second +#define CAMERA_ROTATION_SPEED 0.03f +#define CAMERA_PAN_SPEED 2.0f + +// Camera mouse movement sensitivity +#define CAMERA_MOUSE_MOVE_SENSITIVITY 0.003f + +// Camera orbital speed in CAMERA_ORBITAL mode +#define CAMERA_ORBITAL_SPEED 0.5f // Radians per second + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +//... + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +//... + +//---------------------------------------------------------------------------------- +// Module Internal Functions Declaration +//---------------------------------------------------------------------------------- +//... + +//---------------------------------------------------------------------------------- +// Module Functions Definition +//---------------------------------------------------------------------------------- +// Returns the cameras forward vector (normalized) +Vector3 GetCameraForward(Camera *camera) +{ + return Vector3Normalize(Vector3Subtract(camera->target, camera->position)); +} + +// Returns the cameras up vector (normalized) +// Note: The up vector might not be perpendicular to the forward vector +Vector3 GetCameraUp(Camera *camera) +{ + return Vector3Normalize(camera->up); +} + +// Returns the cameras right vector (normalized) +Vector3 GetCameraRight(Camera *camera) +{ + Vector3 forward = GetCameraForward(camera); + Vector3 up = GetCameraUp(camera); + + return Vector3Normalize(Vector3CrossProduct(forward, up)); +} + +// Moves the camera in its forward direction +void CameraMoveForward(Camera *camera, float distance, bool moveInWorldPlane) +{ + Vector3 forward = GetCameraForward(camera); + + if (moveInWorldPlane) + { + // Project vector onto world plane (the plane defined by the up vector) + if (fabsf(camera->up.z) > 0.7071f) forward.z = 0; + else if (fabsf(camera->up.x) > 0.7071f) forward.x = 0; + else forward.y = 0; + + forward = Vector3Normalize(forward); + } + + // Scale by distance + forward = Vector3Scale(forward, distance); + + // Move position and target + camera->position = Vector3Add(camera->position, forward); + camera->target = Vector3Add(camera->target, forward); +} + +// Moves the camera in its up direction +void CameraMoveUp(Camera *camera, float distance) +{ + Vector3 up = GetCameraUp(camera); + + // Scale by distance + up = Vector3Scale(up, distance); + + // Move position and target + camera->position = Vector3Add(camera->position, up); + camera->target = Vector3Add(camera->target, up); +} + +// Moves the camera target in its current right direction +void CameraMoveRight(Camera *camera, float distance, bool moveInWorldPlane) +{ + Vector3 right = GetCameraRight(camera); + + if (moveInWorldPlane) + { + // Project vector onto world plane (the plane defined by the up vector) + if (fabsf(camera->up.z) > 0.7071f) right.z = 0; + else if (fabsf(camera->up.x) > 0.7071f) right.x = 0; + else right.y = 0; + + right = Vector3Normalize(right); + } + + // Scale by distance + right = Vector3Scale(right, distance); + + // Move position and target + camera->position = Vector3Add(camera->position, right); + camera->target = Vector3Add(camera->target, right); +} + +// Moves the camera position closer/farther to/from the camera target +void CameraMoveToTarget(Camera *camera, float delta) +{ + float distance = Vector3Distance(camera->position, camera->target); + + // Apply delta + distance += delta; + + // Distance must be greater than 0 + if (distance <= 0) distance = 0.001f; + + // Set new distance by moving the position along the forward vector + Vector3 forward = GetCameraForward(camera); + camera->position = Vector3Add(camera->target, Vector3Scale(forward, -distance)); +} + +// Rotates the camera around its up vector +// Yaw is "looking left and right" +// If rotateAroundTarget is false, the camera rotates around its position +// Note: angle must be provided in radians +void CameraYaw(Camera *camera, float angle, bool rotateAroundTarget) +{ + // Rotation axis + Vector3 up = GetCameraUp(camera); + + // View vector + Vector3 targetPosition = Vector3Subtract(camera->target, camera->position); + + // Rotate view vector around up axis + targetPosition = Vector3RotateByAxisAngle(targetPosition, up, angle); + + if (rotateAroundTarget) + { + // Move position relative to target + camera->position = Vector3Subtract(camera->target, targetPosition); + } + else // rotate around camera.position + { + // Move target relative to position + camera->target = Vector3Add(camera->position, targetPosition); + } +} + +// Rotates the camera around its right vector, pitch is "looking up and down" +// - lockView prevents camera overrotation (aka "somersaults") +// - rotateAroundTarget defines if rotation is around target or around its position +// - rotateUp rotates the up direction as well (typically only usefull in CAMERA_FREE) +// NOTE: [angle] must be provided in radians +void CameraPitch(Camera *camera, float angle, bool lockView, bool rotateAroundTarget, bool rotateUp) +{ + // Up direction + Vector3 up = GetCameraUp(camera); + + // View vector + Vector3 targetPosition = Vector3Subtract(camera->target, camera->position); + + if (lockView) + { + // In these camera modes we clamp the Pitch angle + // to allow only viewing straight up or down. + + // Clamp view up + float maxAngleUp = Vector3Angle(up, targetPosition); + maxAngleUp -= 0.001f; // avoid numerical errors + if (angle > maxAngleUp) angle = maxAngleUp; + + // Clamp view down + float maxAngleDown = Vector3Angle(Vector3Negate(up), targetPosition); + maxAngleDown *= -1.0f; // downwards angle is negative + maxAngleDown += 0.001f; // avoid numerical errors + if (angle < maxAngleDown) angle = maxAngleDown; + } + + // Rotation axis + Vector3 right = GetCameraRight(camera); + + // Rotate view vector around right axis + targetPosition = Vector3RotateByAxisAngle(targetPosition, right, angle); + + if (rotateAroundTarget) + { + // Move position relative to target + camera->position = Vector3Subtract(camera->target, targetPosition); + } + else // Rotate around camera.position + { + // Move target relative to position + camera->target = Vector3Add(camera->position, targetPosition); + } + + if (rotateUp) + { + // Rotate up direction around right axis + camera->up = Vector3RotateByAxisAngle(camera->up, right, angle); + } +} + +// Rotates the camera around its forward vector +// Roll is "turning your head sideways to the left or right" +// Note: angle must be provided in radians +void CameraRoll(Camera *camera, float angle) +{ + // Rotation axis + Vector3 forward = GetCameraForward(camera); + + // Rotate up direction around forward axis + camera->up = Vector3RotateByAxisAngle(camera->up, forward, angle); +} + +// Returns the camera view matrix +Matrix GetCameraViewMatrix(Camera *camera) +{ + return MatrixLookAt(camera->position, camera->target, camera->up); +} + +// Returns the camera projection matrix +Matrix GetCameraProjectionMatrix(Camera *camera, float aspect) +{ + if (camera->projection == CAMERA_PERSPECTIVE) + { + return MatrixPerspective(camera->fovy*DEG2RAD, aspect, CAMERA_CULL_DISTANCE_NEAR, CAMERA_CULL_DISTANCE_FAR); + } + else if (camera->projection == CAMERA_ORTHOGRAPHIC) + { + double top = camera->fovy/2.0; + double right = top*aspect; + + return MatrixOrtho(-right, right, -top, top, CAMERA_CULL_DISTANCE_NEAR, CAMERA_CULL_DISTANCE_FAR); + } + + return MatrixIdentity(); +} + +#if !defined(RCAMERA_STANDALONE) +// Update camera position for selected mode +// Camera mode: CAMERA_FREE, CAMERA_FIRST_PERSON, CAMERA_THIRD_PERSON, CAMERA_ORBITAL or CUSTOM +void UpdateCamera(Camera *camera, int mode) +{ + Vector2 mousePositionDelta = GetMouseDelta(); + + bool moveInWorldPlane = ((mode == CAMERA_FIRST_PERSON) || (mode == CAMERA_THIRD_PERSON)); + bool rotateAroundTarget = ((mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL)); + bool lockView = ((mode == CAMERA_FREE) || (mode == CAMERA_FIRST_PERSON) || (mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL)); + bool rotateUp = false; + + // Camera speeds based on frame time + float cameraMoveSpeed = CAMERA_MOVE_SPEED*GetFrameTime(); + float cameraRotationSpeed = CAMERA_ROTATION_SPEED*GetFrameTime(); + float cameraPanSpeed = CAMERA_PAN_SPEED*GetFrameTime(); + float cameraOrbitalSpeed = CAMERA_ORBITAL_SPEED*GetFrameTime(); + + if (mode == CAMERA_CUSTOM) {} + else if (mode == CAMERA_ORBITAL) + { + // Orbital can just orbit + Matrix rotation = MatrixRotate(GetCameraUp(camera), cameraOrbitalSpeed); + Vector3 view = Vector3Subtract(camera->position, camera->target); + view = Vector3Transform(view, rotation); + camera->position = Vector3Add(camera->target, view); + } + else + { + // Camera rotation + if (IsKeyDown(KEY_DOWN)) CameraPitch(camera, -cameraRotationSpeed, lockView, rotateAroundTarget, rotateUp); + if (IsKeyDown(KEY_UP)) CameraPitch(camera, cameraRotationSpeed, lockView, rotateAroundTarget, rotateUp); + if (IsKeyDown(KEY_RIGHT)) CameraYaw(camera, -cameraRotationSpeed, rotateAroundTarget); + if (IsKeyDown(KEY_LEFT)) CameraYaw(camera, cameraRotationSpeed, rotateAroundTarget); + if (IsKeyDown(KEY_Q)) CameraRoll(camera, -cameraRotationSpeed); + if (IsKeyDown(KEY_E)) CameraRoll(camera, cameraRotationSpeed); + + // Camera movement + // Camera pan (for CAMERA_FREE) + if ((mode == CAMERA_FREE) && (IsMouseButtonDown(MOUSE_BUTTON_MIDDLE))) + { + const Vector2 mouseDelta = GetMouseDelta(); + if (mouseDelta.x > 0.0f) CameraMoveRight(camera, cameraPanSpeed, moveInWorldPlane); + if (mouseDelta.x < 0.0f) CameraMoveRight(camera, -cameraPanSpeed, moveInWorldPlane); + if (mouseDelta.y > 0.0f) CameraMoveUp(camera, -cameraPanSpeed); + if (mouseDelta.y < 0.0f) CameraMoveUp(camera, cameraPanSpeed); + } + else + { + // Mouse support + CameraYaw(camera, -mousePositionDelta.x*CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget); + CameraPitch(camera, -mousePositionDelta.y*CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp); + } + + // Keyboard support + if (IsKeyDown(KEY_W)) CameraMoveForward(camera, cameraMoveSpeed, moveInWorldPlane); + if (IsKeyDown(KEY_A)) CameraMoveRight(camera, -cameraMoveSpeed, moveInWorldPlane); + if (IsKeyDown(KEY_S)) CameraMoveForward(camera, -cameraMoveSpeed, moveInWorldPlane); + if (IsKeyDown(KEY_D)) CameraMoveRight(camera, cameraMoveSpeed, moveInWorldPlane); + + // Gamepad movement + if (IsGamepadAvailable(0)) + { + // Gamepad controller support + CameraYaw(camera, -(GetGamepadAxisMovement(0, GAMEPAD_AXIS_RIGHT_X)*2)*CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget); + CameraPitch(camera, -(GetGamepadAxisMovement(0, GAMEPAD_AXIS_RIGHT_Y)*2)*CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp); + + if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_Y) <= -0.25f) CameraMoveForward(camera, cameraMoveSpeed, moveInWorldPlane); + if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_X) <= -0.25f) CameraMoveRight(camera, -cameraMoveSpeed, moveInWorldPlane); + if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_Y) >= 0.25f) CameraMoveForward(camera, -cameraMoveSpeed, moveInWorldPlane); + if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_X) >= 0.25f) CameraMoveRight(camera, cameraMoveSpeed, moveInWorldPlane); + } + + if (mode == CAMERA_FREE) + { + if (IsKeyDown(KEY_SPACE)) CameraMoveUp(camera, cameraMoveSpeed); + if (IsKeyDown(KEY_LEFT_CONTROL)) CameraMoveUp(camera, -cameraMoveSpeed); + } + } + + if ((mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL) || (mode == CAMERA_FREE)) + { + // Zoom target distance + CameraMoveToTarget(camera, -GetMouseWheelMove()); + if (IsKeyPressed(KEY_KP_SUBTRACT)) CameraMoveToTarget(camera, 2.0f); + if (IsKeyPressed(KEY_KP_ADD)) CameraMoveToTarget(camera, -2.0f); + } +} +#endif // !RCAMERA_STANDALONE + +// Update camera movement, movement/rotation values should be provided by user +void UpdateCameraPro(Camera *camera, Vector3 movement, Vector3 rotation, float zoom) +{ + // Required values + // movement.x - Move forward/backward + // movement.y - Move right/left + // movement.z - Move up/down + // rotation.x - yaw + // rotation.y - pitch + // rotation.z - roll + // zoom - Move towards target + + bool lockView = true; + bool rotateAroundTarget = false; + bool rotateUp = false; + bool moveInWorldPlane = true; + + // Camera rotation + CameraPitch(camera, -rotation.y*DEG2RAD, lockView, rotateAroundTarget, rotateUp); + CameraYaw(camera, -rotation.x*DEG2RAD, rotateAroundTarget); + CameraRoll(camera, rotation.z*DEG2RAD); + + // Camera movement + CameraMoveForward(camera, movement.x, moveInWorldPlane); + CameraMoveRight(camera, movement.y, moveInWorldPlane); + CameraMoveUp(camera, movement.z); + + // Zoom target distance + CameraMoveToTarget(camera, zoom); +} + +#endif // RCAMERA_IMPLEMENTATION diff --git a/raylib/include/rgestures.h b/raylib/include/rgestures.h new file mode 100644 index 0000000..e6cb863 --- /dev/null +++ b/raylib/include/rgestures.h @@ -0,0 +1,555 @@ +/********************************************************************************************** +* +* rgestures - Gestures system, gestures processing based on input events (touch/mouse) +* +* CONFIGURATION: +* #define RGESTURES_IMPLEMENTATION +* Generates the implementation of the library into the included file. +* If not defined, the library is in header only mode and can be included in other headers +* or source files without problems. But only ONE file should hold the implementation. +* +* #define RGESTURES_STANDALONE +* If defined, the library can be used as standalone to process gesture events with +* no external dependencies. +* +* CONTRIBUTORS: +* Marc Palau: Initial implementation (2014) +* Albert Martos: Complete redesign and testing (2015) +* Ian Eito: Complete redesign and testing (2015) +* Ramon Santamaria: Supervision, review, update and maintenance +* +* +* LICENSE: zlib/libpng +* +* Copyright (c) 2014-2026 Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RGESTURES_H +#define RGESTURES_H + +#ifndef PI + #define PI 3.14159265358979323846 +#endif + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#ifndef MAX_TOUCH_POINTS + #define MAX_TOUCH_POINTS 8 // Maximum number of touch points supported +#endif + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +// NOTE: Below types are required for standalone usage +//---------------------------------------------------------------------------------- +// Boolean type +#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) || (defined(_MSC_VER) && _MSC_VER >= 1800) + #include +#elif !defined(__cplusplus) && !defined(bool) && !defined(RL_BOOL_TYPE) + typedef enum bool { false = 0, true = !false } bool; +#endif + +#if !defined(RL_VECTOR2_TYPE) +// Vector2 type +typedef struct Vector2 { + float x; + float y; +} Vector2; +#endif + +#if defined(RGESTURES_STANDALONE) +// Gestures type +// NOTE: It could be used as flags to enable only some gestures +typedef enum { + 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 { + TOUCH_ACTION_UP = 0, + TOUCH_ACTION_DOWN, + TOUCH_ACTION_MOVE, + TOUCH_ACTION_CANCEL +} TouchAction; + +// Gesture event +typedef struct { + int touchAction; + int pointCount; + int pointId[MAX_TOUCH_POINTS]; + Vector2 position[MAX_TOUCH_POINTS]; +} GestureEvent; + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +//... + +//---------------------------------------------------------------------------------- +// Module Functions Declaration +//---------------------------------------------------------------------------------- + +#if defined(__cplusplus) +extern "C" { // Prevents name mangling of functions +#endif + +void ProcessGestureEvent(GestureEvent event); // Process gesture event and translate it into gestures +void UpdateGestures(void); // Update gestures detected (must be called every frame) + +#if defined(RGESTURES_STANDALONE) +void SetGesturesEnabled(unsigned int flags); // Enable a set of gestures using flags +bool IsGestureDetected(int gesture); // Check if a gesture have been detected +int GetGestureDetected(void); // Get latest detected gesture + +float GetGestureHoldDuration(void); // Get gesture hold time in seconds +Vector2 GetGestureDragVector(void); // Get gesture drag vector +float GetGestureDragAngle(void); // Get gesture drag angle +Vector2 GetGesturePinchVector(void); // Get gesture pinch delta +float GetGesturePinchAngle(void); // Get gesture pinch angle +#endif + +#if defined(__cplusplus) +} +#endif + +#endif // RGESTURES_H + +/*********************************************************************************** +* +* RGESTURES IMPLEMENTATION +* +************************************************************************************/ + +#if defined(RGESTURES_IMPLEMENTATION) + +#if defined(RGESTURES_STANDALONE) +#if defined(_WIN32) + #if defined(__cplusplus) + extern "C" { // Prevents name mangling of functions + #endif + // Functions required to query time on Windows + int __stdcall QueryPerformanceCounter(unsigned long long int *lpPerformanceCount); + int __stdcall QueryPerformanceFrequency(unsigned long long int *lpFrequency); + #if defined(__cplusplus) + } + #endif +#elif defined(__linux__) + #if _POSIX_C_SOURCE < 199309L + #undef _POSIX_C_SOURCE + #define _POSIX_C_SOURCE 199309L // Required for CLOCK_MONOTONIC if compiled with c99 without gnu ext. + #endif + #include // Required for: timespec + #include // Required for: clock_gettime() + + #include // Required for: sqrtf(), atan2f() +#endif +#if defined(__APPLE__) // macOS also defines __MACH__ + #include // Required for: clock_get_time() + #include // Required for: mach_timespec_t +#endif +#endif + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#define FORCE_TO_SWIPE 0.2f // Swipe force, measured in normalized screen units/time +#define MINIMUM_DRAG 0.015f // Drag minimum force, measured in normalized screen units (0.0f to 1.0f) +#define DRAG_TIMEOUT 0.3f // Drag minimum time for web, measured in seconds +#define MINIMUM_PINCH 0.005f // Pinch minimum force, measured in normalized screen units (0.0f to 1.0f) +#define TAP_TIMEOUT 0.3f // Tap minimum time, measured in seconds +#define PINCH_TIMEOUT 0.3f // Pinch minimum time, measured in seconds +#define DOUBLETAP_RANGE 0.03f // DoubleTap range, measured in normalized screen units (0.0f to 1.0f) + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- + +// Gestures module state context [136 bytes] +typedef struct { + unsigned int current; // Current detected gesture + unsigned int enabledFlags; // Enabled gestures flags + struct { + int firstId; // Touch id for first touch point + int pointCount; // Touch points counter + double eventTime; // Time stamp when an event happened + 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 { + bool resetRequired; // HOLD reset to get first touch point again + double timeDuration; // HOLD duration in seconds + } Hold; + struct { + 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) + } Drag; + struct { + double startTime; // SWIPE start time to calculate drag intensity + } Swipe; + struct { + 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; +} GesturesData; + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +static GesturesData GESTURES = { + .current = GESTURE_NONE, // No current gesture detected + .Touch.firstId = -1, + .enabledFlags = 0b0000001111111111 // All gestures supported by default +}; + +//---------------------------------------------------------------------------------- +// Module Internal Functions Declaration +//---------------------------------------------------------------------------------- +static float rgVector2Angle(Vector2 initialPosition, Vector2 finalPosition); +static float rgVector2Distance(Vector2 v1, Vector2 v2); +static double rgGetCurrentTime(void); + +//---------------------------------------------------------------------------------- +// Module Functions Definition +//---------------------------------------------------------------------------------- + +// Enable only desired gestures to be detected +void SetGesturesEnabled(unsigned int flags) +{ + GESTURES.enabledFlags = flags; +} + +// Check if a gesture have been detected +bool IsGestureDetected(unsigned int gesture) +{ + if ((GESTURES.enabledFlags & GESTURES.current) == gesture) return true; + else return false; +} + +// Process gesture event and translate it into gestures +void ProcessGestureEvent(GestureEvent event) +{ + // Reset required variables + GESTURES.Touch.pointCount = event.pointCount; // Required on UpdateGestures() + + if (GESTURES.Touch.pointCount == 1) // One touch point + { + if (event.touchAction == TOUCH_ACTION_DOWN) + { + GESTURES.Touch.tapCounter++; // Tap counter + + // Detect GESTURE_DOUBLE_TAP + if ((GESTURES.current == GESTURE_NONE) && (GESTURES.Touch.tapCounter >= 2) && ((rgGetCurrentTime() - GESTURES.Touch.eventTime) < TAP_TIMEOUT) && (rgVector2Distance(GESTURES.Touch.downPositionA, event.position[0]) < DOUBLETAP_RANGE)) + { + GESTURES.current = GESTURE_DOUBLETAP; + GESTURES.Touch.tapCounter = 0; + } + else // Detect GESTURE_TAP + { + GESTURES.Touch.tapCounter = 1; + GESTURES.current = GESTURE_TAP; + } + + GESTURES.Touch.downPositionA = event.position[0]; + GESTURES.Touch.downDragPosition = event.position[0]; + + GESTURES.Touch.upPosition = GESTURES.Touch.downPositionA; + GESTURES.Touch.eventTime = rgGetCurrentTime(); + + GESTURES.Swipe.startTime = rgGetCurrentTime(); + + GESTURES.Drag.vector = (Vector2){ 0.0f, 0.0f }; + } + 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 (GESTURES.current == GESTURE_DRAG || GESTURES.current == GESTURE_HOLD) GESTURES.Touch.upPosition = event.position[0]; + + // NOTE: GESTURES.Drag.intensity dependent on the resolution of the screen + GESTURES.Drag.distance = rgVector2Distance(GESTURES.Touch.downPositionA, GESTURES.Touch.upPosition); + GESTURES.Drag.intensity = GESTURES.Drag.distance/(float)((rgGetCurrentTime() - GESTURES.Swipe.startTime)); + + // Detect GESTURE_SWIPE + if ((GESTURES.Drag.intensity > FORCE_TO_SWIPE) && (GESTURES.current != GESTURE_DRAG)) + { + // NOTE: Angle should be inverted in Y + GESTURES.Drag.angle = 360.0f - rgVector2Angle(GESTURES.Touch.downPositionA, GESTURES.Touch.upPosition); + + 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 + { + GESTURES.Drag.distance = 0.0f; + GESTURES.Drag.intensity = 0.0f; + GESTURES.Drag.angle = 0.0f; + + GESTURES.current = GESTURE_NONE; + } + + GESTURES.Touch.downDragPosition = (Vector2){ 0.0f, 0.0f }; + GESTURES.Touch.pointCount = 0; + } + else if (event.touchAction == TOUCH_ACTION_MOVE) + { + GESTURES.Touch.moveDownPositionA = event.position[0]; + + if (GESTURES.current == GESTURE_HOLD) + { + if (GESTURES.Hold.resetRequired) GESTURES.Touch.downPositionA = event.position[0]; + + GESTURES.Hold.resetRequired = false; + + // Detect GESTURE_DRAG + if ((rgGetCurrentTime() - GESTURES.Touch.eventTime) > DRAG_TIMEOUT) + { + GESTURES.Touch.eventTime = rgGetCurrentTime(); + GESTURES.current = GESTURE_DRAG; + } + } + + 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 (GESTURES.Touch.pointCount == 2) // Two touch points + { + if (event.touchAction == TOUCH_ACTION_DOWN) + { + GESTURES.Touch.downPositionA = event.position[0]; + GESTURES.Touch.downPositionB = event.position[1]; + + GESTURES.Touch.previousPositionA = GESTURES.Touch.downPositionA; + GESTURES.Touch.previousPositionB = GESTURES.Touch.downPositionB; + + //GESTURES.Pinch.distance = rgVector2Distance(GESTURES.Touch.downPositionA, GESTURES.Touch.downPositionB); + + GESTURES.Pinch.vector.x = GESTURES.Touch.downPositionB.x - GESTURES.Touch.downPositionA.x; + GESTURES.Pinch.vector.y = GESTURES.Touch.downPositionB.y - GESTURES.Touch.downPositionA.y; + + GESTURES.current = GESTURE_HOLD; + GESTURES.Hold.timeDuration = rgGetCurrentTime(); + } + else if (event.touchAction == TOUCH_ACTION_MOVE) + { + GESTURES.Pinch.distance = rgVector2Distance(GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB); + + GESTURES.Touch.moveDownPositionA = event.position[0]; + GESTURES.Touch.moveDownPositionB = event.position[1]; + + 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(GESTURES.Touch.previousPositionA, GESTURES.Touch.moveDownPositionA) >= MINIMUM_PINCH) || (rgVector2Distance(GESTURES.Touch.previousPositionB, GESTURES.Touch.moveDownPositionB) >= MINIMUM_PINCH)) + { + if ( rgVector2Distance(GESTURES.Touch.previousPositionA, GESTURES.Touch.previousPositionB) > rgVector2Distance(GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB) ) GESTURES.current = GESTURE_PINCH_IN; + else GESTURES.current = GESTURE_PINCH_OUT; + } + else + { + GESTURES.current = GESTURE_HOLD; + GESTURES.Hold.timeDuration = rgGetCurrentTime(); + } + + // NOTE: Angle should be inverted in Y + GESTURES.Pinch.angle = 360.0f - rgVector2Angle(GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB); + } + else if (event.touchAction == TOUCH_ACTION_UP) + { + GESTURES.Pinch.distance = 0.0f; + GESTURES.Pinch.angle = 0.0f; + GESTURES.Pinch.vector = (Vector2){ 0.0f, 0.0f }; + GESTURES.Touch.pointCount = 0; + + GESTURES.current = GESTURE_NONE; + } + } + 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 UpdateGestures(void) +{ + // NOTE: Gestures are processed through system callbacks on touch events + + // Detect GESTURE_HOLD + if (((GESTURES.current == GESTURE_TAP) || (GESTURES.current == GESTURE_DOUBLETAP)) && (GESTURES.Touch.pointCount < 2)) + { + GESTURES.current = GESTURE_HOLD; + GESTURES.Hold.timeDuration = rgGetCurrentTime(); + } + + // Detect GESTURE_NONE + if ((GESTURES.current == GESTURE_SWIPE_RIGHT) || (GESTURES.current == GESTURE_SWIPE_UP) || (GESTURES.current == GESTURE_SWIPE_LEFT) || (GESTURES.current == GESTURE_SWIPE_DOWN)) + { + GESTURES.current = GESTURE_NONE; + } +} + +// Get latest detected gesture +int GetGestureDetected(void) +{ + // Get current gesture only if enabled + return (GESTURES.enabledFlags & GESTURES.current); +} + +// Hold time measured in seconds +float GetGestureHoldDuration(void) +{ + // NOTE: time is calculated on current gesture HOLD + + double time = 0.0; + + if (GESTURES.current == GESTURE_HOLD) time = rgGetCurrentTime() - GESTURES.Hold.timeDuration; + + return (float)time; +} + +// Get drag vector (between initial touch point to current) +Vector2 GetGestureDragVector(void) +{ + // NOTE: drag vector is calculated on one touch points TOUCH_ACTION_MOVE + + return GESTURES.Drag.vector; +} + +// Get drag angle +// NOTE: Angle in degrees, horizontal-right is 0, counterclockwise +float GetGestureDragAngle(void) +{ + // NOTE: drag angle is calculated on one touch points TOUCH_ACTION_UP + + return GESTURES.Drag.angle; +} + +// Get distance between two pinch points +Vector2 GetGesturePinchVector(void) +{ + // NOTE: Pinch distance is calculated on two touch points TOUCH_ACTION_MOVE + + return GESTURES.Pinch.vector; +} + +// Get angle between two pinch points +// NOTE: Angle in degrees, horizontal-right is 0, counterclockwise +float GetGesturePinchAngle(void) +{ + // NOTE: pinch angle is calculated on two touch points TOUCH_ACTION_MOVE + + return GESTURES.Pinch.angle; +} + +//---------------------------------------------------------------------------------- +// Module Internal Functions Definition +//---------------------------------------------------------------------------------- +// Get angle from two-points vector with X-axis +static float rgVector2Angle(Vector2 v1, Vector2 v2) +{ + float angle = atan2f(v2.y - v1.y, v2.x - v1.x)*(180.0f/PI); + + if (angle < 0) angle += 360.0f; + + return angle; +} + +// Calculate distance between two Vector2 +static float rgVector2Distance(Vector2 v1, Vector2 v2) +{ + float result; + + float dx = v2.x - v1.x; + float dy = v2.y - v1.y; + + result = (float)sqrt(dx*dx + dy*dy); + + return result; +} + +// Time measure returned are seconds +static double rgGetCurrentTime(void) +{ + double time = 0; + +#if !defined(RGESTURES_STANDALONE) + time = GetTime(); +#else +#if defined(_WIN32) + unsigned long long int clockFrequency, currentTime; + + QueryPerformanceFrequency(&clockFrequency); // BE CAREFUL: Costly operation! + QueryPerformanceCounter(¤tTime); + + time = (double)currentTime/clockFrequency; // Time in seconds +#endif + +#if defined(__linux__) + // NOTE: Only for Linux-based systems + struct timespec now; + clock_gettime(CLOCK_MONOTONIC, &now); + unsigned long long int nowTime = (unsigned long long int)now.tv_sec*1000000000LLU + (unsigned long long int)now.tv_nsec; // Time in nanoseconds + + time = ((double)nowTime*1e-9); // Time in seconds +#endif + +#if defined(__APPLE__) + //#define CLOCK_REALTIME CALENDAR_CLOCK // returns UTC time since 1970-01-01 + //#define CLOCK_MONOTONIC SYSTEM_CLOCK // returns the time since boot time + + clock_serv_t cclock; + mach_timespec_t now; + host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock); + + // NOTE: OS X does not have clock_gettime(), using clock_get_time() + clock_get_time(cclock, &now); + mach_port_deallocate(mach_task_self(), cclock); + unsigned long long int nowTime = (unsigned long long int)now.tv_sec*1000000000LLU + (unsigned long long int)now.tv_nsec; // Time in nanoseconds + + time = ((double)nowTime*1e-9); // Time in seconds +#endif +#endif + + return time; +} + +#endif // RGESTURES_IMPLEMENTATION diff --git a/raylib/include/rlgl.h b/raylib/include/rlgl.h new file mode 100644 index 0000000..84f3761 --- /dev/null +++ b/raylib/include/rlgl.h @@ -0,0 +1,5392 @@ +/********************************************************************************************** +* +* rlgl v5.0 - A multi-OpenGL abstraction layer with an immediate-mode style API +* +* DESCRIPTION: +* An abstraction layer for multiple OpenGL versions (1.1, 2.1, 3.3 Core, 4.3 Core, ES 2.0, ES 3.0) +* that provides a pseudo-OpenGL 1.1 immediate-mode style API (rlVertex, rlTranslate, rlRotate...) +* +* ADDITIONAL NOTES: +* When choosing an OpenGL backend different than OpenGL 1.1, some internal buffer are +* initialized on rlglInit() to accumulate vertex data +* +* When an internal state change is required all the stored vertex data is rendered in batch, +* additionally, rlDrawRenderBatchActive() could be called to force flushing of the batch +* +* Some resources are also loaded for convenience, here the complete list: +* - Default batch (RLGL.defaultBatch): RenderBatch system to accumulate vertex data +* - Default texture (RLGL.defaultTextureId): 1x1 white pixel R8G8B8A8 +* - Default shader (RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs) +* +* Internal buffer (and resources) must be manually unloaded calling rlglClose() +* +* CONFIGURATION: +* #define GRAPHICS_API_OPENGL_11_SOFTWARE +* #define GRAPHICS_API_OPENGL_11 +* #define GRAPHICS_API_OPENGL_21 +* #define GRAPHICS_API_OPENGL_33 +* #define GRAPHICS_API_OPENGL_43 +* #define GRAPHICS_API_OPENGL_ES2 +* #define GRAPHICS_API_OPENGL_ES3 +* Use selected OpenGL graphics backend, should be supported by platform +* Those preprocessor defines are only used on rlgl module, if OpenGL version is +* required by any other module, use rlGetVersion() to check it +* +* #define RLGL_IMPLEMENTATION +* Generates the implementation of the library into the included file +* If not defined, the library is in header only mode and can be included in other headers +* or source files without problems. But only ONE file should hold the implementation +* +* #define RLGL_SHOW_GL_DETAILS_INFO +* Show OpenGL extensions and capabilities detailed logs on init +* +* #define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT +* Enable debug context (only available on OpenGL 4.3) +* +* rlgl capabilities could be customized just defining some internal +* values before library inclusion (default values listed): +* +* #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 8192 // Default internal render batch elements limits +* #define RL_DEFAULT_BATCH_BUFFERS 1 // Default number of batch buffers (multi-buffering) +* #define RL_DEFAULT_BATCH_DRAWCALLS 256 // Default number of batch draw calls (by state changes: mode, texture) +* #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 4 // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture()) +* +* #define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of internal Matrix stack +* #define RL_MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported +* #define RL_CULL_DISTANCE_NEAR 0.05 // Default projection matrix near cull distance +* #define RL_CULL_DISTANCE_FAR 4000.0 // Default projection matrix far cull distance +* +* When loading a shader, the following vertex attributes and uniform +* location names are tried to be set automatically: +* +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES "vertexBoneIndices" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES +* #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS "vertexBoneWeights" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp" // model-view-projection matrix +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView" // view matrix +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection" // projection matrix +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel" // model matrix +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal" // normal matrix (transpose(inverse(matModelView))) +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (base tint color, multiplied by texture color) +* #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES "boneMatrices" // bone matrices +* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0) +* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1" // texture1 (texture slot active 1) +* #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) +* +* DEPENDENCIES: +* - OpenGL libraries (depending on platform and OpenGL version selected) +* - GLAD OpenGL extensions loading library (only for OpenGL 3.3 Core, 4.3 Core) +* +* +* LICENSE: zlib/libpng +* +* Copyright (c) 2014-2026 Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RLGL_H +#define RLGL_H + +#define RLGL_VERSION "5.0" + +// Function specifiers in case library is build/used as a shared library +// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll +// NOTE: visibility(default) attribute makes symbols "visible" when compiled with -fvisibility=hidden +#if defined(_WIN32) && defined(BUILD_LIBTYPE_SHARED) + #define RLAPI __declspec(dllexport) // Building the library as a Win32 shared library (.dll) +#elif defined(BUILD_LIBTYPE_SHARED) + #define RLAPI __attribute__((visibility("default"))) // Building the library as a Unix shared library (.so/.dylib) +#elif defined(_WIN32) && defined(USE_LIBTYPE_SHARED) + #define RLAPI __declspec(dllimport) // Using the library as a Win32 shared library (.dll) +#endif + +// Function specifiers definition +#ifndef RLAPI + #define RLAPI // Functions defined as 'extern' by default (implicit specifiers) +#endif + +// Support TRACELOG macros +#ifndef TRACELOG + #define TRACELOG(level, ...) (void)0 +#endif + +// Allow custom memory allocators +#ifndef RL_MALLOC + #define RL_MALLOC(sz) malloc(sz) +#endif +#ifndef RL_CALLOC + #define RL_CALLOC(n,sz) calloc(n,sz) +#endif +#ifndef RL_REALLOC + #define RL_REALLOC(n,sz) realloc(n,sz) +#endif +#ifndef RL_FREE + #define RL_FREE(p) free(p) +#endif + +// Security check in case no GRAPHICS_API_OPENGL_* defined +#if !defined(GRAPHICS_API_OPENGL_11_SOFTWARE) && \ + !defined(GRAPHICS_API_OPENGL_11) && \ + !defined(GRAPHICS_API_OPENGL_21) && \ + !defined(GRAPHICS_API_OPENGL_33) && \ + !defined(GRAPHICS_API_OPENGL_43) && \ + !defined(GRAPHICS_API_OPENGL_ES2) && \ + !defined(GRAPHICS_API_OPENGL_ES3) + #define GRAPHICS_API_OPENGL_33 +#endif + +// Security check in case multiple GRAPHICS_API_OPENGL_* defined +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_11_SOFTWARE) + #if defined(GRAPHICS_API_OPENGL_21) + #undef GRAPHICS_API_OPENGL_21 + #endif + #if defined(GRAPHICS_API_OPENGL_33) + #undef GRAPHICS_API_OPENGL_33 + #endif + #if defined(GRAPHICS_API_OPENGL_43) + #undef GRAPHICS_API_OPENGL_43 + #endif + #if defined(GRAPHICS_API_OPENGL_ES2) + #undef GRAPHICS_API_OPENGL_ES2 + #endif +#endif + +// Software implementation uses OpenGL 1.1 functionality +#if defined(GRAPHICS_API_OPENGL_11_SOFTWARE) + #define GRAPHICS_API_OPENGL_11 +#endif + +// OpenGL 2.1 uses most of OpenGL 3.3 Core functionality +// WARNING: Specific parts are checked with #if defines +#if defined(GRAPHICS_API_OPENGL_21) + #define GRAPHICS_API_OPENGL_33 +#endif + +// OpenGL 4.3 uses OpenGL 3.3 Core functionality +#if defined(GRAPHICS_API_OPENGL_43) + #define GRAPHICS_API_OPENGL_33 +#endif + +// OpenGL ES 3.0 uses OpenGL ES 2.0 functionality (and more) +#if defined(GRAPHICS_API_OPENGL_ES3) + #define GRAPHICS_API_OPENGL_ES2 +#endif + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- + +// Default internal render batch elements limits +#ifndef RL_DEFAULT_BATCH_BUFFER_ELEMENTS + #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // This is the maximum amount of elements (quads) per batch + // NOTE: Be careful with text, every letter maps to a quad + #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 8192 + #endif + #if defined(GRAPHICS_API_OPENGL_ES2) + // Reducing memory sizes for embedded systems (RPI and HTML5) + // NOTE: On HTML5 (emscripten) this is allocated on heap, + // by default heap is only 16MB!...just take care... + #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS 2048 + #endif +#endif +#ifndef RL_DEFAULT_BATCH_BUFFERS + #define RL_DEFAULT_BATCH_BUFFERS 1 // Default number of batch buffers (multi-buffering) +#endif +#ifndef RL_DEFAULT_BATCH_DRAWCALLS + #define RL_DEFAULT_BATCH_DRAWCALLS 256 // Default number of batch draw calls (by state changes: mode, texture) +#endif +#ifndef RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS + #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS 4 // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture()) +#endif + +// Internal Matrix stack +#ifndef RL_MAX_MATRIX_STACK_SIZE + #define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of Matrix stack +#endif + +// Shader limits +#ifndef RL_MAX_SHADER_LOCATIONS + #define RL_MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported +#endif + +// Projection matrix culling +#ifndef RL_CULL_DISTANCE_NEAR + #define RL_CULL_DISTANCE_NEAR 0.05 // Default near cull distance +#endif +#ifndef RL_CULL_DISTANCE_FAR + #define RL_CULL_DISTANCE_FAR 4000.0 // Default far cull distance +#endif + +// Texture parameters (equivalent to OpenGL defines) +#define RL_TEXTURE_WRAP_S 0x2802 // GL_TEXTURE_WRAP_S +#define RL_TEXTURE_WRAP_T 0x2803 // GL_TEXTURE_WRAP_T +#define RL_TEXTURE_MAG_FILTER 0x2800 // GL_TEXTURE_MAG_FILTER +#define RL_TEXTURE_MIN_FILTER 0x2801 // GL_TEXTURE_MIN_FILTER + +#define RL_TEXTURE_FILTER_NEAREST 0x2600 // GL_NEAREST +#define RL_TEXTURE_FILTER_LINEAR 0x2601 // GL_LINEAR +#define RL_TEXTURE_FILTER_MIP_NEAREST 0x2700 // GL_NEAREST_MIPMAP_NEAREST +#define RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR 0x2702 // GL_NEAREST_MIPMAP_LINEAR +#define RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST 0x2701 // GL_LINEAR_MIPMAP_NEAREST +#define RL_TEXTURE_FILTER_MIP_LINEAR 0x2703 // GL_LINEAR_MIPMAP_LINEAR +#define RL_TEXTURE_FILTER_ANISOTROPIC 0x3000 // Anisotropic filter (custom identifier) +#define RL_TEXTURE_MIPMAP_BIAS_RATIO 0x4000 // Texture mipmap bias, percentage ratio (custom identifier) + +#define RL_TEXTURE_WRAP_REPEAT 0x2901 // GL_REPEAT +#define RL_TEXTURE_WRAP_CLAMP 0x812F // GL_CLAMP_TO_EDGE +#define RL_TEXTURE_WRAP_MIRROR_REPEAT 0x8370 // GL_MIRRORED_REPEAT +#define RL_TEXTURE_WRAP_MIRROR_CLAMP 0x8742 // GL_MIRROR_CLAMP_EXT + +// Matrix modes (equivalent to OpenGL) +#define RL_MODELVIEW 0x1700 // GL_MODELVIEW +#define RL_PROJECTION 0x1701 // GL_PROJECTION +#define RL_TEXTURE 0x1702 // GL_TEXTURE + +// Primitive assembly draw modes +#define RL_LINES 0x0001 // GL_LINES +#define RL_TRIANGLES 0x0004 // GL_TRIANGLES +#define RL_QUADS 0x0007 // GL_QUADS + +// GL equivalent data types +#define RL_UNSIGNED_BYTE 0x1401 // GL_UNSIGNED_BYTE +#define RL_FLOAT 0x1406 // GL_FLOAT + +// GL buffer usage hint +#define RL_STREAM_DRAW 0x88E0 // GL_STREAM_DRAW +#define RL_STREAM_READ 0x88E1 // GL_STREAM_READ +#define RL_STREAM_COPY 0x88E2 // GL_STREAM_COPY +#define RL_STATIC_DRAW 0x88E4 // GL_STATIC_DRAW +#define RL_STATIC_READ 0x88E5 // GL_STATIC_READ +#define RL_STATIC_COPY 0x88E6 // GL_STATIC_COPY +#define RL_DYNAMIC_DRAW 0x88E8 // GL_DYNAMIC_DRAW +#define RL_DYNAMIC_READ 0x88E9 // GL_DYNAMIC_READ +#define RL_DYNAMIC_COPY 0x88EA // GL_DYNAMIC_COPY + +// GL Shader type +#define RL_FRAGMENT_SHADER 0x8B30 // GL_FRAGMENT_SHADER +#define RL_VERTEX_SHADER 0x8B31 // GL_VERTEX_SHADER +#define RL_COMPUTE_SHADER 0x91B9 // GL_COMPUTE_SHADER + +// GL blending factors +#define RL_ZERO 0 // GL_ZERO +#define RL_ONE 1 // GL_ONE +#define RL_SRC_COLOR 0x0300 // GL_SRC_COLOR +#define RL_ONE_MINUS_SRC_COLOR 0x0301 // GL_ONE_MINUS_SRC_COLOR +#define RL_SRC_ALPHA 0x0302 // GL_SRC_ALPHA +#define RL_ONE_MINUS_SRC_ALPHA 0x0303 // GL_ONE_MINUS_SRC_ALPHA +#define RL_DST_ALPHA 0x0304 // GL_DST_ALPHA +#define RL_ONE_MINUS_DST_ALPHA 0x0305 // GL_ONE_MINUS_DST_ALPHA +#define RL_DST_COLOR 0x0306 // GL_DST_COLOR +#define RL_ONE_MINUS_DST_COLOR 0x0307 // GL_ONE_MINUS_DST_COLOR +#define RL_SRC_ALPHA_SATURATE 0x0308 // GL_SRC_ALPHA_SATURATE +#define RL_CONSTANT_COLOR 0x8001 // GL_CONSTANT_COLOR +#define RL_ONE_MINUS_CONSTANT_COLOR 0x8002 // GL_ONE_MINUS_CONSTANT_COLOR +#define RL_CONSTANT_ALPHA 0x8003 // GL_CONSTANT_ALPHA +#define RL_ONE_MINUS_CONSTANT_ALPHA 0x8004 // GL_ONE_MINUS_CONSTANT_ALPHA + +// GL blending functions/equations +#define RL_FUNC_ADD 0x8006 // GL_FUNC_ADD +#define RL_MIN 0x8007 // GL_MIN +#define RL_MAX 0x8008 // GL_MAX +#define RL_FUNC_SUBTRACT 0x800A // GL_FUNC_SUBTRACT +#define RL_FUNC_REVERSE_SUBTRACT 0x800B // GL_FUNC_REVERSE_SUBTRACT +#define RL_BLEND_EQUATION 0x8009 // GL_BLEND_EQUATION +#define RL_BLEND_EQUATION_RGB 0x8009 // GL_BLEND_EQUATION_RGB // (Same as BLEND_EQUATION) +#define RL_BLEND_EQUATION_ALPHA 0x883D // GL_BLEND_EQUATION_ALPHA +#define RL_BLEND_DST_RGB 0x80C8 // GL_BLEND_DST_RGB +#define RL_BLEND_SRC_RGB 0x80C9 // GL_BLEND_SRC_RGB +#define RL_BLEND_DST_ALPHA 0x80CA // GL_BLEND_DST_ALPHA +#define RL_BLEND_SRC_ALPHA 0x80CB // GL_BLEND_SRC_ALPHA +#define RL_BLEND_COLOR 0x8005 // GL_BLEND_COLOR + +#define RL_READ_FRAMEBUFFER 0x8CA8 // GL_READ_FRAMEBUFFER +#define RL_DRAW_FRAMEBUFFER 0x8CA9 // GL_DRAW_FRAMEBUFFER + +// Default shader vertex attribute locations +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION 0 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD 1 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL 2 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR 3 +#endif + #ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT +#define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT 4 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 5 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INDICES 6 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES 7 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS 8 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORM + #define RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORM 9 +#endif + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) || (defined(_MSC_VER) && _MSC_VER >= 1800) + #include +#elif !defined(__cplusplus) && !defined(bool) && !defined(RL_BOOL_TYPE) + // Boolean type +typedef enum bool { false = 0, true = !false } bool; +#endif + +#if !defined(RL_MATRIX_TYPE) +// Matrix, 4x4 components, column major, OpenGL style, right handed +typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) +} Matrix; +#define RL_MATRIX_TYPE +#endif + +// Dynamic vertex buffers (position + texcoords + colors + indices arrays) +typedef struct rlVertexBuffer { + int elementCount; // Number of elements in the buffer (QUADS) + + float *vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) + float *texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) + float *normals; // Vertex normal (XYZ - 3 components per vertex) (shader-location = 2) + unsigned char *colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + unsigned int *indices; // Vertex indices (in case vertex data comes indexed) (6 indices per quad) +#endif +#if defined(GRAPHICS_API_OPENGL_ES2) + unsigned short *indices; // Vertex indices (in case vertex data comes indexed) (6 indices per quad) +#endif + unsigned int vaoId; // OpenGL Vertex Array Object id + unsigned int vboId[5]; // OpenGL Vertex Buffer Objects id (5 types of vertex data) +} rlVertexBuffer; + +// Draw call type +// NOTE: Only texture changes register a new draw, other state-change-related elements are not +// used at this moment (vaoId, shaderId, matrices), raylib just forces a batch draw call if any +// of those state-change happens (this is done in core module) +typedef struct rlDrawCall { + int mode; // Drawing mode: LINES, TRIANGLES, QUADS + int vertexCount; // Number of vertex of the draw + int vertexAlignment; // Number of vertex required for index alignment (LINES, TRIANGLES) + //unsigned int vaoId; // Vertex array id to be used on the draw -> Using RLGL.currentBatch->vertexBuffer.vaoId + //unsigned int shaderId; // Shader id to be used on the draw -> Using RLGL.currentShaderId + unsigned int textureId; // Texture id to be used on the draw -> Use to create new draw call if changes + + //Matrix projection; // Projection matrix for this draw -> Using RLGL.projection by default + //Matrix modelview; // Modelview matrix for this draw -> Using RLGL.modelview by default +} rlDrawCall; + +// rlRenderBatch type +typedef struct rlRenderBatch { + int bufferCount; // Number of vertex buffers (multi-buffering support) + int currentBuffer; // Current buffer tracking in case of multi-buffering + rlVertexBuffer *vertexBuffer; // Dynamic buffer(s) for vertex data + + rlDrawCall *draws; // Draw calls array, depends on textureId + int drawCounter; // Draw calls counter + float currentDepth; // Current depth value for next draw +} rlRenderBatch; + +// OpenGL version +typedef enum { + RL_OPENGL_11_SOFTWARE = 0, // Software rendering + RL_OPENGL_11, // OpenGL 1.1 + RL_OPENGL_21, // OpenGL 2.1 (GLSL 120) + RL_OPENGL_33, // OpenGL 3.3 (GLSL 330) + RL_OPENGL_43, // OpenGL 4.3 (using GLSL 330) + RL_OPENGL_ES_20, // OpenGL ES 2.0 (GLSL 100) + RL_OPENGL_ES_30 // OpenGL ES 3.0 (GLSL 300 es) +} rlGlVersion; + +// Trace log level +// NOTE: Organized by priority level +typedef enum { + RL_LOG_ALL = 0, // Display all logs + RL_LOG_TRACE, // Trace logging, intended for internal use only + RL_LOG_DEBUG, // Debug logging, used for internal debugging, it should be disabled on release builds + RL_LOG_INFO, // Info logging, used for program execution info + RL_LOG_WARNING, // Warning logging, used on recoverable failures + RL_LOG_ERROR, // Error logging, used on unrecoverable failures + RL_LOG_FATAL, // Fatal logging, used to abort program: exit(EXIT_FAILURE) + RL_LOG_NONE // Disable logging +} rlTraceLogLevel; + +// Texture pixel formats +// NOTE: Support depends on OpenGL version +typedef enum { + RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha) + RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels) + RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5, // 16 bpp + RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8, // 24 bpp + RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, // 16 bpp (1 bit alpha) + RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, // 16 bpp (4 bit alpha) + RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, // 32 bpp + RL_PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float) + RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float) + RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float) + RL_PIXELFORMAT_UNCOMPRESSED_R16, // 16 bpp (1 channel - half float) + RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16, // 16*3 bpp (3 channels - half float) + RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, // 16*4 bpp (4 channels - half float) + RL_PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha) + RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha) + RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp + RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA, // 8 bpp + RL_PIXELFORMAT_COMPRESSED_ETC1_RGB, // 4 bpp + RL_PIXELFORMAT_COMPRESSED_ETC2_RGB, // 4 bpp + RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, // 8 bpp + RL_PIXELFORMAT_COMPRESSED_PVRT_RGB, // 4 bpp + RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA, // 4 bpp + RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, // 8 bpp + RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA // 2 bpp +} rlPixelFormat; + +// Texture parameters: filter mode +// NOTE 1: Filtering considers mipmaps if available in the texture +// NOTE 2: Filter is accordingly set for minification and magnification +typedef enum { + RL_TEXTURE_FILTER_POINT = 0, // No filter, just pixel approximation + RL_TEXTURE_FILTER_BILINEAR, // Linear filtering + RL_TEXTURE_FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps) + RL_TEXTURE_FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x + RL_TEXTURE_FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x + RL_TEXTURE_FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x +} rlTextureFilter; + +// Color blending modes (pre-defined) +typedef enum { + RL_BLEND_ALPHA = 0, // Blend textures considering alpha (default) + RL_BLEND_ADDITIVE, // Blend textures adding colors + RL_BLEND_MULTIPLIED, // Blend textures multiplying colors + RL_BLEND_ADD_COLORS, // Blend textures adding colors (alternative) + RL_BLEND_SUBTRACT_COLORS, // Blend textures subtracting colors (alternative) + RL_BLEND_ALPHA_PREMULTIPLY, // Blend premultiplied textures considering alpha + RL_BLEND_CUSTOM, // Blend textures using custom src/dst factors (use rlSetBlendFactors()) + RL_BLEND_CUSTOM_SEPARATE // Blend textures using custom src/dst factors (use rlSetBlendFactorsSeparate()) +} rlBlendMode; + +// Shader location point type +typedef enum { + RL_SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position + RL_SHADER_LOC_VERTEX_TEXCOORD01, // Shader location: vertex attribute: texcoord01 + RL_SHADER_LOC_VERTEX_TEXCOORD02, // Shader location: vertex attribute: texcoord02 + RL_SHADER_LOC_VERTEX_NORMAL, // Shader location: vertex attribute: normal + RL_SHADER_LOC_VERTEX_TANGENT, // Shader location: vertex attribute: tangent + RL_SHADER_LOC_VERTEX_COLOR, // Shader location: vertex attribute: color + RL_SHADER_LOC_MATRIX_MVP, // Shader location: matrix uniform: model-view-projection + RL_SHADER_LOC_MATRIX_VIEW, // Shader location: matrix uniform: view (camera transform) + RL_SHADER_LOC_MATRIX_PROJECTION, // Shader location: matrix uniform: projection + RL_SHADER_LOC_MATRIX_MODEL, // Shader location: matrix uniform: model (transform) + RL_SHADER_LOC_MATRIX_NORMAL, // Shader location: matrix uniform: normal + RL_SHADER_LOC_VECTOR_VIEW, // Shader location: vector uniform: view + RL_SHADER_LOC_COLOR_DIFFUSE, // Shader location: vector uniform: diffuse color + RL_SHADER_LOC_COLOR_SPECULAR, // Shader location: vector uniform: specular color + RL_SHADER_LOC_COLOR_AMBIENT, // Shader location: vector uniform: ambient color + RL_SHADER_LOC_MAP_ALBEDO, // Shader location: sampler2d texture: albedo (same as: RL_SHADER_LOC_MAP_DIFFUSE) + RL_SHADER_LOC_MAP_METALNESS, // Shader location: sampler2d texture: metalness (same as: RL_SHADER_LOC_MAP_SPECULAR) + RL_SHADER_LOC_MAP_NORMAL, // Shader location: sampler2d texture: normal + RL_SHADER_LOC_MAP_ROUGHNESS, // Shader location: sampler2d texture: roughness + RL_SHADER_LOC_MAP_OCCLUSION, // Shader location: sampler2d texture: occlusion + RL_SHADER_LOC_MAP_EMISSION, // Shader location: sampler2d texture: emission + RL_SHADER_LOC_MAP_HEIGHT, // Shader location: sampler2d texture: height + RL_SHADER_LOC_MAP_CUBEMAP, // Shader location: samplerCube texture: cubemap + RL_SHADER_LOC_MAP_IRRADIANCE, // Shader location: samplerCube texture: irradiance + RL_SHADER_LOC_MAP_PREFILTER, // Shader location: samplerCube texture: prefilter + RL_SHADER_LOC_MAP_BRDF // Shader location: sampler2d texture: brdf +} rlShaderLocationIndex; + +#define RL_SHADER_LOC_MAP_DIFFUSE RL_SHADER_LOC_MAP_ALBEDO +#define RL_SHADER_LOC_MAP_SPECULAR RL_SHADER_LOC_MAP_METALNESS + +// Shader uniform data type +typedef enum { + RL_SHADER_UNIFORM_FLOAT = 0, // Shader uniform type: float + RL_SHADER_UNIFORM_VEC2, // Shader uniform type: vec2 (2 float) + RL_SHADER_UNIFORM_VEC3, // Shader uniform type: vec3 (3 float) + RL_SHADER_UNIFORM_VEC4, // Shader uniform type: vec4 (4 float) + RL_SHADER_UNIFORM_INT, // Shader uniform type: int + RL_SHADER_UNIFORM_IVEC2, // Shader uniform type: ivec2 (2 int) + RL_SHADER_UNIFORM_IVEC3, // Shader uniform type: ivec3 (3 int) + RL_SHADER_UNIFORM_IVEC4, // Shader uniform type: ivec4 (4 int) + RL_SHADER_UNIFORM_UINT, // Shader uniform type: unsigned int + RL_SHADER_UNIFORM_UIVEC2, // Shader uniform type: uivec2 (2 unsigned int) + RL_SHADER_UNIFORM_UIVEC3, // Shader uniform type: uivec3 (3 unsigned int) + RL_SHADER_UNIFORM_UIVEC4, // Shader uniform type: uivec4 (4 unsigned int) + RL_SHADER_UNIFORM_SAMPLER2D // Shader uniform type: sampler2d +} rlShaderUniformDataType; + +// Shader attribute data types +typedef enum { + RL_SHADER_ATTRIB_FLOAT = 0, // Shader attribute type: float + RL_SHADER_ATTRIB_VEC2, // Shader attribute type: vec2 (2 float) + RL_SHADER_ATTRIB_VEC3, // Shader attribute type: vec3 (3 float) + RL_SHADER_ATTRIB_VEC4 // Shader attribute type: vec4 (4 float) +} rlShaderAttributeDataType; + +// Framebuffer attachment type +// NOTE: By default up to 8 color channels defined, but it can be more +typedef enum { + RL_ATTACHMENT_COLOR_CHANNEL0 = 0, // Framebuffer attachment type: color 0 + RL_ATTACHMENT_COLOR_CHANNEL1 = 1, // Framebuffer attachment type: color 1 + RL_ATTACHMENT_COLOR_CHANNEL2 = 2, // Framebuffer attachment type: color 2 + RL_ATTACHMENT_COLOR_CHANNEL3 = 3, // Framebuffer attachment type: color 3 + RL_ATTACHMENT_COLOR_CHANNEL4 = 4, // Framebuffer attachment type: color 4 + RL_ATTACHMENT_COLOR_CHANNEL5 = 5, // Framebuffer attachment type: color 5 + RL_ATTACHMENT_COLOR_CHANNEL6 = 6, // Framebuffer attachment type: color 6 + RL_ATTACHMENT_COLOR_CHANNEL7 = 7, // Framebuffer attachment type: color 7 + RL_ATTACHMENT_DEPTH = 100, // Framebuffer attachment type: depth + RL_ATTACHMENT_STENCIL = 200, // Framebuffer attachment type: stencil +} rlFramebufferAttachType; + +// Framebuffer texture attachment type +typedef enum { + RL_ATTACHMENT_CUBEMAP_POSITIVE_X = 0, // Framebuffer texture attachment type: cubemap, +X side + RL_ATTACHMENT_CUBEMAP_NEGATIVE_X = 1, // Framebuffer texture attachment type: cubemap, -X side + RL_ATTACHMENT_CUBEMAP_POSITIVE_Y = 2, // Framebuffer texture attachment type: cubemap, +Y side + RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y = 3, // Framebuffer texture attachment type: cubemap, -Y side + RL_ATTACHMENT_CUBEMAP_POSITIVE_Z = 4, // Framebuffer texture attachment type: cubemap, +Z side + RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z = 5, // Framebuffer texture attachment type: cubemap, -Z side + RL_ATTACHMENT_TEXTURE2D = 100, // Framebuffer texture attachment type: texture2d + RL_ATTACHMENT_RENDERBUFFER = 200, // Framebuffer texture attachment type: renderbuffer +} rlFramebufferAttachTextureType; + +// Face culling mode +typedef enum { + RL_CULL_FACE_FRONT = 0, + RL_CULL_FACE_BACK +} rlCullMode; + +//------------------------------------------------------------------------------------ +// Functions Declaration - Matrix operations +//------------------------------------------------------------------------------------ + +#if defined(__cplusplus) +extern "C" { // Prevents name mangling of functions +#endif + +RLAPI void rlMatrixMode(int mode); // Choose the current matrix to be transformed +RLAPI void rlPushMatrix(void); // Push the current matrix to stack +RLAPI void rlPopMatrix(void); // Pop latest inserted matrix from stack +RLAPI void rlLoadIdentity(void); // Reset current matrix to identity matrix +RLAPI void rlTranslatef(float x, float y, float z); // Multiply the current matrix by a translation matrix +RLAPI void rlRotatef(float angle, float x, float y, float z); // Multiply the current matrix by a rotation matrix +RLAPI void rlScalef(float x, float y, float z); // Multiply the current matrix by a scaling matrix +RLAPI void rlMultMatrixf(const float *matf); // Multiply the current matrix by another matrix +RLAPI void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar); +RLAPI void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar); +RLAPI void rlViewport(int x, int y, int width, int height); // Set the viewport area +RLAPI void rlSetClipPlanes(double nearPlane, double farPlane); // Set clip planes distances +RLAPI double rlGetCullDistanceNear(void); // Get cull plane distance near +RLAPI double rlGetCullDistanceFar(void); // Get cull plane distance far + +//------------------------------------------------------------------------------------ +// Functions Declaration - Vertex level operations +//------------------------------------------------------------------------------------ +RLAPI void rlBegin(int mode); // Initialize drawing mode (how to organize vertex) +RLAPI void rlEnd(void); // Finish vertex providing +RLAPI void rlVertex2i(int x, int y); // Define one vertex (position) - 2 int +RLAPI void rlVertex2f(float x, float y); // Define one vertex (position) - 2 float +RLAPI void rlVertex3f(float x, float y, float z); // Define one vertex (position) - 3 float +RLAPI void rlTexCoord2f(float x, float y); // Define one vertex (texture coordinate) - 2 float +RLAPI void rlNormal3f(float x, float y, float z); // Define one vertex (normal) - 3 float +RLAPI void rlColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a); // Define one vertex (color) - 4 byte +RLAPI void rlColor3f(float x, float y, float z); // Define one vertex (color) - 3 float +RLAPI void rlColor4f(float x, float y, float z, float w); // Define one vertex (color) - 4 float + +//------------------------------------------------------------------------------------ +// Functions Declaration - OpenGL style functions (common to 1.1, 3.3+, ES2) +// NOTE: This functions are used to completely abstract raylib code from OpenGL layer, +// some of them are direct wrappers over OpenGL calls, some others are custom +//------------------------------------------------------------------------------------ + +// Vertex buffers state +RLAPI bool rlEnableVertexArray(unsigned int vaoId); // Enable vertex array (VAO, if supported) +RLAPI void rlDisableVertexArray(void); // Disable vertex array (VAO, if supported) +RLAPI void rlEnableVertexBuffer(unsigned int id); // Enable vertex buffer (VBO) +RLAPI void rlDisableVertexBuffer(void); // Disable vertex buffer (VBO) +RLAPI void rlEnableVertexBufferElement(unsigned int id); // Enable vertex buffer element (VBO element) +RLAPI void rlDisableVertexBufferElement(void); // Disable vertex buffer element (VBO element) +RLAPI void rlEnableVertexAttribute(unsigned int index); // Enable vertex attribute index +RLAPI void rlDisableVertexAttribute(unsigned int index); // Disable vertex attribute index +RLAPI void rlEnableStatePointer(int vertexAttribType, void *buffer); // Enable attribute state pointer +RLAPI void rlDisableStatePointer(int vertexAttribType); // Disable attribute state pointer + +// Textures state +RLAPI void rlActiveTextureSlot(int slot); // Select and active a texture slot +RLAPI void rlEnableTexture(unsigned int id); // Enable texture +RLAPI void rlDisableTexture(void); // Disable texture +RLAPI void rlEnableTextureCubemap(unsigned int id); // Enable texture cubemap +RLAPI void rlDisableTextureCubemap(void); // Disable texture cubemap +RLAPI void rlTextureParameters(unsigned int id, int param, int value); // Set texture parameters (filter, wrap) +RLAPI void rlCubemapParameters(unsigned int id, int param, int value); // Set cubemap parameters (filter, wrap) + +// Shader state +RLAPI void rlEnableShader(unsigned int id); // Enable shader program +RLAPI void rlDisableShader(void); // Disable shader program + +// Framebuffer state +RLAPI void rlEnableFramebuffer(unsigned int id); // Enable render texture (fbo) +RLAPI void rlDisableFramebuffer(void); // Disable render texture (fbo), return to default framebuffer +RLAPI unsigned int rlGetActiveFramebuffer(void); // Get the currently active render texture (fbo), 0 for default framebuffer +RLAPI void rlActiveDrawBuffers(int count); // Activate multiple draw color buffers +RLAPI void rlBlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight, int bufferMask); // Blit active framebuffer to main framebuffer +RLAPI void rlBindFramebuffer(unsigned int target, unsigned int framebuffer); // Bind framebuffer (FBO) + +// General render state +RLAPI void rlEnableColorBlend(void); // Enable color blending +RLAPI void rlDisableColorBlend(void); // Disable color blending +RLAPI void rlEnableDepthTest(void); // Enable depth test +RLAPI void rlDisableDepthTest(void); // Disable depth test +RLAPI void rlEnableDepthMask(void); // Enable depth write +RLAPI void rlDisableDepthMask(void); // Disable depth write +RLAPI void rlEnableBackfaceCulling(void); // Enable backface culling +RLAPI void rlDisableBackfaceCulling(void); // Disable backface culling +RLAPI void rlColorMask(bool r, bool g, bool b, bool a); // Color mask control +RLAPI void rlSetCullFace(int mode); // Set face culling mode +RLAPI void rlEnableScissorTest(void); // Enable scissor test +RLAPI void rlDisableScissorTest(void); // Disable scissor test +RLAPI void rlScissor(int x, int y, int width, int height); // Scissor test +RLAPI void rlEnablePointMode(void); // Enable point mode +RLAPI void rlDisablePointMode(void); // Disable point mode +RLAPI void rlSetPointSize(float size); // Set the point drawing size +RLAPI float rlGetPointSize(void); // Get the point drawing size +RLAPI void rlEnableWireMode(void); // Enable wire mode +RLAPI void rlDisableWireMode(void); // Disable wire mode +RLAPI void rlSetLineWidth(float width); // Set the line drawing width +RLAPI float rlGetLineWidth(void); // Get the line drawing width +RLAPI void rlEnableSmoothLines(void); // Enable line aliasing +RLAPI void rlDisableSmoothLines(void); // Disable line aliasing +RLAPI void rlEnableStereoRender(void); // Enable stereo rendering +RLAPI void rlDisableStereoRender(void); // Disable stereo rendering +RLAPI bool rlIsStereoRenderEnabled(void); // Check if stereo render is enabled + +RLAPI void rlClearColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a); // Clear color buffer with color +RLAPI void rlClearScreenBuffers(void); // Clear used screen buffers (color and depth) +RLAPI void rlCheckErrors(void); // Check and log OpenGL error codes +RLAPI void rlSetBlendMode(int mode); // Set blending mode +RLAPI void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation); // Set blending mode factor and equation (using OpenGL factors) +RLAPI void rlSetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha, int glEqRGB, int glEqAlpha); // Set blending mode factors and equations separately (using OpenGL factors) + +//------------------------------------------------------------------------------------ +// Functions Declaration - rlgl functionality +//------------------------------------------------------------------------------------ +// rlgl initialization functions +RLAPI void rlglInit(int width, int height); // Initialize rlgl (buffers, shaders, textures, states) +RLAPI void rlglClose(void); // De-initialize rlgl (buffers, shaders, textures) +RLAPI void rlLoadExtensions(void *loader); // Load OpenGL extensions (loader function required) +RLAPI void *rlGetProcAddress(const char *procName); // Get OpenGL procedure address +RLAPI int rlGetVersion(void); // Get current OpenGL version +RLAPI void rlSetFramebufferWidth(int width); // Set current framebuffer width +RLAPI int rlGetFramebufferWidth(void); // Get default framebuffer width +RLAPI void rlSetFramebufferHeight(int height); // Set current framebuffer height +RLAPI int rlGetFramebufferHeight(void); // Get default framebuffer height + +RLAPI unsigned int rlGetTextureIdDefault(void); // Get default texture id +RLAPI unsigned int rlGetShaderIdDefault(void); // Get default shader id +RLAPI int *rlGetShaderLocsDefault(void); // Get default shader locations + +// Render batch management +// NOTE: rlgl provides a default render batch to behave like OpenGL 1.1 immediate mode +// but this render batch API is exposed in case of custom batches are required +RLAPI rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements); // Load a render batch system +RLAPI void rlUnloadRenderBatch(rlRenderBatch batch); // Unload render batch system +RLAPI void rlDrawRenderBatch(rlRenderBatch *batch); // Draw render batch data (Update->Draw->Reset) +RLAPI void rlSetRenderBatchActive(rlRenderBatch *batch); // Set the active render batch for rlgl (NULL for default internal) +RLAPI void rlDrawRenderBatchActive(void); // Update and draw internal render batch +RLAPI bool rlCheckRenderBatchLimit(int vCount); // Check internal buffer overflow for a given number of vertex + +RLAPI void rlSetTexture(unsigned int id); // Set current texture for render batch and check buffers limits + +//------------------------------------------------------------------------------------------------------------------------ + +// Vertex buffers management +RLAPI unsigned int rlLoadVertexArray(void); // Load vertex array (vao) if supported +RLAPI unsigned int rlLoadVertexBuffer(const void *buffer, int size, bool dynamic); // Load a vertex buffer object +RLAPI unsigned int rlLoadVertexBufferElement(const void *buffer, int size, bool dynamic); // Load vertex buffer elements object +RLAPI void rlUpdateVertexBuffer(unsigned int bufferId, const void *data, int dataSize, int offset); // Update vertex buffer object data on GPU buffer +RLAPI void rlUpdateVertexBufferElements(unsigned int id, const void *data, int dataSize, int offset); // Update vertex buffer elements data on GPU buffer +RLAPI void rlUnloadVertexArray(unsigned int vaoId); // Unload vertex array (vao) +RLAPI void rlUnloadVertexBuffer(unsigned int vboId); // Unload vertex buffer object +RLAPI void rlSetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int stride, int offset); // Set vertex attribute data configuration +RLAPI void rlSetVertexAttributeDivisor(unsigned int index, int divisor); // Set vertex attribute data divisor +RLAPI void rlSetVertexAttributeDefault(int locIndex, const void *value, int attribType, int count); // Set vertex attribute default value, when attribute to provided +RLAPI void rlDrawVertexArray(int offset, int count); // Draw vertex array (currently active vao) +RLAPI void rlDrawVertexArrayElements(int offset, int count, const void *buffer); // Draw vertex array elements +RLAPI void rlDrawVertexArrayInstanced(int offset, int count, int instances); // Draw vertex array (currently active vao) with instancing +RLAPI void rlDrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances); // Draw vertex array elements with instancing + +// Textures management +RLAPI unsigned int rlLoadTexture(const void *data, int width, int height, int format, int mipmapCount); // Load texture data +RLAPI unsigned int rlLoadTextureDepth(int width, int height, bool useRenderBuffer); // Load depth texture/renderbuffer (to be attached to fbo) +RLAPI unsigned int rlLoadTextureCubemap(const void *data, int size, int format, int mipmapCount); // Load texture cubemap data +RLAPI void rlUpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int height, int format, const void *data); // Update texture with new data on GPU +RLAPI void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned int *glFormat, unsigned int *glType); // Get OpenGL internal formats +RLAPI const char *rlGetPixelFormatName(unsigned int format); // Get name string for pixel format +RLAPI void rlUnloadTexture(unsigned int id); // Unload texture from GPU memory +RLAPI void rlGenTextureMipmaps(unsigned int id, int width, int height, int format, int *mipmaps); // Generate mipmap data for selected texture +RLAPI void *rlReadTexturePixels(unsigned int id, int width, int height, int format); // Read texture pixel data +RLAPI unsigned char *rlReadScreenPixels(int width, int height); // Read screen pixel data (color buffer) + +// Framebuffer management (fbo) +RLAPI unsigned int rlLoadFramebuffer(void); // Load an empty framebuffer +RLAPI void rlFramebufferAttach(unsigned int fboId, unsigned int texId, int attachType, int texType, int mipLevel); // Attach texture/renderbuffer to a framebuffer +RLAPI bool rlFramebufferComplete(unsigned int id); // Verify framebuffer is complete +RLAPI void rlUnloadFramebuffer(unsigned int id); // Delete framebuffer from GPU +// WARNING: Copy and resize framebuffer functionality only defined for software backend +RLAPI void rlCopyFramebuffer(int x, int y, int width, int height, int format, void *pixels); // Copy framebuffer pixel data to internal buffer +RLAPI void rlResizeFramebuffer(int width, int height); // Resize internal framebuffer + +// Shaders management +RLAPI unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode); // Load shader from code strings +RLAPI unsigned int rlCompileShader(const char *shaderCode, int type); // Compile custom shader and return shader id (type: RL_VERTEX_SHADER, RL_FRAGMENT_SHADER, RL_COMPUTE_SHADER) +RLAPI unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId); // Load custom shader program +RLAPI void rlUnloadShaderProgram(unsigned int id); // Unload shader program +RLAPI int rlGetLocationUniform(unsigned int shaderId, const char *uniformName); // Get shader location uniform, requires shader program id +RLAPI int rlGetLocationAttrib(unsigned int shaderId, const char *attribName); // Get shader location attribute, requires shader program id +RLAPI void rlSetUniform(int locIndex, const void *value, int uniformType, int count); // Set shader value uniform +RLAPI void rlSetUniformMatrix(int locIndex, Matrix mat); // Set shader value matrix +RLAPI void rlSetUniformMatrices(int locIndex, const Matrix *mat, int count); // Set shader value matrices +RLAPI void rlSetUniformSampler(int locIndex, unsigned int textureId); // Set shader value sampler +RLAPI void rlSetShader(unsigned int id, int *locs); // Set shader currently active (id and locations) + +// Compute shader management +RLAPI unsigned int rlLoadComputeShaderProgram(unsigned int shaderId); // Load compute shader program +RLAPI void rlComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ); // Dispatch compute shader (equivalent to *draw* for graphics pipeline) + +// Shader buffer storage object management (ssbo) +RLAPI unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHint); // Load shader storage buffer object (SSBO) +RLAPI void rlUnloadShaderBuffer(unsigned int ssboId); // Unload shader storage buffer object (SSBO) +RLAPI void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int offset); // Update SSBO buffer data +RLAPI void rlBindShaderBuffer(unsigned int id, unsigned int index); // Bind SSBO buffer +RLAPI void rlReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsigned int offset); // Read SSBO buffer data (GPU->CPU) +RLAPI void rlCopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, unsigned int srcOffset, unsigned int count); // Copy SSBO data between buffers +RLAPI unsigned int rlGetShaderBufferSize(unsigned int id); // Get SSBO buffer size + +// Buffer management +RLAPI void rlBindImageTexture(unsigned int id, unsigned int index, int format, bool readonly); // Bind image texture + +// Matrix state management +RLAPI Matrix rlGetMatrixModelview(void); // Get internal modelview matrix +RLAPI Matrix rlGetMatrixProjection(void); // Get internal projection matrix +RLAPI Matrix rlGetMatrixTransform(void); // Get internal accumulated transform matrix +RLAPI Matrix rlGetMatrixProjectionStereo(int eye); // Get internal projection matrix for stereo render (selected eye) +RLAPI Matrix rlGetMatrixViewOffsetStereo(int eye); // Get internal view offset matrix for stereo render (selected eye) +RLAPI void rlSetMatrixProjection(Matrix proj); // Set a custom projection matrix (replaces internal projection matrix) +RLAPI void rlSetMatrixModelview(Matrix view); // Set a custom modelview matrix (replaces internal modelview matrix) +RLAPI void rlSetMatrixProjectionStereo(Matrix right, Matrix left); // Set eyes projection matrices for stereo rendering +RLAPI void rlSetMatrixViewOffsetStereo(Matrix right, Matrix left); // Set eyes view offsets matrices for stereo rendering + +// Quick and dirty cube/quad buffers load->draw->unload +RLAPI void rlLoadDrawCube(void); // Load and draw a cube +RLAPI void rlLoadDrawQuad(void); // Load and draw a quad + +#if defined(__cplusplus) +} +#endif + +#endif // RLGL_H + +/*********************************************************************************** +* +* RLGL IMPLEMENTATION +* +************************************************************************************/ + +#if defined(RLGL_IMPLEMENTATION) + +// Expose OpenGL functions from glad in raylib +#if defined(BUILD_LIBTYPE_SHARED) + #define GLAD_API_CALL_EXPORT + #define GLAD_API_CALL_EXPORT_BUILD +#endif + +#if defined(GRAPHICS_API_OPENGL_11) + #if defined(GRAPHICS_API_OPENGL_11_SOFTWARE) + #define RLSW_IMPLEMENTATION + #define SW_MALLOC(sz) RL_MALLOC(sz) + #define SW_REALLOC(ptr, newSz) RL_REALLOC(ptr, newSz) + #define SW_FREE(ptr) RL_FREE(ptr) + #include "external/rlsw.h" // OpenGL 1.1 software implementation + #else + #if defined(__APPLE__) + #include // OpenGL 1.1 library for OSX + #include // OpenGL extensions library + #else + // APIENTRY for OpenGL function pointer declarations is required + #if !defined(APIENTRY) + #if defined(_WIN32) + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif + #endif + // WINGDIAPI definition. Some Windows OpenGL headers need it + #if !defined(WINGDIAPI) && defined(_WIN32) + #define WINGDIAPI __declspec(dllimport) + #endif + + #include // OpenGL 1.1 library + #endif + #endif +#endif + +#if defined(GRAPHICS_API_OPENGL_33) + #define GLAD_MALLOC RL_MALLOC + #define GLAD_FREE RL_FREE + + #define GLAD_GL_IMPLEMENTATION + #include "external/glad.h" // GLAD extensions loading library, includes OpenGL headers +#endif + +#if defined(GRAPHICS_API_OPENGL_ES3) + #include // OpenGL ES 3.0 library + #define GL_GLEXT_PROTOTYPES + #include // OpenGL ES 2.0 extensions library +#elif defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: OpenGL ES 2.0 can be enabled on Desktop platforms, + // in that case, functions are loaded from a custom glad for OpenGL ES 2.0 + // TODO: OpenGL ES 2.0 support shouldn't be platform-dependant, neither require GLAD + #if defined(PLATFORM_DESKTOP_GLFW) || defined(PLATFORM_DESKTOP_SDL) + #define GLAD_GLES2_IMPLEMENTATION + #include "external/glad_gles2.h" + #else + #define GL_GLEXT_PROTOTYPES + //#include // EGL library -> not required, platform layer + #include // OpenGL ES 2.0 library + #include // OpenGL ES 2.0 extensions library + #endif + + // It seems OpenGL ES 2.0 instancing entry points are not defined on Raspberry Pi + // provided headers (despite being defined in official Khronos GLES2 headers) + // TODO: Avoid raylib platform-dependant code on rlgl, it should be a completely portable library + #if defined(PLATFORM_DRM) + typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); + typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); + typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); + #endif +#endif + +#include // Required for: calloc(), free() +#include // Required for: strcmp(), strlen() [Used in rlglInit(), on extensions loading] +#include // Required for: sqrtf(), sinf(), cosf(), floor(), log() + +//---------------------------------------------------------------------------------- +// Defines and Macros +//---------------------------------------------------------------------------------- +#ifndef PI + #define PI 3.14159265358979323846f +#endif +#ifndef DEG2RAD + #define DEG2RAD (PI/180.0f) +#endif +#ifndef RAD2DEG + #define RAD2DEG (180.0f/PI) +#endif + +#ifndef GL_SHADING_LANGUAGE_VERSION + #define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#endif + +#ifndef GL_COMPRESSED_RGB_S3TC_DXT1_EXT + #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#endif +#ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT + #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#endif +#ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT + #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#endif +#ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT + #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif +#ifndef GL_ETC1_RGB8_OES + #define GL_ETC1_RGB8_OES 0x8D64 +#endif +#ifndef GL_COMPRESSED_RGB8_ETC2 + #define GL_COMPRESSED_RGB8_ETC2 0x9274 +#endif +#ifndef GL_COMPRESSED_RGBA8_ETC2_EAC + #define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#endif +#ifndef GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG + #define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#endif +#ifndef GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG + #define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#endif +#ifndef GL_COMPRESSED_RGBA_ASTC_4x4_KHR + #define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93b0 +#endif +#ifndef GL_COMPRESSED_RGBA_ASTC_8x8_KHR + #define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93b7 +#endif + +#ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT + #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif +#ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT + #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#endif + +#ifndef GL_PROGRAM_POINT_SIZE + #define GL_PROGRAM_POINT_SIZE 0x8642 +#endif + +#ifndef GL_LINE_WIDTH + #define GL_LINE_WIDTH 0x0B21 +#endif + +#if defined(GRAPHICS_API_OPENGL_11) + #define GL_UNSIGNED_SHORT_5_6_5 0x8363 + #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 + #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#endif + +#if defined(GRAPHICS_API_OPENGL_21) + #define GL_LUMINANCE 0x1909 + #define GL_LUMINANCE_ALPHA 0x190A +#endif + +#if defined(GRAPHICS_API_OPENGL_ES2) + #define glClearDepth glClearDepthf + #if !defined(GRAPHICS_API_OPENGL_ES3) + #define GL_READ_FRAMEBUFFER GL_FRAMEBUFFER + #define GL_DRAW_FRAMEBUFFER GL_FRAMEBUFFER + #endif +#endif + +// Default shader vertex attribute names to set location points +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION + #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION "vertexPosition" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD + #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD "vertexTexCoord" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL + #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL "vertexNormal" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR + #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR "vertexColor" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT + #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT "vertexTangent" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 + #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2 "vertexTexCoord2" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2 +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES + #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES "vertexBoneIndices" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS + #define RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS "vertexBoneWeights" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES + #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES "boneMatrices" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEMATRICES +#endif +#ifndef RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCETRANSFORM + #define RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCETRANSFORM "instanceTransform" // Bound by default to shader location: RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORM +#endif + +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MVP + #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP "mvp" // model-view-projection matrix +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW + #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW "matView" // view matrix +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION + #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION "matProjection" // projection matrix +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL + #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL "matModel" // model matrix +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL + #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL "matNormal" // normal matrix (transpose(inverse(matModelView)) +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR + #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR "colDiffuse" // color diffuse (base tint color, multiplied by texture color) +#endif +#ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 + #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0 "texture0" // texture0 (texture slot active 0) +#endif +#ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 + #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1 "texture1" // texture1 (texture slot active 1) +#endif +#ifndef RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 + #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2 "texture2" // texture2 (texture slot active 2) +#endif +#ifndef RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES + #define RL_DEFAULT_SHADER_UNIFORM_NAME_BONEMATRICES "boneMatrices" // bone matrices (required for GPU skinning) +#endif + +//---------------------------------------------------------------------------------- +// Module Types and Structures Definition +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + +typedef void *(*rlglLoadProc)(const char *name); // OpenGL extension functions loader signature (same as GLADloadproc) + +typedef struct rlglData { + rlRenderBatch *currentBatch; // Current render batch + rlRenderBatch defaultBatch; // Default internal render batch + + rlglLoadProc loader; // OpenGL function loader + + struct { + int vertexCounter; // Current active render batch vertex counter (generic, used for all batches) + float texcoordx, texcoordy; // Current active texture coordinate (added on glVertex*()) + float normalx, normaly, normalz; // Current active normal (added on glVertex*()) + unsigned char colorr, colorg, colorb, colora; // Current active color (added on glVertex*()) + + int currentMatrixMode; // Current matrix mode + Matrix *currentMatrix; // Current matrix pointer + Matrix modelview; // Default modelview matrix + Matrix projection; // Default projection matrix + Matrix transform; // Transform matrix to be used with rlTranslate, rlRotate, rlScale + bool transformRequired; // Require transform matrix application to current draw-call vertex (if required) + Matrix stack[RL_MAX_MATRIX_STACK_SIZE];// Matrix stack for push/pop + int stackCounter; // Matrix stack counter + + unsigned int currentTextureId; // Current texture id to be used on glBegin + unsigned int defaultTextureId; // Default texture used on shapes/poly drawing (required by shader) + unsigned int activeTextureId[RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS]; // Active texture ids to be enabled on batch drawing (0 active by default) + unsigned int defaultVShaderId; // Default vertex shader id (used by default shader program) + unsigned int defaultFShaderId; // Default fragment shader id (used by default shader program) + unsigned int defaultShaderId; // Default shader program id, supports vertex color and diffuse texture + int *defaultShaderLocs; // Default shader locations pointer to be used on rendering + unsigned int currentShaderId; // Current shader id to be used on rendering (by default, defaultShaderId) + int *currentShaderLocs; // Current shader locations pointer to be used on rendering (by default, defaultShaderLocs) + + bool stereoRender; // Stereo rendering flag + Matrix projectionStereo[2]; // VR stereo rendering eyes projection matrices + Matrix viewOffsetStereo[2]; // VR stereo rendering eyes view offset matrices + + // Blending variables + int currentBlendMode; // Blending mode active + int glBlendSrcFactor; // Blending source factor + int glBlendDstFactor; // Blending destination factor + int glBlendEquation; // Blending equation + int glBlendSrcFactorRGB; // Blending source RGB factor + int glBlendDestFactorRGB; // Blending destination RGB factor + int glBlendSrcFactorAlpha; // Blending source alpha factor + int glBlendDestFactorAlpha; // Blending destination alpha factor + int glBlendEquationRGB; // Blending equation for RGB + int glBlendEquationAlpha; // Blending equation for alpha + bool glCustomBlendModeModified; // Custom blending factor and equation modification status + + int framebufferWidth; // Current framebuffer width + int framebufferHeight; // Current framebuffer height + + } State; // Renderer state + struct { + bool vao; // VAO support (OpenGL ES2 could not support VAO extension) (GL_ARB_vertex_array_object) + bool instancing; // Instancing supported (GL_ANGLE_instanced_arrays, GL_EXT_draw_instanced + GL_EXT_instanced_arrays) + bool texNPOT; // NPOT textures full support (GL_ARB_texture_non_power_of_two, GL_OES_texture_npot) + bool texDepth; // Depth textures supported (GL_ARB_depth_texture, GL_OES_depth_texture) + bool texDepthWebGL; // Depth textures supported WebGL specific (GL_WEBGL_depth_texture) + bool texFloat32; // float textures support (32 bit per channel) (GL_OES_texture_float) + bool texFloat16; // half float textures support (16 bit per channel) (GL_OES_texture_half_float) + bool texCompDXT; // DDS texture compression support (GL_EXT_texture_compression_s3tc, GL_WEBGL_compressed_texture_s3tc, GL_WEBKIT_WEBGL_compressed_texture_s3tc) + bool texCompETC1; // ETC1 texture compression support (GL_OES_compressed_ETC1_RGB8_texture, GL_WEBGL_compressed_texture_etc1) + bool texCompETC2; // ETC2/EAC texture compression support (GL_ARB_ES3_compatibility) + bool texCompPVRT; // PVR texture compression support (GL_IMG_texture_compression_pvrtc) + bool texCompASTC; // ASTC texture compression support (GL_KHR_texture_compression_astc_hdr, GL_KHR_texture_compression_astc_ldr) + bool texMirrorClamp; // Clamp mirror wrap mode supported (GL_EXT_texture_mirror_clamp) + bool texAnisoFilter; // Anisotropic texture filtering support (GL_EXT_texture_filter_anisotropic) + bool computeShader; // Compute shaders support (GL_ARB_compute_shader) + bool ssbo; // Shader storage buffer object support (GL_ARB_shader_storage_buffer_object) + + float maxAnisotropyLevel; // Maximum anisotropy level supported (minimum is 2.0f) + int maxDepthBits; // Maximum bits for depth component + + } ExtSupported; // Extensions supported flags +} rlglData; + +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + +//---------------------------------------------------------------------------------- +// Global Variables Definition +//---------------------------------------------------------------------------------- +static double rlCullDistanceNear = RL_CULL_DISTANCE_NEAR; +static double rlCullDistanceFar = RL_CULL_DISTANCE_FAR; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +static rlglData RLGL = { 0 }; +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 +static bool isGpuReady = false; + +#if defined(GRAPHICS_API_OPENGL_ES2) && !defined(GRAPHICS_API_OPENGL_ES3) +// NOTE: VAO functionality is exposed through extensions (OES) +static PFNGLGENVERTEXARRAYSOESPROC glGenVertexArrays = NULL; +static PFNGLBINDVERTEXARRAYOESPROC glBindVertexArray = NULL; +static PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArrays = NULL; + +// NOTE: Instancing functionality could also be available through extension +static PFNGLDRAWARRAYSINSTANCEDEXTPROC glDrawArraysInstanced = NULL; +static PFNGLDRAWELEMENTSINSTANCEDEXTPROC glDrawElementsInstanced = NULL; +static PFNGLVERTEXATTRIBDIVISOREXTPROC glVertexAttribDivisor = NULL; +#endif + +//---------------------------------------------------------------------------------- +// Module Functions Declaration +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +static void rlLoadShaderDefault(void); // Load default shader +static void rlUnloadShaderDefault(void); // Unload default shader +#if RLGL_SHOW_GL_DETAILS_INFO +static const char *rlGetCompressedFormatName(int format); // Get compressed format official GL identifier name +#endif +#endif + +static int rlGetPixelDataSize(int width, int height, int format); // Get pixel data size in bytes (image or texture) + +static Matrix rlMatrixIdentity(void); // Get identity matrix +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +// Auxiliar matrix math functions +typedef struct rl_float16 { float v[16]; } rl_float16; +static rl_float16 rlMatrixToFloatV(Matrix mat); // Get float array of matrix data +#define rlMatrixToFloat(mat) (rlMatrixToFloatV(mat).v) // Get float vector for Matrix +static Matrix rlMatrixMultiply(Matrix left, Matrix right); // Multiply two matrices +static Matrix rlMatrixTranspose(Matrix mat); // Transposes provided matrix +static Matrix rlMatrixInvert(Matrix mat); // Invert provided matrix +#endif + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Matrix operations +//---------------------------------------------------------------------------------- + +#if defined(GRAPHICS_API_OPENGL_11) +// Fallback to OpenGL 1.1 function calls +//--------------------------------------- +void rlMatrixMode(int mode) +{ + switch (mode) + { + case RL_PROJECTION: glMatrixMode(GL_PROJECTION); break; + case RL_MODELVIEW: glMatrixMode(GL_MODELVIEW); break; + case RL_TEXTURE: glMatrixMode(GL_TEXTURE); break; + default: break; + } +} + +void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar) +{ + glFrustum(left, right, bottom, top, znear, zfar); +} + +void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar) +{ + glOrtho(left, right, bottom, top, znear, zfar); +} + +void rlPushMatrix(void) { glPushMatrix(); } +void rlPopMatrix(void) { glPopMatrix(); } +void rlLoadIdentity(void) { glLoadIdentity(); } +void rlTranslatef(float x, float y, float z) { glTranslatef(x, y, z); } +void rlRotatef(float angle, float x, float y, float z) { glRotatef(angle, x, y, z); } +void rlScalef(float x, float y, float z) { glScalef(x, y, z); } +void rlMultMatrixf(const float *matf) { glMultMatrixf(matf); } +#endif +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +// Choose the current matrix to be transformed +void rlMatrixMode(int mode) +{ + if (mode == RL_PROJECTION) RLGL.State.currentMatrix = &RLGL.State.projection; + else if (mode == RL_MODELVIEW) RLGL.State.currentMatrix = &RLGL.State.modelview; + //else if (mode == RL_TEXTURE) // Not supported + + RLGL.State.currentMatrixMode = mode; +} + +// Push the current matrix into RLGL.State.stack +void rlPushMatrix(void) +{ + if (RLGL.State.stackCounter >= RL_MAX_MATRIX_STACK_SIZE) TRACELOG(RL_LOG_ERROR, "RLGL: Matrix stack overflow (RL_MAX_MATRIX_STACK_SIZE)"); + + if (RLGL.State.currentMatrixMode == RL_MODELVIEW) + { + RLGL.State.transformRequired = true; + RLGL.State.currentMatrix = &RLGL.State.transform; + } + + RLGL.State.stack[RLGL.State.stackCounter] = *RLGL.State.currentMatrix; + RLGL.State.stackCounter++; +} + +// Pop latest inserted matrix from RLGL.State.stack +void rlPopMatrix(void) +{ + if (RLGL.State.stackCounter > 0) + { + Matrix mat = RLGL.State.stack[RLGL.State.stackCounter - 1]; + *RLGL.State.currentMatrix = mat; + RLGL.State.stackCounter--; + } + + if ((RLGL.State.stackCounter == 0) && (RLGL.State.currentMatrixMode == RL_MODELVIEW)) + { + RLGL.State.currentMatrix = &RLGL.State.modelview; + RLGL.State.transformRequired = false; + } +} + +// Reset current matrix to identity matrix +void rlLoadIdentity(void) +{ + *RLGL.State.currentMatrix = rlMatrixIdentity(); +} + +// Multiply the current matrix by a translation matrix +void rlTranslatef(float x, float y, float z) +{ + Matrix matTranslation = rlMatrixIdentity(); + + // Set translation component of matrix + matTranslation.m12 = x; + matTranslation.m13 = y; + matTranslation.m14 = z; + + // NOTE: Transposing matrix by multiplication order + *RLGL.State.currentMatrix = rlMatrixMultiply(matTranslation, *RLGL.State.currentMatrix); +} + +// Multiply the current matrix by a rotation matrix +// NOTE: The provided angle must be in degrees +void rlRotatef(float angle, float x, float y, float z) +{ + Matrix matRotation = rlMatrixIdentity(); + + // Axis vector (x, y, z) normalization + float lengthSquared = x*x + y*y + z*z; + if ((lengthSquared != 1.0f) && (lengthSquared != 0.0f)) + { + float inverseLength = 1.0f/sqrtf(lengthSquared); + x *= inverseLength; + y *= inverseLength; + z *= inverseLength; + } + + // Rotation matrix generation + float sinres = sinf(DEG2RAD*angle); + float cosres = cosf(DEG2RAD*angle); + float t = 1.0f - cosres; + + matRotation.m0 = x*x*t + cosres; + matRotation.m1 = y*x*t + z*sinres; + matRotation.m2 = z*x*t - y*sinres; + matRotation.m3 = 0.0f; + + matRotation.m4 = x*y*t - z*sinres; + matRotation.m5 = y*y*t + cosres; + matRotation.m6 = z*y*t + x*sinres; + matRotation.m7 = 0.0f; + + matRotation.m8 = x*z*t + y*sinres; + matRotation.m9 = y*z*t - x*sinres; + matRotation.m10 = z*z*t + cosres; + matRotation.m11 = 0.0f; + + matRotation.m12 = 0.0f; + matRotation.m13 = 0.0f; + matRotation.m14 = 0.0f; + matRotation.m15 = 1.0f; + + // NOTE: Transposing matrix by multiplication order + *RLGL.State.currentMatrix = rlMatrixMultiply(matRotation, *RLGL.State.currentMatrix); +} + +// Multiply the current matrix by a scaling matrix +void rlScalef(float x, float y, float z) +{ + Matrix matScale = rlMatrixIdentity(); + + // Set scale component of matrix + matScale.m0 = x; + matScale.m5 = y; + matScale.m10 = z; + + // NOTE: Transposing matrix by multiplication order + *RLGL.State.currentMatrix = rlMatrixMultiply(matScale, *RLGL.State.currentMatrix); +} + +// Multiply the current matrix by another matrix +void rlMultMatrixf(const float *matf) +{ + // Matrix creation from array + // Conversion from column-major to row-major memory order + Matrix mat = { matf[0], matf[4], matf[8], matf[12], + matf[1], matf[5], matf[9], matf[13], + matf[2], matf[6], matf[10], matf[14], + matf[3], matf[7], matf[11], matf[15] }; + + *RLGL.State.currentMatrix = rlMatrixMultiply(mat, *RLGL.State.currentMatrix); +} + +// Multiply the current matrix by a perspective matrix generated by parameters +void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar) +{ + Matrix matFrustum = { 0 }; + + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(zfar - znear); + + matFrustum.m0 = ((float) znear*2.0f)/rl; + matFrustum.m1 = 0.0f; + matFrustum.m2 = 0.0f; + matFrustum.m3 = 0.0f; + + matFrustum.m4 = 0.0f; + matFrustum.m5 = ((float) znear*2.0f)/tb; + matFrustum.m6 = 0.0f; + matFrustum.m7 = 0.0f; + + matFrustum.m8 = ((float)right + (float)left)/rl; + matFrustum.m9 = ((float)top + (float)bottom)/tb; + matFrustum.m10 = -((float)zfar + (float)znear)/fn; + matFrustum.m11 = -1.0f; + + matFrustum.m12 = 0.0f; + matFrustum.m13 = 0.0f; + matFrustum.m14 = -((float)zfar*(float)znear*2.0f)/fn; + matFrustum.m15 = 0.0f; + + *RLGL.State.currentMatrix = rlMatrixMultiply(*RLGL.State.currentMatrix, matFrustum); +} + +// Multiply the current matrix by an orthographic matrix generated by parameters +void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar) +{ + // NOTE: If left-right and top-botton values are equal it could create a division by zero, + // response to it is platform/compiler dependant + Matrix matOrtho = { 0 }; + + float rl = (float)(right - left); + float tb = (float)(top - bottom); + float fn = (float)(zfar - znear); + + matOrtho.m0 = 2.0f/rl; + matOrtho.m1 = 0.0f; + matOrtho.m2 = 0.0f; + matOrtho.m3 = 0.0f; + matOrtho.m4 = 0.0f; + matOrtho.m5 = 2.0f/tb; + matOrtho.m6 = 0.0f; + matOrtho.m7 = 0.0f; + matOrtho.m8 = 0.0f; + matOrtho.m9 = 0.0f; + matOrtho.m10 = -2.0f/fn; + matOrtho.m11 = 0.0f; + matOrtho.m12 = -((float)left + (float)right)/rl; + matOrtho.m13 = -((float)top + (float)bottom)/tb; + matOrtho.m14 = -((float)zfar + (float)znear)/fn; + matOrtho.m15 = 1.0f; + + *RLGL.State.currentMatrix = rlMatrixMultiply(*RLGL.State.currentMatrix, matOrtho); +} +#endif + +// Set the viewport area (transformation from normalized device coordinates to window coordinates) +void rlViewport(int x, int y, int width, int height) +{ + glViewport(x, y, width, height); +} + +// Set clip planes distances +void rlSetClipPlanes(double nearPlane, double farPlane) +{ + rlCullDistanceNear = nearPlane; + rlCullDistanceFar = farPlane; +} + +// Get cull plane distance near +double rlGetCullDistanceNear(void) +{ + return rlCullDistanceNear; +} + +// Get cull plane distance far +double rlGetCullDistanceFar(void) +{ + return rlCullDistanceFar; +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - Vertex level operations +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_11) +// Fallback to OpenGL 1.1 function calls +//--------------------------------------- +void rlBegin(int mode) +{ + switch (mode) + { + case RL_LINES: glBegin(GL_LINES); break; + case RL_TRIANGLES: glBegin(GL_TRIANGLES); break; + case RL_QUADS: glBegin(GL_QUADS); break; + default: break; + } +} + +void rlEnd(void) { glEnd(); } +void rlVertex2i(int x, int y) { glVertex2i(x, y); } +void rlVertex2f(float x, float y) { glVertex2f(x, y); } +void rlVertex3f(float x, float y, float z) { glVertex3f(x, y, z); } +void rlTexCoord2f(float x, float y) { glTexCoord2f(x, y); } +void rlNormal3f(float x, float y, float z) { glNormal3f(x, y, z); } +void rlColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { glColor4ub(r, g, b, a); } +void rlColor3f(float x, float y, float z) { glColor3f(x, y, z); } +void rlColor4f(float x, float y, float z, float w) { glColor4f(x, y, z, w); } +#endif +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +// Initialize drawing mode (how to organize vertex) +void rlBegin(int mode) +{ + // Draw mode can be RL_LINES, RL_TRIANGLES and RL_QUADS + // NOTE: In all three cases, vertex are accumulated over default internal vertex buffer + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode != mode) + { + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount > 0) + { + // Make sure current RLGL.currentBatch->draws[i].vertexCount is aligned a multiple of 4, + // that way, following QUADS drawing will keep aligned with index processing + // It implies adding some extra alignment vertex at the end of the draw, + // those vertex are not processed but they are considered as an additional offset + // for the next set of vertex to be drawn + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_LINES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount : RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4); + else if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? 1 : (4 - (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4))); + else RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = 0; + + if (!rlCheckRenderBatchLimit(RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment)) + { + RLGL.State.vertexCounter += RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment; + RLGL.currentBatch->drawCounter++; + } + } + + if (RLGL.currentBatch->drawCounter >= RL_DEFAULT_BATCH_DRAWCALLS) rlDrawRenderBatch(RLGL.currentBatch); + + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode = mode; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = RLGL.State.currentTextureId; + RLGL.State.currentTextureId = RLGL.State.defaultTextureId; + } +} + +// Finish vertex providing +void rlEnd(void) +{ + // NOTE: Depth increment is dependant on rlOrtho(): z-near and z-far values, + // as well as depth buffer bit-depth (16bit or 24bit or 32bit) + // Correct increment formula would be: depthInc = (zfar - znear)/pow(2, bits) + RLGL.currentBatch->currentDepth += (1.0f/20000.0f); +} + +// Define one vertex (position) +// NOTE: Vertex position data is the basic information required for drawing +void rlVertex3f(float x, float y, float z) +{ + float tx = x; + float ty = y; + float tz = z; + + // Transform provided vector if required + if (RLGL.State.transformRequired) + { + tx = RLGL.State.transform.m0*x + RLGL.State.transform.m4*y + RLGL.State.transform.m8*z + RLGL.State.transform.m12; + ty = RLGL.State.transform.m1*x + RLGL.State.transform.m5*y + RLGL.State.transform.m9*z + RLGL.State.transform.m13; + tz = RLGL.State.transform.m2*x + RLGL.State.transform.m6*y + RLGL.State.transform.m10*z + RLGL.State.transform.m14; + } + + // WARNING: Be careful with primitives breaking 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 + // Checking current draw.mode when a new vertex is required and finish the batch only if the draw.mode draw.vertexCount is %2, %3 or %4 + if (RLGL.State.vertexCounter > (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4 - 4)) + { + if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_LINES) && + (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%2 == 0)) + { + // Reached the maximum number of vertices for RL_LINES drawing + // Launch a draw call but keep current state for next vertices comming + // NOTE: Adding +1 vertex to the check for some safety + rlCheckRenderBatchLimit(2 + 1); + } + else if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) && + (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%3 == 0)) + { + rlCheckRenderBatchLimit(3 + 1); + } + else if ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_QUADS) && + (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4 == 0)) + { + rlCheckRenderBatchLimit(4 + 1); + } + } + + // Add vertices + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter] = tx; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 1] = ty; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].vertices[3*RLGL.State.vertexCounter + 2] = tz; + + // Add current texcoord + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter] = RLGL.State.texcoordx; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].texcoords[2*RLGL.State.vertexCounter + 1] = RLGL.State.texcoordy; + + // Add current normal + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].normals[3*RLGL.State.vertexCounter] = RLGL.State.normalx; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].normals[3*RLGL.State.vertexCounter + 1] = RLGL.State.normaly; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].normals[3*RLGL.State.vertexCounter + 2] = RLGL.State.normalz; + + // Add current color + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter] = RLGL.State.colorr; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 1] = RLGL.State.colorg; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 2] = RLGL.State.colorb; + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].colors[4*RLGL.State.vertexCounter + 3] = RLGL.State.colora; + + RLGL.State.vertexCounter++; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount++; +} + +// Define one vertex (position) +void rlVertex2f(float x, float y) +{ + rlVertex3f(x, y, RLGL.currentBatch->currentDepth); +} + +// Define one vertex (position) +void rlVertex2i(int x, int y) +{ + rlVertex3f((float)x, (float)y, RLGL.currentBatch->currentDepth); +} + +// Define one vertex (texture coordinate) +// NOTE: Texture coordinates are limited to QUADS only +void rlTexCoord2f(float x, float y) +{ + RLGL.State.texcoordx = x; + RLGL.State.texcoordy = y; +} + +// Define one vertex (normal) +// NOTE: Normals limited to TRIANGLES only? +void rlNormal3f(float x, float y, float z) +{ + float normalx = x; + float normaly = y; + float normalz = z; + if (RLGL.State.transformRequired) + { + normalx = RLGL.State.transform.m0*x + RLGL.State.transform.m4*y + RLGL.State.transform.m8*z; + normaly = RLGL.State.transform.m1*x + RLGL.State.transform.m5*y + RLGL.State.transform.m9*z; + normalz = RLGL.State.transform.m2*x + RLGL.State.transform.m6*y + RLGL.State.transform.m10*z; + } + float length = sqrtf(normalx*normalx + normaly*normaly + normalz*normalz); + if (length != 0.0f) + { + float ilength = 1.0f/length; + normalx *= ilength; + normaly *= ilength; + normalz *= ilength; + } + RLGL.State.normalx = normalx; + RLGL.State.normaly = normaly; + RLGL.State.normalz = normalz; +} + +// Define one vertex (color) +void rlColor4ub(unsigned char x, unsigned char y, unsigned char z, unsigned char w) +{ + RLGL.State.colorr = x; + RLGL.State.colorg = y; + RLGL.State.colorb = z; + RLGL.State.colora = w; +} + +// Define one vertex (color) +void rlColor4f(float r, float g, float b, float a) +{ + rlColor4ub((unsigned char)(r*255), (unsigned char)(g*255), (unsigned char)(b*255), (unsigned char)(a*255)); +} + +// Define one vertex (color) +void rlColor3f(float x, float y, float z) +{ + rlColor4ub((unsigned char)(x*255), (unsigned char)(y*255), (unsigned char)(z*255), 255); +} + +#endif + +//-------------------------------------------------------------------------------------- +// Module Functions Definition - OpenGL style functions (common to 1.1, 3.3+, ES2) +//-------------------------------------------------------------------------------------- + +// Set current texture to use +void rlSetTexture(unsigned int id) +{ + if (id == 0) + { +#if defined(GRAPHICS_API_OPENGL_11) + rlDisableTexture(); +#else + // NOTE: If quads batch limit is reached, force a draw call and next batch starts + if (RLGL.State.vertexCounter >= + RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4) + { + rlDrawRenderBatch(RLGL.currentBatch); + } + RLGL.State.currentTextureId = RLGL.State.defaultTextureId; +#endif + } + else + { +#if defined(GRAPHICS_API_OPENGL_11) + rlEnableTexture(id); +#else + RLGL.State.currentTextureId = id; + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId != id) + { + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount > 0) + { + // Make sure current RLGL.currentBatch->draws[i].vertexCount is aligned a multiple of 4, + // that way, following QUADS drawing will keep aligned with index processing + // It implies adding some extra alignment vertex at the end of the draw, + // those vertex are not processed but they are considered as an additional offset + // for the next set of vertex to be drawn + if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_LINES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount : RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4); + else if (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode == RL_TRIANGLES) RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = ((RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount < 4)? 1 : (4 - (RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount%4))); + else RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment = 0; + + if (!rlCheckRenderBatchLimit(RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment)) + { + RLGL.State.vertexCounter += RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexAlignment; + + RLGL.currentBatch->drawCounter++; + + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 2].mode; + + } + } + + if (RLGL.currentBatch->drawCounter >= RL_DEFAULT_BATCH_DRAWCALLS) rlDrawRenderBatch(RLGL.currentBatch); + + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = id; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].vertexCount = 0; + } +#endif + } +} + +// Select and active a texture slot +void rlActiveTextureSlot(int slot) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glActiveTexture(GL_TEXTURE0 + slot); +#endif +} + +// Enable texture +void rlEnableTexture(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_11) + glEnable(GL_TEXTURE_2D); +#endif + glBindTexture(GL_TEXTURE_2D, id); +} + +// Disable texture +void rlDisableTexture(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) + glDisable(GL_TEXTURE_2D); +#endif + glBindTexture(GL_TEXTURE_2D, 0); +} + +// Enable texture cubemap +void rlEnableTextureCubemap(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindTexture(GL_TEXTURE_CUBE_MAP, id); +#endif +} + +// Disable texture cubemap +void rlDisableTextureCubemap(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindTexture(GL_TEXTURE_CUBE_MAP, 0); +#endif +} + +// Set texture parameters (wrap mode/filter mode) +void rlTextureParameters(unsigned int id, int param, int value) +{ + glBindTexture(GL_TEXTURE_2D, id); + + switch (param) + { + case RL_TEXTURE_WRAP_S: + case RL_TEXTURE_WRAP_T: + { + if (value == RL_TEXTURE_WRAP_MIRROR_CLAMP) + { +#if !defined(GRAPHICS_API_OPENGL_11) + if (RLGL.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_2D, param, value); + else TRACELOG(RL_LOG_WARNING, "GL: Clamp mirror wrap mode not supported (GL_MIRROR_CLAMP_EXT)"); +#endif + } + else glTexParameteri(GL_TEXTURE_2D, param, value); + } break; + case RL_TEXTURE_MAG_FILTER: + case RL_TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_2D, param, value); break; + case RL_TEXTURE_FILTER_ANISOTROPIC: + { +#if !defined(GRAPHICS_API_OPENGL_11) + // Reset anisotropy filter, in case it was set + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); + + if (value <= RLGL.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + else if (RLGL.ExtSupported.maxAnisotropyLevel > 0.0f) + { + TRACELOG(RL_LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, (int)RLGL.ExtSupported.maxAnisotropyLevel); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + } + else TRACELOG(RL_LOG_WARNING, "GL: Anisotropic filtering not supported"); +#endif + } break; +#if defined(GRAPHICS_API_OPENGL_33) + case RL_TEXTURE_MIPMAP_BIAS_RATIO: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, value/100.0f); +#endif + default: break; + } + + glBindTexture(GL_TEXTURE_2D, 0); +} + +// Set cubemap parameters (wrap mode/filter mode) +void rlCubemapParameters(unsigned int id, int param, int value) +{ +#if !defined(GRAPHICS_API_OPENGL_11) + glBindTexture(GL_TEXTURE_CUBE_MAP, id); + + // Reset anisotropy filter, in case it was set + glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); + + switch (param) + { + case RL_TEXTURE_WRAP_S: + case RL_TEXTURE_WRAP_T: + { + if (value == RL_TEXTURE_WRAP_MIRROR_CLAMP) + { + if (RLGL.ExtSupported.texMirrorClamp) glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); + else TRACELOG(RL_LOG_WARNING, "GL: Clamp mirror wrap mode not supported (GL_MIRROR_CLAMP_EXT)"); + } + else glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); + } break; + case RL_TEXTURE_MAG_FILTER: + case RL_TEXTURE_MIN_FILTER: glTexParameteri(GL_TEXTURE_CUBE_MAP, param, value); break; + case RL_TEXTURE_FILTER_ANISOTROPIC: + { + if (value <= RLGL.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + else if (RLGL.ExtSupported.maxAnisotropyLevel > 0.0f) + { + TRACELOG(RL_LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, (int)RLGL.ExtSupported.maxAnisotropyLevel); + glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value); + } + else TRACELOG(RL_LOG_WARNING, "GL: Anisotropic filtering not supported"); + } break; +#if defined(GRAPHICS_API_OPENGL_33) + case RL_TEXTURE_MIPMAP_BIAS_RATIO: glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_LOD_BIAS, value/100.0f); +#endif + default: break; + } + + glBindTexture(GL_TEXTURE_CUBE_MAP, 0); +#endif +} + +// Enable shader program +void rlEnableShader(unsigned int id) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + glUseProgram(id); +#endif +} + +// Disable shader program +void rlDisableShader(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + glUseProgram(0); +#endif +} + +// Enable rendering to texture (fbo) +void rlEnableFramebuffer(unsigned int id) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + glBindFramebuffer(GL_FRAMEBUFFER, id); +#endif +} + +// return the active render texture (fbo) +unsigned int rlGetActiveFramebuffer(void) +{ + GLint fboId = 0; +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &fboId); +#endif + return fboId; +} + +// Disable rendering to texture +void rlDisableFramebuffer(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + glBindFramebuffer(GL_FRAMEBUFFER, 0); +#endif +} + +// Blit active framebuffer to main framebuffer +void rlBlitFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int dstX, int dstY, int dstWidth, int dstHeight, int bufferMask) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) + glBlitFramebuffer(srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight, bufferMask, GL_NEAREST); +#endif +} + +// Bind framebuffer object (fbo) +void rlBindFramebuffer(unsigned int target, unsigned int framebuffer) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + glBindFramebuffer(target, framebuffer); +#endif +} + +// Activate multiple draw color buffers +// NOTE: One color buffer is always active by default +void rlActiveDrawBuffers(int count) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES3)) + // NOTE: Maximum number of draw buffers supported is implementation dependant, + // it can be queried with glGet*() but it must be at least 8 + //GLint maxDrawBuffers = 0; + //glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers); + + if (count > 0) + { + if (count > 8) TRACELOG(RL_LOG_WARNING, "GL: Max color buffers limited to 8"); + else + { + unsigned int buffers[8] = { + GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1, + GL_COLOR_ATTACHMENT2, + GL_COLOR_ATTACHMENT3, + GL_COLOR_ATTACHMENT4, + GL_COLOR_ATTACHMENT5, + GL_COLOR_ATTACHMENT6, + GL_COLOR_ATTACHMENT7, + }; + + glDrawBuffers(count, buffers); + } + } + else TRACELOG(RL_LOG_WARNING, "GL: One color buffer active by default"); +#endif +} + +//---------------------------------------------------------------------------------- +// General render state configuration +//---------------------------------------------------------------------------------- + +// Enable color blending +void rlEnableColorBlend(void) { glEnable(GL_BLEND); } + +// Disable color blending +void rlDisableColorBlend(void) { glDisable(GL_BLEND); } + +// Enable depth test +void rlEnableDepthTest(void) { glEnable(GL_DEPTH_TEST); } + +// Disable depth test +void rlDisableDepthTest(void) { glDisable(GL_DEPTH_TEST); } + +// Enable depth write +void rlEnableDepthMask(void) { glDepthMask(GL_TRUE); } + +// Disable depth write +void rlDisableDepthMask(void) { glDepthMask(GL_FALSE); } + +// Enable backface culling +void rlEnableBackfaceCulling(void) { glEnable(GL_CULL_FACE); } + +// Disable backface culling +void rlDisableBackfaceCulling(void) { glDisable(GL_CULL_FACE); } + +// Set color mask active for screen read/draw +void rlColorMask(bool r, bool g, bool b, bool a) { glColorMask(r, g, b, a); } + +// Set face culling mode +void rlSetCullFace(int mode) +{ + switch (mode) + { + case RL_CULL_FACE_BACK: glCullFace(GL_BACK); break; + case RL_CULL_FACE_FRONT: glCullFace(GL_FRONT); break; + default: break; + } +} + +// Enable scissor test +void rlEnableScissorTest(void) { glEnable(GL_SCISSOR_TEST); } + +// Disable scissor test +void rlDisableScissorTest(void) { glDisable(GL_SCISSOR_TEST); } + +// Scissor test +void rlScissor(int x, int y, int width, int height) { glScissor(x, y, width, height); } + +// Enable wire mode +void rlEnableWireMode(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // NOTE: glPolygonMode() not available on OpenGL ES + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); +#endif +} + +// Disable wire mode +void rlDisableWireMode(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // NOTE: glPolygonMode() not available on OpenGL ES + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +#endif +} + +// Enable point mode +void rlEnablePointMode(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // NOTE: glPolygonMode() not available on OpenGL ES + glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); + glEnable(GL_PROGRAM_POINT_SIZE); +#endif +} + +// Disable point mode +void rlDisablePointMode(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // NOTE: glPolygonMode() not available on OpenGL ES + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +#endif +} + +// Set the line drawing width +void rlSetLineWidth(float width) { glLineWidth(width); } + +// Get the line drawing width +float rlGetLineWidth(void) +{ + float width = 0; + glGetFloatv(GL_LINE_WIDTH, &width); + return width; +} + +// Set the point drawing size +void rlSetPointSize(float size) +{ +#if defined(GRAPHICS_API_OPENGL_11) + glPointSize(size); +#endif +} + +// Get the point drawing size +float rlGetPointSize(void) +{ + float size = 1; +#if defined(GRAPHICS_API_OPENGL_11) + glGetFloatv(GL_POINT_SIZE, &size); +#endif + return size; + +} + +// Enable line aliasing +void rlEnableSmoothLines(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_11) + glEnable(GL_LINE_SMOOTH); +#endif +} + +// Disable line aliasing +void rlDisableSmoothLines(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_11) + glDisable(GL_LINE_SMOOTH); +#endif +} + +// Enable stereo rendering +void rlEnableStereoRender(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + RLGL.State.stereoRender = true; +#endif +} + +// Disable stereo rendering +void rlDisableStereoRender(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + RLGL.State.stereoRender = false; +#endif +} + +// Check if stereo render is enabled +bool rlIsStereoRenderEnabled(void) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + return RLGL.State.stereoRender; +#else + return false; +#endif +} + +// Clear color buffer with color +void rlClearColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + // Color values clamp to 0.0f(0) and 1.0f(255) + float cr = (float)r/255; + float cg = (float)g/255; + float cb = (float)b/255; + float ca = (float)a/255; + + glClearColor(cr, cg, cb, ca); +} + +// Clear used screen buffers (color and depth) +void rlClearScreenBuffers(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear used buffers: Color and Depth (Depth is used for 3D) + //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // Stencil buffer not used... +} + +// Check and log OpenGL error codes +void rlCheckErrors(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + int check = 1; + while (check) + { + const GLenum err = glGetError(); + switch (err) + { + case GL_NO_ERROR: check = 0; break; + case 0x0500: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_ENUM"); break; + case 0x0501: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_VALUE"); break; + case 0x0502: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_OPERATION"); break; + case 0x0503: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_STACK_OVERFLOW"); break; + case 0x0504: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_STACK_UNDERFLOW"); break; + case 0x0505: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_OUT_OF_MEMORY"); break; + case 0x0506: TRACELOG(RL_LOG_WARNING, "GL: Error detected: GL_INVALID_FRAMEBUFFER_OPERATION"); break; + default: TRACELOG(RL_LOG_WARNING, "GL: Error detected: Unknown error code: %x", err); break; + } + } +#endif +} + +// Set blend mode +void rlSetBlendMode(int mode) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((RLGL.State.currentBlendMode != mode) || ((mode == RL_BLEND_CUSTOM || mode == RL_BLEND_CUSTOM_SEPARATE) && RLGL.State.glCustomBlendModeModified)) + { + rlDrawRenderBatch(RLGL.currentBatch); + + switch (mode) + { + case RL_BLEND_ALPHA: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_ADDITIVE: glBlendFunc(GL_SRC_ALPHA, GL_ONE); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_MULTIPLIED: glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_ADD_COLORS: glBlendFunc(GL_ONE, GL_ONE); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_SUBTRACT_COLORS: glBlendFunc(GL_ONE, GL_ONE); glBlendEquation(GL_FUNC_SUBTRACT); break; + case RL_BLEND_ALPHA_PREMULTIPLY: glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); break; + case RL_BLEND_CUSTOM: + { + // NOTE: Using GL blend src/dst factors and GL equation configured with rlSetBlendFactors() + glBlendFunc(RLGL.State.glBlendSrcFactor, RLGL.State.glBlendDstFactor); glBlendEquation(RLGL.State.glBlendEquation); + } break; + case RL_BLEND_CUSTOM_SEPARATE: + { + // NOTE: Using GL blend src/dst factors and GL equation configured with rlSetBlendFactorsSeparate() + glBlendFuncSeparate(RLGL.State.glBlendSrcFactorRGB, RLGL.State.glBlendDestFactorRGB, RLGL.State.glBlendSrcFactorAlpha, RLGL.State.glBlendDestFactorAlpha); + glBlendEquationSeparate(RLGL.State.glBlendEquationRGB, RLGL.State.glBlendEquationAlpha); + } break; + default: break; + } + + RLGL.State.currentBlendMode = mode; + RLGL.State.glCustomBlendModeModified = false; + } +#endif +} + +// Set blending mode factor and equation +void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((RLGL.State.glBlendSrcFactor != glSrcFactor) || + (RLGL.State.glBlendDstFactor != glDstFactor) || + (RLGL.State.glBlendEquation != glEquation)) + { + RLGL.State.glBlendSrcFactor = glSrcFactor; + RLGL.State.glBlendDstFactor = glDstFactor; + RLGL.State.glBlendEquation = glEquation; + + RLGL.State.glCustomBlendModeModified = true; + } +#endif +} + +// Set blending mode factor and equation separately for RGB and alpha +void rlSetBlendFactorsSeparate(int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha, int glEqRGB, int glEqAlpha) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((RLGL.State.glBlendSrcFactorRGB != glSrcRGB) || + (RLGL.State.glBlendDestFactorRGB != glDstRGB) || + (RLGL.State.glBlendSrcFactorAlpha != glSrcAlpha) || + (RLGL.State.glBlendDestFactorAlpha != glDstAlpha) || + (RLGL.State.glBlendEquationRGB != glEqRGB) || + (RLGL.State.glBlendEquationAlpha != glEqAlpha)) + { + RLGL.State.glBlendSrcFactorRGB = glSrcRGB; + RLGL.State.glBlendDestFactorRGB = glDstRGB; + RLGL.State.glBlendSrcFactorAlpha = glSrcAlpha; + RLGL.State.glBlendDestFactorAlpha = glDstAlpha; + RLGL.State.glBlendEquationRGB = glEqRGB; + RLGL.State.glBlendEquationAlpha = glEqAlpha; + + RLGL.State.glCustomBlendModeModified = true; + } +#endif +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition - OpenGL Debug +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_43) && RLGL_ENABLE_OPENGL_DEBUG_CONTEXT +static void GLAPIENTRY rlDebugMessageCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam) +{ + // Ignore non-significant error/warning codes (NVidia drivers) + // NOTE: Here there are the details with a sample output: + // - #131169 - Framebuffer detailed info: The driver allocated storage for renderbuffer 2. (severity: low) + // - #131185 - Buffer detailed info: Buffer object 1 (bound to GL_ELEMENT_ARRAY_BUFFER_ARB, usage hint is GL_ENUM_88e4) + // will use VIDEO memory as the source for buffer object operations. (severity: low) + // - #131218 - Program/shader state performance warning: Vertex shader in program 7 is being recompiled based on GL state. (severity: medium) + // - #131204 - Texture state usage warning: The texture object (0) bound to texture image unit 0 does not have + // a defined base level and cannot be used for texture mapping. (severity: low) + if ((id == 131169) || (id == 131185) || (id == 131218) || (id == 131204)) return; + + const char *msgSource = NULL; + switch (source) + { + case GL_DEBUG_SOURCE_API: msgSource = "API"; break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: msgSource = "WINDOW_SYSTEM"; break; + case GL_DEBUG_SOURCE_SHADER_COMPILER: msgSource = "SHADER_COMPILER"; break; + case GL_DEBUG_SOURCE_THIRD_PARTY: msgSource = "THIRD_PARTY"; break; + case GL_DEBUG_SOURCE_APPLICATION: msgSource = "APPLICATION"; break; + case GL_DEBUG_SOURCE_OTHER: msgSource = "OTHER"; break; + default: break; + } + + const char *msgType = NULL; + switch (type) + { + case GL_DEBUG_TYPE_ERROR: msgType = "ERROR"; break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: msgType = "DEPRECATED_BEHAVIOR"; break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: msgType = "UNDEFINED_BEHAVIOR"; break; + case GL_DEBUG_TYPE_PORTABILITY: msgType = "PORTABILITY"; break; + case GL_DEBUG_TYPE_PERFORMANCE: msgType = "PERFORMANCE"; break; + case GL_DEBUG_TYPE_MARKER: msgType = "MARKER"; break; + case GL_DEBUG_TYPE_PUSH_GROUP: msgType = "PUSH_GROUP"; break; + case GL_DEBUG_TYPE_POP_GROUP: msgType = "POP_GROUP"; break; + case GL_DEBUG_TYPE_OTHER: msgType = "OTHER"; break; + default: break; + } + + const char *msgSeverity = "DEFAULT"; + switch (severity) + { + case GL_DEBUG_SEVERITY_LOW: msgSeverity = "LOW"; break; + case GL_DEBUG_SEVERITY_MEDIUM: msgSeverity = "MEDIUM"; break; + case GL_DEBUG_SEVERITY_HIGH: msgSeverity = "HIGH"; break; + case GL_DEBUG_SEVERITY_NOTIFICATION: msgSeverity = "NOTIFICATION"; break; + default: break; + } + + TRACELOG(RL_LOG_WARNING, "GL: OpenGL debug message: %s", message); + TRACELOG(RL_LOG_WARNING, " > Type: %s", msgType); + TRACELOG(RL_LOG_WARNING, " > Source = %s", msgSource); + TRACELOG(RL_LOG_WARNING, " > Severity = %s", msgSeverity); +} +#endif + +//---------------------------------------------------------------------------------- +// Module Functions Definition - rlgl functionality +//---------------------------------------------------------------------------------- + +// Initialize rlgl: OpenGL extensions, default buffers/shaders/textures, OpenGL states +void rlglInit(int width, int height) +{ + isGpuReady = true; + + // Enable OpenGL debug context if requested (and supported) +#if defined(GRAPHICS_API_OPENGL_43) && RLGL_ENABLE_OPENGL_DEBUG_CONTEXT + if ((glDebugMessageCallback != NULL) && (glDebugMessageControl != NULL)) + { + glDebugMessageCallback(rlDebugMessageCallback, 0); + // glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, GL_DEBUG_SEVERITY_HIGH, 0, 0, GL_TRUE); + + // Debug context options: + // - GL_DEBUG_OUTPUT - Faster version but not useful for breakpoints + // - GL_DEBUG_OUTPUT_SYNCHRONUS - Callback is in sync with errors, so a breakpoint can be placed on the callback in order to get a stacktrace for the GL error + glEnable(GL_DEBUG_OUTPUT); + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + } +#endif + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Init default white texture + unsigned char pixels[4] = { 255, 255, 255, 255 }; // 1 pixel RGBA (4 bytes) + RLGL.State.defaultTextureId = rlLoadTexture(pixels, 1, 1, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1); + RLGL.State.currentTextureId = RLGL.State.defaultTextureId; + + if (RLGL.State.defaultTextureId != 0) TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Default texture loaded successfully", RLGL.State.defaultTextureId); + else TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load default texture"); + + // Init default Shader (customized for GL 3.3 and ES2) + // Loaded: RLGL.State.defaultShaderId + RLGL.State.defaultShaderLocs + rlLoadShaderDefault(); + RLGL.State.currentShaderId = RLGL.State.defaultShaderId; + RLGL.State.currentShaderLocs = RLGL.State.defaultShaderLocs; + + // Init default vertex arrays buffers + // Simulate that the default shader has the location RL_SHADER_LOC_VERTEX_NORMAL to bind the normal buffer for the default render batch + RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL] = RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL; + RLGL.defaultBatch = rlLoadRenderBatch(RL_DEFAULT_BATCH_BUFFERS, RL_DEFAULT_BATCH_BUFFER_ELEMENTS); + RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL] = -1; + RLGL.currentBatch = &RLGL.defaultBatch; + + // Init stack matrices (emulating OpenGL 1.1) + for (int i = 0; i < RL_MAX_MATRIX_STACK_SIZE; i++) RLGL.State.stack[i] = rlMatrixIdentity(); + + // Init internal matrices + RLGL.State.transform = rlMatrixIdentity(); + RLGL.State.projection = rlMatrixIdentity(); + RLGL.State.modelview = rlMatrixIdentity(); + RLGL.State.currentMatrix = &RLGL.State.modelview; +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + +#if defined(GRAPHICS_API_OPENGL_11_SOFTWARE) + // Initialize software renderer backend + int result = swInit(width, height); + if (result == 0) + { + TRACELOG(RL_LOG_ERROR, "RLSW: Software renderer initialization failed!"); + exit(-1); + } +#endif + + // Initialize OpenGL default states + //---------------------------------------------------------- + // Init state: Depth test + glDepthFunc(GL_LEQUAL); // Type of depth testing to apply + glDisable(GL_DEPTH_TEST); // Disable depth testing for 2D (only used for 3D) + + // Init state: Blending mode + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Color blending function (how colors are mixed) + glEnable(GL_BLEND); // Enable color blending (required to work with transparencies) + + // Init state: Culling + // NOTE: All shapes/models triangles are drawn CCW + glCullFace(GL_BACK); // Cull the back face (default) + glFrontFace(GL_CCW); // Front face are defined counter clockwise (default) + glEnable(GL_CULL_FACE); // Enable backface culling + +#if defined(GRAPHICS_API_OPENGL_11) + // Init state: Color hints (deprecated in OpenGL 3.0+) + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Improve quality of color and texture coordinate interpolation + glShadeModel(GL_SMOOTH); // Smooth shading between vertex (vertex colors interpolation) +#endif +#if defined(GRAPHICS_API_OPENGL_33) + // Init state: Cubemap seamless + glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); // Seamless cubemaps (not supported on OpenGL ES 2.0) +#endif +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Store screen size into global variables + RLGL.State.framebufferWidth = width; + RLGL.State.framebufferHeight = height; +#endif + + // Init state: Color/Depth buffers clear + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set clear color (black) + glClearDepth(1.0f); // Set clear depth value (default) + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear color and depth buffers (depth buffer required for 3D) + + TRACELOG(RL_LOG_INFO, "RLGL: Default OpenGL state initialized successfully"); + //---------------------------------------------------------- +} + +// Vertex Buffer Object deinitialization (memory free) +void rlglClose(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + rlUnloadRenderBatch(RLGL.defaultBatch); + + rlUnloadShaderDefault(); // Unload default shader + + glDeleteTextures(1, &RLGL.State.defaultTextureId); // Unload default texture + TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Default texture unloaded successfully", RLGL.State.defaultTextureId); +#endif + +#if defined(GRAPHICS_API_OPENGL_11_SOFTWARE) + swClose(); // Unload sofware renderer resources +#endif + isGpuReady = false; +} + +// Load OpenGL extensions +// NOTE: External loader function must be provided +void rlLoadExtensions(void *loader) +{ +#if defined(GRAPHICS_API_OPENGL_33) // Also defined for GRAPHICS_API_OPENGL_21 + // NOTE: glad is generated and contains only required OpenGL 3.3 Core extensions (and lower versions) + if (gladLoadGL((GLADloadfunc)loader) == 0) TRACELOG(RL_LOG_WARNING, "GLAD: Cannot load OpenGL extensions"); + else TRACELOG(RL_LOG_INFO, "GLAD: OpenGL extensions loaded successfully"); + + // Get number of supported extensions + GLint numExt = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &numExt); + TRACELOG(RL_LOG_INFO, "GL: Supported extensions count: %i", numExt); + +#if RLGL_SHOW_GL_DETAILS_INFO + // Get supported extensions list + // WARNING: glGetStringi() not available on OpenGL 2.1 + TRACELOG(RL_LOG_INFO, "GL: OpenGL extensions:"); + for (int i = 0; i < numExt; i++) TRACELOG(RL_LOG_INFO, " %s", glGetStringi(GL_EXTENSIONS, i)); +#endif + +#if defined(GRAPHICS_API_OPENGL_21) + // Register supported extensions flags + // Optional OpenGL 2.1 extensions + RLGL.ExtSupported.vao = GLAD_GL_ARB_vertex_array_object; + RLGL.ExtSupported.instancing = (GLAD_GL_EXT_draw_instanced && GLAD_GL_ARB_instanced_arrays); + RLGL.ExtSupported.texNPOT = GLAD_GL_ARB_texture_non_power_of_two; + RLGL.ExtSupported.texFloat32 = GLAD_GL_ARB_texture_float; + RLGL.ExtSupported.texFloat16 = GLAD_GL_ARB_texture_float; + RLGL.ExtSupported.texDepth = GLAD_GL_ARB_depth_texture; + RLGL.ExtSupported.maxDepthBits = 32; + RLGL.ExtSupported.texAnisoFilter = GLAD_GL_EXT_texture_filter_anisotropic; + RLGL.ExtSupported.texMirrorClamp = GLAD_GL_EXT_texture_mirror_clamp; +#else + // Register supported extensions flags + // OpenGL 3.3 extensions supported by default (core) + RLGL.ExtSupported.vao = true; + RLGL.ExtSupported.instancing = true; + RLGL.ExtSupported.texNPOT = true; + RLGL.ExtSupported.texFloat32 = true; + RLGL.ExtSupported.texFloat16 = true; + RLGL.ExtSupported.texDepth = true; + RLGL.ExtSupported.maxDepthBits = 32; + RLGL.ExtSupported.texAnisoFilter = true; + RLGL.ExtSupported.texMirrorClamp = true; +#endif + + // Optional OpenGL 3.3 extensions + RLGL.ExtSupported.texCompASTC = GLAD_GL_KHR_texture_compression_astc_hdr && GLAD_GL_KHR_texture_compression_astc_ldr; + RLGL.ExtSupported.texCompDXT = GLAD_GL_EXT_texture_compression_s3tc; // Texture compression: DXT + RLGL.ExtSupported.texCompETC2 = GLAD_GL_ARB_ES3_compatibility; // Texture compression: ETC2/EAC + #if defined(GRAPHICS_API_OPENGL_43) + RLGL.ExtSupported.computeShader = GLAD_GL_ARB_compute_shader; + RLGL.ExtSupported.ssbo = GLAD_GL_ARB_shader_storage_buffer_object; + #endif + +#endif // GRAPHICS_API_OPENGL_33 + +#if defined(GRAPHICS_API_OPENGL_ES3) + // Register supported extensions flags + // OpenGL ES 3.0 extensions supported by default (or it should be) + RLGL.ExtSupported.vao = true; + RLGL.ExtSupported.instancing = true; + RLGL.ExtSupported.texNPOT = true; + RLGL.ExtSupported.texFloat32 = true; + RLGL.ExtSupported.texFloat16 = true; + RLGL.ExtSupported.texDepth = true; + RLGL.ExtSupported.texDepthWebGL = true; + RLGL.ExtSupported.maxDepthBits = 24; + RLGL.ExtSupported.texAnisoFilter = true; + RLGL.ExtSupported.texMirrorClamp = true; + // TODO: Check for additional OpenGL ES 3.0 supported extensions: + //RLGL.ExtSupported.texCompDXT = true; + //RLGL.ExtSupported.texCompETC1 = true; + //RLGL.ExtSupported.texCompETC2 = true; + //RLGL.ExtSupported.texCompPVRT = true; + //RLGL.ExtSupported.texCompASTC = true; + //RLGL.ExtSupported.maxAnisotropyLevel = true; + //RLGL.ExtSupported.computeShader = true; + //RLGL.ExtSupported.ssbo = true; + +#elif defined(GRAPHICS_API_OPENGL_ES2) + + #if defined(PLATFORM_DESKTOP_GLFW) || defined(PLATFORM_DESKTOP_SDL) + // TODO: Support GLAD loader for OpenGL ES 3.0 + if (gladLoadGLES2((GLADloadfunc)loader) == 0) TRACELOG(RL_LOG_WARNING, "GLAD: Cannot load OpenGL ES2.0 functions"); + else TRACELOG(RL_LOG_INFO, "GLAD: OpenGL ES 2.0 loaded successfully"); + #endif + + // Get supported extensions list + GLint numExt = 0; + const char **extList = (const char **)RL_CALLOC(512, sizeof(const char *)); // Allocate 512 strings pointers (2 KB) + const char *extensions = (const char *)glGetString(GL_EXTENSIONS); // One big const string + + // NOTE: String duplication rquired because glGetString() returns a const string + int extensionsLength = (int)strlen(extensions); // Get extensions string size in bytes + char *extensionsDup = (char *)RL_CALLOC(extensionsLength + 1, sizeof(char)); // Allocate space for copy with additional EOL byte + strncpy(extensionsDup, extensions, extensionsLength); + extList[numExt] = extensionsDup; + + for (int i = 0; i < extensionsLength; i++) + { + if (extensionsDup[i] == ' ') + { + extensionsDup[i] = '\0'; + numExt++; + extList[numExt] = &extensionsDup[i + 1]; + } + } + + TRACELOG(RL_LOG_INFO, "GL: Supported extensions count: %i", numExt); + +#if RLGL_SHOW_GL_DETAILS_INFO + TRACELOG(RL_LOG_INFO, "GL: OpenGL extensions:"); + for (int i = 0; i < numExt; i++) TRACELOG(RL_LOG_INFO, " %s", extList[i]); +#endif + + // Check required extensions + for (int i = 0; i < numExt; i++) + { + // Check VAO support + // NOTE: Only check on OpenGL ES, OpenGL 3.3 has VAO support as core feature + if (strcmp(extList[i], (const char *)"GL_OES_vertex_array_object") == 0) + { + // The extension is supported by our hardware and driver, try to get related functions pointers + // NOTE: emscripten does not support VAOs natively, it uses emulation and it reduces overall performance... + glGenVertexArrays = (PFNGLGENVERTEXARRAYSOESPROC)((rlglLoadProc)loader)("glGenVertexArraysOES"); + glBindVertexArray = (PFNGLBINDVERTEXARRAYOESPROC)((rlglLoadProc)loader)("glBindVertexArrayOES"); + glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSOESPROC)((rlglLoadProc)loader)("glDeleteVertexArraysOES"); + //glIsVertexArray = (PFNGLISVERTEXARRAYOESPROC)loader("glIsVertexArrayOES"); // NOTE: Fails in WebGL, omitted + + if ((glGenVertexArrays != NULL) && (glBindVertexArray != NULL) && (glDeleteVertexArrays != NULL)) RLGL.ExtSupported.vao = true; + } + + // Check instanced rendering support + if (strstr(extList[i], (const char *)"instanced_arrays") != NULL) // Broad check for instanced_arrays + { + // Specific check + if (strcmp(extList[i], (const char *)"GL_ANGLE_instanced_arrays") == 0) // ANGLE + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedANGLE"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedANGLE"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)("glVertexAttribDivisorANGLE"); + } + else if (strcmp(extList[i], (const char *)"GL_EXT_instanced_arrays") == 0) // EXT + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedEXT"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedEXT"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)("glVertexAttribDivisorEXT"); + } + else if (strcmp(extList[i], (const char *)"GL_NV_instanced_arrays") == 0) // NVIDIA GLES + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedNV"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedNV"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISOREXTPROC)((rlglLoadProc)loader)("glVertexAttribDivisorNV"); + } + + // The feature will only be marked as supported if the elements from GL_XXX_instanced_arrays are present + if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) RLGL.ExtSupported.instancing = true; + } + else if (strstr(extList[i], (const char *)"draw_instanced") != NULL) + { + // GL_ANGLE_draw_instanced doesn't exist + if (strcmp(extList[i], (const char *)"GL_EXT_draw_instanced") == 0) + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedEXT"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedEXT"); + } + else if (strcmp(extList[i], (const char *)"GL_NV_draw_instanced") == 0) + { + glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawArraysInstancedNV"); + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)((rlglLoadProc)loader)("glDrawElementsInstancedNV"); + } + + // But the functions will at least be loaded if only GL_XX_EXT_draw_instanced exist + if ((glDrawArraysInstanced != NULL) && (glDrawElementsInstanced != NULL) && (glVertexAttribDivisor != NULL)) RLGL.ExtSupported.instancing = true; + } + + // Check NPOT textures support + // NOTE: Only check on OpenGL ES, OpenGL 3.3 has NPOT textures full support as core feature + if (strcmp(extList[i], (const char *)"GL_OES_texture_npot") == 0) RLGL.ExtSupported.texNPOT = true; + + // Check texture float support + if (strcmp(extList[i], (const char *)"GL_OES_texture_float") == 0) RLGL.ExtSupported.texFloat32 = true; + if (strcmp(extList[i], (const char *)"GL_OES_texture_half_float") == 0) RLGL.ExtSupported.texFloat16 = true; + + // Check depth texture support + if (strcmp(extList[i], (const char *)"GL_OES_depth_texture") == 0) RLGL.ExtSupported.texDepth = true; + if (strcmp(extList[i], (const char *)"GL_WEBGL_depth_texture") == 0) RLGL.ExtSupported.texDepthWebGL = true; // WebGL requires unsized internal format + if (RLGL.ExtSupported.texDepthWebGL) RLGL.ExtSupported.texDepth = true; + + if (strcmp(extList[i], (const char *)"GL_OES_depth24") == 0) RLGL.ExtSupported.maxDepthBits = 24; // Not available on WebGL + if (strcmp(extList[i], (const char *)"GL_OES_depth32") == 0) RLGL.ExtSupported.maxDepthBits = 32; // Not available on WebGL + + // Check texture compression support: DXT + if ((strcmp(extList[i], (const char *)"GL_EXT_texture_compression_s3tc") == 0) || + (strcmp(extList[i], (const char *)"GL_WEBGL_compressed_texture_s3tc") == 0) || + (strcmp(extList[i], (const char *)"GL_WEBKIT_WEBGL_compressed_texture_s3tc") == 0)) RLGL.ExtSupported.texCompDXT = true; + + // Check texture compression support: ETC1 + if ((strcmp(extList[i], (const char *)"GL_OES_compressed_ETC1_RGB8_texture") == 0) || + (strcmp(extList[i], (const char *)"GL_WEBGL_compressed_texture_etc1") == 0)) RLGL.ExtSupported.texCompETC1 = true; + + // Check texture compression support: ETC2/EAC + if (strcmp(extList[i], (const char *)"GL_ARB_ES3_compatibility") == 0) RLGL.ExtSupported.texCompETC2 = true; + + // Check texture compression support: PVR + if (strcmp(extList[i], (const char *)"GL_IMG_texture_compression_pvrtc") == 0) RLGL.ExtSupported.texCompPVRT = true; + + // Check texture compression support: ASTC + if (strcmp(extList[i], (const char *)"GL_KHR_texture_compression_astc_hdr") == 0) RLGL.ExtSupported.texCompASTC = true; + + // Check anisotropic texture filter support + if (strcmp(extList[i], (const char *)"GL_EXT_texture_filter_anisotropic") == 0) RLGL.ExtSupported.texAnisoFilter = true; + + // Check clamp mirror wrap mode support + if (strcmp(extList[i], (const char *)"GL_EXT_texture_mirror_clamp") == 0) RLGL.ExtSupported.texMirrorClamp = true; + } + + // Free extensions pointers + RL_FREE(extList); + RL_FREE(extensionsDup); // Duplicated string must be deallocated +#endif // GRAPHICS_API_OPENGL_ES2 + + // Check OpenGL information and capabilities + //------------------------------------------------------------------------------ + // Show current OpenGL and GLSL version + TRACELOG(RL_LOG_INFO, "GL: OpenGL device information:"); + TRACELOG(RL_LOG_INFO, " > Vendor: %s", glGetString(GL_VENDOR)); + TRACELOG(RL_LOG_INFO, " > Renderer: %s", glGetString(GL_RENDERER)); + TRACELOG(RL_LOG_INFO, " > Version: %s", glGetString(GL_VERSION)); + TRACELOG(RL_LOG_INFO, " > GLSL: %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.loader = (rlglLoadProc)loader; + + // NOTE: Anisotropy levels capability is an extension + #ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT + #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + #endif + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &RLGL.ExtSupported.maxAnisotropyLevel); + +#if RLGL_SHOW_GL_DETAILS_INFO + // Show some OpenGL GPU capabilities + TRACELOG(RL_LOG_INFO, "GL: OpenGL capabilities:"); + GLint capability = 0; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_TEXTURE_SIZE: %i", capability); + glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_CUBE_MAP_TEXTURE_SIZE: %i", capability); + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_TEXTURE_IMAGE_UNITS: %i", capability); + glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_VERTEX_ATTRIBS: %i", capability); + #if !defined(GRAPHICS_API_OPENGL_ES2) + glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_UNIFORM_BLOCK_SIZE: %i", capability); + glGetIntegerv(GL_MAX_DRAW_BUFFERS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_DRAW_BUFFERS: %i", capability); + if (RLGL.ExtSupported.texAnisoFilter) TRACELOG(RL_LOG_INFO, " GL_MAX_TEXTURE_MAX_ANISOTROPY: %.0f", RLGL.ExtSupported.maxAnisotropyLevel); + #endif + glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &capability); + TRACELOG(RL_LOG_INFO, " GL_NUM_COMPRESSED_TEXTURE_FORMATS: %i", capability); + GLint *compFormats = (GLint *)RL_CALLOC(capability, sizeof(GLint)); + glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, compFormats); + for (int i = 0; i < capability; i++) TRACELOG(RL_LOG_INFO, " %s", rlGetCompressedFormatName(compFormats[i])); + RL_FREE(compFormats); + +#if defined(GRAPHICS_API_OPENGL_43) + glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_VERTEX_ATTRIB_BINDINGS: %i", capability); + glGetIntegerv(GL_MAX_UNIFORM_LOCATIONS, &capability); + TRACELOG(RL_LOG_INFO, " GL_MAX_UNIFORM_LOCATIONS: %i", capability); +#endif + +#else // !RLGL_SHOW_GL_DETAILS_INFO + + // Show some basic info about GL supported features + if (RLGL.ExtSupported.vao) TRACELOG(RL_LOG_INFO, "GL: VAO extension detected, VAO functions loaded successfully"); + else TRACELOG(RL_LOG_WARNING, "GL: VAO extension not found, VAO not supported"); + if (RLGL.ExtSupported.texNPOT) TRACELOG(RL_LOG_INFO, "GL: NPOT textures extension detected, full NPOT textures supported"); + else TRACELOG(RL_LOG_WARNING, "GL: NPOT textures extension not found, limited NPOT support (no-mipmaps, no-repeat)"); + if (RLGL.ExtSupported.texCompDXT) TRACELOG(RL_LOG_INFO, "GL: DXT compressed textures supported"); + if (RLGL.ExtSupported.texCompETC1) TRACELOG(RL_LOG_INFO, "GL: ETC1 compressed textures supported"); + if (RLGL.ExtSupported.texCompETC2) TRACELOG(RL_LOG_INFO, "GL: ETC2/EAC compressed textures supported"); + if (RLGL.ExtSupported.texCompPVRT) TRACELOG(RL_LOG_INFO, "GL: PVRT compressed textures supported"); + if (RLGL.ExtSupported.texCompASTC) TRACELOG(RL_LOG_INFO, "GL: ASTC compressed textures supported"); + if (RLGL.ExtSupported.computeShader) TRACELOG(RL_LOG_INFO, "GL: Compute shaders supported"); + if (RLGL.ExtSupported.ssbo) TRACELOG(RL_LOG_INFO, "GL: Shader storage buffer objects supported"); +#endif + +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 +} + +// Get OpenGL procedure address +void *rlGetProcAddress(const char *procName) +{ + void *func = NULL; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + func = RLGL.loader(procName); +#endif + return func; +} + +// Get current OpenGL version +int rlGetVersion(void) +{ + int glVersion = 0; + +#if defined(GRAPHICS_API_OPENGL_11_SOFTWARE) + glVersion = RL_OPENGL_11_SOFTWARE; +#elif defined(GRAPHICS_API_OPENGL_11) + glVersion = RL_OPENGL_11; +#endif +#if defined(GRAPHICS_API_OPENGL_21) + glVersion = RL_OPENGL_21; +#elif defined(GRAPHICS_API_OPENGL_43) + glVersion = RL_OPENGL_43; +#elif defined(GRAPHICS_API_OPENGL_33) + glVersion = RL_OPENGL_33; +#endif +#if defined(GRAPHICS_API_OPENGL_ES3) + glVersion = RL_OPENGL_ES_30; +#elif defined(GRAPHICS_API_OPENGL_ES2) + glVersion = RL_OPENGL_ES_20; +#endif + + return glVersion; +} + +// Set current framebuffer width +void rlSetFramebufferWidth(int width) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.framebufferWidth = width; +#endif +} + +// Set current framebuffer height +void rlSetFramebufferHeight(int height) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.framebufferHeight = height; +#endif +} + +// Get default framebuffer width +int rlGetFramebufferWidth(void) +{ + int width = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + width = RLGL.State.framebufferWidth; +#endif + return width; +} + +// Get default framebuffer height +int rlGetFramebufferHeight(void) +{ + int height = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + height = RLGL.State.framebufferHeight; +#endif + return height; +} + +// Get default internal texture (white texture) +// NOTE: Default texture is a 1x1 pixel UNCOMPRESSED_R8G8B8A8 +unsigned int rlGetTextureIdDefault(void) +{ + unsigned int id = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + id = RLGL.State.defaultTextureId; +#endif + return id; +} + +// Get default shader id +unsigned int rlGetShaderIdDefault(void) +{ + unsigned int id = 0; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + id = RLGL.State.defaultShaderId; +#endif + return id; +} + +// Get default shader locs +int *rlGetShaderLocsDefault(void) +{ + int *locs = NULL; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + locs = RLGL.State.defaultShaderLocs; +#endif + return locs; +} + +// Render batch management +//------------------------------------------------------------------------------------------------ +// Load render batch +rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements) +{ + rlRenderBatch batch = { 0 }; + if (!isGpuReady) { TRACELOG(RL_LOG_WARNING, "GL: GPU is not ready to load data, trying to load before InitWindow()?"); return batch; } + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Initialize CPU (RAM) vertex buffers (position, texcoord, color data and indexes) + //-------------------------------------------------------------------------------------------- + batch.vertexBuffer = (rlVertexBuffer *)RL_CALLOC(numBuffers, sizeof(rlVertexBuffer)); + + for (int i = 0; i < numBuffers; i++) + { + batch.vertexBuffer[i].elementCount = bufferElements; + + batch.vertexBuffer[i].vertices = (float *)RL_CALLOC(bufferElements*3*4, sizeof(float)); // 3 float by vertex, 4 vertex by quad + batch.vertexBuffer[i].texcoords = (float *)RL_CALLOC(bufferElements*2*4, sizeof(float)); // 2 float by texcoord, 4 texcoord by quad + batch.vertexBuffer[i].normals = (float *)RL_CALLOC(bufferElements*3*4, sizeof(float)); // 3 float by vertex, 4 vertex by quad + batch.vertexBuffer[i].colors = (unsigned char *)RL_CALLOC(bufferElements*4*4, sizeof(unsigned char)); // 4 float by color, 4 colors by quad +#if defined(GRAPHICS_API_OPENGL_33) + batch.vertexBuffer[i].indices = (unsigned int *)RL_CALLOC(bufferElements*6, sizeof(unsigned int)); // 6 int by quad (indices) +#endif +#if defined(GRAPHICS_API_OPENGL_ES2) + batch.vertexBuffer[i].indices = (unsigned short *)RL_CALLOC(bufferElements*6, sizeof(unsigned short)); // 6 int by quad (indices) +#endif + + for (int j = 0; j < (3*4*bufferElements); j++) batch.vertexBuffer[i].vertices[j] = 0.0f; + for (int j = 0; j < (2*4*bufferElements); j++) batch.vertexBuffer[i].texcoords[j] = 0.0f; + for (int j = 0; j < (3*4*bufferElements); j++) batch.vertexBuffer[i].normals[j] = 0.0f; + for (int j = 0; j < (4*4*bufferElements); j++) batch.vertexBuffer[i].colors[j] = 0; + + int k = 0; + + // Indices can be initialized right now + for (int j = 0; j < (6*bufferElements); j += 6) + { + batch.vertexBuffer[i].indices[j] = 4*k; + batch.vertexBuffer[i].indices[j + 1] = 4*k + 1; + batch.vertexBuffer[i].indices[j + 2] = 4*k + 2; + batch.vertexBuffer[i].indices[j + 3] = 4*k; + batch.vertexBuffer[i].indices[j + 4] = 4*k + 2; + batch.vertexBuffer[i].indices[j + 5] = 4*k + 3; + + k++; + } + + RLGL.State.vertexCounter = 0; + } + + TRACELOG(RL_LOG_INFO, "RLGL: Render batch vertex buffers loaded successfully in RAM (CPU)"); + //-------------------------------------------------------------------------------------------- + + // Upload to GPU (VRAM) vertex data and initialize VAOs/VBOs + //-------------------------------------------------------------------------------------------- + for (int i = 0; i < numBuffers; i++) + { + if (RLGL.ExtSupported.vao) + { + // Initialize Quads VAO + glGenVertexArrays(1, &batch.vertexBuffer[i].vaoId); + glBindVertexArray(batch.vertexBuffer[i].vaoId); + } + + // Quads - Vertex buffers binding and attributes enable + // Vertex position buffer (shader-location = 0) + glGenBuffers(1, &batch.vertexBuffer[i].vboId[0]); + glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[0]); + glBufferData(GL_ARRAY_BUFFER, bufferElements*3*4*sizeof(float), batch.vertexBuffer[i].vertices, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); + + // Vertex texcoord buffer (shader-location = 1) + glGenBuffers(1, &batch.vertexBuffer[i].vboId[1]); + glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[1]); + glBufferData(GL_ARRAY_BUFFER, bufferElements*2*4*sizeof(float), batch.vertexBuffer[i].texcoords, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); + + // Vertex normal buffer (shader-location = 2) + glGenBuffers(1, &batch.vertexBuffer[i].vboId[2]); + glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[2]); + glBufferData(GL_ARRAY_BUFFER, bufferElements*3*4*sizeof(float), batch.vertexBuffer[i].normals, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL], 3, GL_FLOAT, 0, 0, 0); + + // Vertex color buffer (shader-location = 3) + glGenBuffers(1, &batch.vertexBuffer[i].vboId[3]); + glBindBuffer(GL_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[3]); + glBufferData(GL_ARRAY_BUFFER, bufferElements*4*4*sizeof(unsigned char), batch.vertexBuffer[i].colors, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); + + // Fill index buffer + glGenBuffers(1, &batch.vertexBuffer[i].vboId[4]); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch.vertexBuffer[i].vboId[4]); +#if defined(GRAPHICS_API_OPENGL_33) + glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferElements*6*sizeof(int), batch.vertexBuffer[i].indices, GL_STATIC_DRAW); +#endif +#if defined(GRAPHICS_API_OPENGL_ES2) + glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferElements*6*sizeof(short), batch.vertexBuffer[i].indices, GL_STATIC_DRAW); +#endif + } + + TRACELOG(RL_LOG_INFO, "RLGL: Render batch vertex buffers loaded successfully in VRAM (GPU)"); + + // Unbind the current VAO + if (RLGL.ExtSupported.vao) glBindVertexArray(0); + //-------------------------------------------------------------------------------------------- + + // Init draw calls tracking system + //-------------------------------------------------------------------------------------------- + batch.draws = (rlDrawCall *)RL_CALLOC(RL_DEFAULT_BATCH_DRAWCALLS, sizeof(rlDrawCall)); + + for (int i = 0; i < RL_DEFAULT_BATCH_DRAWCALLS; i++) + { + batch.draws[i].mode = RL_QUADS; + batch.draws[i].vertexCount = 0; + batch.draws[i].vertexAlignment = 0; + //batch.draws[i].vaoId = 0; + //batch.draws[i].shaderId = 0; + batch.draws[i].textureId = RLGL.State.defaultTextureId; + //batch.draws[i].RLGL.State.projection = rlMatrixIdentity(); + //batch.draws[i].RLGL.State.modelview = rlMatrixIdentity(); + } + + batch.bufferCount = numBuffers; // Record buffer count + batch.drawCounter = 1; // Reset draws counter + batch.currentDepth = -1.0f; // Reset depth value + //-------------------------------------------------------------------------------------------- +#endif + + return batch; +} + +// Unload default internal buffers vertex data from CPU and GPU +void rlUnloadRenderBatch(rlRenderBatch batch) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Unbind everything + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + // Unload all vertex buffers data + for (int i = 0; i < batch.bufferCount; i++) + { + // Unbind VAO attribs data + if (RLGL.ExtSupported.vao) + { + glBindVertexArray(batch.vertexBuffer[i].vaoId); + glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION); + glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD); + glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL); + glDisableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR); + glBindVertexArray(0); + } + + // Delete VBOs from GPU (VRAM) + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[0]); + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[1]); + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[2]); + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[3]); + glDeleteBuffers(1, &batch.vertexBuffer[i].vboId[4]); + + // Delete VAOs from GPU (VRAM) + if (RLGL.ExtSupported.vao) glDeleteVertexArrays(1, &batch.vertexBuffer[i].vaoId); + + // Free vertex arrays memory from CPU (RAM) + RL_FREE(batch.vertexBuffer[i].vertices); + RL_FREE(batch.vertexBuffer[i].texcoords); + RL_FREE(batch.vertexBuffer[i].normals); + RL_FREE(batch.vertexBuffer[i].colors); + RL_FREE(batch.vertexBuffer[i].indices); + } + + // Unload arrays + RL_FREE(batch.vertexBuffer); + RL_FREE(batch.draws); +#endif +} + +// Draw render batch +// NOTE: Batch is reseted and current buffer is updated (for multi-buffer config) +void rlDrawRenderBatch(rlRenderBatch *batch) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Update batch vertex buffers + //------------------------------------------------------------------------------------------------------------ + // NOTE: If there is not vertex data, buffers doesn't need to be updated (vertexCount > 0) + if (RLGL.State.vertexCounter > 0) + { + // Activate elements VAO + if (RLGL.ExtSupported.vao) glBindVertexArray(batch->vertexBuffer[batch->currentBuffer].vaoId); + + // TODO: If no data changed on the CPU arrays there is no need to re-upload data to GPU, + // a flag can be used to detect changes but it would imply keeping a copy buffer and memcmp() both, does it worth it? + + // Vertex positions buffer + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[0]); + glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*3*sizeof(float), batch->vertexBuffer[batch->currentBuffer].vertices); + //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].vertices, GL_DYNAMIC_DRAW); // Update all buffer + + // Texture coordinates buffer + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[1]); + glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*2*sizeof(float), batch->vertexBuffer[batch->currentBuffer].texcoords); + //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].texcoords, GL_DYNAMIC_DRAW); // Update all buffer + + // Normals buffer + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[2]); + glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*3*sizeof(float), batch->vertexBuffer[batch->currentBuffer].normals); + //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].normals, GL_DYNAMIC_DRAW); // Update all buffer + + // Colors buffer + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[3]); + glBufferSubData(GL_ARRAY_BUFFER, 0, RLGL.State.vertexCounter*4*sizeof(unsigned char), batch->vertexBuffer[batch->currentBuffer].colors); + //glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].colors, GL_DYNAMIC_DRAW); // Update all buffer + + // NOTE: glMapBuffer() causes sync issue + // If GPU is working with this buffer, glMapBuffer() will wait(stall) until GPU to finish its job + // To avoid waiting (idle), glBufferData() can bee called first with NULL pointer before glMapBuffer() + // Doing that, the previous data in PBO will be discarded and glMapBuffer() returns a new + // allocated pointer immediately even if GPU is still working with the previous data + + // Another option: map the buffer object into client's memory + //batch->vertexBuffer[batch->currentBuffer].vertices = (float *)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE); + //if (batch->vertexBuffer[batch->currentBuffer].vertices) + //{ + // Update vertex data + //} + //glUnmapBuffer(GL_ARRAY_BUFFER); + + // Unbind the current VAO + if (RLGL.ExtSupported.vao) glBindVertexArray(0); + } + //------------------------------------------------------------------------------------------------------------ + + // Draw batch vertex buffers (considering VR stereo if required) + //------------------------------------------------------------------------------------------------------------ + Matrix matProjection = RLGL.State.projection; + Matrix matModelView = RLGL.State.modelview; + + int eyeCount = 1; + if (RLGL.State.stereoRender) eyeCount = 2; + + for (int eye = 0; eye < eyeCount; eye++) + { + if (eyeCount == 2) + { + // Setup current eye viewport (half screen width) + rlViewport(eye*RLGL.State.framebufferWidth/2, 0, RLGL.State.framebufferWidth/2, RLGL.State.framebufferHeight); + + // Set current eye view offset to modelview matrix + rlSetMatrixModelview(rlMatrixMultiply(matModelView, RLGL.State.viewOffsetStereo[eye])); + // Set current eye projection matrix + rlSetMatrixProjection(RLGL.State.projectionStereo[eye]); + } + + // Draw buffers + if (RLGL.State.vertexCounter > 0) + { + // Set current shader and upload current MVP matrix + glUseProgram(RLGL.State.currentShaderId); + + // Create modelview-projection matrix and upload to shader + Matrix matMVP = rlMatrixMultiply(RLGL.State.modelview, RLGL.State.projection); + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MVP], 1, false, rlMatrixToFloat(matMVP)); + + if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_PROJECTION] != -1) + { + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_PROJECTION], 1, false, rlMatrixToFloat(RLGL.State.projection)); + } + + // WARNING: For the following setup of the view, model, and normal matrices, it is expected that + // transformations and rendering occur between rlPushMatrix() and rlPopMatrix() + + if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_VIEW] != -1) + { + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_VIEW], 1, false, rlMatrixToFloat(RLGL.State.modelview)); + } + + if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MODEL] != -1) + { + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_MODEL], 1, false, rlMatrixToFloat(RLGL.State.transform)); + } + + if (RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_NORMAL] != -1) + { + glUniformMatrix4fv(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MATRIX_NORMAL], 1, false, rlMatrixToFloat(rlMatrixTranspose(rlMatrixInvert(RLGL.State.transform)))); + } + + if (RLGL.ExtSupported.vao) glBindVertexArray(batch->vertexBuffer[batch->currentBuffer].vaoId); + else + { + // Bind vertex attrib: position (shader-location = 0) + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[0]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_POSITION]); + + // Bind vertex attrib: texcoord (shader-location = 1) + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[1]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01]); + + // Bind vertex attrib: normal (shader-location = 2) + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[2]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL], 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_NORMAL]); + + // Bind vertex attrib: color (shader-location = 3) + glBindBuffer(GL_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[3]); + glVertexAttribPointer(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); + glEnableVertexAttribArray(RLGL.State.currentShaderLocs[RL_SHADER_LOC_VERTEX_COLOR]); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, batch->vertexBuffer[batch->currentBuffer].vboId[4]); + } + + // Setup some default shader values + glUniform4f(RLGL.State.currentShaderLocs[RL_SHADER_LOC_COLOR_DIFFUSE], 1.0f, 1.0f, 1.0f, 1.0f); + glUniform1i(RLGL.State.currentShaderLocs[RL_SHADER_LOC_MAP_DIFFUSE], 0); // Active default sampler2D: texture0 + + // Activate additional sampler textures + // Those additional textures will be common for all draw calls of the batch + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) + { + if (RLGL.State.activeTextureId[i] > 0) + { + glActiveTexture(GL_TEXTURE0 + 1 + i); + glBindTexture(GL_TEXTURE_2D, RLGL.State.activeTextureId[i]); + } + } + + // Activate default sampler2D texture0 (one texture is always active for default batch shader) + // NOTE: Batch system accumulates calls by texture0 changes, additional textures are enabled for all the draw calls + glActiveTexture(GL_TEXTURE0); + + for (int i = 0, vertexOffset = 0; i < batch->drawCounter; i++) + { + // Bind current draw call texture, activated as GL_TEXTURE0 and bound to sampler2D texture0 by default + glBindTexture(GL_TEXTURE_2D, batch->draws[i].textureId); + + if ((batch->draws[i].mode == RL_LINES) || (batch->draws[i].mode == RL_TRIANGLES)) glDrawArrays(batch->draws[i].mode, vertexOffset, batch->draws[i].vertexCount); + else + { + #if defined(GRAPHICS_API_OPENGL_33) + // The number of indices to be processed needs to be defined: elementCount*6 + // NOTE: The final parameter tells the GPU the offset in bytes from the + // start of the index buffer to the location of the first index to process + glDrawElements(GL_TRIANGLES, batch->draws[i].vertexCount/4*6, GL_UNSIGNED_INT, (GLvoid *)(vertexOffset/4*6*sizeof(GLuint))); + #endif + #if defined(GRAPHICS_API_OPENGL_ES2) + glDrawElements(GL_TRIANGLES, batch->draws[i].vertexCount/4*6, GL_UNSIGNED_SHORT, (GLvoid *)(vertexOffset/4*6*sizeof(GLushort))); + #endif + } + + vertexOffset += (batch->draws[i].vertexCount + batch->draws[i].vertexAlignment); + } + + if (!RLGL.ExtSupported.vao) + { + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + } + + glBindTexture(GL_TEXTURE_2D, 0); // Unbind textures + } + + if (RLGL.ExtSupported.vao) glBindVertexArray(0); // Unbind VAO + + glUseProgram(0); // Unbind shader program + } + + // Restore viewport to default measures + if (eyeCount == 2) rlViewport(0, 0, RLGL.State.framebufferWidth, RLGL.State.framebufferHeight); + //------------------------------------------------------------------------------------------------------------ + + // Reset batch buffers + //------------------------------------------------------------------------------------------------------------ + // Reset vertex counter for next frame + RLGL.State.vertexCounter = 0; + + // Reset depth for next draw + batch->currentDepth = -1.0f; + + // Restore projection/modelview matrices + RLGL.State.projection = matProjection; + RLGL.State.modelview = matModelView; + + // Reset RLGL.currentBatch->draws array + for (int i = 0; i < RL_DEFAULT_BATCH_DRAWCALLS; i++) + { + batch->draws[i].mode = RL_QUADS; + batch->draws[i].vertexCount = 0; + batch->draws[i].textureId = RLGL.State.defaultTextureId; + } + + // Reset active texture units for next batch + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) RLGL.State.activeTextureId[i] = 0; + + // Reset draws counter to one draw for the batch + batch->drawCounter = 1; + //------------------------------------------------------------------------------------------------------------ + + // Change to next buffer in the list (in case of multi-buffering) + batch->currentBuffer++; + if (batch->currentBuffer >= batch->bufferCount) batch->currentBuffer = 0; +#endif +} + +// Set the active render batch for rlgl +void rlSetRenderBatchActive(rlRenderBatch *batch) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + rlDrawRenderBatch(RLGL.currentBatch); + + if (batch != NULL) RLGL.currentBatch = batch; + else RLGL.currentBatch = &RLGL.defaultBatch; +#endif +} + +// Update and draw internal render batch +void rlDrawRenderBatchActive(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + rlDrawRenderBatch(RLGL.currentBatch); // NOTE: Stereo rendering is checked inside +#endif +} + +// Check internal buffer overflow for a given number of vertex +// and force a rlRenderBatch draw call if required +bool rlCheckRenderBatchLimit(int vCount) +{ + bool overflow = false; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((RLGL.State.vertexCounter + vCount) >= + (RLGL.currentBatch->vertexBuffer[RLGL.currentBatch->currentBuffer].elementCount*4)) + { + overflow = true; + + // Store current primitive drawing mode and texture id + int currentMode = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode; + int currentTexture = RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId; + + rlDrawRenderBatch(RLGL.currentBatch); // NOTE: Stereo rendering is checked inside + + // Restore state of last batch so new vertices can be added + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].mode = currentMode; + RLGL.currentBatch->draws[RLGL.currentBatch->drawCounter - 1].textureId = currentTexture; + } +#endif + + return overflow; +} + +// Textures data management +//----------------------------------------------------------------------------------------- +// Convert image data to OpenGL texture (returns OpenGL valid Id) +unsigned int rlLoadTexture(const void *data, int width, int height, int format, int mipmapCount) +{ + unsigned int id = 0; + if (!isGpuReady) { TRACELOG(RL_LOG_WARNING, "GL: GPU is not ready to load data, trying to load before InitWindow()?"); return id; } + + glBindTexture(GL_TEXTURE_2D, 0); // Free any old binding + + // Check texture format support by OpenGL 1.1 (compressed textures not supported) +#if defined(GRAPHICS_API_OPENGL_11) + if (format >= RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) + { + TRACELOG(RL_LOG_WARNING, "GL: OpenGL 1.1 does not support GPU compressed texture formats"); + return id; + } +#else + if ((!RLGL.ExtSupported.texCompDXT) && ((format == RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA) || + (format == RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA) || (format == RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA))) + { + TRACELOG(RL_LOG_WARNING, "GL: DXT compressed texture format not supported"); + return id; + } +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if ((!RLGL.ExtSupported.texCompETC1) && (format == RL_PIXELFORMAT_COMPRESSED_ETC1_RGB)) + { + TRACELOG(RL_LOG_WARNING, "GL: ETC1 compressed texture format not supported"); + return id; + } + + if ((!RLGL.ExtSupported.texCompETC2) && ((format == RL_PIXELFORMAT_COMPRESSED_ETC2_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA))) + { + TRACELOG(RL_LOG_WARNING, "GL: ETC2 compressed texture format not supported"); + return id; + } + + if ((!RLGL.ExtSupported.texCompPVRT) && ((format == RL_PIXELFORMAT_COMPRESSED_PVRT_RGB) || (format == RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA))) + { + TRACELOG(RL_LOG_WARNING, "GL: PVRT compressed texture format not supported"); + return id; + } + + if ((!RLGL.ExtSupported.texCompASTC) && ((format == RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA) || (format == RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA))) + { + TRACELOG(RL_LOG_WARNING, "GL: ASTC compressed texture format not supported"); + return id; + } +#endif +#endif // GRAPHICS_API_OPENGL_11 + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glGenTextures(1, &id); // Generate texture id + + glBindTexture(GL_TEXTURE_2D, id); + + int mipWidth = width; + int mipHeight = height; + int mipOffset = 0; // Mipmap data offset, only used for tracelog + (void)mipOffset; // Used to avoid gcc warnings about unused variable + + // NOTE: Added pointer math separately from function to avoid UBSAN complaining + unsigned char *dataPtr = NULL; + if (data != NULL) dataPtr = (unsigned char *)data; + + // Load the different mipmap levels + for (int i = 0; i < mipmapCount; i++) + { + unsigned int mipSize = rlGetPixelDataSize(mipWidth, mipHeight, format); + + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + + TRACELOG(RL_LOG_DEBUG, "TEXTURE: Load mipmap level %i (%i x %i), size: %i, offset: %i", i, mipWidth, mipHeight, mipSize, mipOffset); + + if (glInternalFormat != 0) + { + if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) glTexImage2D(GL_TEXTURE_2D, i, glInternalFormat, mipWidth, mipHeight, 0, glFormat, glType, dataPtr); +#if !defined(GRAPHICS_API_OPENGL_11) + else glCompressedTexImage2D(GL_TEXTURE_2D, i, glInternalFormat, mipWidth, mipHeight, 0, mipSize, dataPtr); +#endif + +#if defined(GRAPHICS_API_OPENGL_33) + if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE) + { + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } + else if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA) + { +#if defined(GRAPHICS_API_OPENGL_21) + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA }; +#elif defined(GRAPHICS_API_OPENGL_33) + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; +#endif + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } +#endif + } + + mipWidth /= 2; + mipHeight /= 2; + mipOffset += mipSize; // Increment offset position to next mipmap + if (data != NULL) dataPtr += mipSize; // Increment data pointer to next mipmap + + // Security check for NPOT textures + if (mipWidth < 1) mipWidth = 1; + if (mipHeight < 1) mipHeight = 1; + } + + // Texture parameters configuration + // NOTE: glTexParameteri does NOT affect texture uploading, just the way it's used +#if defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: OpenGL ES 2.0 with no GL_OES_texture_npot support (i.e. WebGL) has limited NPOT support, so CLAMP_TO_EDGE must be used + if (RLGL.ExtSupported.texNPOT) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // Set texture to repeat on x-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Set texture to repeat on y-axis + } + else + { + // NOTE: If using negative texture coordinates (LoadOBJ()), it does not work! + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // Set texture to clamp on x-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // Set texture to clamp on y-axis + } +#else + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // Set texture to repeat on x-axis + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Set texture to repeat on y-axis +#endif + + // Magnification and minification filters + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // Alternative: GL_LINEAR + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // Alternative: GL_LINEAR + +#if defined(GRAPHICS_API_OPENGL_33) + if (mipmapCount > 1) + { + // Activate trilinear filtering if mipmaps are available + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + + // Define the maximum number of mipmap levels to be used, 0 is base texture size + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, mipmapCount - 1); + + // Check if the loaded texture with mipmaps is complete, + // uncomplete textures will draw in black if mipmap filtering is required + //GLint complete = 0; + //glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_IMMUTABLE_FORMAT, &complete); + } +#endif + + // At this point texture is loaded in GPU and texture parameters configured + + // NOTE: If mipmaps were not in data, they are not generated automatically + + // Unbind current texture + glBindTexture(GL_TEXTURE_2D, 0); + + if (id > 0) TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Texture loaded successfully (%ix%i | %s | %i mipmaps)", id, width, height, rlGetPixelFormatName(format), mipmapCount); + else TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load texture"); + + return id; +} + +// Load depth texture/renderbuffer (to be attached to fbo) +// WARNING: OpenGL ES 2.0 requires GL_OES_depth_texture and WebGL requires WEBGL_depth_texture extensions +unsigned int rlLoadTextureDepth(int width, int height, bool useRenderBuffer) +{ + unsigned int id = 0; + if (!isGpuReady) { TRACELOG(RL_LOG_WARNING, "GL: GPU is not ready to load data, trying to load before InitWindow()?"); return id; } + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // In case depth textures were not supported, force renderbuffer usage + if (!RLGL.ExtSupported.texDepth) useRenderBuffer = true; + + // NOTE: Letting the implementation to choose the best bit-depth + // Possible formats: GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32 and GL_DEPTH_COMPONENT32F + unsigned int glInternalFormat = GL_DEPTH_COMPONENT; + +#if defined(GRAPHICS_API_OPENGL_ES2) + // WARNING: WebGL platform requires unsized internal format definition (GL_DEPTH_COMPONENT) + // while other platforms using OpenGL ES 2.0 require/support sized internal formats depending on the GPU capabilities + if (!RLGL.ExtSupported.texDepthWebGL || useRenderBuffer) + { + if (RLGL.ExtSupported.maxDepthBits == 32) glInternalFormat = GL_DEPTH_COMPONENT32_OES; + else if (RLGL.ExtSupported.maxDepthBits == 24) glInternalFormat = GL_DEPTH_COMPONENT24_OES; + else glInternalFormat = GL_DEPTH_COMPONENT16; + } +#endif +#if defined(GRAPHICS_API_OPENGL_ES3) + // NOTE: This sized internal format should also work for WebGL 2.0 + // WARNING: Specification only allows GL_DEPTH_COMPONENT32F for GL_FLOAT type + // REF: https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml + if (RLGL.ExtSupported.maxDepthBits == 24) glInternalFormat = GL_DEPTH_COMPONENT24; + else glInternalFormat = GL_DEPTH_COMPONENT16; +#endif + + if (!useRenderBuffer && RLGL.ExtSupported.texDepth) + { + glGenTextures(1, &id); + glBindTexture(GL_TEXTURE_2D, id); + glTexImage2D(GL_TEXTURE_2D, 0, glInternalFormat, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glBindTexture(GL_TEXTURE_2D, 0); + + TRACELOG(RL_LOG_INFO, "TEXTURE: Depth texture loaded successfully"); + } + else + { + // Create the renderbuffer that will serve as the depth attachment for the framebuffer + // NOTE: A renderbuffer is simpler than a texture and could offer better performance on embedded devices + glGenRenderbuffers(1, &id); + glBindRenderbuffer(GL_RENDERBUFFER, id); + glRenderbufferStorage(GL_RENDERBUFFER, glInternalFormat, width, height); + + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Depth renderbuffer loaded successfully (%i bits)", id, (RLGL.ExtSupported.maxDepthBits >= 24)? RLGL.ExtSupported.maxDepthBits : 16); + } +#endif + + return id; +} + +// Load texture cubemap +// NOTE: Cubemap data is expected to be 6 images in a single data array (one after the other), +// expected the following convention: +X, -X, +Y, -Y, +Z, -Z +unsigned int rlLoadTextureCubemap(const void *data, int size, int format, int mipmapCount) +{ + unsigned int id = 0; + if (!isGpuReady) { TRACELOG(RL_LOG_WARNING, "GL: GPU is not ready to load data, trying to load before InitWindow()?"); return id; } + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + int mipSize = size; + + // NOTE: Added pointer math separately from function to avoid UBSAN complaining + unsigned char *dataPtr = NULL; + if (data != NULL) dataPtr = (unsigned char *)data; + + unsigned int dataSize = rlGetPixelDataSize(size, size, format); + + glGenTextures(1, &id); + glBindTexture(GL_TEXTURE_CUBE_MAP, id); + + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + + if (glInternalFormat != 0) + { + // Load cubemap faces/mipmaps + for (int i = 0; i < 6*mipmapCount; i++) + { + int mipmapLevel = i/6; + int face = i%6; + + if (data == NULL) + { + if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) + { + if ((format == RL_PIXELFORMAT_UNCOMPRESSED_R32) || + (format == RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32) || + (format == RL_PIXELFORMAT_UNCOMPRESSED_R16) || + (format == RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16)) TRACELOG(RL_LOG_WARNING, "TEXTURES: Cubemap requested format not supported"); + else glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, mipmapLevel, glInternalFormat, mipSize, mipSize, 0, glFormat, glType, NULL); + } + else TRACELOG(RL_LOG_WARNING, "TEXTURES: Empty cubemap creation does not support compressed format"); + } + else + { + if (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB) glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, mipmapLevel, glInternalFormat, mipSize, mipSize, 0, glFormat, glType, (unsigned char *)dataPtr + face*dataSize); + else glCompressedTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, mipmapLevel, glInternalFormat, mipSize, mipSize, 0, dataSize, (unsigned char *)dataPtr + face*dataSize); + } + +#if defined(GRAPHICS_API_OPENGL_33) + if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE) + { + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; + glTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } + else if (format == RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA) + { +#if defined(GRAPHICS_API_OPENGL_21) + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_ALPHA }; +#elif defined(GRAPHICS_API_OPENGL_33) + GLint swizzleMask[] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; +#endif + glTexParameteriv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); + } +#endif + if (face == 5) + { + mipSize /= 2; + if (data != NULL) dataPtr += dataSize*6; // Increment data pointer to next mipmap + + // Security check for NPOT textures + if (mipSize < 1) mipSize = 1; + + dataSize = rlGetPixelDataSize(mipSize, mipSize, format); + } + } + } + + // Set cubemap texture sampling parameters + if (mipmapCount > 1) glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + else glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +#if defined(GRAPHICS_API_OPENGL_33) + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); // Flag not supported on OpenGL ES 2.0 +#endif + + glBindTexture(GL_TEXTURE_CUBE_MAP, 0); +#endif + + if (id > 0) TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Cubemap texture loaded successfully (%ix%i)", id, size, size); + else TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load cubemap texture"); + + return id; +} + +// Update already loaded texture in GPU with new data +// WARNING: Not possible to know safely if internal texture format is the expected one... +void rlUpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int height, int format, const void *data) +{ + glBindTexture(GL_TEXTURE_2D, id); + + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + + if ((glInternalFormat != 0) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)) + { + glTexSubImage2D(GL_TEXTURE_2D, 0, offsetX, offsetY, width, height, glFormat, glType, data); + } + else TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Failed to update for current texture format (%i)", id, format); +} + +// Get OpenGL internal formats and data type from raylib PixelFormat +void rlGetGlTextureFormats(int format, unsigned int *glInternalFormat, unsigned int *glFormat, unsigned int *glType) +{ + *glInternalFormat = 0; + *glFormat = 0; + *glType = 0; + + switch (format) + { + #if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_21) || defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: on OpenGL ES 2.0 (WebGL), internalFormat must match format and options allowed are: GL_LUMINANCE, GL_RGB, GL_RGBA + case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: *glInternalFormat = GL_LUMINANCE_ALPHA; *glFormat = GL_LUMINANCE_ALPHA; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_UNSIGNED_SHORT_5_6_5; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_5_5_5_1; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_4_4_4_4; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_BYTE; break; + #if !defined(GRAPHICS_API_OPENGL_11) + #if defined(GRAPHICS_API_OPENGL_ES3) + case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_R32F_EXT; *glFormat = GL_RED_EXT; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F_EXT; *glFormat = GL_RGB; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F_EXT; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_R16F_EXT; *glFormat = GL_RED_EXT; *glType = GL_HALF_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F_EXT; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F_EXT; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT; break; + #else + case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; // NOTE: Requires extension OES_texture_float + #if defined(GRAPHICS_API_OPENGL_21) + case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_ARB; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_ARB; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT_ARB; break; + #else // defined(GRAPHICS_API_OPENGL_ES2) + case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_LUMINANCE; *glFormat = GL_LUMINANCE; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT_OES; break; // NOTE: Requires extension OES_texture_half_float + #endif + #endif + #endif + #elif defined(GRAPHICS_API_OPENGL_33) + case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: *glInternalFormat = GL_R8; *glFormat = GL_RED; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: *glInternalFormat = GL_RG8; *glFormat = GL_RG; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: *glInternalFormat = GL_RGB565; *glFormat = GL_RGB; *glType = GL_UNSIGNED_SHORT_5_6_5; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: *glInternalFormat = GL_RGB8; *glFormat = GL_RGB; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: *glInternalFormat = GL_RGB5_A1; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_5_5_5_1; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: *glInternalFormat = GL_RGBA4; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_SHORT_4_4_4_4; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: *glInternalFormat = GL_RGBA8; *glFormat = GL_RGBA; *glType = GL_UNSIGNED_BYTE; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_R32F; *glFormat = GL_RED; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGB32F; *glFormat = GL_RGB; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: if (RLGL.ExtSupported.texFloat32) *glInternalFormat = GL_RGBA32F; *glFormat = GL_RGBA; *glType = GL_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_R16F; *glFormat = GL_RED; *glType = GL_HALF_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGB16F; *glFormat = GL_RGB; *glType = GL_HALF_FLOAT; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: if (RLGL.ExtSupported.texFloat16) *glInternalFormat = GL_RGBA16F; *glFormat = GL_RGBA; *glType = GL_HALF_FLOAT; break; + #endif + #if !defined(GRAPHICS_API_OPENGL_11) + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break; + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break; + case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break; + case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA: if (RLGL.ExtSupported.texCompDXT) *glInternalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break; + case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB: if (RLGL.ExtSupported.texCompETC1) *glInternalFormat = GL_ETC1_RGB8_OES; break; // NOTE: Requires OpenGL ES 2.0 or OpenGL 4.3 + case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB: if (RLGL.ExtSupported.texCompETC2) *glInternalFormat = GL_COMPRESSED_RGB8_ETC2; break; // NOTE: Requires OpenGL ES 3.0 or OpenGL 4.3 + case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: if (RLGL.ExtSupported.texCompETC2) *glInternalFormat = GL_COMPRESSED_RGBA8_ETC2_EAC; break; // NOTE: Requires OpenGL ES 3.0 or OpenGL 4.3 + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB: if (RLGL.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG; break; // NOTE: Requires PowerVR GPU + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: if (RLGL.ExtSupported.texCompPVRT) *glInternalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; break; // NOTE: Requires PowerVR GPU + case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: if (RLGL.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3 + case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: if (RLGL.ExtSupported.texCompASTC) *glInternalFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR; break; // NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3 + #endif + default: TRACELOG(RL_LOG_WARNING, "TEXTURE: Current format not supported (%i)", format); break; + } +} + +// Unload texture from GPU memory +void rlUnloadTexture(unsigned int id) +{ + glDeleteTextures(1, &id); +} + +// Generate mipmap data for selected texture +// NOTE: Only supports GPU mipmap generation +void rlGenTextureMipmaps(unsigned int id, int width, int height, int format, int *mipmaps) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindTexture(GL_TEXTURE_2D, id); + + // Check if texture is power-of-two (POT) + bool texIsPOT = false; + + if (((width > 0) && ((width & (width - 1)) == 0)) && + ((height > 0) && ((height & (height - 1)) == 0))) texIsPOT = true; + + if ((texIsPOT) || (RLGL.ExtSupported.texNPOT)) + { + //glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE); // Hint for mipmaps generation algorithm: GL_FASTEST, GL_NICEST, GL_DONT_CARE + glGenerateMipmap(GL_TEXTURE_2D); // Generate mipmaps automatically + + #define MIN(a,b) (((a)<(b))? (a):(b)) + #define MAX(a,b) (((a)>(b))? (a):(b)) + + *mipmaps = 1 + (int)floor(log(MAX(width, height))/log(2)); + TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Mipmaps generated automatically, total: %i", id, *mipmaps); + } + else TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Failed to generate mipmaps", id); + + glBindTexture(GL_TEXTURE_2D, 0); +#else + TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] GPU mipmap generation not supported", id); +#endif +} + +// Read texture pixel data +void *rlReadTexturePixels(unsigned int id, int width, int height, int format) +{ + void *pixels = NULL; + +#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + glBindTexture(GL_TEXTURE_2D, id); + + // NOTE: Using texture id, some texture info can be retrieved (but not on OpenGL ES 2.0) + // Possible texture info: GL_TEXTURE_RED_SIZE, GL_TEXTURE_GREEN_SIZE, GL_TEXTURE_BLUE_SIZE, GL_TEXTURE_ALPHA_SIZE + //int width, height, format; + //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width); + //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height); + //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &format); + + // NOTE: Each row written to or read from by OpenGL pixel operations like glGetTexImage are aligned to a 4 byte boundary by default, which may add some padding + // Use glPixelStorei to modify padding with the GL_[UN]PACK_ALIGNMENT setting + // GL_PACK_ALIGNMENT affects operations that read from OpenGL memory (glReadPixels, glGetTexImage, etc.) + // GL_UNPACK_ALIGNMENT affects operations that write to OpenGL memory (glTexImage, etc.) + glPixelStorei(GL_PACK_ALIGNMENT, 1); + + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + unsigned int size = rlGetPixelDataSize(width, height, format); + + if ((glInternalFormat != 0) && (format < RL_PIXELFORMAT_COMPRESSED_DXT1_RGB)) + { + pixels = RL_CALLOC(size, 1); + glGetTexImage(GL_TEXTURE_2D, 0, glFormat, glType, pixels); + } + else TRACELOG(RL_LOG_WARNING, "TEXTURE: [ID %i] Data retrieval not suported for pixel format (%i)", id, format); + + glBindTexture(GL_TEXTURE_2D, 0); +#endif + +#if defined(GRAPHICS_API_OPENGL_ES2) + // glGetTexImage() is not available on OpenGL ES 2.0 + // Texture width and height are required on OpenGL ES 2.0, there is no way to get it from texture id + // Two possible Options: + // 1 - Bind texture to color fbo attachment and glReadPixels() + // 2 - Create an fbo, activate it, render quad with texture, glReadPixels() + // Using Option 1, just need to care for texture format on retrieval + // NOTE: This behaviour could be conditioned by graphic driver... + unsigned int fboId = rlLoadFramebuffer(); + + glBindFramebuffer(GL_FRAMEBUFFER, fboId); + glBindTexture(GL_TEXTURE_2D, 0); + + // Attach our texture to FBO + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, id, 0); + + // Reading data as RGBA because FBO texture is configured as RGBA, despite binding another texture format + pixels = RL_CALLOC(rlGetPixelDataSize(width, height, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8), 1); + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + // Clean up temporal fbo + rlUnloadFramebuffer(fboId); +#endif + + return pixels; +} + +// Copy framebuffer pixel data to internal buffer +void rlCopyFramebuffer(int x, int y, int width, int height, int format, void *pixels) +{ +#if defined(GRAPHICS_API_OPENGL_11_SOFTWARE) + unsigned int glInternalFormat, glFormat, glType; + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); // Get OpenGL texture format + swCopyFramebuffer(x, y, width, height, glFormat, glType, pixels); +#endif +} + +// Resize internal framebuffer +void rlResizeFramebuffer(int width, int height) +{ +#if defined(GRAPHICS_API_OPENGL_11_SOFTWARE) + swResizeFramebuffer(width, height); +#endif +} + +// Read screen pixel data (color buffer) +unsigned char *rlReadScreenPixels(int width, int height) +{ + unsigned char *imgData = (unsigned char *)RL_CALLOC(width*height*4, sizeof(unsigned char)); + + // NOTE: glReadPixels() returns image flipped vertically -> (0,0) is the bottom left corner of the framebuffer + // WARNING: Getting alpha channel! Be careful, it can be transparent if not cleared properly! + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, imgData); + + // Flip image vertically + // NOTE: Alpha value has already been applied to RGB in framebuffer, not needed anymore + for (int y = height - 1; y >= height/2; y--) + { + for (int x = 0; x < (width*4); x += 4) + { + unsigned int s = ((height - 1) - y)*width*4 + x; + unsigned int e = y*width*4 + x; + + unsigned char r = imgData[s]; + unsigned char g = imgData[s+1]; + unsigned char b = imgData[s+2]; + + imgData[s] = imgData[e]; + imgData[s+1] = imgData[e+1]; + imgData[s+2] = imgData[e+2]; + imgData[s+3] = 255; // Set alpha component value to 255 (no trasparent image retrieval) + + imgData[e] = r; + imgData[e+1] = g; + imgData[e+2] = b; + imgData[e+3] = 255; // Ditto + } + } + + return imgData; // NOTE: image data should be freed +} + +// Framebuffer management (fbo) +//----------------------------------------------------------------------------------------- +// Load a framebuffer to be used for rendering +// NOTE: No textures attached +unsigned int rlLoadFramebuffer(void) +{ + unsigned int fboId = 0; + if (!isGpuReady) { TRACELOG(RL_LOG_WARNING, "GL: GPU is not ready to load data, trying to load before InitWindow()?"); return fboId; } + +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + glGenFramebuffers(1, &fboId); // Create the framebuffer object + glBindFramebuffer(GL_FRAMEBUFFER, 0); // Unbind any framebuffer +#endif + + return fboId; +} + +// Attach color buffer texture to an fbo (unloads previous attachment) +// NOTE: Attach type: 0-Color, 1-Depth renderbuffer, 2-Depth texture +void rlFramebufferAttach(unsigned int fboId, unsigned int texId, int attachType, int texType, int mipLevel) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + glBindFramebuffer(GL_FRAMEBUFFER, fboId); + + switch (attachType) + { + case RL_ATTACHMENT_COLOR_CHANNEL0: + case RL_ATTACHMENT_COLOR_CHANNEL1: + case RL_ATTACHMENT_COLOR_CHANNEL2: + case RL_ATTACHMENT_COLOR_CHANNEL3: + case RL_ATTACHMENT_COLOR_CHANNEL4: + case RL_ATTACHMENT_COLOR_CHANNEL5: + case RL_ATTACHMENT_COLOR_CHANNEL6: + case RL_ATTACHMENT_COLOR_CHANNEL7: + { + if (texType == RL_ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_TEXTURE_2D, texId, mipLevel); + else if (texType == RL_ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_RENDERBUFFER, texId); + else if (texType >= RL_ATTACHMENT_CUBEMAP_POSITIVE_X) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + attachType, GL_TEXTURE_CUBE_MAP_POSITIVE_X + texType, texId, mipLevel); + } break; + case RL_ATTACHMENT_DEPTH: + { + if (texType == RL_ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texId, mipLevel); + else if (texType == RL_ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, texId); + } break; + case RL_ATTACHMENT_STENCIL: + { + if (texType == RL_ATTACHMENT_TEXTURE2D) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texId, mipLevel); + else if (texType == RL_ATTACHMENT_RENDERBUFFER) glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, texId); + } break; + default: break; + } + + glBindFramebuffer(GL_FRAMEBUFFER, 0); +#endif +} + +// Verify render texture is complete +bool rlFramebufferComplete(unsigned int id) +{ + bool result = false; + +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + glBindFramebuffer(GL_FRAMEBUFFER, id); + + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + if (status != GL_FRAMEBUFFER_COMPLETE) + { + switch (status) + { + case GL_FRAMEBUFFER_UNSUPPORTED: TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer is unsupported", id); break; + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer has incomplete attachment", id); break; +#if defined(GRAPHICS_API_OPENGL_ES2) + case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer has incomplete dimensions", id); break; +#endif + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: TRACELOG(RL_LOG_WARNING, "FBO: [ID %i] Framebuffer has a missing attachment", id); break; + default: break; + } + } + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + result = (status == GL_FRAMEBUFFER_COMPLETE); +#endif + + return result; +} + +// Unload framebuffer from GPU memory +// NOTE: All attached textures/cubemaps/renderbuffers are also deleted +void rlUnloadFramebuffer(unsigned int id) +{ +#if (defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)) + // Query depth attachment to automatically delete texture/renderbuffer + int depthType = 0; + glBindFramebuffer(GL_FRAMEBUFFER, id); // Bind framebuffer to query depth texture type + glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &depthType); + + // WARNING: WebGL: INVALID_ENUM: getFramebufferAttachmentParameter: invalid parameter name + // REF: https://registry.khronos.org/webgl/specs/latest/1.0/ + int depthId = 0; + glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &depthId); + + unsigned int depthIdU = (unsigned int)depthId; + if (depthType == GL_RENDERBUFFER) glDeleteRenderbuffers(1, &depthIdU); + else if (depthType == GL_TEXTURE) glDeleteTextures(1, &depthIdU); + + // NOTE: If a texture object is deleted while its image is attached to the *currently bound* framebuffer, + // the texture image is automatically detached from the currently bound framebuffer + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glDeleteFramebuffers(1, &id); + + TRACELOG(RL_LOG_INFO, "FBO: [ID %i] Unloaded framebuffer from VRAM (GPU)", id); +#endif +} + +// Vertex data management +//----------------------------------------------------------------------------------------- +// Load a new attributes buffer +unsigned int rlLoadVertexBuffer(const void *buffer, int size, bool dynamic) +{ + unsigned int id = 0; + if (!isGpuReady) { TRACELOG(RL_LOG_WARNING, "GL: GPU is not ready to load data, trying to load before InitWindow()?"); return id; } + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glGenBuffers(1, &id); + glBindBuffer(GL_ARRAY_BUFFER, id); + glBufferData(GL_ARRAY_BUFFER, size, buffer, dynamic? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); +#endif + + return id; +} + +// Load a new attributes element buffer +unsigned int rlLoadVertexBufferElement(const void *buffer, int size, bool dynamic) +{ + unsigned int id = 0; + if (!isGpuReady) { TRACELOG(RL_LOG_WARNING, "GL: GPU is not ready to load data, trying to load before InitWindow()?"); return id; } + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glGenBuffers(1, &id); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, buffer, dynamic? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); +#endif + + return id; +} + +// Enable vertex buffer (VBO) +void rlEnableVertexBuffer(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ARRAY_BUFFER, id); +#endif +} + +// Disable vertex buffer (VBO) +void rlDisableVertexBuffer(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ARRAY_BUFFER, 0); +#endif +} + +// Enable vertex buffer element (VBO element) +void rlEnableVertexBufferElement(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); +#endif +} + +// Disable vertex buffer element (VBO element) +void rlDisableVertexBufferElement(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); +#endif +} + +// Update vertex buffer with new data +// NOTE: dataSize and offset must be provided in bytes +void rlUpdateVertexBuffer(unsigned int id, const void *data, int dataSize, int offset) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ARRAY_BUFFER, id); + glBufferSubData(GL_ARRAY_BUFFER, offset, dataSize, data); +#endif +} + +// Update vertex buffer elements with new data +// NOTE: dataSize and offset must be provided in bytes +void rlUpdateVertexBufferElements(unsigned int id, const void *data, int dataSize, int offset) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, dataSize, data); +#endif +} + +// Enable vertex array object (VAO) +bool rlEnableVertexArray(unsigned int vaoId) +{ + bool result = false; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.ExtSupported.vao) + { + glBindVertexArray(vaoId); + result = true; + } +#endif + return result; +} + +// Disable vertex array object (VAO) +void rlDisableVertexArray(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.ExtSupported.vao) glBindVertexArray(0); +#endif +} + +// Enable vertex attribute index +void rlEnableVertexAttribute(unsigned int index) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glEnableVertexAttribArray(index); +#endif +} + +// Disable vertex attribute index +void rlDisableVertexAttribute(unsigned int index) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glDisableVertexAttribArray(index); +#endif +} + +// Draw vertex array +void rlDrawVertexArray(int offset, int count) +{ + glDrawArrays(GL_TRIANGLES, offset, count); +} + +// Draw vertex array elements +void rlDrawVertexArrayElements(int offset, int count, const void *buffer) +{ + // NOTE: Added pointer math separately from function to avoid UBSAN complaining + unsigned short *bufferPtr = (unsigned short *)buffer; + if (offset > 0) bufferPtr += offset; + + glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (const unsigned short *)bufferPtr); +} + +// Draw vertex array instanced +void rlDrawVertexArrayInstanced(int offset, int count, int instances) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glDrawArraysInstanced(GL_TRIANGLES, offset, count, instances); +#endif +} + +// Draw vertex array elements instanced +void rlDrawVertexArrayElementsInstanced(int offset, int count, const void *buffer, int instances) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: Added pointer math separately from function to avoid UBSAN complaining + unsigned short *bufferPtr = (unsigned short *)buffer; + if (offset > 0) bufferPtr += offset; + + glDrawElementsInstanced(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, (const unsigned short *)bufferPtr, instances); +#endif +} + +// Enable vertex state pointer +void rlEnableStatePointer(int vertexAttribType, void *buffer) +{ +#if defined(GRAPHICS_API_OPENGL_11) + if (buffer != NULL) glEnableClientState(vertexAttribType); + switch (vertexAttribType) + { + case GL_VERTEX_ARRAY: glVertexPointer(3, GL_FLOAT, 0, buffer); break; + case GL_TEXTURE_COORD_ARRAY: glTexCoordPointer(2, GL_FLOAT, 0, buffer); break; + case GL_NORMAL_ARRAY: if (buffer != NULL) glNormalPointer(GL_FLOAT, 0, buffer); break; + case GL_COLOR_ARRAY: if (buffer != NULL) glColorPointer(4, GL_UNSIGNED_BYTE, 0, buffer); break; + //case GL_INDEX_ARRAY: if (buffer != NULL) glIndexPointer(GL_SHORT, 0, buffer); break; // Indexed colors + default: break; + } +#endif +} + +// Disable vertex state pointer +void rlDisableStatePointer(int vertexAttribType) +{ +#if defined(GRAPHICS_API_OPENGL_11) + glDisableClientState(vertexAttribType); +#endif +} + +// Load vertex array object (VAO) +unsigned int rlLoadVertexArray(void) +{ + unsigned int vaoId = 0; + if (!isGpuReady) { TRACELOG(RL_LOG_WARNING, "GL: GPU is not ready to load data, trying to load before InitWindow()?"); return vaoId; } + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.ExtSupported.vao) glGenVertexArrays(1, &vaoId); +#endif + + return vaoId; +} + +// Set vertex attribute +void rlSetVertexAttribute(unsigned int index, int compSize, int type, bool normalized, int stride, int offset) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // NOTE: Data type could be: GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT + // Additional types (depends on OpenGL version or extensions): + // - GL_HALF_FLOAT, GL_FLOAT, GL_DOUBLE, GL_FIXED, + // - GL_INT_2_10_10_10_REV, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_10F_11F_11F_REV + + size_t offsetNative = offset; + glVertexAttribPointer(index, compSize, type, normalized, stride, (void *)offsetNative); +#endif +} + +// Set vertex attribute divisor +void rlSetVertexAttributeDivisor(unsigned int index, int divisor) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glVertexAttribDivisor(index, divisor); +#endif +} + +// Unload vertex array object (VAO) +void rlUnloadVertexArray(unsigned int vaoId) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.ExtSupported.vao) + { + glBindVertexArray(0); + glDeleteVertexArrays(1, &vaoId); + TRACELOG(RL_LOG_INFO, "VAO: [ID %i] Unloaded vertex array data from VRAM (GPU)", vaoId); + } +#endif +} + +// Unload vertex buffer (VBO) +void rlUnloadVertexBuffer(unsigned int vboId) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glDeleteBuffers(1, &vboId); + //TRACELOG(RL_LOG_INFO, "VBO: Unloaded vertex data from VRAM (GPU)"); +#endif +} + +// Shaders management +//----------------------------------------------------------------------------------------------- +// Load shader from code strings +// NOTE: If shader string is NULL, using default vertex/fragment shaders +unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode) +{ + unsigned int id = 0; + if (!isGpuReady) { TRACELOG(RL_LOG_WARNING, "GL: GPU is not ready to load data, trying to load before InitWindow()?"); return id; } + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + unsigned int vertexShaderId = 0; + unsigned int fragmentShaderId = 0; + + // Compile vertex shader (if provided) + // NOTE: If not vertex shader is provided, use default one + if (vsCode != NULL) vertexShaderId = rlCompileShader(vsCode, GL_VERTEX_SHADER); + else vertexShaderId = RLGL.State.defaultVShaderId; + + // Compile fragment shader (if provided) + // NOTE: If not vertex shader is provided, use default one + if (fsCode != NULL) fragmentShaderId = rlCompileShader(fsCode, GL_FRAGMENT_SHADER); + else fragmentShaderId = RLGL.State.defaultFShaderId; + + // In case vertex and fragment shader are the default ones, no need to recompile, just assign the default shader program id + if ((vertexShaderId == RLGL.State.defaultVShaderId) && (fragmentShaderId == RLGL.State.defaultFShaderId)) id = RLGL.State.defaultShaderId; + else if ((vertexShaderId > 0) && (fragmentShaderId > 0)) + { + // One of or both shader are new, a new shader program needs to be compiled + id = rlLoadShaderProgram(vertexShaderId, fragmentShaderId); + + // Detaching and deleting vertex/fragment shaders (if not default ones) + // WARNING: Detach shader before deletion to make sure memory is freed + if (vertexShaderId != RLGL.State.defaultVShaderId) + { + // WARNING: Shader program linkage could fail and returned id is 0 + if (id > 0) glDetachShader(id, vertexShaderId); + glDeleteShader(vertexShaderId); + } + if (fragmentShaderId != RLGL.State.defaultFShaderId) + { + // WARNING: Shader program linkage could fail and returned id is 0 + if (id > 0) glDetachShader(id, fragmentShaderId); + glDeleteShader(fragmentShaderId); + } + + // In case shader program loading failed, assign default shader + if (id == 0) + { + // In case shader loading fails, reassigning default shader + TRACELOG(RL_LOG_WARNING, "SHADER: Failed to load custom shader code, using default shader"); + id = RLGL.State.defaultShaderId; + } + /* + else + { + // Get available shader uniforms + // NOTE: This information is useful for debug... + int uniformCount = -1; + glGetProgramiv(id, GL_ACTIVE_UNIFORMS, &uniformCount); + + for (int i = 0; i < uniformCount; i++) + { + int namelen = -1; + int num = -1; + char name[256] = { 0 }; // Assume no variable names longer than 256 + GLenum type = GL_ZERO; + + // Get the name of the uniforms + glGetActiveUniform(id, i, sizeof(name) - 1, &namelen, &num, &type, name); + + name[namelen] = 0; + TRACELOG(RL_LOG_DEBUG, "SHADER: [ID %i] Active uniform (%s) set at location: %i", id, name, glGetUniformLocation(id, name)); + } + } + */ + } +#endif + + return id; +} + +// Compile custom shader and return shader id +unsigned int rlCompileShader(const char *shaderCode, int type) +{ + unsigned int shaderId = 0; + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + shaderId = glCreateShader(type); + glShaderSource(shaderId, 1, &shaderCode, NULL); + + GLint success = 0; + glCompileShader(shaderId); + glGetShaderiv(shaderId, GL_COMPILE_STATUS, &success); + + if (success == GL_FALSE) + { + switch (type) + { + case GL_VERTEX_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile vertex shader code", shaderId); break; + case GL_FRAGMENT_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile fragment shader code", shaderId); break; + //case GL_GEOMETRY_SHADER: + #if defined(GRAPHICS_API_OPENGL_43) + case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile compute shader code", shaderId); break; + #elif defined(GRAPHICS_API_OPENGL_33) + case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43", shaderId); break; + #endif + default: break; + } + + int maxLength = 0; + glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &maxLength); + + if (maxLength > 0) + { + int length = 0; + char *log = (char *)RL_CALLOC(maxLength, sizeof(char)); + glGetShaderInfoLog(shaderId, maxLength, &length, log); + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Compile error: %s", shaderId, log); + RL_FREE(log); + } + + // Unload object allocated by glCreateShader(), + // despite failing in the compilation process + glDeleteShader(shaderId); + shaderId = 0; + } + else + { + switch (type) + { + case GL_VERTEX_SHADER: TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Vertex shader compiled successfully", shaderId); break; + case GL_FRAGMENT_SHADER: TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Fragment shader compiled successfully", shaderId); break; + //case GL_GEOMETRY_SHADER: + #if defined(GRAPHICS_API_OPENGL_43) + case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Compute shader compiled successfully", shaderId); break; + #elif defined(GRAPHICS_API_OPENGL_33) + case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43", shaderId); break; + #endif + default: break; + } + } +#endif + + return shaderId; +} + +// Load custom shader strings and return program id +unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId) +{ + unsigned int programId = 0; + if (!isGpuReady) { TRACELOG(RL_LOG_WARNING, "GL: GPU is not ready to load data, trying to load before InitWindow()?"); return programId; } + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + GLint success = 0; + programId = glCreateProgram(); + + glAttachShader(programId, vShaderId); + glAttachShader(programId, fShaderId); + + // Default attribute shader locations must be bound before linking + // NOTE: There is no problem with binding a generic attribute index to an attribute variable name + // that is never used; if some attrib name is no found on the shader, it locations becomes -1 + glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION, RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION); + glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD); + glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL, RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL); + glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_COLOR, RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR); + glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TANGENT, RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT); + glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD2, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2); + glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_INSTANCETRANSFORM, RL_DEFAULT_SHADER_ATTRIB_NAME_INSTANCETRANSFORM); + glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEINDICES, RL_DEFAULT_SHADER_ATTRIB_NAME_BONEINDICES); + glBindAttribLocation(programId, RL_DEFAULT_SHADER_ATTRIB_LOCATION_BONEWEIGHTS, RL_DEFAULT_SHADER_ATTRIB_NAME_BONEWEIGHTS); + + glLinkProgram(programId); + + // NOTE: All uniform variables are intitialised to 0 when a program links + + glGetProgramiv(programId, GL_LINK_STATUS, &success); + + if (success == GL_FALSE) + { + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to link shader program", programId); + + int maxLength = 0; + glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &maxLength); + + if (maxLength > 0) + { + int length = 0; + char *log = (char *)RL_CALLOC(maxLength, sizeof(char)); + glGetProgramInfoLog(programId, maxLength, &length, log); + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Link error: %s", programId, log); + RL_FREE(log); + } + + glDeleteProgram(programId); + + programId = 0; + } + else + { + // Get the size of compiled shader program (not available on OpenGL ES 2.0) + // NOTE: If GL_LINK_STATUS is GL_FALSE, program binary length is zero + //GLint binarySize = 0; + //glGetProgramiv(id, GL_PROGRAM_BINARY_LENGTH, &binarySize); + + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Program shader loaded successfully", programId); + } +#endif + return programId; +} + +// Unload shader program +void rlUnloadShaderProgram(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glDeleteProgram(id); + + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Unloaded shader program data from VRAM (GPU)", id); +#endif +} + +// Get shader location uniform +// NOTE: First parameter refers to shader program id +int rlGetLocationUniform(unsigned int shaderId, const char *uniformName) +{ + int location = -1; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + location = glGetUniformLocation(shaderId, uniformName); + + //if (location == -1) TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to find shader uniform: %s", shaderId, uniformName); + //else TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Shader uniform (%s) set at location: %i", shaderId, uniformName, location); +#endif + return location; +} + +// Get shader location attribute +// NOTE: First parameter refers to shader program id +int rlGetLocationAttrib(unsigned int shaderId, const char *attribName) +{ + int location = -1; +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + location = glGetAttribLocation(shaderId, attribName); + + //if (location == -1) TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to find shader attribute: %s", shaderId, attribName); + //else TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Shader attribute (%s) set at location: %i", shaderId, attribName, location); +#endif + return location; +} + +// Set shader value uniform +void rlSetUniform(int locIndex, const void *value, int uniformType, int count) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + switch (uniformType) + { + case RL_SHADER_UNIFORM_FLOAT: glUniform1fv(locIndex, count, (float *)value); break; + case RL_SHADER_UNIFORM_VEC2: glUniform2fv(locIndex, count, (float *)value); break; + case RL_SHADER_UNIFORM_VEC3: glUniform3fv(locIndex, count, (float *)value); break; + case RL_SHADER_UNIFORM_VEC4: glUniform4fv(locIndex, count, (float *)value); break; + case RL_SHADER_UNIFORM_INT: glUniform1iv(locIndex, count, (int *)value); break; + case RL_SHADER_UNIFORM_IVEC2: glUniform2iv(locIndex, count, (int *)value); break; + case RL_SHADER_UNIFORM_IVEC3: glUniform3iv(locIndex, count, (int *)value); break; + case RL_SHADER_UNIFORM_IVEC4: glUniform4iv(locIndex, count, (int *)value); break; + #if !defined(GRAPHICS_API_OPENGL_ES2) + case RL_SHADER_UNIFORM_UINT: glUniform1uiv(locIndex, count, (unsigned int *)value); break; + case RL_SHADER_UNIFORM_UIVEC2: glUniform2uiv(locIndex, count, (unsigned int *)value); break; + case RL_SHADER_UNIFORM_UIVEC3: glUniform3uiv(locIndex, count, (unsigned int *)value); break; + case RL_SHADER_UNIFORM_UIVEC4: glUniform4uiv(locIndex, count, (unsigned int *)value); break; + #endif + case RL_SHADER_UNIFORM_SAMPLER2D: glUniform1iv(locIndex, count, (int *)value); break; + default: TRACELOG(RL_LOG_WARNING, "SHADER: Failed to set uniform value, data type not recognized"); + } +#endif +} + +// Set shader value attribute +void rlSetVertexAttributeDefault(int locIndex, const void *value, int attribType, int count) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + switch (attribType) + { + case RL_SHADER_ATTRIB_FLOAT: if (count == 1) glVertexAttrib1fv(locIndex, (float *)value); break; + case RL_SHADER_ATTRIB_VEC2: if (count == 2) glVertexAttrib2fv(locIndex, (float *)value); break; + case RL_SHADER_ATTRIB_VEC3: if (count == 3) glVertexAttrib3fv(locIndex, (float *)value); break; + case RL_SHADER_ATTRIB_VEC4: if (count == 4) glVertexAttrib4fv(locIndex, (float *)value); break; + default: TRACELOG(RL_LOG_WARNING, "SHADER: Failed to set attrib default value, data type not recognized"); + } +#endif +} + +// Set shader value uniform matrix +void rlSetUniformMatrix(int locIndex, Matrix mat) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glUniformMatrix4fv(locIndex, 1, false, rlMatrixToFloat(mat)); +#endif +} + +// Set shader value uniform matrix +void rlSetUniformMatrices(int locIndex, const Matrix *matrices, int count) +{ +#if defined(GRAPHICS_API_OPENGL_33) + glUniformMatrix4fv(locIndex, count, true, (const float *)matrices); +#elif defined(GRAPHICS_API_OPENGL_ES2) + // WARNING: WebGL does not support Matrix transpose ("true" parameter) + // REF: https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/uniformMatrix + glUniformMatrix4fv(locIndex, count, false, (const float *)matrices); +#endif +} + +// Set shader value uniform sampler +void rlSetUniformSampler(int locIndex, unsigned int textureId) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // Check if texture is already active + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) + { + if (RLGL.State.activeTextureId[i] == textureId) + { + glUniform1i(locIndex, 1 + i); + return; + } + } + + // Register a new active texture for the internal batch system + // NOTE: Default texture is always activated as GL_TEXTURE0 + for (int i = 0; i < RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS; i++) + { + if (RLGL.State.activeTextureId[i] == 0) + { + glUniform1i(locIndex, 1 + i); // Activate new texture unit + RLGL.State.activeTextureId[i] = textureId; // Save texture id for binding on drawing + break; + } + } +#endif +} + +// Set shader currently active (id and locations) +void rlSetShader(unsigned int id, int *locs) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + if (RLGL.State.currentShaderId != id) + { + rlDrawRenderBatch(RLGL.currentBatch); + RLGL.State.currentShaderId = id; + RLGL.State.currentShaderLocs = locs; + } +#endif +} + +// Load compute shader program +unsigned int rlLoadComputeShaderProgram(unsigned int shaderId) +{ + unsigned int programId = 0; + +#if defined(GRAPHICS_API_OPENGL_43) + GLint success = 0; + programId = glCreateProgram(); + glAttachShader(programId, shaderId); + glLinkProgram(programId); + + // NOTE: All uniform variables are intitialised to 0 when a program links + + glGetProgramiv(programId, GL_LINK_STATUS, &success); + + if (success == GL_FALSE) + { + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to link compute shader program", programId); + + int maxLength = 0; + glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &maxLength); + + if (maxLength > 0) + { + int length = 0; + char *log = (char *)RL_CALLOC(maxLength, sizeof(char)); + glGetProgramInfoLog(programId, maxLength, &length, log); + TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Link error: %s", programId, log); + RL_FREE(log); + } + + glDeleteProgram(programId); + + programId = 0; + } + else + { + // Get the size of compiled shader program (not available on OpenGL ES 2.0) + // NOTE: If GL_LINK_STATUS is GL_FALSE, program binary length is zero + //GLint binarySize = 0; + //glGetProgramiv(id, GL_PROGRAM_BINARY_LENGTH, &binarySize); + + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Compute shader program loaded successfully", programId); + } +#else + TRACELOG(RL_LOG_WARNING, "SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43"); +#endif + + return programId; +} + +// Dispatch compute shader (equivalent to *draw* for graphics pilepine) +void rlComputeShaderDispatch(unsigned int groupX, unsigned int groupY, unsigned int groupZ) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glDispatchCompute(groupX, groupY, groupZ); +#endif +} + +// Load shader storage buffer object (SSBO) +unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHint) +{ + unsigned int ssbo = 0; + +#if defined(GRAPHICS_API_OPENGL_43) + glGenBuffers(1, &ssbo); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo); + glBufferData(GL_SHADER_STORAGE_BUFFER, size, data, usageHint? usageHint : RL_STREAM_COPY); + if (data == NULL) glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, NULL); // Clear buffer data to 0 + glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); +#else + TRACELOG(RL_LOG_WARNING, "SSBO: SSBO not enabled. Define GRAPHICS_API_OPENGL_43"); +#endif + + return ssbo; +} + +// Unload shader storage buffer object (SSBO) +void rlUnloadShaderBuffer(unsigned int ssboId) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glDeleteBuffers(1, &ssboId); +#else + TRACELOG(RL_LOG_WARNING, "SSBO: SSBO not enabled. Define GRAPHICS_API_OPENGL_43"); +#endif + +} + +// Update SSBO buffer data +void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSize, unsigned int offset) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glBindBuffer(GL_SHADER_STORAGE_BUFFER, id); + glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset, dataSize, data); +#endif +} + +// Get SSBO buffer size +unsigned int rlGetShaderBufferSize(unsigned int id) +{ +#if defined(GRAPHICS_API_OPENGL_43) + GLint64 size = 0; + glBindBuffer(GL_SHADER_STORAGE_BUFFER, id); + glGetBufferParameteri64v(GL_SHADER_STORAGE_BUFFER, GL_BUFFER_SIZE, &size); + return (size > 0)? (unsigned int)size : 0; +#else + return 0; +#endif +} + +// Read SSBO buffer data (GPU->CPU) +void rlReadShaderBuffer(unsigned int id, void *dest, unsigned int count, unsigned int offset) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glBindBuffer(GL_SHADER_STORAGE_BUFFER, id); + glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, offset, count, dest); +#endif +} + +// Bind SSBO buffer +void rlBindShaderBuffer(unsigned int id, unsigned int index) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, id); +#endif +} + +// Copy SSBO buffer data +void rlCopyShaderBuffer(unsigned int destId, unsigned int srcId, unsigned int destOffset, unsigned int srcOffset, unsigned int count) +{ +#if defined(GRAPHICS_API_OPENGL_43) + glBindBuffer(GL_COPY_READ_BUFFER, srcId); + glBindBuffer(GL_COPY_WRITE_BUFFER, destId); + glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, srcOffset, destOffset, count); +#endif +} + +// Bind image texture +void rlBindImageTexture(unsigned int id, unsigned int index, int format, bool readonly) +{ +#if defined(GRAPHICS_API_OPENGL_43) + unsigned int glInternalFormat = 0, glFormat = 0, glType = 0; + + rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType); + glBindImageTexture(index, id, 0, 0, 0, readonly? GL_READ_ONLY : GL_READ_WRITE, glInternalFormat); +#else + TRACELOG(RL_LOG_WARNING, "TEXTURE: Image texture binding not enabled. Define GRAPHICS_API_OPENGL_43"); +#endif +} + +// Matrix state management +//----------------------------------------------------------------------------------------- +// Get internal modelview matrix +Matrix rlGetMatrixModelview(void) +{ + Matrix matrix = rlMatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_11) + float mat[16]; + glGetFloatv(GL_MODELVIEW_MATRIX, mat); + matrix.m0 = mat[0]; + matrix.m1 = mat[1]; + matrix.m2 = mat[2]; + matrix.m3 = mat[3]; + matrix.m4 = mat[4]; + matrix.m5 = mat[5]; + matrix.m6 = mat[6]; + matrix.m7 = mat[7]; + matrix.m8 = mat[8]; + matrix.m9 = mat[9]; + matrix.m10 = mat[10]; + matrix.m11 = mat[11]; + matrix.m12 = mat[12]; + matrix.m13 = mat[13]; + matrix.m14 = mat[14]; + matrix.m15 = mat[15]; +#else + matrix = RLGL.State.modelview; +#endif + return matrix; +} + +// Get internal projection matrix +Matrix rlGetMatrixProjection(void) +{ +#if defined(GRAPHICS_API_OPENGL_11) + float mat[16]; + glGetFloatv(GL_PROJECTION_MATRIX,mat); + Matrix m; + m.m0 = mat[0]; + m.m1 = mat[1]; + m.m2 = mat[2]; + m.m3 = mat[3]; + m.m4 = mat[4]; + m.m5 = mat[5]; + m.m6 = mat[6]; + m.m7 = mat[7]; + m.m8 = mat[8]; + m.m9 = mat[9]; + m.m10 = mat[10]; + m.m11 = mat[11]; + m.m12 = mat[12]; + m.m13 = mat[13]; + m.m14 = mat[14]; + m.m15 = mat[15]; + return m; +#else + return RLGL.State.projection; +#endif +} + +// Get internal accumulated transform matrix +Matrix rlGetMatrixTransform(void) +{ + Matrix mat = rlMatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + // TODO: Consider possible transform matrices in the RLGL.State.stack + //Matrix matStackTransform = rlMatrixIdentity(); + //for (int i = RLGL.State.stackCounter; i > 0; i--) matStackTransform = rlMatrixMultiply(RLGL.State.stack[i], matStackTransform); + + mat = RLGL.State.transform; +#endif + return mat; +} + +// Get internal projection matrix for stereo render (selected eye) +Matrix rlGetMatrixProjectionStereo(int eye) +{ + Matrix mat = rlMatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + mat = RLGL.State.projectionStereo[eye]; +#endif + return mat; +} + +// Get internal view offset matrix for stereo render (selected eye) +Matrix rlGetMatrixViewOffsetStereo(int eye) +{ + Matrix mat = rlMatrixIdentity(); +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + mat = RLGL.State.viewOffsetStereo[eye]; +#endif + return mat; +} + +// Set a custom modelview matrix (replaces internal modelview matrix) +void rlSetMatrixModelview(Matrix view) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.modelview = view; +#endif +} + +// Set a custom projection matrix (replaces internal projection matrix) +void rlSetMatrixProjection(Matrix projection) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.projection = projection; +#endif +} + +// Set eyes projection matrices for stereo rendering +void rlSetMatrixProjectionStereo(Matrix right, Matrix left) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.projectionStereo[0] = right; + RLGL.State.projectionStereo[1] = left; +#endif +} + +// Set eyes view offsets matrices for stereo rendering +void rlSetMatrixViewOffsetStereo(Matrix right, Matrix left) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + RLGL.State.viewOffsetStereo[0] = right; + RLGL.State.viewOffsetStereo[1] = left; +#endif +} + +// Load and draw a quad in NDC +void rlLoadDrawQuad(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + unsigned int quadVAO = 0; + unsigned int quadVBO = 0; + + float vertices[] = { + // Positions Texcoords + -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, + }; + + // Gen VAO to contain VBO + glGenVertexArrays(1, &quadVAO); + glBindVertexArray(quadVAO); + + // Gen and fill vertex buffer (VBO) + glGenBuffers(1, &quadVBO); + glBindBuffer(GL_ARRAY_BUFFER, quadVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), &vertices, GL_STATIC_DRAW); + + // Bind vertex attributes (position, texcoords) + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void *)0); // Positions + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void *)(3*sizeof(float))); // Texcoords + + // Draw quad + glBindVertexArray(quadVAO); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glBindVertexArray(0); + + // Delete buffers (VBO and VAO) + glDeleteBuffers(1, &quadVBO); + glDeleteVertexArrays(1, &quadVAO); +#endif +} + +// Load and draw a cube in NDC +void rlLoadDrawCube(void) +{ +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + unsigned int cubeVAO = 0; + unsigned int cubeVBO = 0; + + float vertices[] = { + // Positions Normals Texcoords + -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, + 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, + 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, + 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, + -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, + -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, + 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, + -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, + -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, + -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, + -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, + -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f + }; + + // Gen VAO to contain VBO + glGenVertexArrays(1, &cubeVAO); + glBindVertexArray(cubeVAO); + + // Gen and fill vertex buffer (VBO) + glGenBuffers(1, &cubeVBO); + glBindBuffer(GL_ARRAY_BUFFER, cubeVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + // Bind vertex attributes (position, normals, texcoords) + glBindVertexArray(cubeVAO); + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void *)0); // Positions + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_NORMAL, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void *)(3*sizeof(float))); // Normals + glEnableVertexAttribArray(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD); + glVertexAttribPointer(RL_DEFAULT_SHADER_ATTRIB_LOCATION_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void *)(6*sizeof(float))); // Texcoords + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + + // Draw cube + glBindVertexArray(cubeVAO); + glDrawArrays(GL_TRIANGLES, 0, 36); + glBindVertexArray(0); + + // Delete VBO and VAO + glDeleteBuffers(1, &cubeVBO); + glDeleteVertexArrays(1, &cubeVAO); +#endif +} + +// Get name string for pixel format +const char *rlGetPixelFormatName(unsigned int format) +{ + switch (format) + { + case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: return "GRAYSCALE"; break; // 8 bit per pixel (no alpha) + case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: return "GRAY_ALPHA"; break; // 8*2 bpp (2 channels) + case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: return "R5G6B5"; break; // 16 bpp + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: return "R8G8B8"; break; // 24 bpp + case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: return "R5G5B5A1"; break; // 16 bpp (1 bit alpha) + case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: return "R4G4B4A4"; break; // 16 bpp (4 bit alpha) + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: return "R8G8B8A8"; break; // 32 bpp + case RL_PIXELFORMAT_UNCOMPRESSED_R32: return "R32"; break; // 32 bpp (1 channel - float) + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: return "R32G32B32"; break; // 32*3 bpp (3 channels - float) + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: return "R32G32B32A32"; break; // 32*4 bpp (4 channels - float) + case RL_PIXELFORMAT_UNCOMPRESSED_R16: return "R16"; break; // 16 bpp (1 channel - half float) + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: return "R16G16B16"; break; // 16*3 bpp (3 channels - half float) + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: return "R16G16B16A16"; break; // 16*4 bpp (4 channels - half float) + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: return "DXT1_RGB"; break; // 4 bpp (no alpha) + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: return "DXT1_RGBA"; break; // 4 bpp (1 bit alpha) + case RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA: return "DXT3_RGBA"; break; // 8 bpp + case RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA: return "DXT5_RGBA"; break; // 8 bpp + case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB: return "ETC1_RGB"; break; // 4 bpp + case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB: return "ETC2_RGB"; break; // 4 bpp + case RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: return "ETC2_RGBA"; break; // 8 bpp + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB: return "PVRT_RGB"; break; // 4 bpp + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: return "PVRT_RGBA"; break; // 4 bpp + case RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: return "ASTC_4x4_RGBA"; break; // 8 bpp + case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: return "ASTC_8x8_RGBA"; break; // 2 bpp + default: return "UNKNOWN"; break; + } +} + +//---------------------------------------------------------------------------------- +// Module Functions Definition +//---------------------------------------------------------------------------------- +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +// Load default shader (just vertex positioning and texture coloring) +// NOTE: This shader program is used for internal buffers +// NOTE: Loaded: RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs +static void rlLoadShaderDefault(void) +{ + RLGL.State.defaultShaderLocs = (int *)RL_CALLOC(RL_MAX_SHADER_LOCATIONS, sizeof(int)); + + // NOTE: All locations must be reseted to -1 (no location) + for (int i = 0; i < RL_MAX_SHADER_LOCATIONS; i++) RLGL.State.defaultShaderLocs[i] = -1; + + // Vertex shader directly defined, no external file required + const char *defaultVShaderCode = +#if defined(GRAPHICS_API_OPENGL_21) + "#version 120 \n" + "attribute vec3 vertexPosition; \n" + "attribute vec2 vertexTexCoord; \n" + "attribute vec4 vertexColor; \n" + "varying vec2 fragTexCoord; \n" + "varying vec4 fragColor; \n" +#elif defined(GRAPHICS_API_OPENGL_33) + "#version 330 \n" + "in vec3 vertexPosition; \n" + "in vec2 vertexTexCoord; \n" + "in vec4 vertexColor; \n" + "out vec2 fragTexCoord; \n" + "out vec4 fragColor; \n" +#endif + +#if defined(GRAPHICS_API_OPENGL_ES3) + "#version 300 es \n" + "precision mediump float; \n" // Precision required for OpenGL ES3 (WebGL 2) (on some browsers) + "in vec3 vertexPosition; \n" + "in vec2 vertexTexCoord; \n" + "in vec4 vertexColor; \n" + "out vec2 fragTexCoord; \n" + "out vec4 fragColor; \n" +#elif defined(GRAPHICS_API_OPENGL_ES2) + "#version 100 \n" + "precision mediump float; \n" // Precision required for OpenGL ES2 (WebGL) (on some browsers) + "attribute vec3 vertexPosition; \n" + "attribute vec2 vertexTexCoord; \n" + "attribute vec4 vertexColor; \n" + "varying vec2 fragTexCoord; \n" + "varying vec4 fragColor; \n" +#endif + + "uniform mat4 mvp; \n" + "void main() \n" + "{ \n" + " fragTexCoord = vertexTexCoord; \n" + " fragColor = vertexColor; \n" + " gl_Position = mvp*vec4(vertexPosition, 1.0); \n" + "} \n"; + + // Fragment shader directly defined, no external file required + const char *defaultFShaderCode = +#if defined(GRAPHICS_API_OPENGL_21) + "#version 120 \n" + "varying vec2 fragTexCoord; \n" + "varying vec4 fragColor; \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + "void main() \n" + "{ \n" + " vec4 texelColor = texture2D(texture0, fragTexCoord); \n" + " gl_FragColor = texelColor*colDiffuse*fragColor; \n" + "} \n"; +#elif defined(GRAPHICS_API_OPENGL_33) + "#version 330 \n" + "in vec2 fragTexCoord; \n" + "in vec4 fragColor; \n" + "out vec4 finalColor; \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + "void main() \n" + "{ \n" + " vec4 texelColor = texture(texture0, fragTexCoord); \n" + " finalColor = texelColor*colDiffuse*fragColor; \n" + "} \n"; +#endif + +#if defined(GRAPHICS_API_OPENGL_ES3) + "#version 300 es \n" + "precision mediump float; \n" // Precision required for OpenGL ES3 (WebGL 2) + "in vec2 fragTexCoord; \n" + "in vec4 fragColor; \n" + "out vec4 finalColor; \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + "void main() \n" + "{ \n" + " vec4 texelColor = texture(texture0, fragTexCoord); \n" + " finalColor = texelColor*colDiffuse*fragColor; \n" + "} \n"; +#elif defined(GRAPHICS_API_OPENGL_ES2) + "#version 100 \n" + "precision mediump float; \n" // Precision required for OpenGL ES2 (WebGL) + "varying vec2 fragTexCoord; \n" + "varying vec4 fragColor; \n" + "uniform sampler2D texture0; \n" + "uniform vec4 colDiffuse; \n" + "void main() \n" + "{ \n" + " vec4 texelColor = texture2D(texture0, fragTexCoord); \n" + " gl_FragColor = texelColor*colDiffuse*fragColor; \n" + "} \n"; +#endif + + // NOTE: Compiled vertex/fragment shaders are not deleted, + // they are kept for re-use as default shaders in case some shader loading fails + RLGL.State.defaultVShaderId = rlCompileShader(defaultVShaderCode, GL_VERTEX_SHADER); // Compile default vertex shader + RLGL.State.defaultFShaderId = rlCompileShader(defaultFShaderCode, GL_FRAGMENT_SHADER); // Compile default fragment shader + + RLGL.State.defaultShaderId = rlLoadShaderProgram(RLGL.State.defaultVShaderId, RLGL.State.defaultFShaderId); + + if (RLGL.State.defaultShaderId > 0) + { + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Default shader loaded successfully", RLGL.State.defaultShaderId); + + // Set default shader locations: attributes locations + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_POSITION] = glGetAttribLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION); + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_TEXCOORD01] = glGetAttribLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD); + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_VERTEX_COLOR] = glGetAttribLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR); + + // Set default shader locations: uniform locations + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_MATRIX_MVP] = glGetUniformLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_UNIFORM_NAME_MVP); + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_COLOR_DIFFUSE] = glGetUniformLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR); + RLGL.State.defaultShaderLocs[RL_SHADER_LOC_MAP_DIFFUSE] = glGetUniformLocation(RLGL.State.defaultShaderId, RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0); + } + else TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to load default shader", RLGL.State.defaultShaderId); +} + +// Unload default shader +// NOTE: Unloads: RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs +static void rlUnloadShaderDefault(void) +{ + glUseProgram(0); + + glDetachShader(RLGL.State.defaultShaderId, RLGL.State.defaultVShaderId); + glDetachShader(RLGL.State.defaultShaderId, RLGL.State.defaultFShaderId); + glDeleteShader(RLGL.State.defaultVShaderId); + glDeleteShader(RLGL.State.defaultFShaderId); + + glDeleteProgram(RLGL.State.defaultShaderId); + + RL_FREE(RLGL.State.defaultShaderLocs); + + TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Default shader unloaded successfully", RLGL.State.defaultShaderId); +} + +#if RLGL_SHOW_GL_DETAILS_INFO +// Get compressed format official GL identifier name +static const char *rlGetCompressedFormatName(int format) +{ + switch (format) + { + // GL_EXT_texture_compression_s3tc + case 0x83F0: return "GL_COMPRESSED_RGB_S3TC_DXT1_EXT"; break; + case 0x83F1: return "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT"; break; + case 0x83F2: return "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT"; break; + case 0x83F3: return "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT"; break; + // GL_3DFX_texture_compression_FXT1 + case 0x86B0: return "GL_COMPRESSED_RGB_FXT1_3DFX"; break; + case 0x86B1: return "GL_COMPRESSED_RGBA_FXT1_3DFX"; break; + // GL_IMG_texture_compression_pvrtc + case 0x8C00: return "GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG"; break; + case 0x8C01: return "GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG"; break; + case 0x8C02: return "GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG"; break; + case 0x8C03: return "GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG"; break; + // GL_OES_compressed_ETC1_RGB8_texture + case 0x8D64: return "GL_ETC1_RGB8_OES"; break; + // GL_ARB_texture_compression_rgtc + case 0x8DBB: return "GL_COMPRESSED_RED_RGTC1"; break; + case 0x8DBC: return "GL_COMPRESSED_SIGNED_RED_RGTC1"; break; + case 0x8DBD: return "GL_COMPRESSED_RG_RGTC2"; break; + case 0x8DBE: return "GL_COMPRESSED_SIGNED_RG_RGTC2"; break; + // GL_ARB_texture_compression_bptc + case 0x8E8C: return "GL_COMPRESSED_RGBA_BPTC_UNORM_ARB"; break; + case 0x8E8D: return "GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB"; break; + case 0x8E8E: return "GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB"; break; + case 0x8E8F: return "GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB"; break; + // GL_ARB_ES3_compatibility + case 0x9274: return "GL_COMPRESSED_RGB8_ETC2"; break; + case 0x9275: return "GL_COMPRESSED_SRGB8_ETC2"; break; + case 0x9276: return "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"; break; + case 0x9277: return "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"; break; + case 0x9278: return "GL_COMPRESSED_RGBA8_ETC2_EAC"; break; + case 0x9279: return "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"; break; + case 0x9270: return "GL_COMPRESSED_R11_EAC"; break; + case 0x9271: return "GL_COMPRESSED_SIGNED_R11_EAC"; break; + case 0x9272: return "GL_COMPRESSED_RG11_EAC"; break; + case 0x9273: return "GL_COMPRESSED_SIGNED_RG11_EAC"; break; + // GL_KHR_texture_compression_astc_hdr + case 0x93B0: return "GL_COMPRESSED_RGBA_ASTC_4x4_KHR"; break; + case 0x93B1: return "GL_COMPRESSED_RGBA_ASTC_5x4_KHR"; break; + case 0x93B2: return "GL_COMPRESSED_RGBA_ASTC_5x5_KHR"; break; + case 0x93B3: return "GL_COMPRESSED_RGBA_ASTC_6x5_KHR"; break; + case 0x93B4: return "GL_COMPRESSED_RGBA_ASTC_6x6_KHR"; break; + case 0x93B5: return "GL_COMPRESSED_RGBA_ASTC_8x5_KHR"; break; + case 0x93B6: return "GL_COMPRESSED_RGBA_ASTC_8x6_KHR"; break; + case 0x93B7: return "GL_COMPRESSED_RGBA_ASTC_8x8_KHR"; break; + case 0x93B8: return "GL_COMPRESSED_RGBA_ASTC_10x5_KHR"; break; + case 0x93B9: return "GL_COMPRESSED_RGBA_ASTC_10x6_KHR"; break; + case 0x93BA: return "GL_COMPRESSED_RGBA_ASTC_10x8_KHR"; break; + case 0x93BB: return "GL_COMPRESSED_RGBA_ASTC_10x10_KHR"; break; + case 0x93BC: return "GL_COMPRESSED_RGBA_ASTC_12x10_KHR"; break; + case 0x93BD: return "GL_COMPRESSED_RGBA_ASTC_12x12_KHR"; break; + case 0x93D0: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR"; break; + case 0x93D1: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR"; break; + case 0x93D2: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR"; break; + case 0x93D3: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR"; break; + case 0x93D4: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR"; break; + case 0x93D5: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR"; break; + case 0x93D6: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR"; break; + case 0x93D7: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR"; break; + case 0x93D8: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR"; break; + case 0x93D9: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR"; break; + case 0x93DA: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR"; break; + case 0x93DB: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR"; break; + case 0x93DC: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR"; break; + case 0x93DD: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR"; break; + default: return "GL_COMPRESSED_UNKNOWN"; break; + } +} +#endif + +#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2 + +// Get pixel data size in bytes (image or texture) +// NOTE: Size depends on pixel format +static int rlGetPixelDataSize(int width, int height, int format) +{ + int dataSize = 0; // Size in bytes + int bpp = 0; // Bits per pixel + + switch (format) + { + case RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: bpp = 8; break; + case RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: + case RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5: + case RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: + case RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: bpp = 16; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: bpp = 32; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8: bpp = 24; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32: bpp = 32; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32: bpp = 32*3; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: bpp = 32*4; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16: bpp = 16; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16: bpp = 16*3; break; + case RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: bpp = 16*4; break; + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGB: + case RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA: + case RL_PIXELFORMAT_COMPRESSED_ETC1_RGB: + case RL_PIXELFORMAT_COMPRESSED_ETC2_RGB: + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGB: + case RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA: // 8 bytes per each 4x4 block + { + int blockWidth = (width + 3)/4; + int blockHeight = (height + 3)/4; + dataSize = blockWidth*blockHeight*8; + } 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: // 16 bytes per each 4x4 block + { + int blockWidth = (width + 3)/4; + int blockHeight = (height + 3)/4; + dataSize = blockWidth*blockHeight*16; + } break; + case RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: // 4 bytes per each 4x4 block + { + int blockWidth = (width + 3)/4; + int blockHeight = (height + 3)/4; + dataSize = blockWidth*blockHeight*4; + } break; + default: break; + } + + // Compute dataSize for uncompressed texture data (no blocks) + if ((format >= RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE) && + (format <= RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16)) + { + double bytesPerPixel = (double)bpp/8.0; + dataSize = (int)(bytesPerPixel*width*height); // Total data size in bytes + } + + return dataSize; +} + +// Auxiliar math functions +//------------------------------------------------------------------------------- +// Get identity matrix +static Matrix rlMatrixIdentity(void) +{ + Matrix matIdentity = { 0 }; + matIdentity.m0 = 1.0f; + matIdentity.m5 = 1.0f; + matIdentity.m10 = 1.0f; + matIdentity.m15 = 1.0f; + + return matIdentity; +} +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +// Get float array of matrix data +// Explicit conversion to column-major memory layout +static rl_float16 rlMatrixToFloatV(Matrix mat) +{ + rl_float16 result = { 0 }; + + result.v[0] = mat.m0; + result.v[1] = mat.m1; + result.v[2] = mat.m2; + result.v[3] = mat.m3; + result.v[4] = mat.m4; + result.v[5] = mat.m5; + result.v[6] = mat.m6; + result.v[7] = mat.m7; + result.v[8] = mat.m8; + result.v[9] = mat.m9; + result.v[10] = mat.m10; + result.v[11] = mat.m11; + result.v[12] = mat.m12; + result.v[13] = mat.m13; + result.v[14] = mat.m14; + result.v[15] = mat.m15; + + return result; +} + +// Get two matrix multiplication +// NOTE: When multiplying matrices... the order matters! +static Matrix rlMatrixMultiply(Matrix left, Matrix right) +{ + Matrix result = { 0 }; + + result.m0 = left.m0*right.m0 + left.m1*right.m4 + left.m2*right.m8 + left.m3*right.m12; + result.m1 = left.m0*right.m1 + left.m1*right.m5 + left.m2*right.m9 + left.m3*right.m13; + result.m2 = left.m0*right.m2 + left.m1*right.m6 + left.m2*right.m10 + left.m3*right.m14; + result.m3 = left.m0*right.m3 + left.m1*right.m7 + left.m2*right.m11 + left.m3*right.m15; + result.m4 = left.m4*right.m0 + left.m5*right.m4 + left.m6*right.m8 + left.m7*right.m12; + result.m5 = left.m4*right.m1 + left.m5*right.m5 + left.m6*right.m9 + left.m7*right.m13; + result.m6 = left.m4*right.m2 + left.m5*right.m6 + left.m6*right.m10 + left.m7*right.m14; + result.m7 = left.m4*right.m3 + left.m5*right.m7 + left.m6*right.m11 + left.m7*right.m15; + result.m8 = left.m8*right.m0 + left.m9*right.m4 + left.m10*right.m8 + left.m11*right.m12; + result.m9 = left.m8*right.m1 + left.m9*right.m5 + left.m10*right.m9 + left.m11*right.m13; + result.m10 = left.m8*right.m2 + left.m9*right.m6 + left.m10*right.m10 + left.m11*right.m14; + result.m11 = left.m8*right.m3 + left.m9*right.m7 + left.m10*right.m11 + left.m11*right.m15; + result.m12 = left.m12*right.m0 + left.m13*right.m4 + left.m14*right.m8 + left.m15*right.m12; + result.m13 = left.m12*right.m1 + left.m13*right.m5 + left.m14*right.m9 + left.m15*right.m13; + result.m14 = left.m12*right.m2 + left.m13*right.m6 + left.m14*right.m10 + left.m15*right.m14; + result.m15 = left.m12*right.m3 + left.m13*right.m7 + left.m14*right.m11 + left.m15*right.m15; + + return result; +} + +// Transposes provided matrix +static Matrix rlMatrixTranspose(Matrix mat) +{ + Matrix result = { 0 }; + + result.m0 = mat.m0; + result.m1 = mat.m4; + result.m2 = mat.m8; + result.m3 = mat.m12; + result.m4 = mat.m1; + result.m5 = mat.m5; + result.m6 = mat.m9; + result.m7 = mat.m13; + result.m8 = mat.m2; + result.m9 = mat.m6; + result.m10 = mat.m10; + result.m11 = mat.m14; + result.m12 = mat.m3; + result.m13 = mat.m7; + result.m14 = mat.m11; + result.m15 = mat.m15; + + return result; +} + +// Invert provided matrix +static Matrix rlMatrixInvert(Matrix mat) +{ + Matrix result = { 0 }; + + // Cache the matrix values (speed optimization) + float a00 = mat.m0, a01 = mat.m1, a02 = mat.m2, a03 = mat.m3; + float a10 = mat.m4, a11 = mat.m5, a12 = mat.m6, a13 = mat.m7; + float a20 = mat.m8, a21 = mat.m9, a22 = mat.m10, a23 = mat.m11; + float a30 = mat.m12, a31 = mat.m13, a32 = mat.m14, a33 = mat.m15; + + float b00 = a00*a11 - a01*a10; + float b01 = a00*a12 - a02*a10; + float b02 = a00*a13 - a03*a10; + float b03 = a01*a12 - a02*a11; + float b04 = a01*a13 - a03*a11; + float b05 = a02*a13 - a03*a12; + float b06 = a20*a31 - a21*a30; + float b07 = a20*a32 - a22*a30; + float b08 = a20*a33 - a23*a30; + float b09 = a21*a32 - a22*a31; + float b10 = a21*a33 - a23*a31; + float b11 = a22*a33 - a23*a32; + + // Calculate the invert determinant (inlined to avoid double-caching) + float invDet = 1.0f/(b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06); + + result.m0 = (a11*b11 - a12*b10 + a13*b09)*invDet; + result.m1 = (-a01*b11 + a02*b10 - a03*b09)*invDet; + result.m2 = (a31*b05 - a32*b04 + a33*b03)*invDet; + result.m3 = (-a21*b05 + a22*b04 - a23*b03)*invDet; + result.m4 = (-a10*b11 + a12*b08 - a13*b07)*invDet; + result.m5 = (a00*b11 - a02*b08 + a03*b07)*invDet; + result.m6 = (-a30*b05 + a32*b02 - a33*b01)*invDet; + result.m7 = (a20*b05 - a22*b02 + a23*b01)*invDet; + result.m8 = (a10*b10 - a11*b08 + a13*b06)*invDet; + result.m9 = (-a00*b10 + a01*b08 - a03*b06)*invDet; + result.m10 = (a30*b04 - a31*b02 + a33*b00)*invDet; + result.m11 = (-a20*b04 + a21*b02 - a23*b00)*invDet; + result.m12 = (-a10*b09 + a11*b07 - a12*b06)*invDet; + result.m13 = (a00*b09 - a01*b07 + a02*b06)*invDet; + result.m14 = (-a30*b03 + a31*b01 - a32*b00)*invDet; + result.m15 = (a20*b03 - a21*b01 + a22*b00)*invDet; + + return result; +} +#endif + +#endif // RLGL_IMPLEMENTATION diff --git a/raylib/lib/x86_64-linux/libraylib.a b/raylib/lib/x86_64-linux/libraylib.a new file mode 100644 index 0000000000000000000000000000000000000000..88b2fb8f23671821dbf9df15a1e010ea2ae20039 GIT binary patch literal 2811812 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

Vy9 zgTVPYA>+VLV;$Fnp8*dSZq_Rc>bwqK9Q+A*I`CMLejjpy2MRayx`cUU60YY}5I!G| z`oQ5gf`1wL?H&GLhd<8Y&w_si`70d$0r*$ppLY0n;hSFA&%=BG{{q%4`y5CtMF%nvz{f$xsG}^z-K+*3OC0o=lc@=HH@3? z-K_81^)CVEIvxNIMg1p`&pw}le*=E**D=qxfN+y> z6Miw_x}WFZ--3S?ocp1~8-LuJ=tEWEW?c4RkZ?Wj1P9;f;3tHe{T!`7!VTj-yy@`o z!M}s~z7($O%=6ZpugSj-zc@J8w-Gq|)pDJ9>YbJ77=MIOz7e4zC4*wR`>mq!v z*KKfqj@c98y8epq{QlfUf0_u_elPg!+dy#kd7N<5A0Brz;j{i_;I~oF7I3c1LE*a2 zC&Kl*yg&}uB}srWy}ilfsHAY6Qw~1YtBS*~3BL;F)lRss|6@naIOMSY1&*9Oj+}kS zVf{Zj{BZcJ|2jDL+h4-`KP9Eef|j+u52Ffd1$d7cS(V4-KiP%roIJu!HggI&aw<4-sv_qP%&U$gr#1Xy z@VkH)1|K0@*FPFQ>z^Q8@8^|{oUa@?n;bcZ9Q;@0-@*R5fqdRBJcNH2{u_t?UOaDo zbsy3T*Xx)~xb8y<F>{~wJx^EvKhv%ib$l{k~+kpRz`a6K{1n&wy1iX)MeZCzg+|>UB^-Mqx=X(;oINs;= z068s?6PVQNoB6XXcxrI^#lh)U1AmH~X5fE=w*}|>puYp>=K~)D=eQTaS?50vo-Ua; zUvr%D_lOk$=jZR01n1}P)faBkT47#I;PZ0@&%kdDzd>@p|E0jYJNOsie4Wq56fx&q zOX+j==WlS1`wpDzl^~U$!}U!L&UHx#&T+GWKf`?UgFgokea|2F1^7ha`h0r|{!92* z9ezM+KcBCIN+MhzkJ;cyB0mWHAMkR*b)9t_`OO`?6Y^gnKg5wg0=^mBeje{<@Oj=| z2wpI;|9XbC;5-kXQ~9^#^C(_{|BE``Atzo^KR-(vum7gT_~3cK6M%mJPQMvA=QRjC zA#!F3H>1Bsoh#t;yt)zo8~A%2{vmMo?JRQMBIh=Ij{5}uJNN-<{l3u;6#n0L@jAUs z4!;0+BJ`&$a$+H;HhhlT0)A}x-5mZfaQ0^ja?GB%B>QSRcpT*KK@RuTS@1y2>mG9A zBIhN1&g&gG`;#J_*MIY8Jmh2)u8;S;@Z-ZT9g^Y}`d!S8cY92Z#}{C)6~xL&Oa zo(ws49ekj0GkOxtHw-@KyArZyqPLB$<@a|d7H;9G^8(Nkc3 z_X;=TWLqwa_;E6O^D;R+ev^Qwg`YvV`KgqsCqI1d+v4z3!LQ=*8-drt zd0;Sd-b2nf_#AgGIO|^xo*DDn15W=Z@T~CffYXng#qTH2duhP4BPSPl3h<)falp%f z^L$tjob|K-XFXlPb77x+49@&7z;mIVRp7b74+uBi;Pv@W@Ol2c4$j-_`{2BNe+|y_ zVX~}V|IMGNu}`uHH~XCXq$zkl)E^370DL8Qe(=5EeEh0FHh({mR{-aANC$8pzjwiN zV!bkC_w#xDRu*o)n+APo1-}sL9}eI2D0Ba)Kcc?o!Y>GawZq>4pY?A8XCH1mavnSQ zKMr0zhu;VGvtd4;7e@UZ!CB{V;pV5(qHn*!=i`cx;HQKCkHb%u->b*`nI3)x@C@LM zg_||uxI^G)gg@HhPXp(9W` z^#0gBq;>Gj4j!a=!>ECxzN!f~W3tXc4u3d&9!GN={sM=;+~I$xd8Pl#3^;?F5;(4J zXupW(zXi{N{TZjA*H1IwlE_IT{QvteIb|KZhT@sT|4{MF!kanx2;rt49*>_n_*U?o zsQ)B5*YOrO&y&x=xo_ha^83U5RN$;LBRKuS4&Dd64C){0;OoHS!rum76nrl@>$wP? z82%%0=DY+i4L?a?zduR9bAt1FtT=dC_~pQ}fVTlJ58hk289giZ^9cAnKTn6B4gOMx ze;AzCMLCN2^W}A5N#W+Z*^yr!JO_AnD!-ob~KL z4(IhFeCC`4=k@;saPw2# z55?efKh%WJ{oK&ucLL{r{s=i7Hw-?<-437o|3`;^5}f+0JIvAX{ze^naFX3jCd^nC?!)HB7OM3N~KUsff;pV!6ei8WW^ZW2?p#C}zzX5#C zcOW?D`w@6PJkB!-oc;>%Jn%P@!;~kE{vNSoPH^A zUPn~~=Xt5Fa5G8))Y%F?>r7bMuZQCn7jC}WDC)o0QMH<{EM+|3{27G&Lc;ZaXa&ym z@YmoR_W|<%8#n4PQ1g|ntUqo+jGINc9`_RbLh%1|__50Q`Gw)95U%sf!vC+%sQ1L0 zuZ5NT9P=}gh5y3=s}+AOe3Rk623(7Yr?-${Fd-<6u&3@l5pL($KdQ+;_A`+ z_CRt{DsJ;LDQ@e@p}4I-NO3#g62f&q%Q^gRitm&<2PnQ*_z1=K3I9a#L&85-{HXAG ziiZndq4+7`Un?FV{H$=jE_cDXE+cFB>+;`m7j>+fui~|QZnEsYDzCU5x2EE@&PIyc zd9_yD_Mwa7wr~9uw|yS2xLubq!u7g;>hO=i=Xu~hd_E8U1b)1v{_9xw*YWyh#%&CK zO1SxM5u6XN!sqSCGl%~MyeM)4>-ys|C%bU--D2>A;1|K|a%FJV-x{3xoxq!5zTXHp z;}*xbd*E~2OW=u+a}zlwknj|jm^}+o4KK$gu&AQMp55FY*dJexMIM2^>z`1|M zHt_2yh5RYPO+9?vcs=}WQQxzlC-V(>Y2@5N4)0&YY3Pk>^7(jjQgGIvN4WVZ^D}z~ zMEw!cE62w_|xIXiTareX0f8a z7CHQN!p*uA#`XEP;Cx@<0r2whPYAdB^N{Sf2=H>K{|a(4;CyliJU#dW`^{;UsZbs-+a%W zhi}1egME7+ydC&s;re`7zPZ;olieSFP4Lz@j)H~joPokkn#r=aFP}L4FW`TG<9Z2r zdGK}M%-`b3uiL_(7q15z3)gkFb?_y^^?XaUj5)u8aGl>;xX$SdzXIkv6g=8|9ejr) zzh*11PV;9)mncvcp ze;a-^;D%%^B1>^d0kcs*Xy!RxSnt4|HYisOSsNiEL`V&tV+6`Xw=6#3#x;M|Kz?@NdcE?&=eT8r>-xhTIlnq`o`cs! zJ+V9bb@FyLH8|_ZBwW`s4Sp@;9~7?VdkjAFe{=A}oxD1Y+Y7gYWrdsX@;bS;a9!tK z__a~zapdzndlxzUUpx3k2Y=<@xw?4s)#KK3@ZJtS&B1Rvc*d^&{uzk<*0C0N z82AzJj^G!B>v{d_;AOhS+=mVhK3=$4!(pg@5BPBKec++sC%{L5UjiQqep9%f*E@$F zzkAH{$|l^@&-}a&zp}%x7IH=*ClZ{W7ZIzM*MFU#$HD6g*T;1$2k+tF!yNoG2VdaeYaM)tgCBSB3l4tY z!6O|!Zf~!j=FfWAKko@QedGSg2|f(Bj|GtPA#%#XXHI2s=F~z?edIKU&z$bU^?n$R zoCe7G)RD6goSzf50yzzlvjslu*$vM3^_&o{>kRJW_n+_2nkn4$|6?2%%N_nM_(S0D z6RyWSfgCf2{hYls$f-F8~;I|$8k%PY$Zo1k6^(5%;^;wUbNw}$VEY>lnaPw2#&&A;LyjKQ3&!4s6a~)d> z*Y)&A4(lJ`@TVf5_0L8Q>t6?-pAY;UI6s%^I5=;|BZTYv|8np*4xV^`zyDcha^Z&Y zJeJep=Yu~E>sTE86YyHXb^XEcc{|e9;rDg$j~#rfgD(?qy20am4R}lJ=WoDUf$tM; z`o{hClW;xX2;{Uz&P_+oWB6_0zjOG3A^!Tdg`Y{dt}{RUcJRwM{OaJ`&ke!3pQnLe z!|l$u;HAM2f!_x|F5L8UJoeQo_`Bd=5w6cCH{nk}&J&0K0{*A);|}!u%;PALaKk3T zPv`J6!=D5{$l(`-KN)^ShhGi;XYd<4{O0hdz;7p9@8=+`^e@H@b7>`u&=6sufo3i(7{_ccqa!RE!>RW3;SvoIX<`T5OUh0&a)1F&%s|gc;HCC56sW% z;FX1&pW^30)&}p5c{N8)7WA_heC7-UXU+uVWJS&baMu5|gMaVfzc~1H@J{IeYw&sC zaX#|;sr!>exH&E|qy9ADe0@|t2Y(;=rLj-S!)JaqaPH>@4&KVayEyoG;by+v&-2Mq z=YHg*Lmv{2^83c~SWR$#E@(aBrk^hp`;T{ZfX|$RAIF^kFF5yMlF^=T^10uF9K4Ef z^Ha>J1E2f9gM$xrEDN9K{~E&e^;K5~AL8Jj zJNPl-W?tq!8TNI{zY90>;&t_P_)KI+dBoEY4{Otq})K|RgJr6Wi ze7^8t#eWpuO7T0w+bN#(z6UxgUPgFV#XAY_srWSE0a4dB=F9eHzzgr+aTVY5+~Wxq zA0vLC;>X2Lq4+uBsTIE|JiX$NglAU#U*XvmPayT=R{TBT`4!J5ypZArg%?x2jPR0* zR~KGZ@kYWcDBf0h6~%i9uc7#0;dKz?<7Zu)D@od6F6kqj)mor51?Ba(io<;a5#WM;IQ#^(6@rq{> zK1uQCQqNSy|0n(o#WM(>qj*~3^A&$j_+rIvoy!&PbkOV1YQ?Ya_xM`HKRn>^4T^UV zzD4mN!nY|tOZZO3*9qUNcl4*<~1JVcZ8egn#m)Do9AlD6TkH8@2GfY;pRCG`o)Et z$D+w=2{+f?6|F-cR^)#XlClR`Jh;Z&7@a@STcp6)yPy_s?NzWOn(6IZC`E z#RK|&XbpKF!S=`c_BwL4%1JHz_>|&rg}+w(o_uaqezQCU3`0n8oA86rYpL73 zGs}Ll^}i5aQt>?Rd-?Sh4;J24@lS-$Q2bxvdlerl57NyTRg@2L1Q;rjZaN_8(s-;NIu zu5Z_})%5(=D!;9quv5$NYS;HO;e{06CA@~>_k@QiUb3z??qbC+2|ucM{(7E&P4Sk( z0~31Rw{`Yt;QhO-;^iB9ysP3%gpX1@T=*Qt{}sMZ@!IA^+)-Z-6hGY5<8kFYXX|_> zyqMyPn|Xda#qSB9r1%jdVkycANBJ7ZJwJjUzS(w?fu)lSHgT*K0~;9Z7TUp;pVk=O;3Pk+x3SNyi{z+~R{?YjIZpLdj7@e{&B6z@IA`}wJg zj~?vt^NODwq+;_b$Ie6`~3CwTm^;tM|ac$F01-*#TX-+BLTrFdWA zeHC9NJWTOx+r6AQivJ}%T=AcGcz&ef{dar3SW542TW7sJ-oINZ{`Fpuhbdn42am5+ zeD{wY-=}!E@Jos}+voX@74IrMZYuBlw$6US(#V-oKrT7iuk&53J z9+)nAe;y0ZuJ}vgB^7@sJWTNpN4?znijNV#LGdu*`xGB5Jazi$bzc10`*&l-8y@#~ zPsMu(4^#XT;qw(=EPRXNJB43T{E_g4^7w~69`lBK_2gE(vhWIucN8A1_#okZ6(28r zyyDA*FIN0#;oB6yBRpL3_fB~AUsF7_@Mnsr5gwS)`#IZ(!oqVaURihr#XATOR(zoF zzKVY$e7xfQPI`4LR(!JXql&*4eo65+!XGRCR(M=_e9O)^?l0cB=@pMBypZDYg;!BL zf$(6(F9`3cc+ykexT6%mCVYnCXHR?nYQ@9Pczmbgv3~Vq+`5KL3T66Q=l= z!sjUdgYdPA=X&Yo>{EP-@Ce0c2*0QJa^bHPj}V?BTl7A>6`ou15|N%)R`E8%>nlE7 zct^!&2p^*O_rfPB{+IB@is${ut7nViZG|6Ie3|fTieC`^O!2s{y!?dOy}#`~DJwj) z;vvF|DZW~G4aH;q>*cmme1P!2iXRjnrg;9>Ud~#@rwBi#_(S236>s;(%ZZ!A``ga< zsqplQ7kuk^brfGOyq)6d-g*91#qSAUuK1+?p6Lk)*rxa@;YSt!LHH%b{}KLJ@%*u3 z{Z~-joYCjoMRWXg{$3o9k5as<@EMBt6uw&V1;TeK zepz_9;u+(5Qwse4pZDl6X8q@n(S@zo+;n;jb0nmeli86cb@3;%AdvKWfgxWyuRXjvwD6< z#fJ$WqIkw^oI6u|Bt-40gtM>_J=1QV$jGLENW`8 zjyUS55rRgAN;Q!|2aSpnB)LW;5)f)kFochKY5WK%(}3Emt+ut5-f~-8ZA*JCrLES4 z@DUI&d?_Gm1e632P!Rd%{jIgvo>{Y*0or^2@Be+C_dL(cobx;DtiATyYp=cb$JyiH zVZpaM_>TqmU7V-~e-Fc_n}bgkJmlb=E;RK09Q?O}4|4DUK|^2R;GYRT$-!GLGW4?@ z{LPCE-tORky2Rjz9K1m$uKkxJ=6BPjhCb-vk6dQ((GK1{*Wi;Kyy^;rKkML62|mlg zztz*w&vo##t}^&i2cIT*n}e^)>Y& zF!&S)KlLVqzv$qXM-2X&gMTP^qk}&&(9o}T@Qhmw-tOS93Vz7Jb8j{D{>u{e@Sxy9 z2mh1ceH{FmBEzT1!N=TY@Zk>r>g@)vb@1Ff3_i`lR}21fa1r;ox1$4F0TxNAETGY6t(;eFhKYCZ_w-;RY{q z@YUr8AMW735e9$B!Do*&_-qFsHrn96D-zQkU2X7g4qh#I$iW{Myq|+VE%+b@e?jmH z2cIeUBnSVE;L{!aPlC^M@X%Nz|LYF^tl(=MeE7qL-u}N_I@Cd*u{8z{_Ds~z4#5XG z_>pmjezJrArqJ5D;FHxQ?Qw(0<;OSEhKHb3wJZ12i4qhqv>kj^k;ACz^{5ioZ9DI)8lO24G;LkdEMuU;(H3u&ie7=KM3ckU?9~Zpjs>J+`m|^&jb?|2e zpXT6i3O>`pR|-DY!P^9Hb@1$`O}g71{NDxl=O@bf)^mnFstyx75C7JRgW&lY^L zgU=KESqFbl@L3MNN$|N2{-xkc9o+X5lixN6KV5MDHHrE;=ck4~=-^ig-p9f35WL92 z?-6{sgFhg6t%FYxe42w#6?~?H|6cI<4&M5b$VM!87|L%K53_0SDjopN3B#2mf5~Vh8X1 zOG97j;O7cH#lbHZe3pYx6ui;Fe;{~H-$eO~erM7xa`0xshdcQCKN$KK9sIAa8~hCi z|M1TS-{s&B{oUZ*zLh9Xi{O16{Gm4teT9RMdDGyN9Q=ENKkwjw_=ll?!@(nO8GN;a zmk7Sy!D|K2ye?7xCj{^A;Li%4=io00Ug6;XG2h7Zn1f%sz~HYrc*bIbw>kJ9ml(WT zzeG9jTWat;2j4DurGs}_Zs?~w_zuD6I{2+C4SnXf6VrWC7Pdzm{Id0izQVyD-C*$T z4*u}R1|NHUBL7=IF?frE9}+zChD7?ywix<;4t`Yd5(mGp-Ox{Q@NOLjf5pKM2)@C= z8@3vHe?g)=-M1M$*THK94?B3X;FBEuXP+59uRHjQI}N_e!B5+5@IaxD58J;8?lE|g zgJ;V7aibmlGQppB@WF!5cJQI{zFWJ4|3L7}8x!T3EqHea5AI82!h8ph2wvpim4a6| zc!S`R9sIX~zv$rI_nUM#JNRb71N{@_fBc}KuXOM+hYkLkgWq)2;CmeW_Ox_n+%25Q zf8;3!&v)>LvJ770;J(fVpX}fh1fS{Pp9wzS!3UjY__RCte+!;HAW_cCPB-*<4qhjC znS-C1ZRl$qytm-f9ejx3vmE?s!F@L+%Cq=uhJTKOw+o)<;5T+N^hFLnLGa-YUMKh@ z2Y*iRXC3^Pg1_S6e-wO=gFk$>kth4+#C$y}c*Mc$&N1{;9K0jP;4eA&SAwr~@abPS z^qG;wbRRg^;5iOnEqJbjPZYes!5uhr*${-v^w}4!M8j3YQaMT z6Z7@$^9-M22mgWKV;y|1;4>Y(_cslnxei_>_-Y4#M(~_l66MJY7(QVKe^~J04t_-N z*$%!nWcX}%@Cz?9c=oM{>Hc2upo70Jcs~a(yWH@pbnxc|Z*=fya}E6-2S4iyg9nNd zL5cidy2;>`4qkGL!KXO*7{NCeV2n@CV1wZiRtzcJjcNc1kZKw zh~SePJVV~Up6=jR2|m-oO9g-3!5V&jl}V@V5mocJQ<1|Nllicz?ksJNN^FKkMKPg3ogB^@6W;@O|<>f7=~A zf27fyuQ)NkWrBBe@LItm4t{ox;q$D6e|>_%UvY4s>?6Fv!9SAye0Mqc+21vM`VC2x zvrzVx8|2{Sf>${B!-7w8@W%yz-odvD{)&U2D*M*?dXD?v{jUalW24)pSARy?gdfyzGNZdd85*1ychC+Ox8HM0ur)ThQnI4ejD9zMd@T2)R!Z_7Ym*t*Y>AG z(%oeN`3*SNxws~t?(>m)V~?{RNqiuXcSWDzvV;Kh|UdloUqk1Ir>`HI7VlI#7q9Krlk7+sI=d*ek`CoFLCt2yRzrVzJ zvgcos=ku64{^gfb`};?E-lbbB&j;d<@)@N?hyDGVI_DemwNIYc7@gbaEdGvQuKn8Q z=Zasp^j2^7dI?UFm0w88&yEXH`B53!=WY3sJZ{>6e6uGR{rhe<5}yU^Avihrd9q2N zq{m{%?6*t_^?fe}@rj#%s-DT7e=*;rv@Y@SWAs-uZglzBk>h$+_X_ZlXMWVVL9WTq zXY881tNUKbXTwi>bU@Kf>1lC^(tOt+!=IAR>xc_cz^4ViF1|B-qat42Jo;*>pB&8c z)q116>ZVcN&c$BOrbo)h-?xZeIPpK3GpcWfj*^IWW~Ncj-mMqoF966J`GuiBkFbB2nhh9Et9OsC@2qJ+*=FMTh#EcYAe` z1pQSY{;axiXyM&M21n|*_n~YyMh_N77e<=e1JTT2WX9y6zn!QW>Px4pOowVmWNT z7kbA&eFbF~&*u`;x}9EVSpxI2VCE>VY7Ge1r)J$1R9*%T@V;i0a#nO-^gX1}2(2_q zTFW8Cl1S6W0Dc=Iom z&18N!>rc?F*?bwPZ_bMJ-8O!GJTcA|${>$&)kt59qcEke;b1pN-R>>?Y={>+44^WY zv)e0cA>lg+#oYw}7I~o+yS>sCUT7_T@F`j4h1T!(?tCB5lm)YAbh{QhrE0U%>$S>z zDg?h&h5HlRaH)?LS7Xo;1yB9)sO2d>e z?tv4M4l=dh3w?=OwZTBx3oYCoru#Yg0YS(M&9liD1w&wnhZrz2T!sneF^z+Cb*+H5LfTEj3rG~oGHJjuu z3kFEPUwS=PJ<`dW@S#EaC4MrqU|MDH zDpKxzpuuQ+Q@bB01#rQ1o`dsnVRR9S9*;5uXb@#Kj9sJ`S_l4IpkAoSD<<#Aje^&+ zZNkO7yBX^71ke0^PZ*=t-?3S zRSodw9K~mEWX5@P8ID#2`$Q{){ld}OU_SKW&8ZCry*ZPESB0bd8;XPZw&cmZ-wI#P zc0U-c1k3_9z->h>+19Ynz0h)|#=RnHM?jI4`tb^SyrhEc4T?hcVKKwjvp@GwW`^I;?^DuHQYtD_KW3VJDFpmBFH-85O|@08>o3UAn2z3(YTzej17H zv?AsPZ5=3r;Or1eCkG>FAHWxq;~Tk1Ek9KlmHm=hs(f8*gE?O4L)=*Bh2FMFp`~V? z;#HQn*K=d64w6TPGnzL~)j=qx zWS%!gKR_`=*ZXKsIkqQ84VyDGtK_q7KBoFibvmXk%-D zYp`w&fVgF3A0=gIgAnk1zyO>p06(hn`>9jmIzcTho{3wPvU6fh_66(b+LO%0P^UwO z*b-o3h=I)c@r<2S52+HPL(cCp!XPt7r=;OPqMcF7OOY~+8{epxY^;u*rOG`biA~70 z82E{l-0={slw+?WZv|nU5Q{B_a>1605G_lBGcVM_@fq6;2+*`&_8|&ly~Jm&N#Zj^ z@UaHUMDeifBGNrPk3Wi97TqmP)C=O~yg6GZ)!kbP}q0A_YBQnQ|0asJ#ZvR-h^AiVW>_> zJ{S*IZ2N(l@|icM85szmp$JF62uF8BO=OLSP4kb;8MUKX%Z<#amU#$F~S7c zq`)L(TrQF`E|)4J2T8HCz@e5KDYygZfzORaLC_CT*HSYDK_z9txKy2i`sTF0W$?#S z3lJ0?EC2D8$M#Svp-9Y2p0x6ehD<+&I{?N>OEb|Gd^+w%6@m=b@v?RQUvSfbn49); z8>cpgy*t_{RO#MP4Ed-l9jk~D)VlzJ7b>C5U}5w<^pHc-ih}2Qb3TZ|+eTXu>`e;? zzd>O(q6Z#KVMP@F! ziV(c?D?)AQV{76<7!teIqUe#Lc)JaWtq!4d30WHd!^p%5GyMU^(LsJ{6$ zQNT&C;rt_SXj-`xk`)^}7%DUH;hD-=E zJH8f0ycxfrLSq}HJztCVoFc~%_x595PmH=~XL1sHr!h#@;lHBye^SpUrJQ6HT33vd zVq!HM`9G~;?%1R5N!-K@8uic;v@6do5lu9HQ;=f6U#DM#w?Ef);c))~W8s2AKXjZ%C`@@^1_GJ?uTRKQR{E zFQXSUbc6T?QlP#J+r?7#JIN6MxB(st4#2{Tf_=m(+K%*Q5 zJTf3{TsSrc(1uYbc!)!2;R?`Lgmnw&_W4OzI7AdkKJr@0CC8x-#*^Yh0MwG98(xcU zcx)^TjR|??qUc`Lk`*%rcMf0@dDLkyg2yiON}*nap1EQ2zv#g?p$8970)I|k-THGW zhEzgUka!7$*pfyC%m!&Jg>*=RPFGt$e?sSP2OoQ_QmT>_9!rlu6p z70zvkxO5AArP4$g{pv^EE%NFsjKA!L zn=nQ200}uk%s6?y-eY%ZoH2UY7!b@NiPq3SKjf<(Dp@2@X^n9T%I)2q7aSABSqd)X%)9uR|cA z`mm__-T%o>tm#ifc&qw%AYla+E%~*si2AriE1l0?6CoPBrV$f#XiouDvJ<0oI2>C? zN*9o;Ref6;8wf!Yq=nC7X>6A{yX{C1=f;OPshDv9GRRUAj=R^TrctksOt_vWn&DO(*Ii{pj1Y^a4|TCkM?5Uy+n*8YSCG7@JR50hBEo3NSGE%+IIlrxFcf!Q>;R z*-$sdOY9;Orob_r032ft%p9i`98$rlBdXhUGEAMw1_}YYkjbl81ubDxA{)%UOvTKE zyfk~h31aHWe%m7p2)E=p#Dl2!Df34)zzza3pM)r4G zp=SV_=ovI;M6(gsOH7v)lM5gq|Ay?8E$~8Haj%_-IuL(;fQQOH!k00>(q_6r&c6kZ zVFU=GQEXF)sbo9`Q!U$#8|fbLpHGM)?Lt8*jUy<+jePk)|DiNYkf*0nx^y&I=>aU4_w>Nc7#J3zpL* zs$Zn(<3Mz8r1R%sS4Gp`m~O=YH$KiNcp;6RE&|>N>xB{USpN#x3({z#uEo4aXM#CC zqDf9WNWPAezwiEC?YC?S> zGXqbQC#>11u*X!MEb?V$sSF0-IE9U7iXS~N>1}ZyAQSsA)Kov7NnKSzhb1ORYci35S1WGXe8RgEYM46W*(8~iWvR-sP~txCwOh_fq2D>?vH-K z%DAUl#9A3$93s(;Z1>rO_bd2x}1-d58O$xTETCwPKzba6PkBzi=IQUmFO zxE}7c>yD_>`K^g^yx@geVRxpJfK_NXH>*itmM0#|W#fXTmc#GS)Gx)NBsdk$W>VoN z>?9Eqm0&m#=C}!-nUlAwpO0Hup5}$x;Yg{2f~U9Rs|s`X#w_@PzSM)>WfYjA&k)*$ z$D}!w8e+++xFf8tY+no(xeOoE7#Z&NibaE48)SzeV*`ma?oIu!2_W2{Jw-CUt=!qL~QGjkq=%&!Rin2Q(cfNs#_m9&GVBlgTd z!>}kR!-3RtfZ-d|IGMF2MbS3H5S-9QQlbrv&PSUHXhl)9Jw}5R%N77^QYljVix!GM} z@6^xt-(yzXVZzPpHQ#%p2f8qr|Fs3(ab{wt|MBf>p;a;>ZX%apjth&GzJkSk>@D0( zU2?7@G!#0|t4~8T9i6gKqhO!E5rA2XCsrJKR>_cK42qPRG?uEX>UG7qsAbLZ<6o#k>L`$}C1}k6+ zCUlB`t}<9gkr)<);$|5wCIAmOp_0SQb2NxezhMxrUk^SD{o&-L;Pd8WR`5lO&^mbB zniZUBPTmO4GAFMGU$Mw*I9W6$_!xeCzWn|;ox-P2(djfkWhT>u({T}*@kVeqe%UEB zsB;FW7*)3e6aGAQOKmPjBSp)q>wy@AS8uhi*oR^$i7W~S`%sDr%eE#5D=|tlmL^4O zJDwo}_=?Q6kyGqA4euAAd=dBRGVVABR%QzXrNNVx$M1n+z61}L?xHuW$y`c|-kM|? zP9qAQmsDU}e2E$tUy6cS;tg5r-HlX9XIMU14-KkCz_6FazKwYfZR&iI6Iv zS98HO(a%g=eKVORB_|;b9z?-V3Kn$0+>=dmRZ_FH2KS1ClQBtY&nMX-XEI|uHUkAx z$eAjmnBCBVa2A8fQ{~msr0$~NWPFzeksd}noI#bO>6wvit%~^2K9Yp2O1F`E7-(7q z%Srk~>i1=OQyzsm@+FAgnDQ73n5!tn^uIA*Dkj%mTuSxC(gSiKSgLr4Ciu;)1sTB5 zFnnJqjKIGn!6@KpZAbUG`r>jtj_@h654%Df0>jt<(J?UvoyV3Yq9doGZ|;KzsdE@6 z`=Nm~E?-`nxP+D_w$M#<6KQr;j3z8~00V7JYM_lDhpC|Fj-|OU6@)f$Z>5u|=#mXm zCCxesi|!@*6_Aun7+HY*CR>*1XLEqqDXrEll7T2>+F`Qyld~VHm|{P!$+E_1F{eq? z8EmvVkc5$HCFLH;I|-Y$iHE)En_)3~;Xcy5DG%ec<8L(14uh#gLo}AgE^FaA_t1hR zUXPJWOPJtR(C0Iw@!G#6AHzAGmnnn5SU${5Sm{tVluq7#w;0!PnL4&f?OFo6JZ6Wb zzNvbmC|j5eEjc9%MGJ~ShJ+U(cybL)BPYrz+!P+&%F0ILnrP=#>rGw_pMOn*$*QBt za>a?H}U8sk36Nl1o614?RAg zx>L5Njy{+gihO)KE#;yZou@J|l1#m=yeQ@+uv)DoHlNWffjWAV=qZIz*z;OX@rvp7 zv_@X=0iD49>EFv zV$P;Zc0ZU+D-Pb^%~^;*IX~KJ)-(p1w&q~DV|Rp3dFXw80V;Y3;UkZB+r-h&9@Y+? zl{}U%?>)f5L!Bk)f_0^NHxuKdONQm)utoG1OK6mPDM+9a^xY7_!2Nff9&Ds|4ipI4 zV6T|gD??LV(h~MUpEFe@Q_Tkz*DNsE0Hln<83dzc7yv2*$B&tIIMcQmj_9?~I|aNj zw}eRJJjXI!E8peueI!eAVXPf;Rq)-_F)mctBq0VwDgOEj=ivPqPzX%viws6yxHIHx z13g2X!Zw_c2#}k}IE7lK*=%Uu2$Fpsj_X+i)&IH+T@OuFXeuR~x*+u3?Jq2uHs%5-0Cbk&mS?*%@mtn(-R< z>5HI+X`Gh-+xUSD2*ZPDFA`Vc#)!;F03@YpJs2N3JS^I20fG*U7kZDbT9fto*bzV) zbRi?CzQ^?bkaq;{a1JbP8P7K8w|pvS1`55EK1hnrkvR9zaZL^hnmND;!%i6&hyjU zcqvABB`rQbHmMZsZNZuTI;QwyFBO{^Rb~$V0ZBqg=GZQ8Vf}opZldnp)Mj)TiqKCO zG!QGE2G$?W^rnsnMCzFW^%O=w3rEo#vm+qz*ppG$+o_)K0Q_3;F;Fq$)gkVNu1e_M zd~1dDR)l%uOfr+aFJQAoD>2;Q9sU$KDbuEWd?x12jl@V~(#bI~JzeRyCDX6ra}se8 z*?{zzF|&mW%*d*@15Kt3pMOzTJQ3jpTos(nu_v!9o{V*ROBH0LX6`O!p>gZd9TjKT z7pP&FV}=_EAeSG*ra5&WMZwW0!HKF9DT_i;Je14=&_cliOs+^-v`#QAuiX3-#^sa) zT4z&9{)eW8w((@_(~JU$NhC8Z!{>yim0+Td4aBk(H>`hNP031tO=AAZn-#Atc1)gm zn3>U(W<{D5?}_Mz3@WkOutEJ3Jd)*wd6>L#h7#griiK62%m!Hk|3-5+9SKuW11Z$t zWePBhgx&)4|8Pp3txB4K~;PZs{;f}`{Nf=?0jpdn_ z;?N#{o#wqUWal4X-;e!J-6F?~XT2X*fG8PN-(a z+1kZ{&}4Vo%!QWlm3)-i#bIG24|DKf!0uyQTo$o7p{q@mV+cVL!Z8+{U*+NI=ksP0 zX7dx?Z3RX^uZAQpWQ;D8em{!ME@Z@tBwO|;vEG3Nfp%r(WLz$@R3Yg#Er^h;^L_U^ z&dyqEj`7vlUM2m}wC4Cbk+RFmNiLkiHW}Q9qosmL7fz*G$un>UX4hv7ID8v+Y4Jy9 za34|%{x%vXp_#xTut>COsA$rCf#Iof*Ft&+4V?`XTc)W#rU#Vjd3q~?Iy>kQZRh@u z8!#&mkXjV9I5~J)#KTk<1FHO6LW38ZE(l_{?LT~R`Z%8U6N~)J#uiS)PkN4$yC^Pdu@Kf z-UVsnsTb@#t;ii-+Zs6!WO%e~R$U9NZ^6edX`waM`^ZD^K0CO9)s$Nh7JP~iwrARa zc3=a>iWX4sbO8#!WG!v1gN2(r8w_?aO$-mRx>HOjM?hqT~R&^96aGZc(xg(La>VqOwP67NplAUD65KL4JBJn&M)$P5gJpa=2A-@u*+t;`EF=wEPc!ULv#>i8}0 zgK$2cv~4+UnPEOq<2>BNpjyc%CWDwcgsRIvfU28G)y+JJSGu1xz7HBdiW~DtoJI8q zFmd)DlsXMpaJ4GKdZ4bOvj|x0g*a*>fNCBoF3TiA3XNpe&x18J`s)vT-J9|=aKS<= z@Q@m_1T2Ov4|}~jyr*uU5Dsf(@w#$?;LQ*mTSgYaax~XabEl zA_|lhA1KL#B;h_#9RWevQA347#qu!7ieQS0l}0!*{n>FI7;Xb z1Hx+aAv7hZiSUYW7t(n9=i=29U*AREZHv&Nqi)#Z#6n-#AI;Or`Ue|wk=vtUg15=1 z^apXmh#AZYUr|Mh#SB@2i4w$3_gCxj$i0Y`D!1%OCB-9KM)n} zj#I-azjgOdDm3K zLMRdmQmBjbaY9d-d>52#l#yf%%+D)T?T7*f#8{kuJXH>f5_?LhGuRdh94p`jVEap9 zH?$5Ly+wXS9QmfZocmJv4cvgC0L6<2W>W<*-^4{2ECLqG_Tj7sC5T}KQifs!QPhfK z5SUZvS8jAKEyAg@9@F)fy9Ro*vy3=O?gO28m*^42EovWn@MUKk=p(!kMthXdYa(1A8Bf~XK(Jk&I! zm9n)a-IMe?b}&D10>6XTRAa@7SBg=v&MU>d0T&jw6h&!?AI3Cn@xmRk;AF$Rh>x9y zF5dVH$RL5=Mq$R5uo#XQZ?o*Mr~&Ly8K^^;%J0A?#P6W+5jw(aY{yd-T*>r~k@Rjb zxdk$(B{+ji#F-hGb1W)FwY5nltG4`Zvw8I-#vRSqKgk|)^x-T+G|m-Gl&B$Naz0BT zJGX$P=-5NeWY8ZZGv^e!u&kY2Sk~lKjbG#UjOG18Y9MTVW3RN+oBAa>*<4f!J+K6? zWcCSx-cgF#*d@|?`V_Mi0ZBUT6<4cJT$tMd6GI2HJ4Oorg^zK)8g90B@gCX6`_j*h-G-DwI%SY9U?@ zMF&5+mBT{LjtS{E)!qwf?twD=m$P=u$XyPm$~PjDUq~v$yBIBy4p9|4#ii6SM#FF? zy^eF#>-CQJWKW8Tyb?_Lz}WEMFq&w^(zuSZC|HrsYHVXrM4^pP4oIN*`XiX}?Se>^ zy9;Yb#=L|$G(2O}VU81^zYysUzd`v8&~L}DnHj2QHdfPNUzXU$q~I6wjNu zzvCN-e<+}a>C#IykREOl0_CBRr5APa6aD!KvVA=cp@31+C@~D3qOM2vIC%|SQ&d%ii{{wa=SEk37PI} zH1C}unr@+JdMbsQQxy%P-EgghuJ6#^G`Q2;{_n51HAmeth+Zg-d6_D}|+-S${~k8X9{KA1pjA8BCsudmKg- zgh-|rf$(S%gppQWf+f;X8AVKZH1-sAt^lK0hh0JD14c9{>zTd0K#X1Tik+k?;}OctMTUJTx{R@mZR1V?&$3fN#~(n(sPCu51Vi&0 zA-Izz!9L}MSJJs3FJDjT1jkfY4E9A7I>K3o@C-Riga&LCRIFswfT);wiv*Ctvp^+f z#xLaK>|>De%qv+C9_YtBa;;Y2GV4A?g3mWmN3VbsO;G?XAHgZS3QoT=T|b*`;1$pU ze#m3thx#sGhrHmN8AL_ROsuHnm6ylsXXNqurbVny?_pA9wd*tzdOXg)8~NQFY8GJ5kQyf>W6WUN za6>*ZTWfw|^O3zi$JsCl+ZUcu!=xuc|P9+6YjT@nd-#-Fl3uVQ`G{ZpRO?X?peN`0Tf@$brDT#cU}) zB6IR5_$L$y7u5hS)P`ay{RAdWI|9SnVb|;E3on#aEdfM3iEe86EYSicSwF^$;b3C@(3t{N7^h=z!600@z+)Da- zcT|yAwRHf^#1L1yF$}(`bSp?3iL?nPpHZsqxGLE}_hFr7UlM1oTxj<>+MsHWp}c*# zL1J@DiD&0i^FoaYLb65t(i~UDtZiWst>J+|ewAuCoIP~~;G{}6fn+#2NAi+r*x<-` zKy^?;fYpW?0Ov?!TKL$lCqGA0XvEQvLH;TJ=98uN1X7Trg0Pse1qDS{B)JL4%o$>M zN)dx1D3G!bk%@z(iG$|d`>mvh!_df`N5QBaOor{`&?*<96=)9-?O}Yu<&d8!p%Flw z`z;^%wnKOdgMtKiLlRtvQIpAul#sUt-o0Z3+!xzZvQa?<+;gdM5KG0&oZtqx7Bg4a z?xJH`OYS{mprj6N7|Sy;CMebna!ia>A7InQ#e3jf6}v*$AXcE8?Z9xODNT4n@kOz= z18%lEm+vw!gtFvNgv%G@P361MmM@LdLfdGB$`Cp^L$)=h@k0;fGTbzSuvp27Jr!Vl zrDWD0LRF<$Zw7;;jub*nl;}1v>%fheG#FV1nS8~gKCteOH`-QkExI- za^w^6pgQE|70}dFAwYwPQh%B2EjpOEf}P0~%C!{cM^~jE;n}s|hJ72nQjDDd-b$Cy zL&Mu zsS-5Ou&01|_DlF4vfwhYM2=d>e}E)J)Mi>Dx8oMExPW7EWNCJyf##iQ6-3=i;~?9P zvA9J4R}{tKiS_`wnSGHcwr?=!yU4k&pf4)h^QbXnyTWQjZsFK`&}V`N0x-o-mX84 zafqSpvUUMSj;SjQj|zr)X7gb9^h02YS31xV=HqM!&iEYxS+U=*<7_ce)){*BrpBZ1`{!QIC01ToUAQoT0AS2xO zlgTS!^mcUvIYKi#hJ2b~3;ag_wVhk-;ucZ{0d}VaWVRHqW>mr6O6TLZ4Zlzbwc*B>biFIS!BE*}Q2ch{8cTw*e9TYQ>NPh(M}t~fIsEdcn#=EppRi>c`!!QE<8v}^q?r3 z2p{$dZhVRqX~U#a;zpfqm>`~m4u_E^CY|yGHw|Wh6K;{ZKg9`cf`plMATZ-$)a68k z!h1s4|37NOumR<|krgj z+m0Uzmbm4iz=f~Xh6^A;_IZqpem^8pOd#e}Qyj*|WIG%PPfDSWlBGm-MEWHJBD)5( zofQHpr;x<7fzT*COewucN7WEDtOPq=&|gxadq5Q))`W8mT2d#JH)WtyQrM^3Y|Yvl zghzkCI)g^=AU^Mtq-GTY)+hj2p)*KQQaP_C(AF68p4fD(ib6cv^aL>g?+c2)SrxG* ze}qU9521=k@3tjYh;au%(l=8>w2Zze3I4MSskUgEvZ&x7zOhJlj&Wz6jT>l%%q!3s z%s?qyLNhE&&Kw*{5jVhZXX30Q?#v-G92i<8>&)52Hqn+DsK`_()a+xf5TaFmA~4Bf zI3cl;7P_@r-2y*6LH5ozaab2WR72XPO@U}@q*5Mjqzg2{JkUa~0@>$Rcgd_2J35VQ-tUd`SMjm^9wCE=S& z!|W&`{85+9|6j$JQ4+$4<}*sE*9T9+|IO0k^;+RQXR0i-Sssag6=~WTpoflv~- zS~&m0ZhC_x$e>{VWxGvRWh2qs^+BiyWv#f6I#GsEUbNB_Oza06v$Y7}nL7Aq6ZL$OMSgQ|I1E4JEkl@f{WH(SggLi3*fF~_p8 zfru?L>L^RQA|v*)BDV!cjq2&0KZT-bpE~u<4JwPj({bfy=kr68+ zGrCbYbQiW_#fvyEG(iOXG!E#~REx~`b18y44YHvJ2P-TiTLMJAaGKhqa$M-WFt4!p z%55))qpj>IjoMA=RpS9;7`H-yY`tEuB@@D=-FSJ5UEmSk{Tja%YOH}Q6S&;ip#i~O zLCXxt$IXi$Kxg{%f%qXb%Cl3+39i0aTXSEC1Myfn_& z;=>sRm$hCocT^AfgK=9)8dTkpQ#8R_y=YtA$vzjC-E|aBSOM76osL3bbL<5Gbrp5SYp?qnbb4&CHN7;7_$my`Zk0-rC31A zOA3(nt+IL+r)#Mz!sUUnVYuV6k1{%eHf-I_Cr1Z^M|K;zBb=Nj>MA@yxo0XN_LAHgv4_-lw}yF9X{ z#)ANuj`w3YxUK8ePFu?3G)Epmlfw_8m!T8c_G5>tyHN2<#8#A!vFPej zc_6lk`QU}H%W8;LeNdV&?4XI=k|_44K}NI05K{+U@g}dBS}`V|!)ORRmeUyzMz4c@$e3Dod-u_%S)>Q5wG_)@pa?PAy$DRV(IVBM zl$dScC}fQ}A&g7lx%)mMY_IvZff6R*5D}a}0KarEJkh2J-z8m{DMfl2a@!e{5B`@5 zBm@!an%E+E2oNvQM0gnmiWj@T9l@@Cyf0xLZ^nt6_Id?21GV?#yRf~RunQneK_#^9 zht#CW@z@PM-(xpWjn^OZ57v*}ux#m4bkASE5w~x}=Z5#a#Ra(TfAxW<`{B9keZIy* z{1Z7oKHvrTG~)9ZJ~JC%{q1Gcwa>?g-Wz(9e%0}qI`{c*?%)4gflzql{bS0j0=@Hl zUfDD6ir#%Ml~eu?Z=z3oHtl2_j;eFQVbEz2|n za*mAgJ4T+Jo{m(XBzfvH)62W$6p8@3xZjOr#!*FIH+S(T&h0P0>8hwO?{?C$E zO&{(uDC3nh&ZAAjR|K|` z6R&VOG57g?Njy))>#?+q@24fpiqA*7e^z+yCx+masLO)%?MjuDzeb^V^S4&;ekUW- z@Qe#nh{QS!l8$hoVzO>0iVph;e(}kramMk|n3g0BvXhyDUqy}WiF6A)S#TUXp|aW~ z{9ejD34UWU{xcOj(nUYwfrI`;K*^@-__Jvl1u&h2S{}36$?|+HF@epdS9i&xGJRg~ zdo5mK@Ye)CTkt!j9Oer?n#%k{I)eS(k)GWC$fucsC!g;HN&_{vK0W=1NQV7gE(bh5 zAA5Oo?>V|x0MdxuyH#u#WlkmB6q>*D4v&!%VGaYk}oknMFR--M%67kr(F*UXHJ?9)>?2|P~aS}FW=`4s@4 zB6!CMbT>R>bu!g)L)aob-UdICbq2K!(-Yd8g7m*78X~nRKGPuknknr_(&xrzymo9m z6#{ubdG>YUgJ-p`O8=E@Cyeck7TOM?O&{JRFMS%B4%^ifx%V;2aC4X085!%+=q8ot zOu4u5I5wf%iNz^wn|N&(UZX_M(k7?!`M0I=SH!CiyFLWd;*D|^H2P!)**I%bwUouJV)tGyY85!S+-Fsf{EsEL0TWk;1KF*eVLn%?@ zJ5g78>9?r%F#?h{q5tuT?dRq$k7Z_jFNOW&gI6xLMWSOEeWj{nwQ@WD{J4fbOuM;R@Gg=L?xsA5B-8i#(PRV}+><%>PKJ*vP~t&JrU9pX z(n0dkK_iKT+r!@P!GJh%dlSE*6gZD$_@uE@^z=fS54cqA*qv(y&yFGHgkw6;+rEyy zT`2StT3Fb3li*fvd*fEYZ9XkNNO1BM`WV6&onrd2_wM17Q+xpn$ZxseK?i?8aHFUA z&4&ahpP>)#J0ZV$8pQc``T7*osZ{q&=kgS;cMA4R6?&t;_?-s93*r!;{Xp=rgHxP! zrn0NQ%KcXax7SvGbWQXtgwFOkR|&pRaPD{F{6l=)vLcdgDe&DX@FOYk&ZscS_@A8u zzaRxpK9BOXocuHn?)&1mx8RvlWlZ_`eBTm$qTplrDTL92w+YUDSlqiy@Y}_pxvvVm zT<{F3dfXocPRp5+N z1#guC-!FVt2)_7C16ckPOOZa)zh-dm2jX;x;MYqiGueJ`+v{2!6PS!E4QruUPPhFEjx6g>ZVm z;L8Q)SQ_{^!8Z%eeIeitf)`zE_;9}lr~fJVCc%GbZu|Z!_@qk=!2KDVE(M;<9zGWO zW^q8=cLDug!80#6e7HY?)6-#>q|a(<>~L`30>76CKHfN3pUqdH;0=Ov9|82Y3tk%` zE;-8YUmdogkrlkSxEy5c;>ofr+@jzX*QbcMN|UJ1!Oc3Bhgr*e3YF2MxWA zA@>X3!!(G#pPSphGZ8wF9vTJbSQ7WBk5Bli)rN4m(DxVo0l{soc(35U7raI2zbp8J zu?Da);|~PC=wX9T68c$!|4i`yg8xnMHo^ZP_)5WlUSj|oLw+jwpQWMTI1(gBfG5*` zW+#*1JH{J696RFlJi#BHVDMP%STk;P`Ph-;dXDhbj+``@&*NuzjU3_YS=7IG9(`ZU zr}T9dedW_vU;4U|zOJFKYw4>Gef93m-+ZgLd6Fr5Gf8hlW1eQ_S2F#TOn>E7zQH4F zjV#3@C)JLx8R@(EL;yssEw6f@a-=U@Q$BIfm`Nim@AlPHf{|rWQ+eaa2gXzZyuG^S zq4LVBM&Y!7b!Bx;{`mWG3cCK))io7Y5`Oo{8t8*h2UJzWdGcA&m@1PDo!lLR2G`b% z85_F_mya7g(mdIJOwEYOk%J*&b&YS_n5q%g<3{<)`J03_w+$b2&P?=El+ZYZ-ds~& zF=k{{t%8_DGl@Slpt5qz*l{AMT=0`}t{&A0liW3?>VeovoMlYigKDbHZL5DHLhOFx zO)@CTa_qLv$bd=7afh2Fk0eqXxoRq5CAXEM6ebndlvj-#guvO6|4Cg?x@empj|dg3U~yMET(B6q-99#lOhCVC=hZ={7p_mj7Z0xBS;QxaI$WgIoR?h)e09YvN()vlUKV7>jpR_<0Kd zw!#AnA0Rm8OY8YgMSp>!AEWRd3LmfdAk>YGFFo$y)_!PpJROv;3-Ph?zozh@!tH#j z)xWj3)hYOIReUu6FBHAbFa2>Z9VCxV_d>zlbbC3t%~z4)qtm7SBOUak)2&kUI^9PU zz1HWG4sO$>{v#bEzfO0y!ZrUtEBqonWA*=*!nIu;RQNX)eSn0+LFoqYv3&X{yobW? zP`H+7WD5K{3fFQ{e~=D0U7kA-T&MenqSxuJOo6|raGma6g$Iz1%`a_OK?nWlbT3i3 zPWPG=IQ8%7pdX#?O2MfZwEgT=^a0$n@^n1~7dYs)mgiZ82XW8R{~`sxN#PeM`n?Jd zDf~tBQ|KT$JL6;d|5D*}YVkiR{4|BXqi~(y>{CI6gYu>Q;aLjTc6+YEwLiQ?;Q{cn z^3)1W@>5Y;fBsWNul2cD;TI}C>lLo`d@f}M2g$GLO9ZEMPshi~Q>o~475)>2YyR&k zT=U;H0^HjOBAl{`D%sJsihyRaGh?I!aYU* zg5V@i4~73y(UX1JcJL1lZrg>o6(4O68x*ef-L4|91P9-D5;p*pW4sPYi z6WrBLp~5x)QpHEx!~Kf>a-?tN|Ea=zD*O^MdK@GtnY^XHQsLTe3lvVKVd>3=G=`71 z+y4@J%2zajJko;QCvlXuCdkXH#e~qHo>E5q!&F2AyYrk5j_-8{V zTkbzlI2DD(UskxbhrcNPS19_o6g{cL@>#BMZHF5auI=!E!gac5Nkt?55Q*hKR&dgD zK;gerxYqwlg=@X-SGcA>uPd11aLXkmIHjx0bkctXAuex=IS zwKDHW`3flfL51u5{=33;x-SXt>fzUlUdz8m;hN8u6nwr=^qSAP($JIqn$P75*LrwZ z;rS}Re^9vA!zP7mJ!GDRhjF<1^#mt*w4B!}T+2By1)pL?ulYv*-h!gYV7NZ|qSvhq(7 zoaCqYCmSC+o>BC=yp}3l$3Gt`KDr(JLeXpe=gYty**Y@*kh3oQKA~?xOy0_)>fx>nBxJ}{OPBPAo z%dgwV(*-B~x_vxX;o3e!3fJ~|lfrenMd~|;A5}eWv;A7>PsPG;Ne@5}q_2PL& zukEl|;o7b`QsAeNvT%?*I^FJqll(f}D-^v>_d5#L=}t|-=f{d(^J!JM=5rtgegO^k z;UM`neSyMtzDfjl^L4MH*YZqPxaR+-6!>2huIukQ!71Hrd~CUISGcaH2NbUD=S(ts z9F$*OPtO&c`0ILlslv70UaN3zw?h=J(;cgDT~Gg0aFQnvADgei0bJl9oJ`N+WdU5^ zAeefdn`+D=ZR z!oxxO)PCtq!AWnr{$8x;Nk&^Pqe(a%ME@;(EWSYD*D3scg=_i?DKj{TkGAt%g=_hH zD_q-oxxxeBW#t(oIOSK{`FKT7sj*Ao@%DUzAp2F$W z;$JFUr+X$9Dh`rgr~6F@x9MIhcqZs|xK94sO$(t@!A4TNSR; zZCAKXcaOv0rt71g;P>i|9us%?d=1FU$5wEE+J`*-D>*r^e8JzO_ZG5agf1d(>D+RtT1%6O)w_I+fpcV(=S@_s=Cn{Xa z`GLZ9+`EXJDGrif`?pmJ*Y>tn;o84tQLuu8_yq8=@?0)B$w~ep8y`AuQS@4G_bB=^ zKxg?>rNAdET<>zE^v@M zy1v}1aP61M6duGgmd~pS*YryTCq3(S^F2jRMQ8bR>V*p&B#-8wuW-%(M!{YFw<&tf ze}cj_|6eOy^Pj75O@B=ui+PORDip5yj90kk^Jj%?`rU%N`AY8{Pgmy)>r(m1#JA>O zrEtyv3Bg_dGZek%KS$x3{}zR7{$Hiw--!kvagdyve=mh={@+u04?JV-Bq}(`pMj5U z?|$gue%zzukBX0$bDqL=x*s}xEdQ+zZu$GJGU-shH2c#T=RcR;ksPjcKF+L-*a%A?rz0Lr<<7{*QZX`FSx6> z?hbDGU!(YF{x>UJ^B?T+>1M?6-RIzz|768S^Piz`&Hu*^pKikczZ~51pRf36{%aJj z`G2Z#T`pfZ{JTlIM;zRyd+yb7{p)luSGZ31TEX3N!RmTGEN=PVtN3XCRSMVqA946t z`JZ%f%m0^(kLLfn!ZrU!hmYmI)WI$PZHkZPe@Nk){~6cB^{LC{>w;VT*mN&)aGP$S z;-k~OOW``*VGbY5|2qzD`9G!jX#OuMT=Sph@Ui@7JGkY)O!3kDKUBEpzt!Pm`R{db z%RlGZxSlotOBJs9e@o%ITy7HFEtk6-+@@Ql_~>*WRk%*K!Qo@`^@4+2{(n?_H2--D z*Zh||d@TR<4sQAHQG7K2Q~Jd9srh#m+||!{4sQAPReUu6TNJMO-=T2b-zinNj{nyS zPV(ru_q4u7e!|bd$Hoss6|Vao^$OSYPtc$Y4wwHA1<%Ai-B0<2!nK^gQn>D?ysPj4 zcv(5W6x`}L8~5la>1Tc^-5&T@`X?2x_55?eiI0xM|D@=3Jho5ax?HZNP7w}DSMwhv zxXZsn(QE#{Qn=>7N#UA*R~jt9LFsDx8x*eT$0%IW|3Yw*Q zb#QCvXWjrJ93-cf=R$>Rd3p&>@@W3oIk@FNRPoXLM=MrIj4sQ9^D?U13&naBJmmj5!vNAv$c;hKMk!^iUf(!nkNZiPNR zT>V_6aLxZZh3j&;S#Y;p20OS-w_5Sh`KnX6PWSr`ADgcqIk@HjC&fqeZ&tYG|Bl1Q z@_*mKE&l_GkLG{+jd6Wy{^tnp>gPfSxBPEZd^G<%6|VW;ukaoa!L|!kf~Nz^z{lq6 z5eK*F{z&jl(CT!5rEs0@pBz4x|34hu@?Wp`X#QIjuKDkE_*nkw{UIQZbbKgZmj5>e zcjfP?aLxZ)4j;?^CI`3t?^k>-M7mbbH44}KCn{XWGmk6$e8uM*VO-!K`H95x&lQ~V ztJ|*|QsB2KT*pNt1hn%5sJr4P*!gach3fJ;~EO;i;45)N( z8Gs8Mg!jP5>fwIDNe?=n8K>xVyzvW#2Nj>cr{J?p(Q7^j6|VUd-UOyNTsiMhxTYVL z0WPz*7H<{kLCXZ2edFYH2K`9*D$nklr+(?kVugQ{Z_D*ZD0|xUMfF6|VL09fj-q z@)LyzAgk5SpA@e3vruqbzS($&jy;NAmt&_}%zal6{S~h1?^L+fTZ6(i{ZACG>01=8 z>EBbhrteU=*7I(KYki)3Ydl{8oLaqIt#GZkTNSR;{kIhO=oEM~1^z+`{8uUP-zi+@ zH&|ryMdeF%)aL6)f@cCFl~{bcqCZpNdlatQ&C_oK5f0-2HGC|eZVJy*_<0H^UuEfg zD*OzEXWotr9K>JawSv3y|6S3aj%O_YH466>{+Z&V>)l?3Ydblpa9!^%zXMEhkURl= zY`TL5C;2n*$;O9{F^WDH*OvZ8h4)bST!m};uN1E9Mb;onBx?T(roaCV*vU(V)aBb&R z3fFobr*LiOzf^cY@qb%zl0O3f7*DGAp zpFV_>J*FKWpm0rJqj1fCrouJ-5`}B}_Z6cX`5C0`N(f3q*vP%uU%coFqO7|>9e_INCl)}$e^tB4te4bFarhh2~{)ZI!n+iWi zrMpbwn*aL>*Ya#hf&2aqOmUDNG@mXC*L==ZxTf!&0`H#!zf<8lU*!td{8uSlm-{LA zu=p(hnK-rfGeB_H9)6|hHJ?Q(=%<$@=l>&xYrB0*;aYF26rQ8x+@kPq3g4x0t)K1p z8hKoMesNe_PMxo8@6|*3Z=s#pTiY-IxO3qi`+fQNi7EJg+LwU(??yxJy5D zY@A-p^VP#~{0y90JLysr$4^ywzQQ&Ay$aX#=Z;Ixr-#DNRs3&LxR%qaP0r{16!_JG zlOD*#Y`z{!LI2qJWUTx&Z^TJ(Eq_BVSGkqt9REI^y6f zxZSUMyMx>Ps&mrJ4J%JuhPjS7xZSUMvV+_Gs+T&r-G6$s zgWLV54>`Eqe>y^f;IQ)8{imOIaJ&EXd}Z@@M(m{ih2Y-0nX;-NEht z)3Y4h?mxZ9!R`Lj1!N#9Uv~fL#~j@5KmDSE+x@3!JGk9{y2ZgaUue?nc8dA6`L+8` z=Q+6Df4a!Q?f%nt|0v7H?lZmGp||@?2RbFDYxkKR>)>{u>1hsb_nBVm;I&dwGRf)S zu=3b_rVAWA{Z>O)>EL#s>1hsb_nDsM;C7$sT@G&dneInU0f&{x?lV2j!R>z1Z#cN! zPnutjRebDz(&5g`KE~hfCq3N3?S9ge9o+6G{i1{0{iI)aaJ!%MW(T+XN#~uGD39GY zdbESveWNEkxZOAUSqHcKM$dBa9?~w(b#S|H^d1Md`$lKcAPx>&E_UDO?hbDEjm~p$ zyKi*Z!R@}$B@S-)jjnWXyKnSk4sQ32e%`_DzR|4?Zuf_7cW}Euw6Ev5?>V!_3I8)AGnO1i-qVooUL)JHBZh^PDfW=C%O zj5L4t($^bjgi&8wANKi(25~O#KK4t?wURxbH_1F0Fh8+xE5H3M!X0`(FGgWb2Bmo3 z%5Q&%$n(zQzOnMWi`(Zc{vCOq>Zv~L^ZUf!?LAw5_L{6PS@{=iG!&D>u!s%0H2Zvx zxy^ZZ)23Uarx=1h;$O0HNw(%bPdweSrzdAVP2X69;25@>|E{1(_Way-e%vQvthvCq z`#kM>P8+U|>sj3^fFqB-xpW%c-}&=N=glQ9Q}@<(n~U9iAN?EM`07aCecsRLe}$Xr-<6{W zqhA(ASGO+$!PLgu^Z4NbQ#Vign)inf_^I%vZGD@)pVJff+*?@IJY+EaJ#Hj=FfyaM zPs7msNW-I{NOZ^1!Tw0YbB#zLa`|(u_(^+?cuj2_A6(R*%{UT$m2c1J-!~GiZ^6xl z*yNu6O!uC9o9)dPBWVk8PItF$9!#k;JjG94_Y`3@XRv_vkLLNtpLtJnWX7PhNc06F z@aFio?P$Lb*@!gM^AmiJC8B#Pp@!l}bl;>)BK42@eYIyr8lEAJk?4}h<;X{N3OU?fgw&(R%Fgy1apui=ziCqz z)RwkZGHF$JxV0r?paLB3o_0^)QNT9!vDtftzd7VWB9L zt2H`s{8qv)(AZ7m-zDq}jrAEnkFfpd!Oj@8m|5mk z_W|`|lQJHg5QvOe8A)5>&55K>I}P7y({4%g=44H~CEc4-kTLDXjD~vRjG~P4$#wO` zxb&t^MxqV%ML0KjLwy+M8TBMsl)oETyuPiIi${&>>78$yk>sZh4Fz~?>f*Xf8|o`? zwyG`4>{jf{s2>z#Sl^KrWx~F#-&-cN4ccj6j=I{>fv-q(e({#>PecAhXj;CyKdoDD7|?-+PBS8D(Jqk@`@-Iw>~GDOlpei4GGZ|HtP@}*!1iXeVOL`?|Dmr6iN-v4vXy?17kfI;2v{*=r)=iYP9bDppBoadbLTs`5~ z8=VH=I2yP>H!xZnsOpR~-14!2Xz!}7NW+aE3m~pJ%?e{S_moQ0ZQ;2t>kIHv`_Ezf z9eaztak|}FZa=l4H4;31Ag?77R0FHqmz|$DI=c1>wMLB4)U<&_zi;Wn>8l6Ss^b)d z)w(G``+$8ghSHiTjmNC2CQ56413jb3C*B=hTUb9nb*WUmy|r&z;$8oeuZB~X`Ksm^h)I-k!mG!O0yH>7TX{CFLd?@L$>7(bAboyE#T)}uN zk%lNoMlV@!KvU~teq?EO@FN+>Xw^SnfVe@p^>zkF7gK^#@^LAdMM-MT08{2?wdTnd zl(oJ_`$*yy-?+BT1Bu4sQ>u zXnQ!+AGVK7S68$}LhW_=WbOTGR#Wp}20d)qvxE5&_2_M*BBL)}5f#WIG3roQ1p@Nt z0&*cqd`cDf9#Zi=ht#~MRPn1M-yr$&bXD9&t@tMX%xh7_{X96Tir?nvFwgg?;$zf~ zAK}luS15c6VBp?v$3g_*3~;`ZZOlNi1(Q9dZlFbV4o$dX};;ubX7P?6}RwaD}`fK@dlFX zNizI-hoy2U2}WC3LaUP-7pQ&hhtzp(>ijnKlP0yUs{})+YQRdr;kOJAT0UB;9Lv91 ze%eZtn43?ciTcinRVAhIbTf^00Vb$Za}6$3Q-6jm<(dRq1pcaPT~@gR(~c36KWo>N*X*enA!UT+ms`zj;pG zLGO-yV8cVzN$UeC`yUiCT66K`^)?t+hBCsz!;gYC zyt>&qHuc=$3A+p`(WEI)PGKW8=STe5X^mzut{Z(r2zx1S3q%lx5E z^}UA?yKpi zB>S3&>VC*1efH;;XyJN?qo+9uw7$nLA+l4xXg`N2#7qZNC-jT(XbMn6N#yxrC{2 zz)Jc51i6vd!o23`$^1x3N2ue@FGWh)Fh)X6bw$?wSq-am%JN$Me=izEjFnJR{Q;~B z>iT~iwwL*vqxMnDrrCGOQw9GXO;rb?p##-Ru-mMZW+-f|QHQ3ffd4M)l~# zp|+YLr)#zDEHLT+z6_Lh{8pkB%e<}n4HVEj%!H3R3W%39sA}DKdB1`8$EtNReQsuk zpWG-f#}abpXwe3!HMmhExo}2-07(Y{D|EPe9a!m)+FiPviytjdS%FySX?1r3Br*mE zyiB(jO52ZU{HS%+KBsMTtZuvPEedt_`jviiZuj0R;7Pg%SE1ILf5QTel{9AIsXP@c z)OadS&A!_oO@;Scq5hgrhg-ueQ?=nX&FxiW)95f%dH5|4ReEU0t1owOmV=S~IoJYR z505i|cIIdgb$|(m1k}*+nkT%r%{-97M+VtL=#Xi7BxG>uJQVm0aRvAcaRELHUZBr( zI8xxfrUm#+%fdt%OaT4(_u!!u1D|PTDDYnIg8EYj-fMa&@R^oJ06c0TYHwx;v6LS< zTZ&rPU;TF(wV>85*X{km;rfe&M|1`XEZ0!z9D`V{aj0`y>Y%aaiJ0AZ0(Aht-{q)- z#+p*g#9GGmi|RhVOP{h>87F;8rc6X9KblC7iiH}hpF2hAt=5gY;(Ot6(yPbgN$;q^ zue>km{gg;==?y;*F%q}MVTE_Xqv!*M>e>f#IyJBFbE^2sL+ZLV)zY4)0`mi^@+nn_ zEvr>o<0PZXo~scXsH{Mp-+BAfShy(0zE_Oc>Q?(cmo-yl)(_H(pcJLpns0@ktNDzy zf^iqf=aEw9YXwt{xf!r1xsLh0Q1!K&hW(FHtYPgNXP{`UDWPZvP?&nX+M;qnKSxzQ z=|bMO$!()Am-U-^2Lc>uc8I%v>kH;w>t0wyJzV1*WR_%c^i9Py@LIuz-b)ROf zqubHVXxIkB|DwP@$%Ee*9NA;o<&5D=;v@mpb$%8Wf@@X$w6LYu-6eHPRNy=nxFG=M zix^%h3ztR~IvXOO#YwLxT^4XM&5|i{GEI_U)V-?ke3nkC@Fvi+T@_vrUN)=3xtXyh zTC*vY^Z-zG^nQjaeqN{!o}}7Y9?4{O$&hWU47-@&uuR&-WGc+f=qmMc$s2y6Rg-ZW zx~9`%G%G2~p1|#XRs5`K=>iKcsg@mrg;+_8FrK=%8OdcyS;W6(EM)_hq{;*vjIpwn z6=FqTx{7x?1!)SbA`04^0&o_XUrGVUDt?|SFHlfS{zXtUk$)8+5C(7%_AXDW=_h_1 z86&-%?qH!xup79cl=OO4`6}u2NWP{DKcxzn!#}WF;k44IaJ~MA1Z0M==Br}5x_MRi zWd^`V+f-!-<5F>yP(B@~z(p)DS!&XZ;VY33uUdV36g%$%R-00Jqrq|<>}gEP;#34i zDvKK8pBRvB)lcIK?2KZ7CB-oOf|Z?oPdk`Z>44Ad#S3L+Gf&{YbZv{bng`soK! zG|=b(eecwF$?Rig$>7iMTNnoT0PhrCSv^3x^BS zdyc#r#b%mT^}iFDn{B0T8<3Lpo1?UQRbI@GH=etk3B}0`;cvK5_mm}PeN((n+$rWxx zei3kQuxmc11>DK2x*4v3V;YHoYwK>Dk@R*Jb_h_VkULw{4e3SP-Dc|l5QF5_dx<+# z(A1{gf>QWFd|`!yg}<%(j|l%}GuNHT3$uf7IVxb0-=XyFY-U1fG%4d`IA5#cHddn$*N`ZyE65k^QhPZ)c z&>;Q>1S0FH_)@o7Y?9K0nIpoN`bV=;O4uH9+5^VppE!3xClK4r2LVw z0V$MVQpMPbKc&eXxQPjNy>J?((#Q)Gcd5YVRQwt28Q2XCGeaP{9u*^#h?!7ae#^r6 zntNR}BNR||HvooD^VyTxYKHc)iyb}Vai7*h9usCXkIXjO+Y@kE(d$vw|1276uesT1 zpG~>i$A)8K!M7ZZlMip9;#{M^Q9$nWgla8l5HB@uQcEJ_ykdNCrCT%znv0&0<{hy2=GkTB_U@kc?C1HmM>RsdAfCc}uFm zD{h*+=JjIgRvwUyRFTYn$q1inz{p(Sq@~JjFr5KRGBBS3Ofpod?4!H$`4z2u6XGfB zHLcm2htq6^^F+IOSX%Qu+~(y~-PNvkLq!_xMvJ1|P;_xv79}x41-=kt5f#qh{Nv}*}W@W1G9e|x^yzrLb9{IU3xL}3coo(LYgQ;LQx;UoXh&yu%V(7>=7qX{AZ`t@lLCQ6(p~`F0G;uJxwkJOsg4Kr2r)vu-sOUORE%U zSmDOO3X)b)__|eLVLd-cfwcN9*jUdGQXs8H-Bt&jR>ujfv>FmVr+T4OVfKd&wlTI@ zpgPXRrndHk-Q%0dh_$B;yiH^p$tWJA;ZT$=+IKGY-7J)^<2B${l&>oiS{-U1gj(}? zL_*leP&!~JEo#tvN!2Y8svEJ$*2=1Kqb&U6o^1duo=(=UKTW~MdBKsOZ1d1@Q?NV` zCGE;lrqlXll=W}DQPf*=74>)FT~{yXi<%}s$WWw&?LsWcEJaOOhgW86&RK* za*AwVyYM6Ci%uUUy-cde17X``QpJ&w!evrL z7+b1HFOrrjx);ev72S)&{`A7o#jcSmEOv~ILwY%~pfgfsxy%Og7IMf~pxQ{6urA{p zVUYR2!|$43I?NA#y<$~YP`s#)pF2%OEfCqS2H5+3SlQV2ihx(Zj0?Az{jEuu#h`qe6`e)4? zM%&^{8?dmMHg5M=c+oH{JjY|<>#|w+O^1cwb|w&)g`4yQ0)?I=p&f3ql9!B0y@bQV zGIy*nGfAzPNp8W+qVUFGzx>P&9z#)#=HIm_yTI3FUb$R2=>yCwFi%|A8@|=1h--G! z>d5C6aj$46fIF|8;k1g(<1S^0$C@!KmcwT`_ z-3XG*fjJ8gnXNJl58ja3%3vTPdjX9BT18U90Dq(kOAnDqG@iJV;?I*2=f+%_t-8o? zLM||uSK`=Gm1#0(k(PC1?rhbZvs94T$`x8YFBpzmvzc9MQLcug0*0fQzl5Whzl5U# zaFka?se9M3gclC`pmUff?|LobiGAQ46&LF;nrO~hddRHi3V#+jYi?ta9SuFH5vk#k7(~m+Q%IL7+VObv^klnoyp+ zwp6HbJG&1%WeuZ>`y35&*wG;GIwmN~NlZ}qY@^m7B({?1!fWkm>wD$=qgn9tcb-ul zD}u-VTW3b}z$FO3NU~^~dT(Zwj5jk%CVOU-$yCHt#8XeElJO=}M}V139l6t!sgsr} zcOZA(%y>uk%%~?*CUS2wm9$jRlc{99$y74lWQxQVegdXISPQ?72v^FY=W@iil5>}Z zmzKIqc-JSKJ*mR=c;-Dat+_=eRS`i}(g8yzWEFXIXTQ4YlT5JUqSSsx`gImyGQVc| zoMfsMs5m5OR`~#>=U3N|6p_=S==E5Cuf=>@%EsLaO}_k+&YXqEH2XVqSLCLm84ZEkXH4qB&|w; zv?`viIDNXNYT#2&tGV;?HPY%!POD21nz*zo1=8xR0*bUM1=8wGZmS~A*qVXQIjvp- zR+b{!g|{NnIJKz5kScdDKYAFDg6AplFdzlnDbV|50_%XZN`b}zBAGke$LYLyo71XZ zMdF9i1=6ZsMfN!b(yBOz<1bJEoVwL>1y))O@h`KAtdv$6n}*fk)hUox4PKoBY1QDB zf+J3=8n3i?5&tr?{WUV%O9NFh+iUNiWMsB~Ms$Z{WVYAtLNcEwyx))_Z&{uS-=bB7Z?OP`Z&5YktH2NtUj>GMtY8h>V*$vS zI?eFxQey^eQ?gy1ui~sCkSnq;$`-n0&(_(OSW)ZjIXcTBWBoQ@%j*o1e}QqlLCMEW z2}#`qC1)EI75E5iamMlbs}6C6m63{(9Lhk?oR6Ybbe1mq3n5+IcytfwCQ5nYI`v*_6HLm1&EC zCK=Is{>1%BF(Ld(t?9TsAZOe|Z>!Y{#b)@1tL+YH!(pTGdX8}n2hn*;WhdtAu7Cbo zG~T7!Z1@fu@A6_HToq=+*R|R3?THu=Q>9F{|GSL=p>-dQL9@f>nh&k6`S6r$K0K>6 zAFTWm3EBPbvr3w+#Jg<%jWa4R0{4gt?BVZhctW(a_IW{9MviZ(+eBUSX8UNTZeuj#pzq0Nvj{Ax2q zJV)9LX(ln)3~ABZ(?gYpN9i?xYfKSMX_N+(Mu9+SbcI$DP}*Y*l*Ii;NqCHLQZwbF z#!NBx3eq7~ies?I&X{Ach#e&ci@-m~U}-sl(c*xw>Q@4&2f7vNsj1T!$tW#S#f+s= zc=kMfEkGwHqlk7p#gjjYt?j1S>M!1>Ge9wUA~|YOMRFe}x7W*^O*xuNDCm3srj4`DJ16_z7 z-*mtL`)ytf+Z!XvrNQa;;fQ+ZKlkHZkt_c4L;L|QtsUn=#z3c)czhvcc~LcePt4w_ zi}wxO*QQ@j$Rm0E3@e$OPdZ}nj@a*T+gvKj%~NxCnJbkX9=7a*$v<&#H!r#FdxF#C zOn_-9m1@ap3nTW*GLp%ex7ZC45{YGzF>2Mzyf~d3?4OM!R|<%LT2{pUzL+_TJ%j6> zZ1z2rc4~8H^V7)&c~L!N1;h6Kn7KZ}dwyS7J=A8}PBuvVE%lIobC|cdyBn)o*~2@r zs+qTx(|*jCwnopy(a|uKQb33V$2o_1r8VGYuN8K|<=dN&a{g^V^fAOEZ zo7XG%n#1}+l9l-V!!(*#d#%^a(mTql8o6JX*y$@z`74}r>sKWGO^M^c)x>@ARRkNz zTh*mjujetkT|;YO?!Hf# z3!dk;^{xP5I!^39Eo^TNKlZP`{`IfHTt_tB`>7eJg6MQ#J6D7_pB3iLDwj#G90XhM z_0I5h1D#$2P0@4@4fxBZ`x+x9OQZcMgk$K4YO0q$Z>4<;nmE~3K zU?Q3-xYEG{!|JeqU%`OvhiCIQX0LpZA86Oc532-cu#ca+S*>di+wX?Q9SZ+}M{wWt z_P&3S274J~NBD7PkXxeZ-M~2Es_DM2NXcfp1I(F&y6j6vQde+O_cRwfQLtly9gyQ| zFX?bbmW}&4jLhE8c_&0b2-jYwe%Ml$e^9ONz_y`mRTIApxV(8#&Fj>f>7WYellcqO z`OmX_(*vCbwNBzN1t7-Z`kw+t1yC0e+9r_8SM) zb+7YpCuMsNhShmJ6uv~kiw9Xo>q2!6#%AHI02cTg(3Ho+zJux-49mh>3&P1luDLac zvpY3qyuQwMKsD%FZaP!~t#tE`F0K(1?WO>&oF=U>1XTL8M!SU$n|Z}8)xRq7Z_<;+ zB8l*96O6piUy0Ac$rK;1?5s}y4w*8Q#g_MXlAW(?=;2JC%w^DM}0 z3b#r_=Js9t9iP>><-IOJ0NB3nIbiDL#U4{3-eIRpgbHmg6?Cr*VY5nniWO(Cf|fkj zuxqF-^;rKUy=4@~>@I8b?sEItaN;#zY}{`8Y2=mjnhvUXWAD!aBgSoEd4qe!?i=m$ zMh9=S15KKixszHfq-k5A=59Kun$~j{Yc`pyH!R>%E0FXrT~xk$N9}hsgwex?XfCE6 z>WTXH!ii0mZ(GdXSZ?>m>@88dDQ0hD+fcX&=%VV<&9TtVnzHiM?X{1W3pr)N)Nn?D zlVa5%^9?2K2PtXqy@_1Jo;xvO&zhulM(_6-2kmL@RChl@&K5S)BW(nWP}p31>M5M-N;hmZ%-} zj0q8YtUb%Gna3uii4JOzO{h)?b@YbaWh-^;3 z9=Pju+E_X6;JD5OYEdKDscX5bMM9p_^S-l)aWEi|+|^CEqP%cwZQlO+yg%G2-5%Mp zJ2lO>xhFOEf9vKFN5`uf>D1h{>7C>6+L=cLkZ`)^^vJlT#K2;8*=8bMyct+PZ!5>` zziVJEEquJ|aMyynb`I2!>ombyD9a;Qi^v;6F`QT}Qiy{4kq)i0M+eHNdPftfM;=M^ z75Po{4=m9&Ub0(tLEk|W-h!APhq+<;Cu!Bxz#eI4X05G|m<-G8PVU4myVSZrHT$YR z>u4uiv#$Cmx!=1Pl7UbMX|ldLKX~r$deN)jeV`aIbds z)x-$ZEcvoRA3C-&sJ&%OP%ih z(Nx9$zK`G|&R6=vGM9OqYWBxMjkUG7W&2(y&O|JACHpzES>vRlZ0f{R5!=wExSLcd zhsWjMxZ-G~K318U!IHAOkwzQ)KBEGY^0|aPA;6!4e7fNELD#)F>q~cArMuIlyQiAD zxmSCR5z0<|8Fj+%7$y?j((@{2tY*`bz4WKdOFG^eSE3JE_SWQoz6Iv(BUtf^g#=aY zR{E7uR!N5}9BL<7$^7KvU?geHizUnQV=QIXiiXj>v3fHy^M$hF2 zbV=_dJkxVMQ9AA8e!4Lp%)$-lTKrjx%nWw^_Ufxp%)3&QQzdN`M$e8W&XXE|rt7YA|2 z*-yvpW~T2*@`>O|kQ+%}NYI%9I}$8TPMa7>&YYAWa&K*Zs7-yZkgKntfyK%|YvXn}+_`;!sb@h?tlr=Q!C7~a0RPu?Vij~a20`@? z)cM=0Q!I1|AaLh)ntSE;f93C{rS}8abC?2~ExQe4DmDB2{sn7kp^+8d8vK0qzR$L#rb@eQqM~2`5|I&8hxRC zf&5ha?c3P-P0Iz${8*@I$*a-?3r<2BbO}$9Y_+PmvtRpHpvj*Sq!MsR)m2IWf>n5EK2%=&T21~oZJ+#Yl9OB#wJY{Nmz)<4*=IK zL4T6+i2X)*;8~lOjsP(nK@deTFK&8*V>*fTzUiUY?`(<4o4sEXz3*ahwD6MjZP~X33FEaPn%L{dMHBd6emcD|=*L4spSfL1^U~?T$63oJ_V|)t ziG=)ixT)EzO^C@XzRXU7`hfp#x)hv<$Xx2ba}N-T zgT{DI1|~G=VJ`@)MeChW-v$7^^U;1K`|YMw86mZ-st!b|WHaJ4puVtT^|9rDwd7;k z01Bm->}E-;t=GN_cs({|AhfCebC6~-5mK%=4B97?DJ5z}?1)W*%#={8DsP2GQ|!y3 z-cgm3I3!lpL5TM|97sn>B&f*+4DUyIS;JB1PWI|EDz5^KZgLVw*Y98ZoAla{@g-p*U)< zCsvF}v7Gjuz~&+mu@5%hc)HeezbB=h>#=^-cfaL*U(GI7z^x_Pd-dSfuZZ>nBH=w*R~UaSzQ{fI>nuKeV* zW2wbHyZV@Qe?!5j^yl-%V(bwMHqk$}?kuC80QgVIWyex;eP5~QU$LR@5mTI4Z?K*< zH{Z4A0b-(CRWFHUq8{2FCc@9=0f};V@6Uv~_MZtaCafe&3H4AjnlJo>j3Abp9lYPn z&f!1Fn0n{%zJy5|ZLsYo{LTE47m2qjtWXwvx5uF_CKX z`=hC4p!$ve7=@UgauH^e&ub>ppI`IE2mMR_nju|F@Q3jY;~yMVdnM6^)T6cIk1w$K z(>E=gywJYTZV4w>TzJgpUtei7iNkZeosLRB7H{=ispYyK%ic^s`hrbXKT%(!rm^D78u&w9{r7U?=~$cD`82dBL?| z6nfP6BEJ0Tp<}fZ%k3W7&%i74deq)-*}Ty!PB-hW^+LTY)saQn#Gc})eVpiV6XXu~ ziXfp28(r6;<2Y5*30e{h&W|K7{%+!{Le)IA>P8qBVn<3E)k7`T{ZU`b;g{ft+VFJT zC-;6*3;EkbFU3_AKKw!y@%Qzk4=uYO7)$+)v=Kw0=11)ona(11EI3Jcd|}_^=(`Dc z#@nJ*n`8Dn&LVPsaTfS$-SoVM(YgB6N^D>e+w2pZ#5nl5s(~)TiGeXoUt{_TMyr@O zV!ob%?r7CBQXkF==AY+3vte}K`e@a989G#%Ft&5IJT2*@{5QIvNbqC&Ij=*tF?xQ` ze(Rp|AC|bRY8`LL`@M41)PUBzD3h!r8I#UrR*VoO4{M%r3TWz{PxElP&GL&SE8k+P z@;_$zItRKV%#;(@3Fw_3>QyNT*&DOpF0VQ=Gd1aw=_MP>eQ#f;*4_A3mREP?X@Iny z+w-%B&}}8_BMqN+u@MXHUGhxtA8CNzIsN|70kFzSrW{9XNoP28K&2kwA@dPJQ;^r$ z%g=-{B^?bD|^iWFWvx#uNjlW@s~NWHhu&JU zq4&?sjS&GsHb>k69Ez4~VFgxhAB>h9oGx%}<+UuP$V!^=O~Avyu3(g}WAjl-j49dN zP@sny4mH-l-1`%%LmnAtyYQ>D4VL!nXl2V!()LQBoeXPC_`C^uF6z?tdwL^TP3mU8 zNC6&q3EE}96D!%23Bsc5pC|4WgZXs*-rm!A8%bzkBcj~b(kqd5%@l}Wb)x0jrF|$3 z$i>bK!k|7Hv76D)=zyuXHt;}wB($Y&oOU7ieb$C#N9i69=@FUBrbL;11$g^vz429` zjRt$0o^!o9?XRLx(*8!Ce%SYlY3q6Ov*l#|sVpsX*Ped50V4Ylss`(IV+5uMOt&|! zYOMXLDv1OatCH^pSMri7`C(8zYpUd@!3Xs3zXTuFzrP7K>fhf6wQHf|iC{N*z0i`l zlaX<|?>GZpCp~2;3(TbAQi}MUEWcK2RWPpSEDS8nv|yR==TuBI@R>ik>1@WG!9_mM%O#-e0+|hI} zp}gui>&IYz*nUwjK>}z`$_r>CfEF0&OQWUrjK~xq_mh0cK5P;Qwbg#Ys+t#^ zV2%E1Q0%ZjI>6`W)!*Is8*wS*^*)Al3svp?i6j2n+lWP)D$qWTuzfI$L*n((H}ml& z@4tyR`>v|Ex%lQUNr`=c4I?&!66r5pd2{*A(;O@3$~iaZg)46Mh4Fr;ACtlUN&aZc z^@!9$H6gJ!B&Bb!^-MobY9X%;EF9qP!aV+x9msxX^vy-UGw0@8ZeDKS0hm-lYB}#a z0O{2}@BocK^ars?hK1{E1}-5(ujp{=u07j$R|2hKZ^nXCV^FUwM#_SRzbrglp-Px0 zRmp7O=AQ;v^13Sd7l)gF6MR7Df9r7b6PlZ$etv**;Ut$kyU7br2826{BsEdEGr#8| zY*$bvVC3$D$F+ILL^{dd61JaCg^&LV=m#X0_Yc!-`vGKeghhNu;^-*#Q*oy!noOvQ zaWAQc3a0Xy&GHPd2fQ4D)Bl468w%;}(G}BD{y$53#n)k{DHSeh%r;d7@1}N~>siP( zWDx+%5Vut`)A};kY*@X4RWPxR!+#V8V0FfNWSd&`pOnhX$Sx#CGXJ!v0Zf;L?Wa(3 z-6;My%ByxoeS0KAb}TqqmU_1Ytr$_^=LKWa?PI-{(}wWQP_Sdci?4LSzB%tINjlDD zMuWgTAftmD@}}EI!uGZdgIYMC?&qNy%ipkg!uY&v{aT88KS6g9)@!ASK3}S4piHfM zN6%(GU-*Tn_&qY^2ef=ePy~SpI4Lf-514&!455gT zdpQz9g>du>7L3@hftGz%6=a$hEQ+P3j28PTAg@eT_jUpjoko1GSygXazL#S5?wEa8 zt8gshZ-i4bMhSkICGV|~*5tjtmhZ*K83k=K3=mBv*3FrEYSky84=_pecHdqY;Va?L z`nuZ^@7C9C(PQr&#S7B7coZguLoIdJIZeYWMJxg`?aSJhFdC+ZHyp^8d?~x>mbx3I z>F0IReMNe{=@s+D^z~y>y1l;BbU~`7Ua+ohD*^g<|3?fh)SSUFDR|x>SsoYv3%&rk zBx#yYqa^vt1e%{0i4HIEi_0uu8$Yp7M=c`G2+-@3^6Fj+YkLoNoT8_S-dkxUtoLR$ zXY__dRY0@+o&*0pFrYWrB|!B0c-AzeA@A*yH^mBu!CUY!-9>2T`Vt)1fpWZ=cQ*l4%#8ofu?{nYjk-*-B@wz~UW;dTRj z?>^Fmn6yf8{+8``BF=h|REap-O327wm^rNy-vv9cv0mA5NvZD>?$FuWwZncc6td86 z_497c4eHSuqu5Z}dAfr_gF&d38O4}f{7EA|_2}54wKyG+sg*Rf`V#ugRuxfF*j7nh ztO(Ge)~o`;SgH*7bZhlhTJF*Se3^JQ!~02%k%Zj*x~xD_{gTR;6l~y}#0x!L^OOj5 zN!pSKvg}xury_aG+_Ogo5L6vg_8jU>lSTy{5`?V`p=xCCO+;MmuO@h8s&+h!?pci@ zZB1oJ+oxdB7YL4d>&*dD&q}Jgh}0%YEiWb23Ih+bTa~W)BU^H{zu|Zqy9a&0wcH{5 zWytkk6KR%CrwB|ksu?oSX)>xAGExoa3>m2aI)j1ozVJM;aoPPcfLen9{e%aoqzs^v zGJt+!@Ge}Um2I^n0%*Sj=+o~3s331Jpc?p71Qfr3gHcHtKqX}W4SjGxH6AraHOPWd zjYomgpnGH(<@UP+sH6;_k}`m{j0{i?DZ11bh96shv&-z*t}QsYXs{4gYJ!z6gLma% zDQq1&T=RM^OKWb{e0@qR-3?23YnCper?ctlNnzg`gr(QhCtJE@blE8Sw|cvPV`v?b!OD%eH4z{|o^crkVlB8RmRlGbdeIgSr$(G+k1Mka08UvXw5MmM;6H z%cn=y<$WXW@;

  • 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

    jc&o&Pqy6lbG$s+U$re# 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

    j{F{n^{(W`6|a9g+5BLauQT#{f6vdKx{OoY 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

    pt!EL07H^pu}hzH+}etw$~ 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ķaY)z6TvA%f(h0mTfP2bYi$XAw%7%SO%C?uRm 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Ŭ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 literal 0 HcmV?d00001