/**********************************************************************************************
*
*   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 the 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 already defined inside [rcore.c] so there is no need to be
// redefined here, in case it must be done, 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 already defined inside [rlgl.h] so there is no need to be
// redefined here, in case it must be done, 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_PNM
    #define SUPPORT_FILEFORMAT_PNM      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 already defined inside [rlgl.h] so there is no need to be
// redefined here, in case it must be done, 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
