mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-10-30 14:30:53 -07:00 
			
		
		
		
	Delete auxillary/vis_ast
When I get to making this it will be with SectrPrototype
This commit is contained in:
		| @@ -1,126 +0,0 @@ | |||||||
| Clear-Host |  | ||||||
|  |  | ||||||
| $path_root     = git rev-parse --show-toplevel |  | ||||||
| $path_scripts  = Join-Path $path_root 'scripts' |  | ||||||
|  |  | ||||||
| $target_arch        = Join-Path $path_scripts 'helpers/target_arch.psm1' |  | ||||||
| $devshell           = Join-Path $path_scripts 'helpers/devshell.ps1' |  | ||||||
| $format_cpp	        = Join-Path $path_scripts 'helpers/format_cpp.psm1' |  | ||||||
| $incremental_checks = Join-Path $path_scripts 'helpers/incremental_checks.ps1' |  | ||||||
| $vendor_toolchain   = Join-Path $path_scripts 'helpers/vendor_toolchain.ps1' |  | ||||||
|  |  | ||||||
| $path_project  = Join-Path $path_root     'project' |  | ||||||
| $path_aux      = Join-Path $path_project  'auxillary' |  | ||||||
| $path_vis_root = Join-Path $path_aux      'vis_ast' |  | ||||||
| $path_binaries = Join-Path $path_vis_root 'binaries' |  | ||||||
| $path_build    = Join-Path $path_vis_root 'build' |  | ||||||
| $path_code     = Join-Path $path_vis_root 'code' |  | ||||||
| $path_deps     = Join-Path $path_vis_root 'dependencies' |  | ||||||
| $path_win32    = Join-Path $path_code     'win32' |  | ||||||
|  |  | ||||||
| Import-Module $target_arch |  | ||||||
| Import-Module $format_cpp |  | ||||||
|  |  | ||||||
| #region Arguments |  | ||||||
| $vendor           = $null |  | ||||||
| $optimize         = $null |  | ||||||
| $debug 	          = $null |  | ||||||
| $analysis	      = $false |  | ||||||
| $dev              = $false |  | ||||||
| $verbose          = $null |  | ||||||
| $platform         = $null |  | ||||||
| $module_specified = $false |  | ||||||
|  |  | ||||||
| [array] $vendors = @( "clang", "msvc" ) |  | ||||||
|  |  | ||||||
| # This is a really lazy way of parsing the args, could use actual params down the line... |  | ||||||
|  |  | ||||||
| if ( $args ) { $args | ForEach-Object { |  | ||||||
| switch ($_){ |  | ||||||
|  { $_ -in $vendors }   { $vendor    = $_; break } |  | ||||||
|  "optimize"            { $optimize  = $true } |  | ||||||
|  "debug"               { $debug     = $true } |  | ||||||
|  "analysis"            { $analysis  = $true } |  | ||||||
|  "dev"                 { $dev       = $true } |  | ||||||
|  "verbose"             { $verbose   = $true } |  | ||||||
|  "platform"            { $platform  = $true; $module_specified = $true } |  | ||||||
| } |  | ||||||
| }} |  | ||||||
| #endregion Argument |  | ||||||
|  |  | ||||||
| if ( -not $module_specified ) |  | ||||||
| { |  | ||||||
| 	$platform = $true |  | ||||||
| } |  | ||||||
|  |  | ||||||
| # Load up toolchain configuraion |  | ||||||
| . $vendor_toolchain |  | ||||||
| . $incremental_checks |  | ||||||
|  |  | ||||||
| write-host "Building Vis AST with $vendor" |  | ||||||
|  |  | ||||||
| if ( (Test-Path $path_build) -eq $false ) { |  | ||||||
| 	New-Item $path_build -ItemType Directory |  | ||||||
| } |  | ||||||
|  |  | ||||||
| if ( (Test-Path $path_binaries) -eq $false ) { |  | ||||||
| 	New-Item $path_binaries -ItemType Directory |  | ||||||
| } |  | ||||||
|  |  | ||||||
| $path_raylib     = join-path $path_deps   'raylib' |  | ||||||
| $path_raylib_inc = join-path $path_raylib 'include' |  | ||||||
| $path_raylib_lib = join-path $path_raylib 'lib' |  | ||||||
|  |  | ||||||
| $path_raylib_dll     = join-path $path_raylib_lib 'raylib.dll' |  | ||||||
| $path_raylib_dll_bin = join-path $path_binaries   'raylib.dll' |  | ||||||
|  |  | ||||||
| Copy-Item $path_raylib_dll $path_raylib_dll_bin -Force |  | ||||||
|  |  | ||||||
| $includes = @( |  | ||||||
| 	$path_code, |  | ||||||
| 	$path_deps |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| write-host $path_code |  | ||||||
|  |  | ||||||
| foreach ( $include in $includes ) { |  | ||||||
| 	Write-Host 'include: ' $include |  | ||||||
| } |  | ||||||
|  |  | ||||||
| # Microsoft |  | ||||||
| $lib_gdi32  = 'Gdi32.lib' |  | ||||||
| $lib_xinput = 'Xinput.lib' |  | ||||||
| $lib_user32 = 'User32.lib' |  | ||||||
| $lib_winmm  = 'Winmm.lib' |  | ||||||
|  |  | ||||||
| $stack_size = 1024 * 1024 * 4 |  | ||||||
|  |  | ||||||
| $compiler_args = @( |  | ||||||
| 	( $flag_define + 'UNICODE'), |  | ||||||
| 	( $flag_define + '_UNICODE') |  | ||||||
| 	( $flag_define + 'INTELLISENSE_DIRECTIVES=0'), |  | ||||||
| 	( $flag_define + 'RL_USE_LIBTYPE_SHARED') |  | ||||||
| 	# ($flag_set_stack_size + $stack_size) |  | ||||||
| 	$flag_wall |  | ||||||
| 	$flag_warnings_as_errors |  | ||||||
| 	$flag_optimize_intrinsics |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| if ( $dev ) { |  | ||||||
| 	$compiler_args += ( $flag_define + 'Build_Development=1' ) |  | ||||||
| } |  | ||||||
| else { |  | ||||||
| 	$compiler_args += ( $flag_define + 'Build_Development=0' ) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| $linker_args = @( |  | ||||||
| 	$flag_link_win_subsystem_windows, |  | ||||||
| 	$flag_link_optiiize_references, |  | ||||||
|  |  | ||||||
| 	( join-path $path_raylib_lib 'raylib.lib' ) |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| $unit       = join-path $path_code     'vis_ast_windows.cpp' |  | ||||||
| $executable = join-path $path_binaries 'vis_ast.exe' |  | ||||||
|  |  | ||||||
| $build_result = build-simple $path_build $includes $compiler_args $linker_args $unit $executable |  | ||||||
| @@ -1,22 +0,0 @@ | |||||||
| $path_root     = git rev-parse --show-toplevel |  | ||||||
| $path_scripts  = Join-Path $path_root 'scripts' |  | ||||||
|  |  | ||||||
| $target_arch        = Join-Path $path_scripts 'helpers/target_arch.psm1' |  | ||||||
| $devshell           = Join-Path $path_scripts 'helpers/devshell.ps1' |  | ||||||
| $format_cpp	        = Join-Path $path_scripts 'helpers/format_cpp.psm1' |  | ||||||
| $incremental_checks = Join-Path $path_scripts 'helpers/incremental_checks.ps1' |  | ||||||
| $vendor_toolchain   = Join-Path $path_scripts 'helpers/vendor_toolchain.ps1' |  | ||||||
|  |  | ||||||
| $path_project  = Join-Path $path_root     'project' |  | ||||||
| $path_aux      = Join-Path $path_project  'auxillary' |  | ||||||
| $path_vis_root = Join-Path $path_aux      'vis_ast' |  | ||||||
| $path_binaries = Join-Path $path_vis_root 'binaries' |  | ||||||
| $path_build    = Join-Path $path_vis_root 'build' |  | ||||||
|  |  | ||||||
| if ( test-path $path_build ) { |  | ||||||
| 	remove-item $path_build -Recurse |  | ||||||
| } |  | ||||||
|  |  | ||||||
| if ( test-path $path_binaries ) { |  | ||||||
| 	remove-item $path_binaries -recurse |  | ||||||
| } |  | ||||||
| @@ -1,25 +0,0 @@ | |||||||
| #pragma once |  | ||||||
| #if INTELLISENSE_DIRECTIVES |  | ||||||
| #include "vendor/compiler.hpp" |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #define global        static // Global variables |  | ||||||
| #define internal      static // Internal linkage |  | ||||||
| #define local_persist static // Local Persisting variables |  | ||||||
|  |  | ||||||
| #define api_c extern "C" |  | ||||||
|  |  | ||||||
| #define ccast( type, value ) ( const_cast< type >( (value) ) ) |  | ||||||
| #define pcast( type, value ) ( * reinterpret_cast< type* >( & ( value ) ) ) |  | ||||||
| #define rcast( type, value ) reinterpret_cast< type >( value ) |  | ||||||
| #define scast( type, value ) static_cast< type >( value ) |  | ||||||
|  |  | ||||||
| #define do_once()   for ( local_persist b32 once = true; once; once = false ) |  | ||||||
| #define stmt( ... ) do { __VA_ARGS__; } while ( 0 ) |  | ||||||
|  |  | ||||||
| #define array_count( array ) ( sizeof( array ) / sizeof( ( array )[0] ) ) |  | ||||||
|  |  | ||||||
| #define kilobytes( x ) ( ( x ) * ( s64 )( 1024 ) ) |  | ||||||
| #define megabytes( x ) ( kilobytes( x ) * ( s64 )( 1024 ) ) |  | ||||||
| #define gigabytes( x ) ( megabytes( x ) * ( s64 )( 1024 ) ) |  | ||||||
| #define terabytes( x ) ( gigabytes( x ) * ( s64 )( 1024 ) ) |  | ||||||
| @@ -1,10 +0,0 @@ | |||||||
| // Platform architecture |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #if defined( _WIN64 ) || defined( __x86_64__ ) || defined( _M_X64 ) || defined( __64BIT__ ) || defined( __powerpc64__ ) || defined( __ppc64__ ) || defined( __aarch64__ ) |  | ||||||
| #	ifndef ARCH_64_BIT |  | ||||||
| #		define ARCH_64_BIT 1 |  | ||||||
| #	endif |  | ||||||
| #else |  | ||||||
| #	error A 32-bit architecture is not supported |  | ||||||
| #endif |  | ||||||
| @@ -1,22 +0,0 @@ | |||||||
| // Platform compiler |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #if defined( _MSC_VER ) |  | ||||||
| #	define Compiler_MSVC 1 |  | ||||||
| #elif defined( __clang__ ) |  | ||||||
| #	define Compiler_Clang 1 |  | ||||||
| #else |  | ||||||
| #	error "Unknown compiler" |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if defined( __has_attribute ) |  | ||||||
| #	define HAS_ATTRIBUTE( attribute ) __has_attribute( attribute ) |  | ||||||
| #else |  | ||||||
| #	define HAS_ATTRIBUTE( attribute ) ( 0 ) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef Compiler_Clang |  | ||||||
| #	define compiler_decorated_func_name __PRETTY_NAME__ |  | ||||||
| #elif defined(Compiler_MSVC) |  | ||||||
| #	define compiler_decorated_func_name __FUNCDNAME__ |  | ||||||
| #endif |  | ||||||
| @@ -1,34 +0,0 @@ | |||||||
| #pragma once |  | ||||||
| #if INTELLISENSE_DIRECTIVES |  | ||||||
| #include "compiler.hpp" |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef Compiler_MSVC |  | ||||||
| #pragma warning( disable: 4201 ) // Support for non-standard nameless struct or union extesnion |  | ||||||
| #pragma warning( disable: 4100 ) // Support for unreferenced formal parameters |  | ||||||
| #pragma warning( disable: 4800 ) // Support implicit conversion to bools |  | ||||||
| #pragma warning( disable: 4365 ) // Support for signed/unsigned mismatch auto-conversion |  | ||||||
| #pragma warning( disable: 4189 ) // Support for unused variables |  | ||||||
| #pragma warning( disable: 4514 ) // Support for unused inline functions |  | ||||||
| #pragma warning( disable: 4505 ) // Support for unused static functions |  | ||||||
| #pragma warning( disable: 5045 ) // Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified |  | ||||||
| #pragma warning( disable: 5264 ) // Support for 'const' variables unused |  | ||||||
| #pragma warning( disable: 4820 ) // Support auto-adding padding to structs |  | ||||||
| #pragma warning( disable: 4711 ) // Support automatic inline expansion |  | ||||||
| #pragma warning( disable: 4710 ) // Support automatic inline expansion |  | ||||||
| #pragma warning( disable: 4805 ) // Support comparisons of s32 to bool. |  | ||||||
| #pragma warning( disable: 5246 ) // Support for initialization of subobject without braces. |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef Compiler_Clang |  | ||||||
| #pragma clang diagnostic push |  | ||||||
| #pragma clang diagnostic ignored "-Wunused-const-variable" |  | ||||||
| #pragma clang diagnostic ignored "-Wswitch" |  | ||||||
| #pragma clang diagnostic ignored "-Wunused-variable" |  | ||||||
| #pragma clang diagnostic ignored "-Wunused-local-typedef" |  | ||||||
| #pragma clang diagnostic ignored "-Wunknown-pragmas" |  | ||||||
| #pragma clang diagnostic ignored "-Wvarargs" |  | ||||||
| #pragma clang diagnostic ignored "-Wunused-function" |  | ||||||
| #pragma clang diagnostic ignored "-Wunused-but-set-variable" |  | ||||||
| #pragma clang diagnostic ignored "-Wmissing-braces" |  | ||||||
| #endif |  | ||||||
| @@ -1,22 +0,0 @@ | |||||||
| // Platform OS detection |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #if defined( _WIN32 ) || defined( _WIN64 ) |  | ||||||
| #	ifndef System_Windows |  | ||||||
| #		define System_Windows 1 |  | ||||||
| #	endif |  | ||||||
| #elif defined( __APPLE__ ) && defined( __MACH__ ) |  | ||||||
| #	ifndef System_MacOS |  | ||||||
| #		define System_MacOS 1 |  | ||||||
| #	endif |  | ||||||
| #elif defined( __unix__ ) |  | ||||||
| #	if defined( __linux__ ) |  | ||||||
| #		ifndef System_Linux |  | ||||||
| #			define System_linux 1 |  | ||||||
| #		endif |  | ||||||
| #	else |  | ||||||
| #		error This UNIX operating system is not supported |  | ||||||
| #	endif |  | ||||||
| #else |  | ||||||
| #	error This operating system is not supported |  | ||||||
| #endif |  | ||||||
| @@ -1,45 +0,0 @@ | |||||||
| #if INTELLISENSE_DIRECTIVES |  | ||||||
| #include "win32.hpp" |  | ||||||
| #include "raylib/include/raylib.h" |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| int __stdcall WinMain( HINSTANCE instance, HINSTANCE prev_instance, char* commandline, int num_cmd_show) |  | ||||||
| { |  | ||||||
|     // Initialization |  | ||||||
|     //-------------------------------------------------------------------------------------- |  | ||||||
|     const int screenWidth = 800; |  | ||||||
|     const int screenHeight = 450; |  | ||||||
|  |  | ||||||
|     rl::init_window(screenWidth, screenHeight, "raylib [core] example - basic window"); |  | ||||||
|  |  | ||||||
|     rl::set_target_fps(60);               // Set our game to run at 60 frames-per-second |  | ||||||
|     //-------------------------------------------------------------------------------------- |  | ||||||
|  |  | ||||||
|     // Main game loop |  | ||||||
|     while (!rl::window_should_close())    // Detect window close button or ESC key |  | ||||||
|     { |  | ||||||
|         // Update |  | ||||||
|         //---------------------------------------------------------------------------------- |  | ||||||
|         // TODO: Update your variables here |  | ||||||
|         //---------------------------------------------------------------------------------- |  | ||||||
|  |  | ||||||
|         // Draw |  | ||||||
|         //---------------------------------------------------------------------------------- |  | ||||||
|         rl::begin_drawing(); |  | ||||||
|  |  | ||||||
|             rl::clear_background(RL_RAYWHITE); |  | ||||||
|  |  | ||||||
|             rl::draw_text("Congrats! You created your first window!", 190, 200, 20, RL_LIGHTGRAY); |  | ||||||
|  |  | ||||||
|         rl::end_drawing(); |  | ||||||
|         //---------------------------------------------------------------------------------- |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // De-Initialization |  | ||||||
|     //-------------------------------------------------------------------------------------- |  | ||||||
|     rl::close_window();        // Close window and OpenGL context |  | ||||||
|     //-------------------------------------------------------------------------------------- |  | ||||||
|  |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| @@ -1,3 +0,0 @@ | |||||||
| #pragma once |  | ||||||
|  |  | ||||||
| using HINSTANCE = void*; |  | ||||||
| @@ -1,14 +0,0 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| #include "platform/vendor/arch.hpp" |  | ||||||
| #include "platform/vendor/compiler.hpp" |  | ||||||
| #include "platform/vendor/compiler_ignores.hpp" |  | ||||||
| #include "platform/vendor/os.hpp" |  | ||||||
|  |  | ||||||
| #include "platform/macros.hpp" |  | ||||||
|  |  | ||||||
| #include "platform/win32/types.hpp" |  | ||||||
|  |  | ||||||
| #include "raylib/include/raylib.h" |  | ||||||
|  |  | ||||||
| #include "platform/win32/launch.cpp" |  | ||||||
| @@ -1,285 +0,0 @@ | |||||||
| /********************************************************************************************** |  | ||||||
| * |  | ||||||
| *   raylib configuration flags |  | ||||||
| * |  | ||||||
| *   This file defines all the configuration flags for the different raylib modules |  | ||||||
| * |  | ||||||
| *   LICENSE: zlib/libpng |  | ||||||
| * |  | ||||||
| *   Copyright (c) 2018-2023 Ahmad Fatoum & 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 |  | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Module selection - Some modules could be avoided |  | ||||||
| // Mandatory modules: rcore, rlgl, utils |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| #define RL_SUPPORT_MODULE_RSHAPES          1 |  | ||||||
| #define RL_SUPPORT_MODULE_RTEXTURES        1 |  | ||||||
| #define RL_SUPPORT_MODULE_RTEXT            1       // WARNING: It requires RL_SUPPORT_MODULE_RTEXTURES to load sprite font textures |  | ||||||
| #define RL_SUPPORT_MODULE_RMODELS          1 |  | ||||||
| #define RL_SUPPORT_MODULE_RAUDIO           1 |  | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Module: rcore - Configuration Flags |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Camera module is included (rcamera.h) and multiple predefined cameras are available: free, 1st/3rd person, orbital |  | ||||||
| #define RL_SUPPORT_CAMERA_SYSTEM           1 |  | ||||||
| // Gestures module is included (rgestures.h) to support gestures detection: tap, hold, swipe, drag |  | ||||||
| #define RL_SUPPORT_GESTURES_SYSTEM         1 |  | ||||||
| // Include pseudo-random numbers generator (rprand.h), based on Xoshiro128** and SplitMix64 |  | ||||||
| #define RL_SUPPORT_RPRAND_GENERATOR        1 |  | ||||||
| // Mouse gestures are directly mapped like touches and processed by gestures system |  | ||||||
| #define RL_SUPPORT_MOUSE_GESTURES          1 |  | ||||||
| // Reconfigure standard input to receive key inputs, works with SSH connection. |  | ||||||
| #define RL_SUPPORT_SSH_KEYBOARD_RPI        1 |  | ||||||
| // 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 RL_SUPPORT_WINMM_HIGHRES_TIMER     1 |  | ||||||
| // Use busy wait loop for timing sync, if not defined, a high-resolution timer is set up and used |  | ||||||
| //#define RL_SUPPORT_BUSY_WAIT_LOOP          1 |  | ||||||
| // Use a partial-busy wait loop, in this case frame sleeps for most of the time, but then runs a busy loop at the end for accuracy |  | ||||||
| #define RL_SUPPORT_PARTIALBUSY_WAIT_LOOP    1 |  | ||||||
| // Allow automatic screen capture of current screen pressing F12, defined in KeyCallback() |  | ||||||
| #define RL_SUPPORT_SCREEN_CAPTURE          1 |  | ||||||
| // Allow automatic gif recording of current screen pressing CTRL+F12, defined in KeyCallback() |  | ||||||
| #define RL_SUPPORT_GIF_RECORDING           1 |  | ||||||
| // Support CompressData() and DecompressData() functions |  | ||||||
| #define RL_SUPPORT_COMPRESSION_API         1 |  | ||||||
| // Support automatic generated events, loading and recording of those events when required |  | ||||||
| #define RL_SUPPORT_AUTOMATION_EVENTS       1 |  | ||||||
| // Support custom frame control, only for advance users |  | ||||||
| // By default end_drawing() does this job: draws everything + swap_screen_buffer() + manage frame timing + poll_input_events() |  | ||||||
| // Enabling this flag allows manual control of the frame processes, use at your own risk |  | ||||||
| //#define RL_SUPPORT_CUSTOM_FRAME_CONTROL    1 |  | ||||||
|  |  | ||||||
| // rcore: Configuration values |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| #define RL_MAX_FILEPATH_CAPACITY        8192       // Maximum file paths capacity |  | ||||||
| #define RL_MAX_FILEPATH_LENGTH          4096       // Maximum length for filepaths (Linux PATH_MAX default value) |  | ||||||
|  |  | ||||||
| #define RL_MAX_KEYBOARD_KEYS             512       // Maximum number of keyboard keys supported |  | ||||||
| #define RL_MAX_MOUSE_BUTTONS               8       // Maximum number of mouse buttons supported |  | ||||||
| #define RL_MAX_GAMEPADS                    4       // Maximum number of gamepads supported |  | ||||||
| #define RL_MAX_GAMEPAD_AXIS                8       // Maximum number of axis supported (per gamepad) |  | ||||||
| #define RL_MAX_GAMEPAD_BUTTONS            32       // Maximum number of buttons supported (per gamepad) |  | ||||||
| #define RL_MAX_TOUCH_POINTS                8       // Maximum number of touch points supported |  | ||||||
| #define RL_MAX_KEY_PRESSED_QUEUE          16       // Maximum number of keys in the key input queue |  | ||||||
| #define RL_MAX_CHAR_PRESSED_QUEUE         16       // Maximum number of characters in the char input queue |  | ||||||
|  |  | ||||||
| #define RL_MAX_DECOMPRESSION_SIZE         64       // Max size allocated for decompression in MB |  | ||||||
|  |  | ||||||
| #define RL_MAX_AUTOMATION_EVENTS       16384       // Maximum number of automation events to record |  | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Module: rlgl - Configuration values |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
|  |  | ||||||
| // Enable OpenGL Debug Context (only available on OpenGL 4.3) |  | ||||||
| //#define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT       1 |  | ||||||
|  |  | ||||||
| // Show OpenGL extensions and capabilities detailed logs on init |  | ||||||
| //#define RLGL_SHOW_GL_DETAILS_INFO              1 |  | ||||||
|  |  | ||||||
| //#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 (set_shader_value_texture()) |  | ||||||
|  |  | ||||||
| #define RL_MAX_MATRIX_STACK_SIZE              32      // Maximum size of internal Matrix stack |  | ||||||
|  |  | ||||||
| #define RL_MAX_SHADER_LOCATIONS               32      // Maximum number of shader locations supported |  | ||||||
|  |  | ||||||
| #define RL_CULL_DISTANCE_NEAR               0.01      // Default projection matrix near cull distance |  | ||||||
| #define RL_CULL_DISTANCE_FAR              1000.0      // Default projection matrix far cull distance |  | ||||||
|  |  | ||||||
| // Default shader vertex attribute names to set location points |  | ||||||
| // NOTE: When a new shader is loaded, the following locations are tried to be set for convenience |  | ||||||
| #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION     "vertexPosition"    // Bound by default to shader location: 0 |  | ||||||
| #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD     "vertexTexCoord"    // Bound by default to shader location: 1 |  | ||||||
| #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL       "vertexNormal"      // Bound by default to shader location: 2 |  | ||||||
| #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR        "vertexColor"       // Bound by default to shader location: 3 |  | ||||||
| #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT      "vertexTangent"     // Bound by default to shader location: 4 |  | ||||||
| #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2    "vertexTexCoord2"   // Bound by default to shader location: 5 |  | ||||||
|  |  | ||||||
| #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_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 |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Use QUADS instead of TRIANGLES for drawing when possible |  | ||||||
| // Some lines-based shapes could still use lines |  | ||||||
| #define RL_SUPPORT_QUADS_DRAW_MODE         1 |  | ||||||
|  |  | ||||||
| // rshapes: Configuration values |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| #define SPLINE_SEGMENT_DIVISIONS       24       // Spline segments subdivisions |  | ||||||
|  |  | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Module: rtextures - Configuration Flags |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Selecte desired fileformats to be supported for image data loading |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_PNG      1 |  | ||||||
| //#define RL_SUPPORT_FILEFORMAT_BMP      1 |  | ||||||
| //#define RL_SUPPORT_FILEFORMAT_TGA      1 |  | ||||||
| //#define RL_SUPPORT_FILEFORMAT_JPG      1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_GIF      1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_QOI      1 |  | ||||||
| //#define RL_SUPPORT_FILEFORMAT_PSD      1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_DDS      1 |  | ||||||
| //#define RL_SUPPORT_FILEFORMAT_HDR      1 |  | ||||||
| //#define RL_SUPPORT_FILEFORMAT_PIC          1 |  | ||||||
| //#define RL_SUPPORT_FILEFORMAT_KTX      1 |  | ||||||
| //#define RL_SUPPORT_FILEFORMAT_ASTC     1 |  | ||||||
| //#define RL_SUPPORT_FILEFORMAT_PKM      1 |  | ||||||
| //#define RL_SUPPORT_FILEFORMAT_PVR      1 |  | ||||||
| //#define RL_SUPPORT_FILEFORMAT_SVG      1 |  | ||||||
|  |  | ||||||
| // Support image export functionality (.png, .bmp, .tga, .jpg, .qoi) |  | ||||||
| #define RL_SUPPORT_IMAGE_EXPORT            1 |  | ||||||
| // Support procedural image generation functionality (gradient, spot, perlin-noise, cellular) |  | ||||||
| #define RL_SUPPORT_IMAGE_GENERATION        1 |  | ||||||
| // Support multiple image editing functions to scale, adjust colors, flip, draw on images, crop... |  | ||||||
| // If not defined, still some functions are supported: image_format(), image_crop(), image_to_pot() |  | ||||||
| #define RL_SUPPORT_IMAGE_MANIPULATION      1 |  | ||||||
|  |  | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Module: rtext - Configuration Flags |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Default font is loaded on window initialization to be available for the user to render simple text |  | ||||||
| // NOTE: If enabled, uses external module functions to load default raylib font |  | ||||||
| #define RL_SUPPORT_DEFAULT_FONT            1 |  | ||||||
| // Selected desired font fileformats to be supported for loading |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_FNT          1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_TTF          1 |  | ||||||
|  |  | ||||||
| // Support text management functions |  | ||||||
| // If not defined, still some functions are supported: text_length(), TextFormat() |  | ||||||
| #define RL_SUPPORT_TEXT_MANIPULATION       1 |  | ||||||
|  |  | ||||||
| // On font atlas image generation [gen_image_font_atlas()], add a 3x3 pixels white rectangle |  | ||||||
| // at the bottom-right corner of the atlas. It can be useful to for shapes drawing, to allow |  | ||||||
| // drawing text and shapes with a single draw call [set_shapes_texture()]. |  | ||||||
| #define RL_SUPPORT_FONT_ATLAS_WHITE_REC    1 |  | ||||||
|  |  | ||||||
| // rtext: Configuration values |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| #define RL_MAX_TEXT_BUFFER_LENGTH       1024       // Size of internal static buffers used on some functions: |  | ||||||
|                                                 // TextFormat(), TextSubtext(), TextToUpper(), TextToLower(), TextToPascal(), TextSplit() |  | ||||||
| #define RL_MAX_TEXTSPLIT_COUNT           128       // Maximum number of substrings to split: TextSplit() |  | ||||||
|  |  | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Module: rmodels - Configuration Flags |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Selected desired model fileformats to be supported for loading |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_OBJ          1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_MTL          1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_IQM          1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_GLTF         1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_VOX          1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_M3D          1 |  | ||||||
| // Support procedural mesh generation functions, uses external par_shapes.h library |  | ||||||
| // NOTE: Some generated meshes DO NOT include generated texture coordinates |  | ||||||
| #define RL_SUPPORT_MESH_GENERATION         1 |  | ||||||
|  |  | ||||||
| // rmodels: Configuration values |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| #define RL_MAX_MATERIAL_MAPS              12       // Maximum number of shader maps supported |  | ||||||
| #define RL_MAX_MESH_VERTEX_BUFFERS         7       // Maximum vertex buffers (VBO) per mesh |  | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Module: raudio - Configuration Flags |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Desired audio fileformats to be supported for loading |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_WAV          1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_OGG          1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_MP3          1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_QOA          1 |  | ||||||
| //#define RL_SUPPORT_FILEFORMAT_FLAC         1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_XM           1 |  | ||||||
| #define RL_SUPPORT_FILEFORMAT_MOD          1 |  | ||||||
|  |  | ||||||
| // raudio: Configuration values |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| #define RL_AUDIO_DEVICE_FORMAT    ma_format_f32    // Device output format (miniaudio: float-32bit) |  | ||||||
| #define RL_AUDIO_DEVICE_CHANNELS              2    // Device output channels: stereo |  | ||||||
| #define RL_AUDIO_DEVICE_SAMPLE_RATE           0    // Device sample rate (device default) |  | ||||||
|  |  | ||||||
| #define RL_MAX_AUDIO_BUFFER_POOL_CHANNELS    16    // Maximum number of audio pool channels |  | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Module: utils - Configuration Flags |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| // Standard file io library (stdio.h) included |  | ||||||
| #define RL_SUPPORT_STANDARD_FILEIO         1 |  | ||||||
| // Show RL_TRACELOG() output messages |  | ||||||
| // NOTE: By default LOG_DEBUG traces not shown |  | ||||||
| #define RL_SUPPORT_TRACELOG                1 |  | ||||||
| //#define RL_SUPPORT_TRACELOG_DEBUG          1 |  | ||||||
|  |  | ||||||
| // utils: Configuration values |  | ||||||
| //------------------------------------------------------------------------------------ |  | ||||||
| #define RL_MAX_TRACELOG_MSG_LENGTH       256       // Max length of one trace-log message |  | ||||||
|  |  | ||||||
| #endif // CONFIG_H |  | ||||||
|  |  | ||||||
| // Indicates of raylib has been refactored |  | ||||||
| #ifndef RL_REFACTORED_CPP |  | ||||||
| #define RL_REFACTORED_CPP |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #define RL_USE_CPP_NAMESPACE 1 |  | ||||||
| #define RL_USE_CPP_MANGLING  1 |  | ||||||
|  |  | ||||||
| #if RL_USE_CPP_NAMESPACE && defined(__cplusplus) |  | ||||||
|     #pragma message("USING CPP NAMESPACE") |  | ||||||
|     #define RL_NS_BEGIN namespace rl { |  | ||||||
|     #define RL_NS_END } |  | ||||||
| #else |  | ||||||
|     #define RL_NS_BEGIN |  | ||||||
|     #define RL_NS_END |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if RL_USE_CPP_MANGLING && defined(__cplusplus) |  | ||||||
|     #pragma message("USING CPP MANGLING") |  | ||||||
|     #define RL_EXTERN_C_BEGIN |  | ||||||
|     #define RL_EXTERN_C_END |  | ||||||
| #else |  | ||||||
|     #ifdef __cplusplus |  | ||||||
|         #define RL_EXTERN_C_BEGIN extern "C" { |  | ||||||
|         #define RL_EXTERN_C_END   } |  | ||||||
|     #else |  | ||||||
|         #define RL_EXTERN_C_BEGIN |  | ||||||
|         #define RL_EXTERN_C_END |  | ||||||
|     #endif |  | ||||||
| #endif |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,562 +0,0 @@ | |||||||
| /******************************************************************************************* |  | ||||||
| * |  | ||||||
| *   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-2023 Christoph Wagner (@Crydsch) & Ramon Santamaria (@raysan5) |  | ||||||
| * |  | ||||||
| *   This software is provided "as-is", without any express or implied warranty. In no event |  | ||||||
| *   will the authors be held liable for any damages arising from the use of this software. |  | ||||||
| * |  | ||||||
| *   Permission is granted to anyone to use this software for any purpose, including commercial |  | ||||||
| *   applications, and to alter it and redistribute it freely, subject to the following restrictions: |  | ||||||
| * |  | ||||||
| *     1. The origin of this software must not be misrepresented; you must not claim that you |  | ||||||
| *     wrote the original software. If you use this software in a product, an acknowledgment |  | ||||||
| *     in the product documentation would be appreciated but is not required. |  | ||||||
| * |  | ||||||
| *     2. Altered source versions must be plainly marked as such, and must not be misrepresented |  | ||||||
| *     as being the original software. |  | ||||||
| * |  | ||||||
| *     3. This notice may not be removed or altered from any source distribution. |  | ||||||
| * |  | ||||||
| **********************************************************************************************/ |  | ||||||
|  |  | ||||||
| #ifndef RCAMERA_H |  | ||||||
| #define RCAMERA_H |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Defines and Macros |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Function specifiers definition |  | ||||||
|  |  | ||||||
| // Function specifiers in case library is build/used as a shared library (Windows) |  | ||||||
| // NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll |  | ||||||
| #if defined(_WIN32) |  | ||||||
| #if defined(RL_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(RL_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 RL_CAMERA_CULL_DISTANCE_NEAR      0.01 |  | ||||||
|     #define RL_CAMERA_CULL_DISTANCE_FAR    1000.0 |  | ||||||
| #else |  | ||||||
|     #define RL_CAMERA_CULL_DISTANCE_NEAR   RL_CULL_DISTANCE_NEAR |  | ||||||
|     #define RL_CAMERA_CULL_DISTANCE_FAR    RL_CULL_DISTANCE_FAR |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| RL_NS_BEGIN |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Types and Structures Definition |  | ||||||
| // NOTE: Below types are required for standalone usage |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| #if defined(RCAMERA_STANDALONE) |  | ||||||
|     // 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 (update_camera() does nothing) |  | ||||||
|         CAMERA_FREE,            // Camera free mode |  | ||||||
|         CAMERA_ORBITAL,         // Camera orbital, around target, zoom supported |  | ||||||
|         CAMERA_FIRST_PERSON,    // Camera first person |  | ||||||
|         CAMERA_THIRD_PERSON     // Camera third person |  | ||||||
|     } CameraMode; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Global Variables Definition |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| //... |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Module Functions Declaration |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
|  |  | ||||||
| RL_EXTERN_C_BEGIN |  | ||||||
|  |  | ||||||
| RLAPI Vector3 get_camera_forward(Camera *camera); |  | ||||||
| RLAPI Vector3 get_camera_up(Camera *camera); |  | ||||||
| RLAPI Vector3 get_camera_right(Camera *camera); |  | ||||||
|  |  | ||||||
| // Camera movement |  | ||||||
| RLAPI void camera_move_forward(Camera *camera, float distance, bool moveInWorldPlane); |  | ||||||
| RLAPI void camera_move_up(Camera *camera, float distance); |  | ||||||
| RLAPI void camera_move_right(Camera *camera, float distance, bool moveInWorldPlane); |  | ||||||
| RLAPI void camera_move_to_target(Camera *camera, float delta); |  | ||||||
|  |  | ||||||
| // Camera rotation |  | ||||||
| RLAPI void camera_yaw(Camera *camera, float angle, bool rotateAroundTarget); |  | ||||||
| RLAPI void camera_pitch(Camera *camera, float angle, bool lockView, bool rotateAroundTarget, bool rotateUp); |  | ||||||
| RLAPI void camera_roll(Camera *camera, float angle); |  | ||||||
|  |  | ||||||
| RLAPI Matrix get_camera_view_matrix(Camera *camera); |  | ||||||
| RLAPI Matrix get_camera_projection_matrix(Camera* camera, float aspect); |  | ||||||
|  |  | ||||||
| RL_EXTERN_C_END |  | ||||||
|  |  | ||||||
| RL_NS_END |  | ||||||
|  |  | ||||||
| #endif // RCAMERA_H |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /*********************************************************************************** |  | ||||||
| * |  | ||||||
| *   CAMERA IMPLEMENTATION |  | ||||||
| * |  | ||||||
| ************************************************************************************/ |  | ||||||
|  |  | ||||||
| #if defined(RCAMERA_IMPLEMENTATION) |  | ||||||
|  |  | ||||||
| #include "raymath.h"        // Required for vector maths: |  | ||||||
|                             // vector3_add() |  | ||||||
|                             // vector3_subtract() |  | ||||||
|                             // vector3_scale() |  | ||||||
|                             // vector3_normalize() |  | ||||||
|                             // vector3_distance() |  | ||||||
|                             // vector3_cross_product() |  | ||||||
|                             // vector3_rotate_by_axis_angle() |  | ||||||
|                             // vector3_angle() |  | ||||||
|                             // vector3_negate() |  | ||||||
|                             // matrix_look_at() |  | ||||||
|                             // matrix_perspective() |  | ||||||
|                             // matrix_ortho() |  | ||||||
|                             // matrix_identity() |  | ||||||
|  |  | ||||||
| // raylib required functionality: |  | ||||||
|                             // get_mouse_delta() |  | ||||||
|                             // get_mouse_wheel_move() |  | ||||||
|                             // is_key_down() |  | ||||||
|                             // is_key_pressed() |  | ||||||
|                             // get_frame_time() |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Defines and Macros |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| #define CAMERA_MOVE_SPEED                               0.09f |  | ||||||
| #define CAMERA_ROTATION_SPEED                           0.03f |  | ||||||
| #define CAMERA_PAN_SPEED                                0.2f |  | ||||||
|  |  | ||||||
| // Camera mouse movement sensitivity |  | ||||||
| #define CAMERA_MOUSE_MOVE_SENSITIVITY                   0.003f     // TODO: it should be independant of framerate |  | ||||||
| #define CAMERA_MOUSE_SCROLL_SENSITIVITY                 1.5f |  | ||||||
|  |  | ||||||
| #define CAMERA_ORBITAL_SPEED                            0.5f       // Radians per second |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #define CAMERA_FIRST_PERSON_STEP_TRIGONOMETRIC_DIVIDER  8.0f |  | ||||||
| #define CAMERA_FIRST_PERSON_STEP_DIVIDER                30.0f |  | ||||||
| #define CAMERA_FIRST_PERSON_WAVING_DIVIDER              200.0f |  | ||||||
|  |  | ||||||
| // PLAYER (used by camera) |  | ||||||
| #define PLAYER_MOVEMENT_SENSITIVITY                     20.0f |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Types and Structures Definition |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| //... |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Global Variables Definition |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| //... |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Module specific Functions Declaration |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| //... |  | ||||||
|  |  | ||||||
| RL_NS_BEGIN |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Module Functions Definition |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Returns the cameras forward vector (normalized) |  | ||||||
| Vector3 get_camera_forward(Camera *camera) |  | ||||||
| { |  | ||||||
|     return vector3_normalize(vector3_subtract(camera->target, camera->position)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Returns the cameras up vector (normalized) |  | ||||||
| // Note: The up vector might not be perpendicular to the forward vector |  | ||||||
| Vector3 get_camera_up(Camera *camera) |  | ||||||
| { |  | ||||||
|     return vector3_normalize(camera->up); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Returns the cameras right vector (normalized) |  | ||||||
| Vector3 get_camera_right(Camera *camera) |  | ||||||
| { |  | ||||||
|     Vector3 forward = get_camera_forward(camera); |  | ||||||
|     Vector3 up = get_camera_up(camera); |  | ||||||
|  |  | ||||||
|     return vector3_cross_product(forward, up); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Moves the camera in its forward direction |  | ||||||
| void camera_move_forward(Camera *camera, float distance, bool moveInWorldPlane) |  | ||||||
| { |  | ||||||
|     Vector3 forward = get_camera_forward(camera); |  | ||||||
|  |  | ||||||
|     if (moveInWorldPlane) |  | ||||||
|     { |  | ||||||
|         // Project vector onto world plane |  | ||||||
|         forward.y = 0; |  | ||||||
|         forward = vector3_normalize(forward); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // Scale by distance |  | ||||||
|     forward = vector3_scale(forward, distance); |  | ||||||
|  |  | ||||||
|     // Move position and target |  | ||||||
|     camera->position = vector3_add(camera->position, forward); |  | ||||||
|     camera->target = vector3_add(camera->target, forward); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Moves the camera in its up direction |  | ||||||
| void camera_move_up(Camera *camera, float distance) |  | ||||||
| { |  | ||||||
|     Vector3 up = get_camera_up(camera); |  | ||||||
|  |  | ||||||
|     // Scale by distance |  | ||||||
|     up = vector3_scale(up, distance); |  | ||||||
|  |  | ||||||
|     // Move position and target |  | ||||||
|     camera->position = vector3_add(camera->position, up); |  | ||||||
|     camera->target = vector3_add(camera->target, up); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Moves the camera target in its current right direction |  | ||||||
| void camera_move_right(Camera *camera, float distance, bool moveInWorldPlane) |  | ||||||
| { |  | ||||||
|     Vector3 right = get_camera_right(camera); |  | ||||||
|  |  | ||||||
|     if (moveInWorldPlane) |  | ||||||
|     { |  | ||||||
|         // Project vector onto world plane |  | ||||||
|         right.y = 0; |  | ||||||
|         right = vector3_normalize(right); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // Scale by distance |  | ||||||
|     right = vector3_scale(right, distance); |  | ||||||
|  |  | ||||||
|     // Move position and target |  | ||||||
|     camera->position = vector3_add(camera->position, right); |  | ||||||
|     camera->target = vector3_add(camera->target, right); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Moves the camera position closer/farther to/from the camera target |  | ||||||
| void camera_move_to_target(Camera *camera, float delta) |  | ||||||
| { |  | ||||||
|     float distance = vector3_distance(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 = get_camera_forward(camera); |  | ||||||
|     camera->position = vector3_add(camera->target, vector3_scale(forward, -distance)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Rotates the camera around its up vector |  | ||||||
| // Yaw is "looking left and right" |  | ||||||
| // If rotateAroundTarget is false, the camera rotates around its position |  | ||||||
| // Note: angle must be provided in radians |  | ||||||
| void camera_yaw(Camera *camera, float angle, bool rotateAroundTarget) |  | ||||||
| { |  | ||||||
|     // Rotation axis |  | ||||||
|     Vector3 up = get_camera_up(camera); |  | ||||||
|  |  | ||||||
|     // View vector |  | ||||||
|     Vector3 targetPosition = vector3_subtract(camera->target, camera->position); |  | ||||||
|  |  | ||||||
|     // Rotate view vector around up axis |  | ||||||
|     targetPosition = vector3_rotate_by_axis_angle(targetPosition, up, angle); |  | ||||||
|  |  | ||||||
|     if (rotateAroundTarget) |  | ||||||
|     { |  | ||||||
|         // Move position relative to target |  | ||||||
|         camera->position = vector3_subtract(camera->target, targetPosition); |  | ||||||
|     } |  | ||||||
|     else // rotate around camera.position |  | ||||||
|     { |  | ||||||
|         // Move target relative to position |  | ||||||
|         camera->target = vector3_add(camera->position, targetPosition); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Rotates the camera around its right vector, pitch is "looking up and down" |  | ||||||
| //  - lockView prevents camera overrotation (aka "somersaults") |  | ||||||
| //  - rotateAroundTarget defines if rotation is around target or around its position |  | ||||||
| //  - rotateUp rotates the up direction as well (typically only usefull in CAMERA_FREE) |  | ||||||
| // NOTE: angle must be provided in radians |  | ||||||
| void camera_pitch(Camera *camera, float angle, bool lockView, bool rotateAroundTarget, bool rotateUp) |  | ||||||
| { |  | ||||||
|     // Up direction |  | ||||||
|     Vector3 up = get_camera_up(camera); |  | ||||||
|  |  | ||||||
|     // View vector |  | ||||||
|     Vector3 targetPosition = vector3_subtract(camera->target, camera->position); |  | ||||||
|  |  | ||||||
|     if (lockView) |  | ||||||
|     { |  | ||||||
|         // In these camera modes we clamp the Pitch angle |  | ||||||
|         // to allow only viewing straight up or down. |  | ||||||
|  |  | ||||||
|         // clamp view up |  | ||||||
|         float maxAngleUp = vector3_angle(up, targetPosition); |  | ||||||
|         maxAngleUp -= 0.001f; // avoid numerical errors |  | ||||||
|         if (angle > maxAngleUp) angle = maxAngleUp; |  | ||||||
|  |  | ||||||
|         // clamp view down |  | ||||||
|         float maxAngleDown = vector3_angle(vector3_negate(up), targetPosition); |  | ||||||
|         maxAngleDown *= -1.0f; // downwards angle is negative |  | ||||||
|         maxAngleDown += 0.001f; // avoid numerical errors |  | ||||||
|         if (angle < maxAngleDown) angle = maxAngleDown; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // Rotation axis |  | ||||||
|     Vector3 right = get_camera_right(camera); |  | ||||||
|  |  | ||||||
|     // Rotate view vector around right axis |  | ||||||
|     targetPosition = vector3_rotate_by_axis_angle(targetPosition, right, angle); |  | ||||||
|  |  | ||||||
|     if (rotateAroundTarget) |  | ||||||
|     { |  | ||||||
|         // Move position relative to target |  | ||||||
|         camera->position = vector3_subtract(camera->target, targetPosition); |  | ||||||
|     } |  | ||||||
|     else // rotate around camera.position |  | ||||||
|     { |  | ||||||
|         // Move target relative to position |  | ||||||
|         camera->target = vector3_add(camera->position, targetPosition); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (rotateUp) |  | ||||||
|     { |  | ||||||
|         // Rotate up direction around right axis |  | ||||||
|         camera->up = vector3_rotate_by_axis_angle(camera->up, right, angle); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Rotates the camera around its forward vector |  | ||||||
| // Roll is "turning your head sideways to the left or right" |  | ||||||
| // Note: angle must be provided in radians |  | ||||||
| void camera_roll(Camera *camera, float angle) |  | ||||||
| { |  | ||||||
|     // Rotation axis |  | ||||||
|     Vector3 forward = get_camera_forward(camera); |  | ||||||
|  |  | ||||||
|     // Rotate up direction around forward axis |  | ||||||
|     camera->up = vector3_rotate_by_axis_angle(camera->up, forward, angle); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Returns the camera view matrix |  | ||||||
| Matrix get_camera_view_matrix(Camera *camera) |  | ||||||
| { |  | ||||||
|     return matrix_look_at(camera->position, camera->target, camera->up); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Returns the camera projection matrix |  | ||||||
| Matrix get_camera_projection_matrix(Camera *camera, float aspect) |  | ||||||
| { |  | ||||||
|     if (camera->projection == CAMERA_PERSPECTIVE) |  | ||||||
|     { |  | ||||||
|         return matrix_perspective(camera->fovy*RL_DEG2RAD, aspect, RL_CAMERA_CULL_DISTANCE_NEAR, RL_CAMERA_CULL_DISTANCE_FAR); |  | ||||||
|     } |  | ||||||
|     else if (camera->projection == CAMERA_ORTHOGRAPHIC) |  | ||||||
|     { |  | ||||||
|         double top = camera->fovy/2.0; |  | ||||||
|         double right = top*aspect; |  | ||||||
|  |  | ||||||
|         return matrix_ortho(-right, right, -top, top, RL_CAMERA_CULL_DISTANCE_NEAR, RL_CAMERA_CULL_DISTANCE_FAR); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return matrix_identity(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #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 update_camera(Camera *camera, int mode) |  | ||||||
| { |  | ||||||
|     Vector2 mousePositionDelta = get_mouse_delta(); |  | ||||||
|  |  | ||||||
|     bool moveInWorldPlane = ((mode == CAMERA_FIRST_PERSON) || (mode == CAMERA_THIRD_PERSON)); |  | ||||||
|     bool rotateAroundTarget = ((mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL)); |  | ||||||
|     bool lockView = ((mode == CAMERA_FIRST_PERSON) || (mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL)); |  | ||||||
|     bool rotateUp = false; |  | ||||||
|  |  | ||||||
|     if (mode == CAMERA_ORBITAL) |  | ||||||
|     { |  | ||||||
|         // Orbital can just orbit |  | ||||||
|         Matrix rotation = matrix_rotate(get_camera_up(camera), CAMERA_ORBITAL_SPEED*get_frame_time()); |  | ||||||
|         Vector3 view = vector3_subtract(camera->position, camera->target); |  | ||||||
|         view = vector3_transform(view, rotation); |  | ||||||
|         camera->position = vector3_add(camera->target, view); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         // Camera rotation |  | ||||||
|         if (is_key_down(KEY_DOWN)) camera_pitch(camera, -CAMERA_ROTATION_SPEED, lockView, rotateAroundTarget, rotateUp); |  | ||||||
|         if (is_key_down(KEY_UP)) camera_pitch(camera, CAMERA_ROTATION_SPEED, lockView, rotateAroundTarget, rotateUp); |  | ||||||
|         if (is_key_down(KEY_RIGHT)) camera_yaw(camera, -CAMERA_ROTATION_SPEED, rotateAroundTarget); |  | ||||||
|         if (is_key_down(KEY_LEFT)) camera_yaw(camera, CAMERA_ROTATION_SPEED, rotateAroundTarget); |  | ||||||
|         if (is_key_down(KEY_Q)) camera_roll(camera, -CAMERA_ROTATION_SPEED); |  | ||||||
|         if (is_key_down(KEY_E)) camera_roll(camera, CAMERA_ROTATION_SPEED); |  | ||||||
|  |  | ||||||
|         // Camera movement |  | ||||||
|         if (!is_gamepad_available(0)) |  | ||||||
|         { |  | ||||||
|             // Camera pan (for CAMERA_FREE) |  | ||||||
|             if ((mode == CAMERA_FREE) && (is_mouse_button_down(MOUSE_BUTTON_MIDDLE))) |  | ||||||
|             { |  | ||||||
|                 const Vector2 mouseDelta = get_mouse_delta(); |  | ||||||
|                 if (mouseDelta.x > 0.0f) camera_move_right(camera, CAMERA_PAN_SPEED, moveInWorldPlane); |  | ||||||
|                 if (mouseDelta.x < 0.0f) camera_move_right(camera, -CAMERA_PAN_SPEED, moveInWorldPlane); |  | ||||||
|                 if (mouseDelta.y > 0.0f) camera_move_up(camera, -CAMERA_PAN_SPEED); |  | ||||||
|                 if (mouseDelta.y < 0.0f) camera_move_up(camera, CAMERA_PAN_SPEED); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 // Mouse support |  | ||||||
|                 camera_yaw(camera, -mousePositionDelta.x*CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget); |  | ||||||
|                 camera_pitch(camera, -mousePositionDelta.y*CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             // Keyboard support |  | ||||||
|             if (is_key_down(KEY_W)) camera_move_forward(camera, CAMERA_MOVE_SPEED, moveInWorldPlane); |  | ||||||
|             if (is_key_down(KEY_A)) camera_move_right(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane); |  | ||||||
|             if (is_key_down(KEY_S)) camera_move_forward(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane); |  | ||||||
|             if (is_key_down(KEY_D)) camera_move_right(camera, CAMERA_MOVE_SPEED, moveInWorldPlane); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             // Gamepad controller support |  | ||||||
|             camera_yaw(camera, -(get_gamepad_axis_movement(0, GAMEPAD_AXIS_RIGHT_X) * 2)*CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget); |  | ||||||
|             camera_pitch(camera, -(get_gamepad_axis_movement(0, GAMEPAD_AXIS_RIGHT_Y) * 2)*CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp); |  | ||||||
|  |  | ||||||
|             if (get_gamepad_axis_movement(0, GAMEPAD_AXIS_LEFT_Y) <= -0.25f) camera_move_forward(camera, CAMERA_MOVE_SPEED, moveInWorldPlane); |  | ||||||
|             if (get_gamepad_axis_movement(0, GAMEPAD_AXIS_LEFT_X) <= -0.25f) camera_move_right(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane); |  | ||||||
|             if (get_gamepad_axis_movement(0, GAMEPAD_AXIS_LEFT_Y) >= 0.25f) camera_move_forward(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane); |  | ||||||
|             if (get_gamepad_axis_movement(0, GAMEPAD_AXIS_LEFT_X) >= 0.25f) camera_move_right(camera, CAMERA_MOVE_SPEED, moveInWorldPlane); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if (mode == CAMERA_FREE) |  | ||||||
|         { |  | ||||||
|             if (is_key_down(KEY_SPACE)) camera_move_up(camera, CAMERA_MOVE_SPEED); |  | ||||||
|             if (is_key_down(KEY_LEFT_CONTROL)) camera_move_up(camera, -CAMERA_MOVE_SPEED); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if ((mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL) || (mode == CAMERA_FREE)) |  | ||||||
|     { |  | ||||||
|         // Zoom target distance |  | ||||||
|         camera_move_to_target(camera, -get_mouse_wheel_move()); |  | ||||||
|         if (is_key_pressed(KEY_KP_SUBTRACT)) camera_move_to_target(camera, 2.0f); |  | ||||||
|         if (is_key_pressed(KEY_KP_ADD)) camera_move_to_target(camera, -2.0f); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| #endif // !RCAMERA_STANDALONE |  | ||||||
|  |  | ||||||
| // Update camera movement, movement/rotation values should be provided by user |  | ||||||
| void update_camera_pro(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 |  | ||||||
|     camera_pitch(camera, -rotation.y*RL_DEG2RAD, lockView, rotateAroundTarget, rotateUp); |  | ||||||
|     camera_yaw(camera, -rotation.x*RL_DEG2RAD, rotateAroundTarget); |  | ||||||
|     camera_roll(camera, rotation.z*RL_DEG2RAD); |  | ||||||
|  |  | ||||||
|     // Camera movement |  | ||||||
|     camera_move_forward(camera, movement.x, moveInWorldPlane); |  | ||||||
|     camera_move_right(camera, movement.y, moveInWorldPlane); |  | ||||||
|     camera_move_up(camera, movement.z); |  | ||||||
|  |  | ||||||
|     // Zoom target distance |  | ||||||
|     camera_move_to_target(camera, zoom); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| RL_NS_END |  | ||||||
|  |  | ||||||
| #endif // RCAMERA_IMPLEMENTATION |  | ||||||
| @@ -1,579 +0,0 @@ | |||||||
| /********************************************************************************************** |  | ||||||
| * |  | ||||||
| *   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-2023 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 RL_PI |  | ||||||
|     #define RL_PI 3.14159265358979323846 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Defines and Macros |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| #ifndef RL_MAX_TOUCH_POINTS |  | ||||||
|     #define RL_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 <stdbool.h> |  | ||||||
| #elif !defined(__cplusplus) && !defined(bool) && !defined(RL_BOOL_TYPE) |  | ||||||
|     typedef enum bool { false = 0, true = !false } bool; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include "config.h" |  | ||||||
|  |  | ||||||
| RL_NS_BEGIN |  | ||||||
|  |  | ||||||
| #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[RL_MAX_TOUCH_POINTS]; |  | ||||||
|     Vector2 position[RL_MAX_TOUCH_POINTS]; |  | ||||||
| } GestureEvent; |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Global Variables Definition |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| //... |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Module Functions Declaration |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
|  |  | ||||||
| RL_EXTERN_C_BEGIN |  | ||||||
|  |  | ||||||
| void process_gesture_event(GestureEvent event);           // Process gesture event and translate it into gestures |  | ||||||
| void update_gestures(void);                              // Update gestures detected (must be called every frame) |  | ||||||
|  |  | ||||||
| #if defined(RGESTURES_STANDALONE) |  | ||||||
| void set_gestures_enabled(unsigned int flags);            // Enable a set of gestures using flags |  | ||||||
| bool is_gesture_detected(int gesture);                    // Check if a gesture have been detected |  | ||||||
| int get_gesture_detected(void);                           // Get latest detected gesture |  | ||||||
|  |  | ||||||
| float get_gesture_hold_duration(void);                     // Get gesture hold time in seconds |  | ||||||
| Vector2 get_gesture_drag_vector(void);                     // Get gesture drag vector |  | ||||||
| float get_gesture_drag_angle(void);                        // Get gesture drag angle |  | ||||||
| Vector2 get_gesture_pinch_vector(void);                    // Get gesture pinch delta |  | ||||||
| float get_gesture_pinch_angle(void);                       // Get gesture pinch angle |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| RL_EXTERN_C_END |  | ||||||
|  |  | ||||||
| RL_NS_END |  | ||||||
|  |  | ||||||
| #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 query_performance_counter(unsigned long long int *lpPerformanceCount); |  | ||||||
|     int __stdcall query_performance_frequency(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 <sys/time.h>               // Required for: timespec |  | ||||||
|     #include <time.h>                   // Required for: clock_gettime() |  | ||||||
|  |  | ||||||
|     #include <math.h>                   // Required for: sqrtf(), atan2f() |  | ||||||
| #endif |  | ||||||
| #if defined(__APPLE__)                  // macOS also defines __MACH__ |  | ||||||
|     #include <mach/clock.h>             // Required for: clock_get_time() |  | ||||||
|     #include <mach/mach.h>              // Required for: mach_timespec_t |  | ||||||
| #endif |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Defines and Macros |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| #define RL_FORCE_TO_SWIPE      0.2f        // Swipe force, measured in normalized screen units/time |  | ||||||
| #define RL_MINIMUM_DRAG        0.015f      // Drag minimum force, measured in normalized screen units (0.0f to 1.0f) |  | ||||||
| #define RL_DRAG_TIMEOUT        0.3f        // Drag minimum time for web, measured in seconds |  | ||||||
| #define RL_MINIMUM_PINCH       0.005f      // Pinch minimum force, measured in normalized screen units (0.0f to 1.0f) |  | ||||||
| #define RL_TAP_TIMEOUT         0.3f        // Tap minimum time, measured in seconds |  | ||||||
| #define RL_PINCH_TIMEOUT       0.3f        // Pinch minimum time, measured in seconds |  | ||||||
| #define RL_DOUBLETAP_RANGE     0.03f       // DoubleTap range, measured in normalized screen units (0.0f to 1.0f) |  | ||||||
|  |  | ||||||
| RL_NS_BEGIN |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Types and Structures Definition |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
|  |  | ||||||
| // 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 = { |  | ||||||
| #ifdef __cplusplus |  | ||||||
|     (unsigned int)-1, |  | ||||||
|     GESTURE_NONE, |  | ||||||
|     0b0000001111111111 |  | ||||||
| #else |  | ||||||
|     .Touch.firstId = -1, |  | ||||||
|     .current = GESTURE_NONE,        // No current gesture detected |  | ||||||
|     .enabledFlags = 0b0000001111111111  // All gestures supported by default |  | ||||||
| #endif |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Module specific Functions Declaration |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| static float rg_vector2_angle(Vector2 initialPosition, Vector2 finalPosition); |  | ||||||
| static float rg_vector2_distance(Vector2 v1, Vector2 v2); |  | ||||||
| static double rg_get_current_time(void); |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Module Functions Definition |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
|  |  | ||||||
| // Enable only desired gestures to be detected |  | ||||||
| void set_gestures_enabled(unsigned int flags) |  | ||||||
| { |  | ||||||
|     GESTURES.enabledFlags = flags; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Check if a gesture have been detected |  | ||||||
| bool is_gesture_detected(unsigned int gesture) |  | ||||||
| { |  | ||||||
|     if ((GESTURES.enabledFlags & GESTURES.current) == gesture) return true; |  | ||||||
|     else return false; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Process gesture event and translate it into gestures |  | ||||||
| void process_gesture_event(GestureEvent event) |  | ||||||
| { |  | ||||||
|     // Reset required variables |  | ||||||
|     GESTURES.Touch.pointCount = event.pointCount;      // Required on update_gestures() |  | ||||||
|  |  | ||||||
|     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) && ((rg_get_current_time() - GESTURES.Touch.eventTime) < RL_TAP_TIMEOUT) && (rg_vector2_distance(GESTURES.Touch.downPositionA, event.position[0]) < RL_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 = rg_get_current_time(); |  | ||||||
|  |  | ||||||
|             GESTURES.Swipe.startTime = rg_get_current_time(); |  | ||||||
|  |  | ||||||
|         #ifdef __cplusplus |  | ||||||
|             GESTURES.Drag.vector = Vector2{ 0.0f, 0.0f }; |  | ||||||
|         #else |  | ||||||
|             GESTURES.Drag.vector = (Vector2){ 0.0f, 0.0f }; |  | ||||||
|         #endif |  | ||||||
|         } |  | ||||||
|         else if (event.touchAction == TOUCH_ACTION_UP) |  | ||||||
|         { |  | ||||||
|             // A swipe can happen while the current gesture is drag, but (specially for web) also hold, so set upPosition for both cases |  | ||||||
|             if (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 = rg_vector2_distance(GESTURES.Touch.downPositionA, GESTURES.Touch.upPosition); |  | ||||||
|             GESTURES.Drag.intensity = GESTURES.Drag.distance/(float)((rg_get_current_time() - GESTURES.Swipe.startTime)); |  | ||||||
|  |  | ||||||
|             // Detect GESTURE_SWIPE |  | ||||||
|             if ((GESTURES.Drag.intensity > RL_FORCE_TO_SWIPE) && (GESTURES.current != GESTURE_DRAG)) |  | ||||||
|             { |  | ||||||
|                 // NOTE: Angle should be inverted in Y |  | ||||||
|                 GESTURES.Drag.angle = 360.0f - rg_vector2_angle(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; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|         #if __cplusplus |  | ||||||
|             GESTURES.Touch.downDragPosition = Vector2{ 0.0f, 0.0f }; |  | ||||||
|         #else |  | ||||||
|             GESTURES.Touch.downDragPosition = (Vector2){ 0.0f, 0.0f }; |  | ||||||
|         #endif |  | ||||||
|             GESTURES.Touch.pointCount = 0; |  | ||||||
|         } |  | ||||||
|         else if (event.touchAction == TOUCH_ACTION_MOVE) |  | ||||||
|         { |  | ||||||
|             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 ((rg_get_current_time() - GESTURES.Touch.eventTime) > RL_DRAG_TIMEOUT) |  | ||||||
|                 { |  | ||||||
|                     GESTURES.Touch.eventTime = rg_get_current_time(); |  | ||||||
|                     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 = rg_vector2_distance(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 = rg_get_current_time(); |  | ||||||
|         } |  | ||||||
|         else if (event.touchAction == TOUCH_ACTION_MOVE) |  | ||||||
|         { |  | ||||||
|             GESTURES.Pinch.distance = rg_vector2_distance(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 ((rg_vector2_distance(GESTURES.Touch.previousPositionA, GESTURES.Touch.moveDownPositionA) >= RL_MINIMUM_PINCH) || (rg_vector2_distance(GESTURES.Touch.previousPositionB, GESTURES.Touch.moveDownPositionB) >= RL_MINIMUM_PINCH)) |  | ||||||
|             { |  | ||||||
|                 if ( rg_vector2_distance(GESTURES.Touch.previousPositionA, GESTURES.Touch.previousPositionB) > rg_vector2_distance(GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB) ) GESTURES.current = GESTURE_PINCH_IN; |  | ||||||
|                 else GESTURES.current = GESTURE_PINCH_OUT; |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 GESTURES.current = GESTURE_HOLD; |  | ||||||
|                 GESTURES.Hold.timeDuration = rg_get_current_time(); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             // NOTE: Angle should be inverted in Y |  | ||||||
|             GESTURES.Pinch.angle = 360.0f - rg_vector2_angle(GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB); |  | ||||||
|         } |  | ||||||
|         else if (event.touchAction == TOUCH_ACTION_UP) |  | ||||||
|         { |  | ||||||
|             GESTURES.Pinch.distance = 0.0f; |  | ||||||
|             GESTURES.Pinch.angle = 0.0f; |  | ||||||
|         #if __cplusplus |  | ||||||
|             GESTURES.Pinch.vector = Vector2{ 0.0f, 0.0f }; |  | ||||||
|         #else |  | ||||||
|             GESTURES.Pinch.vector = (Vector2){ 0.0f, 0.0f }; |  | ||||||
|         #endif |  | ||||||
|             GESTURES.Touch.pointCount = 0; |  | ||||||
|  |  | ||||||
|             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 update_gestures(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 = rg_get_current_time(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // 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 get_gesture_detected(void) |  | ||||||
| { |  | ||||||
|     // Get current gesture only if enabled |  | ||||||
|     return (GESTURES.enabledFlags & GESTURES.current); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Hold time measured in ms |  | ||||||
| float get_gesture_hold_duration(void) |  | ||||||
| { |  | ||||||
|     // NOTE: time is calculated on current gesture HOLD |  | ||||||
|  |  | ||||||
|     double time = 0.0; |  | ||||||
|  |  | ||||||
|     if (GESTURES.current == GESTURE_HOLD) time = rg_get_current_time() - GESTURES.Hold.timeDuration; |  | ||||||
|  |  | ||||||
|     return (float)time; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Get drag vector (between initial touch point to current) |  | ||||||
| Vector2 get_gesture_drag_vector(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 get_gesture_drag_angle(void) |  | ||||||
| { |  | ||||||
|     // NOTE: drag angle is calculated on one touch points TOUCH_ACTION_UP |  | ||||||
|  |  | ||||||
|     return GESTURES.Drag.angle; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Get distance between two pinch points |  | ||||||
| Vector2 get_gesture_pinch_vector(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 get_gesture_pinch_angle(void) |  | ||||||
| { |  | ||||||
|     // NOTE: pinch angle is calculated on two touch points TOUCH_ACTION_MOVE |  | ||||||
|  |  | ||||||
|     return GESTURES.Pinch.angle; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Module specific Functions Definition |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Get angle from two-points vector with X-axis |  | ||||||
| static float rg_vector2_angle(Vector2 v1, Vector2 v2) |  | ||||||
| { |  | ||||||
|     float angle = atan2f(v2.y - v1.y, v2.x - v1.x)*(180.0f/RL_PI); |  | ||||||
|  |  | ||||||
|     if (angle < 0) angle += 360.0f; |  | ||||||
|  |  | ||||||
|     return angle; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Calculate distance between two Vector2 |  | ||||||
| static float rg_vector2_distance(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 rg_get_current_time(void) |  | ||||||
| { |  | ||||||
|     double time = 0; |  | ||||||
|  |  | ||||||
| #if !defined(RGESTURES_STANDALONE) |  | ||||||
|     time = get_time(); |  | ||||||
| #else |  | ||||||
| #if defined(_WIN32) |  | ||||||
|     unsigned long long int clockFrequency, currentTime; |  | ||||||
|  |  | ||||||
|     query_performance_frequency(&clockFrequency);     // BE CAREFUL: Costly operation! |  | ||||||
|     query_performance_counter(¤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; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| RL_NS_END |  | ||||||
|  |  | ||||||
| #endif // RGESTURES_IMPLEMENTATION |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,81 +0,0 @@ | |||||||
| /********************************************************************************************** |  | ||||||
| * |  | ||||||
| *   raylib.utils - Some common utility functions |  | ||||||
| * |  | ||||||
| * |  | ||||||
| *   LICENSE: zlib/libpng |  | ||||||
| * |  | ||||||
| *   Copyright (c) 2014-2023 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 UTILS_H |  | ||||||
| #define UTILS_H |  | ||||||
|  |  | ||||||
| #if defined(PLATFORM_ANDROID) |  | ||||||
|     #include <stdio.h>                      // Required for: FILE |  | ||||||
|     #include <android/asset_manager.h>      // Required for: AAssetManager |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if defined(RL_SUPPORT_TRACELOG) |  | ||||||
|     #define RL_TRACELOG(level, ...) RL_NS(trace_log)(level, __VA_ARGS__) |  | ||||||
|  |  | ||||||
|     #if defined(RL_SUPPORT_TRACELOG_DEBUG) |  | ||||||
|         #define TRACELOGD(...) RL_NS(trace_log)(LOG_DEBUG, __VA_ARGS__) |  | ||||||
|     #else |  | ||||||
|         #define TRACELOGD(...) (void)0 |  | ||||||
|     #endif |  | ||||||
| #else |  | ||||||
|     #define RL_TRACELOG(level, ...) (void)0 |  | ||||||
|     #define TRACELOGD(...) (void)0 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Some basic Defines |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| #if defined(PLATFORM_ANDROID) |  | ||||||
|     #define fopen(name, mode) android_fopen(name, mode) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Types and Structures Definition |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| //... |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Global Variables Definition |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Nop... |  | ||||||
|  |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| // Module Functions Declaration |  | ||||||
| //---------------------------------------------------------------------------------- |  | ||||||
| #if defined(__cplusplus) |  | ||||||
| extern "C" {            // Prevents name mangling of functions |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if defined(PLATFORM_ANDROID) |  | ||||||
| void init_asset_manager(AAssetManager *manager, const char *dataPath);   // Initialize asset manager from android app |  | ||||||
| FILE *android_fopen(const char *fileName, const char *mode);           // Replacement for fopen() -> Read-only! |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if defined(__cplusplus) |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif // UTILS_H |  | ||||||
										
											Binary file not shown.
										
									
								
							| @@ -1,8 +0,0 @@ | |||||||
| #include "raudio.c" |  | ||||||
| #include "rcore.c" |  | ||||||
| #include "rglfw.c" |  | ||||||
| #include "rmodels.c" |  | ||||||
| #include "rshapes.c" |  | ||||||
| #include "rtext.c" |  | ||||||
| #include "rtextures.c" |  | ||||||
| #include "rutils.c" |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,242 +0,0 @@ | |||||||
| // rlgl.h |  | ||||||
|  |  | ||||||
| word RL_NOT_REFACTORED, RL_REFACTORED_CPP |  | ||||||
|  |  | ||||||
| namespace rl_, |  | ||||||
| namespace rl, |  | ||||||
| namespace rlgl, |  | ||||||
| not word  rl |  | ||||||
| not word  rlgl |  | ||||||
|  |  | ||||||
| namespace RL_LOG_,         LOG_ |  | ||||||
| namespace RL_PIXELFORMAT_, PIXELFORMAT_ |  | ||||||
| namespace RL_TEXTURE_,     TEXTURE_ |  | ||||||
| namespace RL_SHADER_,      SHADER_ |  | ||||||
| namespace RL_BLEND_,       BLEND_ |  | ||||||
| namespace RL_ATTACHMENT_,  ATTACHMENT_ |  | ||||||
| namespace RL_CULL_,        CULL_ |  | ||||||
|  |  | ||||||
| not include rlgl.h |  | ||||||
|  |  | ||||||
| word TRACELOG, RL_TRACELOG |  | ||||||
|  |  | ||||||
| word RLGL, GLOBAL_DATA |  | ||||||
|  |  | ||||||
| word Vector2,             Vector2 |  | ||||||
| word Vector3,             Vector3 |  | ||||||
| word Vector4,             Vector4 |  | ||||||
| word Quaternion,          Quaternion |  | ||||||
| word Matrix,              Matrix |  | ||||||
| word Color,               Color |  | ||||||
| word Rectangle,           Rectangle |  | ||||||
| word Image,               Image |  | ||||||
| word Texture,             Texture |  | ||||||
| word Texture2D,           Texture2d |  | ||||||
| word TextureCubemap,      Texture_Cubemap |  | ||||||
| word RenderTexture,       Render_Texture |  | ||||||
| word RenderTexture2D,     Render_Texture2D |  | ||||||
| word NPatchInfo,          N_Patch_Info |  | ||||||
| word GlyphInfo,           Glyph_Info |  | ||||||
| word Font,                Font |  | ||||||
| word Camera3D,            Camera3D |  | ||||||
| word Camera,              Camera |  | ||||||
| word Camera2D,            Camera2D |  | ||||||
| word Mesh,                Mesh |  | ||||||
| word Shader,              Shader |  | ||||||
| word MaterialMap,         Material_Map |  | ||||||
| word Material,            Material |  | ||||||
| word Transform,           Transform |  | ||||||
| word BoneInfo,            Bone_Info |  | ||||||
| word Model,               Model |  | ||||||
| word ModelAnimation,      Model_Animation |  | ||||||
| word Ray,                 Ray |  | ||||||
| word RayCollision,        Ray_Collision |  | ||||||
| word BoundingBox,         Bounding_box |  | ||||||
| word Wave,                Wave |  | ||||||
| word rAudioBuffer,        Audio_Buffer |  | ||||||
| word rAudioProcessor,     Audio_Processor |  | ||||||
| word AudioStream,         Audio_Stream |  | ||||||
| word Sound,               Sound |  | ||||||
| word Music,               Music |  | ||||||
| word VrDeviceInfo,        VR_Device_Info |  | ||||||
| word VrStereoConfig,      VR_Stereo_Config |  | ||||||
| word FilePathList,        File_Path_List |  | ||||||
| word AutomationEvent,     Automation_Event |  | ||||||
| word AutomationEventList, Automation_Event_List |  | ||||||
| word Matrix,              Matrix |  | ||||||
|  |  | ||||||
| word rlVertexBuffer,                 vertex_buffer |  | ||||||
| word rlDrawCall,                     draw_call |  | ||||||
| word rlRenderBatch,                  render_batch |  | ||||||
| word rlGlVersion,                    gl_version |  | ||||||
| word rlTraceLogLevel,                trace_log_level |  | ||||||
| word rlPixelFormat,                  pixel_format |  | ||||||
| word rlTextureFilter,                texture_filter |  | ||||||
| word rlShaderLocationIndex,          shader_location_index |  | ||||||
| word rlShaderUniformDataType,        shader_uniform_data_type |  | ||||||
| word rlShaderAttributeDataType,      shader_attribute_data_type |  | ||||||
| word rlBlendMode,                    blend_mode |  | ||||||
| word rlFramebufferAttachType,        framebuffer_attach_type |  | ||||||
| word rlFramebufferAttachTextureType, framebuffer_attach_texture_type |  | ||||||
| word rlCullMode,                     cull_mode |  | ||||||
|  |  | ||||||
| word get_pixel_data_size, gpu_get_pixel_data_size |  | ||||||
|  |  | ||||||
| word rlMatrixMode,                       matrix_mode |  | ||||||
| word rlPushMatrix,                       push_matrix |  | ||||||
| word rlPopMatrix,                        pop_matrix |  | ||||||
| word rlLoadIdentity,                     load_identity |  | ||||||
| word rlTranslatef,                       translatef |  | ||||||
| word rlRotatef,                          rotatef |  | ||||||
| word rlScalef,                           scalef |  | ||||||
| word rlMultMatrixf,                      mult_matrixf |  | ||||||
| word rlFrustum,                          frustum |  | ||||||
| word rlOrtho,                            ortho |  | ||||||
| word rlViewport,                         viewport |  | ||||||
| word rlBegin,                            begin |  | ||||||
| word rlEnd,                              end |  | ||||||
| word rlVertex2i,                         vertex2i |  | ||||||
| word rlVertex2f,                         vertex2f |  | ||||||
| word rlVertex3f,                         vertex3f |  | ||||||
| word rlTexCoord2f,                       tex_coord2f |  | ||||||
| word rlNormal3f,                         normal3f |  | ||||||
| word rlColor4ub,                         color4ub |  | ||||||
| word rlColor3f,                          color3f |  | ||||||
| word rlColor4f,                          color4f |  | ||||||
| word rlEnableVertexArray,                enable_vertex_array |  | ||||||
| word rlDisableVertexArray,               disable_vertex_array |  | ||||||
| word rlEnableVertexBuffer,               enable_vertex_buffer |  | ||||||
| word rlDisableVertexBuffer,              disable_vertex_buffer |  | ||||||
| word rlEnableVertexBufferElement,        enable_vertex_buffer_element |  | ||||||
| word rlDisableVertexBufferElement,       disable_vertex_buffer_element |  | ||||||
| word rlEnableVertexAttribute,            enable_vertex_attribute |  | ||||||
| word rlDisableVertexAttribute,           disable_vertex_attribute |  | ||||||
| word rlEnableStatePointer,               enable_state_pointer |  | ||||||
| word rlDisableStatePointer,              disable_state_pointer |  | ||||||
| word rlActiveTextureSlot,                active_texture_slot |  | ||||||
| word rlEnableTexture,                    enable_texture |  | ||||||
| word rlDisableTexture,                   disable_texture |  | ||||||
| word rlEnableTextureCubemap,             enable_texture_cubemap |  | ||||||
| word rlDisableTextureCubemap,            disable_texture_cubemap |  | ||||||
| word rlTextureParameters,                texture_parameters |  | ||||||
| word rlCubemapParameters,                cubemap_parameters |  | ||||||
| word rlEnableShader,                     enable_shader |  | ||||||
| word rlDisableShader,                    disable_shader |  | ||||||
| word rlEnableFramebuffer,                enable_framebuffer |  | ||||||
| word rlDisableFramebuffer,               disable_framebuffer |  | ||||||
| word rlActiveDrawBuffers,                active_draw_buffers |  | ||||||
| word rlBlitFramebuffer,                  blit_framebuffer |  | ||||||
| word rlEnableColorBlend,                 enable_color_blend |  | ||||||
| word rlDisableColorBlend,                disable_color_blend |  | ||||||
| word rlEnableDepthTest,                  enable_depth_test |  | ||||||
| word rlDisableDepthTest,                 disable_depth_test |  | ||||||
| word rlEnableDepthMask,                  enable_depth_mask |  | ||||||
| word rlDisableDepthMask,                 disable_depth_mask |  | ||||||
| word rlEnableBackfaceCulling,            enable_backface_culling |  | ||||||
| word rlDisableBackfaceCulling,           disable_backface_culling |  | ||||||
| word rlSetCullFace,                      set_cull_face |  | ||||||
| word rlEnableScissorTest,                enable_scissor_test |  | ||||||
| word rlDisableScissorTest,               disable_scissor_test |  | ||||||
| word rlScissor,                          scissor |  | ||||||
| word rlEnableWireMode,                   enable_wire_mode |  | ||||||
| word rlEnablePointMode,                  enable_point_mode |  | ||||||
| word rlDisableWireMode,                  disable_wire_mode |  | ||||||
| word rlSetLineWidth,                     set_line_width |  | ||||||
| word rlGetLineWidth,                     get_line_width |  | ||||||
| word rlEnableSmoothLines,                enable_smooth_lines |  | ||||||
| word rlDisableSmoothLines,               disable_smooth_lines |  | ||||||
| word rlEnableStereoRender,               enable_stereo_render |  | ||||||
| word rlDisableStereoRender,              disable_stereo_render |  | ||||||
| word rlIsStereoRenderEnabled,            is_stereo_render_enabled |  | ||||||
| word rlClearColor,                       clear_color |  | ||||||
| word rlClearScreenBuffers,               clear_screen_buffers |  | ||||||
| word rlCheckErrors,                      check_errors |  | ||||||
| word rlSetBlendMode,                     set_blend_mode |  | ||||||
| word rlSetBlendFactors,                  set_blend_factors |  | ||||||
| word rlSetBlendFactorsSeparate,          set_blend_factors_separate |  | ||||||
| word rlglInit,                           init |  | ||||||
| word rlglClose,                          close |  | ||||||
| word rlLoadExtensions,                   load_extensions |  | ||||||
| word rlGetVersion,                       get_version |  | ||||||
| word rlSetFramebufferWidth,              set_framebuffer_width |  | ||||||
| word rlGetFramebufferWidth,              get_framebuffer_width |  | ||||||
| word rlSetFramebufferHeight,             set_framebuffer_height |  | ||||||
| word rlGetFramebufferHeight,             get_framebuffer_height |  | ||||||
| word rlGetTextureIdDefault,              get_texture_id_default |  | ||||||
| word rlGetShaderIdDefault,               get_shader_id_default |  | ||||||
| word rlLoadRenderBatch,                  load_render_batch |  | ||||||
| word rlUnloadRenderBatch,                unload_render_batch |  | ||||||
| word rlDrawRenderBatch,                  draw_render_batch |  | ||||||
| word rlSetRenderBatchActive,             set_render_batch_active |  | ||||||
| word rlDrawRenderBatchActive,            draw_render_batch_active |  | ||||||
| word rlCheckRenderBatchLimit,            check_render_batch_limit |  | ||||||
| word rlSetTexture,                       set_texture |  | ||||||
| word rlLoadVertexArray,                  load_vertex_array |  | ||||||
| word rlLoadVertexBuffer,                 load_vertex_buffer |  | ||||||
| word rlLoadVertexBufferElement,          load_vertex_buffer_element |  | ||||||
| word rlUpdateVertexBuffer,               update_vertex_buffer |  | ||||||
| word rlUpdateVertexBufferElements,       update_vertex_buffer_elements |  | ||||||
| word rlUnloadVertexArray,                unload_vertex_array |  | ||||||
| word rlUnloadVertexBuffer,               unload_vertex_buffer |  | ||||||
| word rlSetVertexAttribute,               set_vertex_attribute |  | ||||||
| word rlSetVertexAttributeDivisor,        set_vertex_attribute_divisor |  | ||||||
| word rlSetVertexAttributeDefault,        set_vertex_attribute_default |  | ||||||
| word rlDrawVertexArray,                  draw_vertex_array |  | ||||||
| word rlDrawVertexArrayElements,          draw_vertex_array_elements |  | ||||||
| word rlDrawVertexArrayInstanced,         draw_vertex_array_instanced |  | ||||||
| word rlDrawVertexArrayElementsInstanced, draw_vertex_array_elements_instanced |  | ||||||
| word rlLoadTexture,                      load_texture |  | ||||||
| word rlLoadTextureDepth,                 load_texture_depth |  | ||||||
| word rlLoadTextureCubemap,               load_texture_cubemap |  | ||||||
| word rlUpdateTexture,                    update_texture |  | ||||||
| word rlGetGlTextureFormats,              get_gl_texture_formats |  | ||||||
| word rlUnloadTexture,                    unload_texture |  | ||||||
| word rlGenTextureMipmaps,                gen_texture_mipmaps |  | ||||||
| word rlLoadFramebuffer,                  load_framebuffer |  | ||||||
| word rlFramebufferAttach,                framebuffer_attach |  | ||||||
| word rlFramebufferComplete,              framebuffer_complete |  | ||||||
| word rlUnloadFramebuffer,                unload_framebuffer |  | ||||||
| word rlLoadShaderCode,                   load_shader_code |  | ||||||
| word rlCompileShader,                    compile_shader |  | ||||||
| word rlLoadShaderProgram,                load_shader_program |  | ||||||
| word rlUnloadShaderProgram,              unload_shader_program |  | ||||||
| word rlGetLocationUniform,               get_location_uniform |  | ||||||
| word rlGetLocationAttrib,                get_location_attrib |  | ||||||
| word rlSetUniform,                       set_uniform |  | ||||||
| word rlSetUniformMatrix,                 set_uniform_matrix |  | ||||||
| word rlSetUniformSampler,                set_uniform_sampler |  | ||||||
| word rlSetShader,                        set_shader |  | ||||||
| word rlLoadComputeShaderProgram,         load_compute_shader_program |  | ||||||
| word rlComputeShaderDispatch,            compute_shader_dispatch |  | ||||||
| word rlLoadShaderBuffer,                 load_shader_buffer |  | ||||||
| word rlUnloadShaderBuffer,               unload_shader_buffer |  | ||||||
| word rlUpdateShaderBuffer,               update_shader_buffer |  | ||||||
| word rlBindShaderBuffer,                 bind_shader_buffer |  | ||||||
| word rlReadShaderBuffer,                 read_shader_buffer |  | ||||||
| word rlCopyShaderBuffer,                 copy_shader_buffer |  | ||||||
| word rlGetShaderBufferSize,              get_shader_buffer_size |  | ||||||
| word rlBindImageTexture,                 bind_image_texture |  | ||||||
| word rlGetMatrixModelview,               get_matrix_modelview |  | ||||||
| word rlGetMatrixProjection,              get_matrix_projection |  | ||||||
| word rlGetMatrixTransform,               get_matrix_transform |  | ||||||
| word rlGetMatrixProjectionStereo,        get_matrix_projection_stereo |  | ||||||
| word rlGetMatrixViewOffsetStereo,        get_matrix_view_offset_stereo |  | ||||||
| word rlSetMatrixProjection,              set_matrix_projection |  | ||||||
| word rlSetMatrixModelview,               set_matrix_modelview |  | ||||||
| word rlSetMatrixProjectionStereo,        set_matrix_projection_stereo |  | ||||||
| word rlSetMatrixViewOffsetStereo,        set_matrix_view_offset_stereo |  | ||||||
| word rlLoadDrawCube,                     load_draw_cube |  | ||||||
| word rlLoadDrawQuad,                     load_draw_quad |  | ||||||
| word rlLoadShaderDefault,                load_shader_default |  | ||||||
| word rlUnloadShaderDefault,              unload_shader_default |  | ||||||
| word rlGetPixelDataSize,                 internal_get_pixel_data_size |  | ||||||
| word rlMatrixIdentity,                   internal_matrix_identity |  | ||||||
| word rlMatrixMultiply,                   internal_matrix_multiply |  | ||||||
| word rlCheckRenderBatchLimit,            check_render_batch_limit |  | ||||||
| word rlLoadShaderDefault,                load_shader_default |  | ||||||
| word rlSetMatrixProjection,              set_matrix_projection |  | ||||||
| word rlUnloadFramebuffer,                unload_framebuffer |  | ||||||
| word rlReadScreenPixels,                 read_screen_pixels |  | ||||||
| word rlReadTexturePixels,                read_texture_pixels |  | ||||||
| word rlGetShaderLocsDefault,             get_shader_locs_default |  | ||||||
| word rlGetPixelFormatName,               get_pixel_format_name |  | ||||||
| @@ -1,322 +0,0 @@ | |||||||
| #define GEN_DEFINE_LIBRARY_CODE_CONSTANTS |  | ||||||
| #define GEN_BENCHMARK |  | ||||||
| #define GEN_ENFORCE_STRONG_CODE_TYPES |  | ||||||
| // #define GEN_IMPLEMENTATION |  | ||||||
| #include "gen.cpp" |  | ||||||
| #include "gen.builder.cpp" |  | ||||||
|  |  | ||||||
|  |  | ||||||
| constexpr char const* path_config_h    = "config.h"; |  | ||||||
| constexpr char const* path_raylib_h    = "raylib.h"; |  | ||||||
| constexpr char const* path_raymath_h   = "raymath.h"; |  | ||||||
| constexpr char const* path_rcamera_h   = "rcamera.h"; |  | ||||||
| constexpr char const* path_rcore_h     = "rcore.h"; |  | ||||||
| constexpr char const* path_rgestures_h = "rgestures.h"; |  | ||||||
| constexpr char const* path_rgl_h       = "rgl.h"; |  | ||||||
| constexpr char const* path_rtext_h     = "rtext.h"; |  | ||||||
|  |  | ||||||
| constexpr char const* path_rcore_desktop_c = "rcore_desktop.c"; |  | ||||||
|  |  | ||||||
| constexpr char const* path_raudio_c    = "raudio.c"; |  | ||||||
| constexpr char const* path_rcore_c     = "rcore.c"; |  | ||||||
| constexpr char const* path_rglfw_c     = "rglfw.c"; |  | ||||||
| constexpr char const* path_rmodels_c   = "rmodels.c"; |  | ||||||
| constexpr char const* path_rtext_c     = "rtext.c"; |  | ||||||
| constexpr char const* path_rtextures_c = "rtextures.c"; |  | ||||||
| constexpr char const* path_rutils_c    = "rutils.c"; |  | ||||||
|  |  | ||||||
| using namespace gen; |  | ||||||
|  |  | ||||||
| StringCached upper_snake_to_mixed_snake(StringCached str) |  | ||||||
| { |  | ||||||
|     local_persist String scratch = String::make_reserve(GlobalAllocator, kilobytes(1)); |  | ||||||
|     scratch.clear(); |  | ||||||
|  |  | ||||||
|     bool capitalizeNext = true; |  | ||||||
|  |  | ||||||
|     for (s32 index = 0; index < str.length(); ++index) |  | ||||||
|     { |  | ||||||
|         char c = str[index]; |  | ||||||
|  |  | ||||||
|         if (c == '_') |  | ||||||
|         { |  | ||||||
|             scratch.append(c); |  | ||||||
|             capitalizeNext = true; |  | ||||||
|         } |  | ||||||
|         else if (capitalizeNext) |  | ||||||
|         { |  | ||||||
|             if (c >= 'a' && c <= 'z') |  | ||||||
|             { |  | ||||||
|                 scratch.append(c - 32); // Convert to uppercase |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 scratch.append(c); |  | ||||||
|             } |  | ||||||
|             capitalizeNext = false; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             if (c >= 'A' && c <= 'Z') |  | ||||||
|             { |  | ||||||
|                 scratch.append(c + 32); // Convert to lowercase |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 scratch.append(c); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     StringCached result = get_cached_string(scratch); |  | ||||||
|     return result; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| StringCached pascal_to_lower_snake(StringCached str) |  | ||||||
| { |  | ||||||
|     local_persist String scratch = String::make_reserve(GlobalAllocator, kilobytes(1)); |  | ||||||
|     scratch.clear(); |  | ||||||
|  |  | ||||||
|     for (s32 index = 0; index < str.length(); ++index) |  | ||||||
|     { |  | ||||||
|         char c = str[index]; |  | ||||||
|         char next = (index + 1 < str.length()) ? str[index + 1] : '\0'; // Ensure we don't go out of bounds |  | ||||||
|  |  | ||||||
|         // Whitelist check for "2D" and "3D" |  | ||||||
|         if ((c == '2' || c == '3' | c == '4') && (next == 'D' || next == 'd')) |  | ||||||
|         { |  | ||||||
|             if (index > 0) // If it's not the start of the string, append an underscore |  | ||||||
|             { |  | ||||||
|                 char* prev = str.Data + index - 1; |  | ||||||
|                 if (*prev != '_') // Avoid double underscores |  | ||||||
|                 { |  | ||||||
|                     scratch.append('_'); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             scratch.append(c); |  | ||||||
|             scratch.append('d'); // Convert to lowercase |  | ||||||
|             index++; // Skip the next character since we've already processed it |  | ||||||
|             continue; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if (c >= 'A' && c <= 'Z') |  | ||||||
|         { |  | ||||||
|             char* prev = (index > 0) ? str.Data + index - 1 : nullptr; |  | ||||||
|  |  | ||||||
|             if ((index > 0 && prev && *prev >= 'a' && *prev <= 'z') ||  |  | ||||||
|                 (prev && char_is_digit(*prev) && (next >= 'A' && next <= 'Z'))) |  | ||||||
|             { |  | ||||||
|                 scratch.append('_'); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             scratch.append(c + 32); |  | ||||||
|         } |  | ||||||
|         else if (char_is_digit(c) && (next >= 'A' && next <= 'Z')) // Check for a number followed by an uppercase letter |  | ||||||
|         { |  | ||||||
|             scratch.append(c); |  | ||||||
|             scratch.append('_'); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             scratch.append(c); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     StringCached result = get_cached_string(scratch); |  | ||||||
|     return result; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void refactor_define( CodeDefine& code ) |  | ||||||
| { |  | ||||||
| 	local_persist String name_scratch = String::make_reserve( GlobalAllocator, kilobytes(1) ); |  | ||||||
|  |  | ||||||
| 	if ( str_compare( elem->Name, txt("RL"), 2 ) == 0 || str_compare( elem->Name, txt("RAYLIB"), 6 ) == 0 ) |  | ||||||
| 		continue; |  | ||||||
|  |  | ||||||
| 	name_scratch.append_fmt( "%RL_%S", elem->Name ); |  | ||||||
| 	elem->Name = get_cached_string( name_scratch ); |  | ||||||
| 	name_scratch.clear(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void refactor_enum( CodeEnum& code ) |  | ||||||
| { |  | ||||||
| 	for ( Code elem : code->Body ) |  | ||||||
| 	{ |  | ||||||
| 		if ( elem->Type == ECode::Untyped ) |  | ||||||
| 		{ |  | ||||||
| 			elem->Content = upper_snake_to_mixed_snake( elem->Content ); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void refactor_typename( CodeType& type ) |  | ||||||
| { |  | ||||||
| 	local_persist CodeType t_unsigned_char      = parse_type( code(unsigned char) ); |  | ||||||
| 	local_persist CodeType t_unsigned_char_ptr  = parse_type( code(unsigned char*) ); |  | ||||||
| 	local_persist CodeType t_unsigned_short_ptr	= parse_type( code(unsigned short*) ); |  | ||||||
| 	local_persist CodeType t_int                = parse_type( code(int) ); |  | ||||||
| 	local_persist CodeType t_int_ptr 		    = parse_type( code(int*) ); |  | ||||||
| 	local_persist CodeType t_unsigned_int       = parse_type( code(unsigned int) ); |  | ||||||
| 	local_persist CodeType t_float 	            = parse_type( code(float) ); |  | ||||||
| 	local_persist CodeType t_float_ptr          = parse_type( code(float*) ); |  | ||||||
|  |  | ||||||
| 	local_persist CodeType t_f32_ptr = parse_type( code(f32*) ); |  | ||||||
| 	local_persist CodeType t_u8_ptr  = parse_type( code(u8*) ); |  | ||||||
| 	local_persist CodeType t_s32_ptr = parse_type( code(s32*) ); |  | ||||||
|  |  | ||||||
| 	String type_str = type.to_string(); |  | ||||||
|  |  | ||||||
| 	if ( str_compare( type_str, t_unsigned_char.to_string() ) == 0 ) |  | ||||||
| 	{ |  | ||||||
| 		type.ast = t_u8.ast; |  | ||||||
| 	} |  | ||||||
| 	if ( str_compare( type_str, t_unsigned_char_ptr.to_string() ) == 0 ) |  | ||||||
| 	{ |  | ||||||
| 		type.ast = t_u8_ptr.ast; |  | ||||||
| 	} |  | ||||||
| 	if ( str_compare( type_str, t_unsigned_short_ptr.to_string() ) == 0 ) |  | ||||||
| 	{ |  | ||||||
| 		type.ast = t_u8_ptr.ast; |  | ||||||
| 	} |  | ||||||
| 	if ( str_compare( type_str, t_int.to_string() ) == 0 ) |  | ||||||
| 	{ |  | ||||||
| 		type.ast = t_s32.ast; |  | ||||||
| 	} |  | ||||||
| 	if ( str_compare( type_str, t_int_ptr.to_string() ) == 0 ) |  | ||||||
| 	{ |  | ||||||
| 		type.ast = t_s32_ptr.ast; |  | ||||||
| 	} |  | ||||||
| 	if ( str_compare( type_str, t_unsigned_int.to_string() ) == 0 ) |  | ||||||
| 	{ |  | ||||||
| 		type.ast = t_u32.ast; |  | ||||||
| 	} |  | ||||||
| 	if ( str_compare( type_str, t_float.to_string() ) == 0 ) |  | ||||||
| 	{ |  | ||||||
| 		type.ast = t_f32.ast; |  | ||||||
| 	} |  | ||||||
| 	if ( str_compare( type_str, t_float_ptr.to_string() ) == 0 ) |  | ||||||
| 	{ |  | ||||||
| 		type.ast = t_f32_ptr.ast; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void refactor_fn( CodeFn& fn ) |  | ||||||
| { |  | ||||||
| 	StringCached original_name = fn->Name; |  | ||||||
| 	fn->Name = pascal_to_lower_snake( fn->Name ); |  | ||||||
|  |  | ||||||
| 	log_fmt( "%S", "Proc ID: %S -> %S", original_name, fn->Name ); |  | ||||||
|  |  | ||||||
| 	for ( CodeParam param : fn->Params ) |  | ||||||
| 	{ |  | ||||||
| 		refactor_typename( param->ValueType ); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void refactor_struct( CodeStruct& code ) |  | ||||||
| { |  | ||||||
| 	for ( Code field : code->Body ) |  | ||||||
| 	{ |  | ||||||
| 		if ( field->Type == ECode::Variable ) |  | ||||||
| 		{ |  | ||||||
| 			CodeVar var = field.cast<CodeVar>(); |  | ||||||
| 			refactor_typename( var->ValueType ); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void refactor_file( char const* path ) |  | ||||||
| { |  | ||||||
| 	FileContents contents = file_read_contents( GlobalAllocator, true, path ); |  | ||||||
| 	CodeBody     code     = parse_global_body( { contents.size, rcast(char const*, contents.data) } ); |  | ||||||
|  |  | ||||||
| 	local_perist String name_scratch = String::make_reserve( GlobalAllocator, kilobytes(1) ); |  | ||||||
|  |  | ||||||
| 	// CodeBody includes |  | ||||||
| 	// CodeBody nspace_body = def_body( ECode::Namespace ); |  | ||||||
| 	CodeBody new_code = def_body( ECode::Global_Body ); |  | ||||||
|  |  | ||||||
| 	for ( Code elem : code ) |  | ||||||
| 	{ |  | ||||||
| 		if ( elem->Type == ECode::Preprocess_Define ) |  | ||||||
| 		{ |  | ||||||
| 			refactor_define( elem.cast<CodeDefine>() ); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( elem->Type == ECode::Enum ) |  | ||||||
| 		{ |  | ||||||
| 			refactor_enum( elem.cast<CodeEnum>() ); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( elem->Type == ECode::Typedef ) |  | ||||||
| 		{ |  | ||||||
| 			CodeTypedef td = elem.cast<CodeTypedef>(); |  | ||||||
| 			if ( td->UnderlyingType->Type == ECode::Enum ) |  | ||||||
| 			{ |  | ||||||
| 				CodeEnum code = td->UnderlyingType.cast<CodeEnum>(); |  | ||||||
| 				refactor_enum( code ); |  | ||||||
| 			} |  | ||||||
| 			if ( td->UnderlyingType->Type == ECode::Struct ) |  | ||||||
| 			{ |  | ||||||
| 				CodeStruct code = td->UnderlyingType.cast<CodeStruct>(); |  | ||||||
| 				refactor_struct( code ); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( elem->Type == ECode::Struct ) |  | ||||||
| 		{ |  | ||||||
| 			refactor_struct( elem.cast<CodeStruct>() ); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( elem->Type == ECode::Function || elem->Type == ECode::Function_Fwd ) |  | ||||||
| 		{ |  | ||||||
| 			refactor_fn( elem.cast<CodeFn>() ); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if ( elem->Type == ECode::Extern_Linkage ) |  | ||||||
| 		{ |  | ||||||
| 			CodeBody body = elem.cast<CodeExtern>()->Body; |  | ||||||
| 			for ( Code elem : body ) |  | ||||||
| 			{ |  | ||||||
| 				if ( elem->Type == ECode::Function || elem->Type == ECode::Function_Fwd ) |  | ||||||
| 				{ |  | ||||||
| 					refactor_fn( elem.cast<CodeFn>() ); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			Code nspace = def_namespace( txt("raylib"), def_namespace_body( args(elem) ) ); |  | ||||||
| 			elem = nspace; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		new_code.append( elem ); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	Builder builder = Builder::open( path ); |  | ||||||
| 	builder.print( new_code ); |  | ||||||
| 	builder.write(); |  | ||||||
|  |  | ||||||
| 	name_scratch.clear(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int gen_main() |  | ||||||
| { |  | ||||||
| 	gen::init(); |  | ||||||
|  |  | ||||||
| 	refactor_file( path_config_h ); |  | ||||||
| 	refactor_file( path_raylib_h ); |  | ||||||
| 	refactor_file( path_rcamera_h ); |  | ||||||
| 	refactor_file( path_raymath_h ); |  | ||||||
| 	refactor_file( path_rcore_h ); |  | ||||||
| 	refactor_file( path_rgl_h ); |  | ||||||
| 	refactor_file( path_rtext_h ); |  | ||||||
|  |  | ||||||
| 	refactor_file( path_rcore_desktop_c ); |  | ||||||
| 	refactor_file( path_raudio_c ); |  | ||||||
| 	refactor_file( path_rcore_c ); |  | ||||||
| 	refactor_file( path_rglfw_c ); |  | ||||||
| 	refactor_file( path_rmodels_c ); |  | ||||||
| 	refactor_file( path_rtext_c ); |  | ||||||
| 	refactor_file( path_rutils_c ); |  | ||||||
|  |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| @@ -1,10 +0,0 @@ | |||||||
| # Vis AST |  | ||||||
|  |  | ||||||
| AST visualizer for gencpp |  | ||||||
|  |  | ||||||
| This is a early start to creating frontend tooling for c/c++ using gencpp as a core component.   |  | ||||||
| I'll be exploring creating an AST explorer for this library with raylib as the graphical & general platform vendor for dependencies that go beyond the scope of gencpp. |  | ||||||
|  |  | ||||||
| For now I'll have its build script in this file, however it will heavily rely on gencpp's helper scripts. |  | ||||||
|  |  | ||||||
| Whatever sort of UX tooling I setup for this will be reused for the other tools I'll be creating for gencpp. |  | ||||||
| @@ -1,256 +0,0 @@ | |||||||
| Clear-Host |  | ||||||
|  |  | ||||||
| $path_root     = git rev-parse --show-toplevel |  | ||||||
| $path_scripts  = Join-Path $path_root 'scripts' |  | ||||||
|  |  | ||||||
| $target_arch        = Join-Path $path_scripts 'helpers/target_arch.psm1' |  | ||||||
| $devshell           = Join-Path $path_scripts 'helpers/devshell.ps1' |  | ||||||
| $format_cpp	        = Join-Path $path_scripts 'helpers/format_cpp.psm1' |  | ||||||
| $incremental_checks = Join-Path $path_scripts 'helpers/incremental_checks.ps1' |  | ||||||
| $vendor_toolchain   = Join-Path $path_scripts 'helpers/vendor_toolchain.ps1' |  | ||||||
|  |  | ||||||
| $path_project  = Join-Path $path_root     'project' |  | ||||||
| $path_aux      = Join-Path $path_project  'auxillary' |  | ||||||
| $path_vis_root = Join-Path $path_aux      'vis_ast' |  | ||||||
| $path_binaries = Join-Path $path_vis_root 'binaries' |  | ||||||
|  |  | ||||||
| $path_deps = Join-Path $path_vis_root 'dependencies' |  | ||||||
| $path_temp = Join-Path $path_deps     'temp' |  | ||||||
|  |  | ||||||
| Import-Module $target_arch |  | ||||||
| Import-Module $format_cpp |  | ||||||
|  |  | ||||||
| #region Arguments |  | ||||||
| $vendor           = $null |  | ||||||
| $optimize         = $null |  | ||||||
| $debug 	          = $null |  | ||||||
| $analysis	      = $false |  | ||||||
| $dev              = $false |  | ||||||
| $verbose          = $null |  | ||||||
|  |  | ||||||
| [array] $vendors = @( "clang", "msvc" ) |  | ||||||
|  |  | ||||||
| # This is a really lazy way of parsing the args, could use actual params down the line... |  | ||||||
|  |  | ||||||
| if ( $args ) { $args | ForEach-Object { |  | ||||||
| switch ($_){ |  | ||||||
|  { $_ -in $vendors }   { $vendor    = $_; break } |  | ||||||
|  "optimize"            { $optimize  = $true } |  | ||||||
|  "debug"               { $debug     = $true } |  | ||||||
|  "analysis"            { $analysis  = $true } |  | ||||||
|  "dev"                 { $dev       = $true } |  | ||||||
|  "verbose"             { $verbose   = $true } |  | ||||||
| } |  | ||||||
| }} |  | ||||||
| #endregion Argument |  | ||||||
|  |  | ||||||
| # Load up toolchain configuraion |  | ||||||
| . $vendor_toolchain |  | ||||||
| . $incremental_checks |  | ||||||
|  |  | ||||||
| # Clear out the current content first |  | ||||||
| if ( test-path $path_temp) { |  | ||||||
| 	remove-item $path_temp -Recurse |  | ||||||
| } |  | ||||||
| New-Item -ItemType Directory -Path $path_temp |  | ||||||
|  |  | ||||||
| if ( -not (Test-Path $path_binaries) ) { |  | ||||||
| 	New-Item -ItemType Directory -Path $path_binaries |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function setup-raylib { |  | ||||||
| 	$path_raylib     = join-path $path_deps   'raylib' |  | ||||||
| 	$path_raylib_inc = join-path $path_raylib 'include' |  | ||||||
| 	$path_raylib_lib = join-path $path_raylib 'lib' |  | ||||||
| 	if ( test-path $path_raylib_inc ) { |  | ||||||
| 		remove-item $path_raylib_inc -recurse |  | ||||||
| 		remove-item $path_raylib_lib -recurse |  | ||||||
| 	} |  | ||||||
| 	new-item -path $path_raylib_inc -ItemType Directory |  | ||||||
| 	new-item -path $path_raylib_lib -ItemType Directory |  | ||||||
|  |  | ||||||
| 	$url_raylib_zip  = 'https://github.com/Ed94/raylib_refactored/archive/refs/heads/refactor-support.zip' |  | ||||||
| 	$path_raylib_zip = join-path $path_temp 'raylib.zip' |  | ||||||
|  |  | ||||||
| 	$path_raylib_master      = join-path $path_temp          'raylib_refactored-refactor-support' |  | ||||||
| 	$path_raylib_src         = join-path $path_raylib_master 'src' |  | ||||||
| 	$path_raylib_platforms   = join-path $path_raylib_src    'platforms' |  | ||||||
| 	$path_raylib_glfw_inc    = join-path $path_raylib_src    'external/glfw/include' |  | ||||||
| 	$path_raylib_gputex      = join-path $path_raylib_src    'external/rl_gputex.h' |  | ||||||
|  |  | ||||||
| 	if ( test-path $path_raylib_master ) { |  | ||||||
| 		remove-item $path_raylib_master -Recurse |  | ||||||
| 	} |  | ||||||
| 	invoke-webrequest -uri $url_raylib_zip   -outfile $path_raylib_zip |  | ||||||
| 	expand-archive    -path $path_raylib_zip -destinationpath $path_temp |  | ||||||
|  |  | ||||||
| 	write-host "Building raylib with $vendor" |  | ||||||
|  |  | ||||||
| 	$path_build = Join-Path $path_raylib 'build' |  | ||||||
| 	if ( (Test-Path $path_build) -eq $false ) { |  | ||||||
| 		New-Item $path_build -ItemType Directory |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	$raylib_headers  = Get-ChildItem -Path $path_raylib_src -Filter '*.h' -File |  | ||||||
| 	$raylib_modules  = get-childitem -path $path_raylib_src -filter '*.c' -file |  | ||||||
|  |  | ||||||
| 	# Refactor with refactor.exe |  | ||||||
| 	if ( $true ) { |  | ||||||
| 		$path_refactor      = join-path $path_raylib 'raylib_cpp.refactor' |  | ||||||
| 		$path_refactor_rlgl = join-path $path_raylib 'raylib_cpp_gl.refactor' |  | ||||||
|  |  | ||||||
| 		$files = @() |  | ||||||
| 		foreach ( $header in $raylib_headers ) { |  | ||||||
| 			$file_name = split-path $header -leaf |  | ||||||
|  |  | ||||||
| 			if ( -not $file_name.Equals('rlgl.h' ) ) { |  | ||||||
| 				$files += "$header" |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		foreach ( $module in $raylib_modules ) { |  | ||||||
| 			$files += "$module" |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		$files += "$path_raylib_gputex" |  | ||||||
|  |  | ||||||
| 		$platform_modules = @() |  | ||||||
| 		foreach ( $module in (get-childitem -path $path_raylib_platforms -filter '*.c' -file) ) { |  | ||||||
| 			$platform_modules += "$module" |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		$path_rlgl = join-path $path_raylib_src 'rlgl.h' |  | ||||||
|  |  | ||||||
| 		Push-Location $path_raylib_src |  | ||||||
| 			write-host "Beginning refactor...`n" |  | ||||||
| 			$refactors = @(@()) |  | ||||||
| 			$refactorParams = @( |  | ||||||
| 				# "-debug", |  | ||||||
| 				"-num=$($files.Count)" |  | ||||||
| 				"-src=$($files)", |  | ||||||
| 				"-spec=$($path_refactor)" |  | ||||||
| 			) |  | ||||||
| 			& refactor $refactorParams |  | ||||||
| 			Write-Host "`nRefactoring complete`n`n" |  | ||||||
| 		Pop-Location |  | ||||||
|  |  | ||||||
| 		Push-Location $path_raylib_platforms |  | ||||||
| 		write-host "Beginning refactor...`n" |  | ||||||
| 			$refactors = @(@()) |  | ||||||
| 			$refactorParams = @( |  | ||||||
| 				# "-debug", |  | ||||||
| 				"-num=$($platform_modules.Count)" |  | ||||||
| 				"-src=$($platform_modules)", |  | ||||||
| 				"-spec=$($path_refactor)" |  | ||||||
| 			) |  | ||||||
| 			& refactor $refactorParams |  | ||||||
| 			Write-Host "`nRefactoring complete`n`n" |  | ||||||
| 		Pop-Location |  | ||||||
|  |  | ||||||
| 		Push-Location $path_raylib_src |  | ||||||
| 			$gl_modules = @( "$path_rlgl", "$path_raylib_gputex" ) |  | ||||||
|  |  | ||||||
| 			write-host "Beginning refactor just for rlgl.h...`n" |  | ||||||
| 			$refactors = @(@()) |  | ||||||
| 			$refactorParams = @( |  | ||||||
| 				# "-debug", |  | ||||||
| 				"-num=$($gl_modules.Count)" |  | ||||||
| 				"-src=$($gl_modules)", |  | ||||||
| 				"-spec=$($path_refactor_rlgl)" |  | ||||||
| 			) |  | ||||||
| 			& refactor $refactorParams |  | ||||||
| 			Write-Host "`nRefactoring complete`n`n" |  | ||||||
| 		Pop-Location |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	# Refactor raylib with gencpp |  | ||||||
| 	if ( $false ) { |  | ||||||
| 	# if ( $false ) { |  | ||||||
| 		$path_gencpp = join-path $path_root 'project/gen' |  | ||||||
|  |  | ||||||
| 		$includes = @( |  | ||||||
| 			$path_gencpp |  | ||||||
| 		) |  | ||||||
|  |  | ||||||
| 		$compiler_args = @( |  | ||||||
| 			($flag_define + 'GEN_TIME') |  | ||||||
| 		) |  | ||||||
|  |  | ||||||
| 		$linker_args = @( |  | ||||||
|  |  | ||||||
| 		) |  | ||||||
|  |  | ||||||
| 		$unit       = join-path $path_raylib 'raylib_refactor.cpp' |  | ||||||
| 		$executable = join-path $path_build  'raylib_refactor.exe' |  | ||||||
|  |  | ||||||
| 		$build_result = build-simple $path_build $includes $compiler_args $linker_args $unit $executable |  | ||||||
| 		Push-Location $path_raylib_src |  | ||||||
| 			if ( Test-Path( $executable ) ) { |  | ||||||
| 				Measure-Command { & $executable |  | ||||||
| 						| ForEach-Object { |  | ||||||
| 							write-host `t $_ -ForegroundColor Green |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 			} |  | ||||||
| 		Pop-Location |  | ||||||
|  |  | ||||||
| 		push-location $path_scripts |  | ||||||
| 		# Time to format |  | ||||||
| 		$fmt_includes = @() |  | ||||||
| 		foreach ( $header in $raylib_headers ) { |  | ||||||
| 			$fmt_includes +=  split-path $header -leaf |  | ||||||
| 		} |  | ||||||
| 		foreach ( $module in $raylib_modules ) { |  | ||||||
| 			$fmt_includes +=  split-path $module -leaf |  | ||||||
| 		} |  | ||||||
| 		format-cpp $path_raylib_src $fmt_includes $null |  | ||||||
| 		pop-location |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	# Build raylib |  | ||||||
| 	if ( $true ) { |  | ||||||
| 		# Microsoft |  | ||||||
| 		$lib_gdi32   = 'Gdi32.lib' |  | ||||||
| 		$lib_shell32 = 'Shell32.lib' |  | ||||||
| 		$lib_xinput  = 'Xinput.lib' |  | ||||||
| 		$lib_user32  = 'User32.lib' |  | ||||||
| 		$lib_winmm   = 'Winmm.lib' |  | ||||||
|  |  | ||||||
| 		$includes = @( |  | ||||||
| 			$path_raylib_src, |  | ||||||
| 			$path_raylib_glfw_inc |  | ||||||
| 		) |  | ||||||
| 		foreach ($include in $includes) { |  | ||||||
| 			write-host $include |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		$compiler_args = @( |  | ||||||
| 			($flag_define + 'PLATFORM_DESKTOP'), |  | ||||||
| 			($flag_define + 'RL_BUILD_LIBTYPE_SHARED'), |  | ||||||
| 			$flag_all_cpp |  | ||||||
| 		) |  | ||||||
| 		$linker_args   = @( |  | ||||||
| 			$flag_link_dll, |  | ||||||
|  |  | ||||||
| 			# $lib_xinput, |  | ||||||
| 			$lib_gdi32, |  | ||||||
| 			$lib_shell32, |  | ||||||
| 			$lib_user32, |  | ||||||
| 			$lib_winmm |  | ||||||
| 		) |  | ||||||
|  |  | ||||||
| 		# $unit = join-path $path_raylib     'raylib.c' |  | ||||||
| 		$dll  = join-path $path_raylib_lib 'raylib.dll' |  | ||||||
| 		# $build_result = build-simple $path_build $includes $compiler_args $linker_args $unit $dll |  | ||||||
|  |  | ||||||
| 		$build_result = build $path_build $includes $compiler_args $linker_args $raylib_modules $dll |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	# Move headers to used include |  | ||||||
| 	foreach ($header in $raylib_headers) { |  | ||||||
| 		Copy-Item -Path $header -Destination (join-path $path_raylib_inc (split-path $header -Leaf)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	# Don't want to remove as it hampers debugging. |  | ||||||
| 	# remove-item -path $path_temp -Recurse |  | ||||||
| } |  | ||||||
| setup-raylib |  | ||||||
		Reference in New Issue
	
	Block a user