mirror of
				https://github.com/Ed94/gencpp.git
				synced 2025-10-29 05:50:53 -07:00 
			
		
		
		
	Compare commits
	
		
			12 Commits
		
	
	
		
			v0.15-Alph
			...
			v0.16-Alph
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9bd6dac783 | |||
| 212d907d73 | |||
| c1ab233686 | |||
| b42b224c0d | |||
| 041671762b | |||
| d0f3b6187e | |||
| b22f589203 | |||
| 4af85f8612 | |||
| e9c151f85d | |||
| a900e86b65 | |||
| d5a4b77033 | |||
| eaba60f80b | 
							
								
								
									
										22
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -16,25 +16,15 @@ | ||||
| gencpp.hpp | ||||
| gencpp.cpp | ||||
|  | ||||
| # Build results | ||||
| [Dd]ebug/ | ||||
| [Dd]ebugPublic/ | ||||
| [Rr]elease/ | ||||
| [Rr]eleases/ | ||||
| x64/ | ||||
| x86/ | ||||
| [Ww][Ii][Nn]32/ | ||||
| [Aa][Rr][Mm]/ | ||||
| [Aa][Rr][Mm]64/ | ||||
| bld/ | ||||
| [Bb]in/ | ||||
| [Oo]bj/ | ||||
| [Ll]og/ | ||||
| [Ll]ogs/ | ||||
| vc140.pdb | ||||
| **/*.lib | ||||
| **/*.pdb | ||||
| **/*.exe | ||||
| **/*.dll | ||||
|  | ||||
| release/** | ||||
|  | ||||
| # Unreal | ||||
| **/Unreal/*.h | ||||
| **/Unreal/*.cpp | ||||
| ! **/Unreal/validate.unreal.cpp | ||||
| project/auxillary/vis_ast/dependencies/temp | ||||
|   | ||||
							
								
								
									
										6
									
								
								.vscode/c_cpp_properties.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.vscode/c_cpp_properties.json
									
									
									
									
										vendored
									
									
								
							| @@ -12,7 +12,8 @@ | ||||
|                 "GEN_TIME", | ||||
|                 "GEN_IMPLEMENTATION", | ||||
|                 // "GEN_DONT_USE_NAMESPACE" | ||||
|                 "GEN_INTELLISENSE_DIRECTIVES" | ||||
|                 "GEN_INTELLISENSE_DIRECTIVES", | ||||
|                 "INTELLISENSE_DIRECTIVES" | ||||
|             ], | ||||
|             "windowsSdkVersion": "10.0.19041.0", | ||||
|             "compilerPath": "C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.29.30133/bin/HostX64/x64/cl.exe", | ||||
| @@ -31,7 +32,8 @@ | ||||
|                 "GEN_TIME", | ||||
|                 "GEN_IMPLEMENTATION", | ||||
|                 // "GEN_DONT_USE_NAMESPACE" | ||||
|                 "GEN_INTELLISENSE_DIRECTIVES" | ||||
|                 "GEN_INTELLISENSE_DIRECTIVES", | ||||
|                 "INTELLISENSE_DIRECTIVES" | ||||
|             ], | ||||
|             "windowsSdkVersion": "10.0.19041.0", | ||||
|             "compilerPath": "C:/Users/Ed/scoop/apps/llvm/current/bin/clang++.exe", | ||||
|   | ||||
							
								
								
									
										9
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							| @@ -40,6 +40,15 @@ | ||||
| 			"args": [], | ||||
| 			"cwd": "${workspaceFolder}/singleheader/", | ||||
| 			"visualizerFile": "${workspaceFolder}/scripts/gencpp.natvis" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "cppvsdbg", | ||||
| 			"request": "launch", | ||||
| 			"name": "Debug raylib refactor vsdbg", | ||||
| 			"program": "${workspaceFolder}/project/auxillary/vis_ast/dependencies/raylib/build/raylib_refactor.exe", | ||||
| 			"args": [], | ||||
| 			"cwd": "${workspaceFolder}/project/auxillary/vis_ast/dependencies/temp/raylib-master/src/", | ||||
| 			"visualizerFile": "${workspaceFolder}/scripts/gencpp.natvis" | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
|   | ||||
							
								
								
									
										4
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @@ -28,7 +28,9 @@ | ||||
| 		"functional": "cpp", | ||||
| 		"vector": "cpp", | ||||
| 		"list": "cpp", | ||||
| 		"xhash": "cpp" | ||||
| 		"xhash": "cpp", | ||||
| 		"glfw3.h": "c", | ||||
| 		"stdbool.h": "c" | ||||
| 	}, | ||||
| 	"C_Cpp.intelliSenseEngineFallback": "disabled", | ||||
| 	"mesonbuild.configureOnOpen": true, | ||||
|   | ||||
							
								
								
									
										106
									
								
								project/auxillary/vis_ast/build.ps1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								project/auxillary/vis_ast/build.ps1
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | ||||
| 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_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 | ||||
| } | ||||
|  | ||||
| $includes = @( | ||||
| 	$paht_code | ||||
| ) | ||||
|  | ||||
| # 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_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 | ||||
| ) | ||||
|  | ||||
| $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 | ||||
							
								
								
									
										0
									
								
								project/auxillary/vis_ast/clean.ps1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								project/auxillary/vis_ast/clean.ps1
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										24
									
								
								project/auxillary/vis_ast/code/platform/macros.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								project/auxillary/vis_ast/code/platform/macros.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| #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 ) ) | ||||
							
								
								
									
										9
									
								
								project/auxillary/vis_ast/code/platform/vendor/arch.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								project/auxillary/vis_ast/code/platform/vendor/arch.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| // Platform architecture | ||||
|  | ||||
| #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 | ||||
							
								
								
									
										21
									
								
								project/auxillary/vis_ast/code/platform/vendor/compiler.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								project/auxillary/vis_ast/code/platform/vendor/compiler.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| // Platform compiler | ||||
|  | ||||
| #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 | ||||
							
								
								
									
										34
									
								
								project/auxillary/vis_ast/code/platform/vendor/compiler_ignores.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								project/auxillary/vis_ast/code/platform/vendor/compiler_ignores.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| #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 | ||||
							
								
								
									
										21
									
								
								project/auxillary/vis_ast/code/platform/vendor/os.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								project/auxillary/vis_ast/code/platform/vendor/os.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| // Platform OS detection | ||||
|  | ||||
| #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 | ||||
							
								
								
									
										8
									
								
								project/auxillary/vis_ast/code/platform/win32/launch.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								project/auxillary/vis_ast/code/platform/win32/launch.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| #if INTELLISENSE_DIRECTIVES | ||||
| #include "win32.hpp" | ||||
| #endif | ||||
|  | ||||
| int __stdcall WinMain( HINSTANCE instance, HINSTANCE prev_instance, char* commandline, int num_cmd_show) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
							
								
								
									
										1
									
								
								project/auxillary/vis_ast/code/platform/win32/types.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								project/auxillary/vis_ast/code/platform/win32/types.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| using HINSTANCE = void*; | ||||
							
								
								
									
										10
									
								
								project/auxillary/vis_ast/code/vis_ast_windows.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								project/auxillary/vis_ast/code/vis_ast_windows.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| #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 "platform/win32/launch.cpp" | ||||
							
								
								
									
										226
									
								
								project/auxillary/vis_ast/dependencies/raylib/include/config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								project/auxillary/vis_ast/dependencies/raylib/include/config.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,226 @@ | ||||
| /********************************************************************************************** | ||||
|  * | ||||
|  *   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 RL_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 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 | ||||
| // 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 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 SUPPORT_EVENTS_AUTOMATION       1 | ||||
| // Support custom frame control, only for advance users | ||||
| // By default EndDrawing() does this job: draws everything + SwapScreenBuffer() + manage frame timing + PollInputEvents() | ||||
| // Enabling this flag allows manual control of the frame processes, use at your own risk | ||||
| // #define SUPPORT_CUSTOM_FRAME_CONTROL    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 | ||||
|  | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // 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 | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| // 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 | ||||
|  | ||||
|  | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // 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 | ||||
|  | ||||
|  | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Module: rtextures - Configuration Flags | ||||
| //------------------------------------------------------------------------------------ | ||||
| // Selecte desired fileformats to be supported for image data loading | ||||
| #define RL_SUPPORT_FILEFORMAT_PNG 1 | ||||
| // #define SUPPORT_FILEFORMAT_BMP      1 | ||||
| // #define SUPPORT_FILEFORMAT_TGA      1 | ||||
| // #define SUPPORT_FILEFORMAT_JPG      1 | ||||
| #define RL_SUPPORT_FILEFORMAT_GIF 1 | ||||
| #define RL_SUPPORT_FILEFORMAT_QOI 1 | ||||
| // #define SUPPORT_FILEFORMAT_PSD      1 | ||||
| #define RL_SUPPORT_FILEFORMAT_DDS 1 | ||||
| // #define SUPPORT_FILEFORMAT_HDR      1 | ||||
| // #define SUPPORT_FILEFORMAT_PIC          1 | ||||
| // #define SUPPORT_FILEFORMAT_KTX      1 | ||||
| // #define SUPPORT_FILEFORMAT_ASTC     1 | ||||
| // #define SUPPORT_FILEFORMAT_PKM      1 | ||||
| // #define SUPPORT_FILEFORMAT_PVR      1 | ||||
| // #define 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: ImageFormat(), ImageCrop(), ImageToPOT() | ||||
| #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: TextLength(), TextFormat() | ||||
| #define RL_SUPPORT_TEXT_MANIPULATION 1 | ||||
|  | ||||
| // On font atlas image generation [GenImageFontAtlas()], 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 [SetShapesTexture()]. | ||||
| #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 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 TRACELOG() output messages | ||||
| // NOTE: By default LOG_DEBUG traces not shown | ||||
| #define RL_SUPPORT_TRACELOG 1 | ||||
| // #define SUPPORT_TRACELOG_DEBUG          1 | ||||
|  | ||||
| // utils: Configuration values | ||||
| //------------------------------------------------------------------------------------ | ||||
| #define RL_MAX_TRACELOG_MSG_LENGTH 256    // Max length of one trace-log message | ||||
|  | ||||
| #endif | ||||
| // CONFIG_H | ||||
							
								
								
									
										1995
									
								
								project/auxillary/vis_ast/dependencies/raylib/include/raylib.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1995
									
								
								project/auxillary/vis_ast/dependencies/raylib/include/raylib.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2181
									
								
								project/auxillary/vis_ast/dependencies/raylib/include/raymath.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2181
									
								
								project/auxillary/vis_ast/dependencies/raylib/include/raymath.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										595
									
								
								project/auxillary/vis_ast/dependencies/raylib/include/rcamera.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										595
									
								
								project/auxillary/vis_ast/dependencies/raylib/include/rcamera.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,595 @@ | ||||
| /******************************************************************************************* | ||||
|  * | ||||
|  *   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 RL_RCAMERA_H | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Defines and Macros | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Function specifiers definition | ||||
|  | ||||
| // Function specifiers in case library is build/used as a shared library (Windows) | ||||
| // NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll | ||||
| #if defined( _WIN32 ) | ||||
| #if defined( BUILD_LIBTYPE_SHARED ) | ||||
| #if defined( __TINYC__ ) | ||||
| #define RL___declspec( x ) __attribute__( ( x ) ) | ||||
| #endif | ||||
| #elif defined( USE_LIBTYPE_SHARED ) | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef RLAPI | ||||
| #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 | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Types and Structures Definition | ||||
| // NOTE: Below types are required for standalone usage | ||||
| //---------------------------------------------------------------------------------- | ||||
| #if defined( RCAMERA_STANDALONE ) | ||||
| // Vector2, 2 components | ||||
| typedef struct Vector2 | ||||
| { | ||||
| 	f32 x;    // Vector x component | ||||
| 	f32 y;    // Vector y component | ||||
|  | ||||
| } Vector2; | ||||
|  | ||||
| // Vector3, 3 components | ||||
| typedef struct Vector3 | ||||
| { | ||||
| 	f32 x;    // Vector x component | ||||
| 	f32 y;    // Vector y component | ||||
| 	f32 z;    // Vector z component | ||||
|  | ||||
| } Vector3; | ||||
|  | ||||
| // Matrix, 4x4 components, column major, OpenGL style, right-handed | ||||
| typedef struct Matrix | ||||
| { | ||||
| 	f32 m0, m4, m8, m12;     // Matrix first row (4 components) | ||||
| 	f32 m1, m5, m9, m13;     // Matrix second row (4 components) | ||||
| 	f32 m2, m6, m10, m14;    // Matrix third row (4 components) | ||||
| 	f32 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) | ||||
| 	f32     fovy;          // Camera field-of-view apperture in Y (degrees) in perspective, used as near plane width in orthographic | ||||
| 	s32     projection;    // Camera projection type: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC | ||||
|  | ||||
| } Camera3D; | ||||
|  | ||||
| typedef Camera3D Camera;    // Camera type fallback, defaults to Camera3D | ||||
|  | ||||
| // Camera projection | ||||
| typedef enum | ||||
| { | ||||
| 	Camera_Perspective = 0,    // Perspective projection | ||||
| 	Camera_Orthographic        // orthographic projection | ||||
|  | ||||
| } CameraProjection; | ||||
|  | ||||
| // Camera system modes | ||||
| typedef enum | ||||
| { | ||||
| 	Camera_Custom = 0,      // Camera custom, controlled by user (UpdateCamera() does nothing) | ||||
| 	Camera_Free,            // Camera free mode | ||||
| 	Camera_Orbital,         // Camera orbital, around target, zoom supported | ||||
| 	Camera_First_Person,    // Camera first person | ||||
| 	Camera_Third_Person     // camera third person | ||||
|  | ||||
| } CameraMode; | ||||
| #endif | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Global Variables Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| //... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module Functions Declaration | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| #if defined( __cplusplus ) | ||||
| namespace raylib | ||||
| { | ||||
| 	extern "C" | ||||
| 	{ | ||||
| // Prevents name mangling of functions | ||||
| #endif | ||||
|  | ||||
| 		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, f32 distance, bool moveInWorldPlane ); | ||||
| 		RLAPI void camera_move_up( Camera* camera, f32 distance ); | ||||
| 		RLAPI void camera_move_right( Camera* camera, f32 distance, bool moveInWorldPlane ); | ||||
| 		RLAPI void camera_move_to_target( Camera* camera, f32 delta ); | ||||
|  | ||||
| 		// Camera rotation | ||||
| 		RLAPI void camera_yaw( Camera* camera, f32 angle, bool rotateAroundTarget ); | ||||
| 		RLAPI void camera_pitch( Camera* camera, f32 angle, bool lockView, bool rotateAroundTarget, bool rotateUp ); | ||||
| 		RLAPI void camera_roll( Camera* camera, f32 angle ); | ||||
|  | ||||
| 		RLAPI Matrix get_camera_view_matrix( Camera* camera ); | ||||
| 		RLAPI Matrix get_camera_projection_matrix( Camera* camera, f32 aspect ); | ||||
|  | ||||
| #if defined( __cplusplus ) | ||||
| 	} | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
| // RCAMERA_H | ||||
|  | ||||
|  | ||||
| /*********************************************************************************** | ||||
|  * | ||||
|  *   CAMERA IMPLEMENTATION | ||||
|  * | ||||
|  ************************************************************************************/ | ||||
|  | ||||
| #if defined( RCAMERA_IMPLEMENTATION ) | ||||
|  | ||||
| #include "raymath.h" | ||||
| // Required for vector maths: | ||||
| // Vector3Add() | ||||
| // Vector3Subtract() | ||||
| // Vector3Scale() | ||||
| // Vector3Normalize() | ||||
| // Vector3Distance() | ||||
| // Vector3CrossProduct() | ||||
| // Vector3RotateByAxisAngle() | ||||
| // Vector3Angle() | ||||
| // Vector3Negate() | ||||
| // MatrixLookAt() | ||||
| // MatrixPerspective() | ||||
| // MatrixOrtho() | ||||
| // MatrixIdentity() | ||||
|  | ||||
| // raylib required functionality: | ||||
| // GetMouseDelta() | ||||
| // GetMouseWheelMove() | ||||
| // IsKeyDown() | ||||
| // IsKeyPressed() | ||||
| // GetFrameTime() | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Defines and Macros | ||||
| //---------------------------------------------------------------------------------- | ||||
| #define RL_CAMERA_MOVE_SPEED     0.09f | ||||
| #define RL_CAMERA_ROTATION_SPEED 0.03f | ||||
| #define RL_CAMERA_PAN_SPEED      0.2f | ||||
|  | ||||
| // Camera mouse movement sensitivity | ||||
| #define RL_CAMERA_MOUSE_MOVE_SENSITIVITY                  0.003f    // TODO: it should be independant of framerate | ||||
| #define RL_CAMERA_MOUSE_SCROLL_SENSITIVITY                1.5f | ||||
|  | ||||
| #define RL_CAMERA_ORBITAL_SPEED                           0.5f    // Radians per second | ||||
|  | ||||
|  | ||||
| #define RL_CAMERA_FIRST_PERSON_STEP_TRIGONOMETRIC_DIVIDER 8.0f | ||||
| #define RL_CAMERA_FIRST_PERSON_STEP_DIVIDER               30.0f | ||||
| #define RL_CAMERA_FIRST_PERSON_WAVING_DIVIDER             200.0f | ||||
|  | ||||
| // PLAYER (used by camera) | ||||
| #define RL_PLAYER_MOVEMENT_SENSITIVITY 20.0f | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Types and Structures Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| //... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Global Variables Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| //... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Declaration | ||||
| //---------------------------------------------------------------------------------- | ||||
| //... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module Functions Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Returns the cameras forward vector (normalized) | ||||
| Vector3 get_camera_forward( Camera* camera ) | ||||
| { | ||||
| 	return Vector3Normalize( Vector3Subtract( camera->target, camera->position ) ); | ||||
| } | ||||
|  | ||||
| // Returns the cameras up vector (normalized) | ||||
| // Note: The up vector might not be perpendicular to the forward vector | ||||
| Vector3 get_camera_up( Camera* camera ) | ||||
| { | ||||
| 	return Vector3Normalize( camera->up ); | ||||
| } | ||||
|  | ||||
| // Returns the cameras right vector (normalized) | ||||
| Vector3 get_camera_right( Camera* camera ) | ||||
| { | ||||
| 	Vector3 forward = GetCameraForward( camera ); | ||||
| 	Vector3 up      = GetCameraUp( camera ); | ||||
|  | ||||
| 	return Vector3CrossProduct( forward, up ); | ||||
| } | ||||
|  | ||||
| // Moves the camera in its forward direction | ||||
| void camera_move_forward( Camera* camera, f32 distance, bool moveInWorldPlane ) | ||||
| { | ||||
| 	Vector3 forward = GetCameraForward( camera ); | ||||
|  | ||||
| 	if ( moveInWorldPlane ) | ||||
| 	{ | ||||
| 		// Project vector onto world plane | ||||
| 		forward.y = 0; | ||||
| 		forward   = Vector3Normalize( forward ); | ||||
| 	} | ||||
|  | ||||
| 	// Scale by distance | ||||
| 	forward = Vector3Scale( forward, distance ); | ||||
|  | ||||
| 	// Move position and target | ||||
| 	camera->position = Vector3Add( camera->position, forward ); | ||||
| 	camera->target   = Vector3Add( camera->target, forward ); | ||||
| } | ||||
|  | ||||
| // Moves the camera in its up direction | ||||
| void camera_move_up( Camera* camera, f32 distance ) | ||||
| { | ||||
| 	Vector3 up = GetCameraUp( camera ); | ||||
|  | ||||
| 	// Scale by distance | ||||
| 	up = Vector3Scale( up, distance ); | ||||
|  | ||||
| 	// Move position and target | ||||
| 	camera->position = Vector3Add( camera->position, up ); | ||||
| 	camera->target   = Vector3Add( camera->target, up ); | ||||
| } | ||||
|  | ||||
| // Moves the camera target in its current right direction | ||||
| void camera_move_right( Camera* camera, f32 distance, bool moveInWorldPlane ) | ||||
| { | ||||
| 	Vector3 right = GetCameraRight( camera ); | ||||
|  | ||||
| 	if ( moveInWorldPlane ) | ||||
| 	{ | ||||
| 		// Project vector onto world plane | ||||
| 		right.y = 0; | ||||
| 		right   = Vector3Normalize( right ); | ||||
| 	} | ||||
|  | ||||
| 	// Scale by distance | ||||
| 	right = Vector3Scale( right, distance ); | ||||
|  | ||||
| 	// Move position and target | ||||
| 	camera->position = Vector3Add( camera->position, right ); | ||||
| 	camera->target   = Vector3Add( camera->target, right ); | ||||
| } | ||||
|  | ||||
| // Moves the camera position closer/farther to/from the camera target | ||||
| void camera_move_to_target( Camera* camera, f32 delta ) | ||||
| { | ||||
| 	float distance = Vector3Distance( camera->position, camera->target ); | ||||
|  | ||||
| 	// Apply delta | ||||
| 	distance += delta; | ||||
|  | ||||
| 	// Distance must be greater than 0 | ||||
| 	if ( distance <= 0 ) | ||||
| 		distance = 0.001f; | ||||
|  | ||||
| 	// Set new distance by moving the position along the forward vector | ||||
| 	Vector3 forward  = GetCameraForward( camera ); | ||||
| 	camera->position = Vector3Add( camera->target, Vector3Scale( forward, -distance ) ); | ||||
| } | ||||
|  | ||||
| // Rotates the camera around its up vector | ||||
| // Yaw is "looking left and right" | ||||
| // If rotateAroundTarget is false, the camera rotates around its position | ||||
| // Note: angle must be provided in radians | ||||
| void camera_yaw( Camera* camera, f32 angle, bool rotateAroundTarget ) | ||||
| { | ||||
| 	Vector3 up = GetCameraUp( camera ); | ||||
|  | ||||
| 	// View vector | ||||
| 	Vector3 targetPosition = Vector3Subtract( camera->target, camera->position ); | ||||
|  | ||||
| 	// Rotate view vector around up axis | ||||
| 	targetPosition = Vector3RotateByAxisAngle( targetPosition, up, angle ); | ||||
|  | ||||
| 	if ( rotateAroundTarget ) | ||||
| 	{ | ||||
| 		// Move position relative to target | ||||
| 		camera->position = Vector3Subtract( camera->target, targetPosition ); | ||||
| 	} | ||||
| 	else    // rotate around camera.position | ||||
| 	{ | ||||
| 		// Move target relative to position | ||||
| 		camera->target = Vector3Add( camera->position, targetPosition ); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Rotates the camera around its right vector, pitch is "looking up and down" | ||||
| //  - lockView prevents camera overrotation (aka "somersaults") | ||||
| //  - rotateAroundTarget defines if rotation is around target or around its position | ||||
| //  - rotateUp rotates the up direction as well (typically only usefull in CAMERA_FREE) | ||||
| // NOTE: angle must be provided in radians | ||||
| void camera_pitch( Camera* camera, f32 angle, bool lockView, bool rotateAroundTarget, bool rotateUp ) | ||||
| { | ||||
| 	Vector3 up = GetCameraUp( camera ); | ||||
|  | ||||
| 	// View vector | ||||
| 	Vector3 targetPosition = Vector3Subtract( camera->target, camera->position ); | ||||
|  | ||||
| 	if ( lockView ) | ||||
| 	{ | ||||
| 		// In these camera modes we clamp the Pitch angle | ||||
| 		// to allow only viewing straight up or down. | ||||
|  | ||||
| 		// Clamp view up | ||||
| 		float maxAngleUp  = Vector3Angle( up, targetPosition ); | ||||
| 		maxAngleUp       -= 0.001f;    // avoid numerical errors | ||||
| 		if ( angle > maxAngleUp ) | ||||
| 			angle = maxAngleUp; | ||||
|  | ||||
| 		// Clamp view down | ||||
| 		float maxAngleDown  = Vector3Angle( Vector3Negate( up ), targetPosition ); | ||||
| 		maxAngleDown       *= -1.0f;     // downwards angle is negative | ||||
| 		maxAngleDown       += 0.001f;    // avoid numerical errors | ||||
| 		if ( angle < maxAngleDown ) | ||||
| 			angle = maxAngleDown; | ||||
| 	} | ||||
|  | ||||
| 	// Rotation axis | ||||
| 	Vector3 right = GetCameraRight( camera ); | ||||
|  | ||||
| 	// Rotate view vector around right axis | ||||
| 	targetPosition = Vector3RotateByAxisAngle( targetPosition, right, angle ); | ||||
|  | ||||
| 	if ( rotateAroundTarget ) | ||||
| 	{ | ||||
| 		// Move position relative to target | ||||
| 		camera->position = Vector3Subtract( camera->target, targetPosition ); | ||||
| 	} | ||||
| 	else    // rotate around camera.position | ||||
| 	{ | ||||
| 		// Move target relative to position | ||||
| 		camera->target = Vector3Add( camera->position, targetPosition ); | ||||
| 	} | ||||
|  | ||||
| 	if ( rotateUp ) | ||||
| 	{ | ||||
| 		// Rotate up direction around right axis | ||||
| 		camera->up = Vector3RotateByAxisAngle( camera->up, right, angle ); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Rotates the camera around its forward vector | ||||
| // Roll is "turning your head sideways to the left or right" | ||||
| // Note: angle must be provided in radians | ||||
| void camera_roll( Camera* camera, f32 angle ) | ||||
| { | ||||
| 	Vector3 forward = GetCameraForward( camera ); | ||||
|  | ||||
| 	// Rotate up direction around forward axis | ||||
| 	camera->up = Vector3RotateByAxisAngle( camera->up, forward, angle ); | ||||
| } | ||||
|  | ||||
| // Returns the camera view matrix | ||||
| Matrix get_camera_view_matrix( Camera* camera ) | ||||
| { | ||||
| 	return MatrixLookAt( camera->position, camera->target, camera->up ); | ||||
| } | ||||
|  | ||||
| // Returns the camera projection matrix | ||||
| Matrix get_camera_projection_matrix( Camera* camera, f32 aspect ) | ||||
| { | ||||
| 	if ( camera->projection == CAMERA_PERSPECTIVE ) | ||||
| 	{ | ||||
| 		return MatrixPerspective( camera->fovy * DEG2RAD, aspect, CAMERA_CULL_DISTANCE_NEAR, CAMERA_CULL_DISTANCE_FAR ); | ||||
| 	} | ||||
| 	else if ( camera->projection == CAMERA_ORTHOGRAPHIC ) | ||||
| 	{ | ||||
| 		double top   = camera->fovy / 2.0; | ||||
| 		double right = top * aspect; | ||||
|  | ||||
| 		return MatrixOrtho( -right, right, -top, top, CAMERA_CULL_DISTANCE_NEAR, CAMERA_CULL_DISTANCE_FAR ); | ||||
| 	} | ||||
|  | ||||
| 	return MatrixIdentity(); | ||||
| } | ||||
|  | ||||
| #if ! defined( RCAMERA_STANDALONE ) | ||||
| // Update camera position for selected mode | ||||
| // Camera mode: CAMERA_FREE, CAMERA_FIRST_PERSON, CAMERA_THIRD_PERSON, CAMERA_ORBITAL or CUSTOM | ||||
| void update_camera( Camera* camera, s32 mode ) | ||||
| { | ||||
| 	Vector2 mousePositionDelta = GetMouseDelta(); | ||||
|  | ||||
| 	bool moveInWorldPlane      = ( ( mode == CAMERA_FIRST_PERSON ) || ( mode == CAMERA_THIRD_PERSON ) ); | ||||
| 	bool rotateAroundTarget    = ( ( mode == CAMERA_THIRD_PERSON ) || ( mode == CAMERA_ORBITAL ) ); | ||||
| 	bool lockView              = ( ( mode == CAMERA_FIRST_PERSON ) || ( mode == CAMERA_THIRD_PERSON ) || ( mode == CAMERA_ORBITAL ) ); | ||||
| 	bool rotateUp              = false; | ||||
|  | ||||
| 	if ( mode == CAMERA_ORBITAL ) | ||||
| 	{ | ||||
| 		// Orbital can just orbit | ||||
| 		Matrix  rotation = MatrixRotate( GetCameraUp( camera ), CAMERA_ORBITAL_SPEED * GetFrameTime() ); | ||||
| 		Vector3 view     = Vector3Subtract( camera->position, camera->target ); | ||||
| 		view             = Vector3Transform( view, rotation ); | ||||
| 		camera->position = Vector3Add( camera->target, view ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		// Camera rotation | ||||
| 		if ( IsKeyDown( KEY_DOWN ) ) | ||||
| 			CameraPitch( camera, -CAMERA_ROTATION_SPEED, lockView, rotateAroundTarget, rotateUp ); | ||||
| 		if ( IsKeyDown( KEY_UP ) ) | ||||
| 			CameraPitch( camera, CAMERA_ROTATION_SPEED, lockView, rotateAroundTarget, rotateUp ); | ||||
| 		if ( IsKeyDown( KEY_RIGHT ) ) | ||||
| 			CameraYaw( camera, -CAMERA_ROTATION_SPEED, rotateAroundTarget ); | ||||
| 		if ( IsKeyDown( KEY_LEFT ) ) | ||||
| 			CameraYaw( camera, CAMERA_ROTATION_SPEED, rotateAroundTarget ); | ||||
| 		if ( IsKeyDown( KEY_Q ) ) | ||||
| 			CameraRoll( camera, -CAMERA_ROTATION_SPEED ); | ||||
| 		if ( IsKeyDown( KEY_E ) ) | ||||
| 			CameraRoll( camera, CAMERA_ROTATION_SPEED ); | ||||
|  | ||||
| 		// Camera movement | ||||
| 		if ( ! IsGamepadAvailable( 0 ) ) | ||||
| 		{ | ||||
| 			// Camera pan (for CAMERA_FREE) | ||||
| 			if ( ( mode == CAMERA_FREE ) && ( IsMouseButtonDown( MOUSE_BUTTON_MIDDLE ) ) ) | ||||
| 			{ | ||||
| 				const Vector2 mouseDelta = GetMouseDelta(); | ||||
| 				if ( mouseDelta.x > 0.0f ) | ||||
| 					CameraMoveRight( camera, CAMERA_PAN_SPEED, moveInWorldPlane ); | ||||
| 				if ( mouseDelta.x < 0.0f ) | ||||
| 					CameraMoveRight( camera, -CAMERA_PAN_SPEED, moveInWorldPlane ); | ||||
| 				if ( mouseDelta.y > 0.0f ) | ||||
| 					CameraMoveUp( camera, -CAMERA_PAN_SPEED ); | ||||
| 				if ( mouseDelta.y < 0.0f ) | ||||
| 					CameraMoveUp( camera, CAMERA_PAN_SPEED ); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				// Mouse support | ||||
| 				CameraYaw( camera, -mousePositionDelta.x * CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget ); | ||||
| 				CameraPitch( camera, -mousePositionDelta.y * CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp ); | ||||
| 			} | ||||
|  | ||||
| 			// Keyboard support | ||||
| 			if ( IsKeyDown( KEY_W ) ) | ||||
| 				CameraMoveForward( camera, CAMERA_MOVE_SPEED, moveInWorldPlane ); | ||||
| 			if ( IsKeyDown( KEY_A ) ) | ||||
| 				CameraMoveRight( camera, -CAMERA_MOVE_SPEED, moveInWorldPlane ); | ||||
| 			if ( IsKeyDown( KEY_S ) ) | ||||
| 				CameraMoveForward( camera, -CAMERA_MOVE_SPEED, moveInWorldPlane ); | ||||
| 			if ( IsKeyDown( KEY_D ) ) | ||||
| 				CameraMoveRight( camera, CAMERA_MOVE_SPEED, moveInWorldPlane ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			// Gamepad controller support | ||||
| 			CameraYaw( camera, -( GetGamepadAxisMovement( 0, GAMEPAD_AXIS_RIGHT_X ) * 2 ) * CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget ); | ||||
| 			CameraPitch( | ||||
| 			    camera, | ||||
| 			    -( GetGamepadAxisMovement( 0, GAMEPAD_AXIS_RIGHT_Y ) * 2 ) * CAMERA_MOUSE_MOVE_SENSITIVITY, | ||||
| 			    lockView, | ||||
| 			    rotateAroundTarget, | ||||
| 			    rotateUp | ||||
| 			); | ||||
|  | ||||
| 			if ( GetGamepadAxisMovement( 0, GAMEPAD_AXIS_LEFT_Y ) <= -0.25f ) | ||||
| 				CameraMoveForward( camera, CAMERA_MOVE_SPEED, moveInWorldPlane ); | ||||
| 			if ( GetGamepadAxisMovement( 0, GAMEPAD_AXIS_LEFT_X ) <= -0.25f ) | ||||
| 				CameraMoveRight( camera, -CAMERA_MOVE_SPEED, moveInWorldPlane ); | ||||
| 			if ( GetGamepadAxisMovement( 0, GAMEPAD_AXIS_LEFT_Y ) >= 0.25f ) | ||||
| 				CameraMoveForward( camera, -CAMERA_MOVE_SPEED, moveInWorldPlane ); | ||||
| 			if ( GetGamepadAxisMovement( 0, GAMEPAD_AXIS_LEFT_X ) >= 0.25f ) | ||||
| 				CameraMoveRight( camera, CAMERA_MOVE_SPEED, moveInWorldPlane ); | ||||
| 		} | ||||
|  | ||||
| 		if ( mode == CAMERA_FREE ) | ||||
| 		{ | ||||
| 			if ( IsKeyDown( KEY_SPACE ) ) | ||||
| 				CameraMoveUp( camera, CAMERA_MOVE_SPEED ); | ||||
| 			if ( IsKeyDown( KEY_LEFT_CONTROL ) ) | ||||
| 				CameraMoveUp( camera, -CAMERA_MOVE_SPEED ); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if ( ( mode == CAMERA_THIRD_PERSON ) || ( mode == CAMERA_ORBITAL ) || ( mode == CAMERA_FREE ) ) | ||||
| 	{ | ||||
| 		// Zoom target distance | ||||
| 		CameraMoveToTarget( camera, -GetMouseWheelMove() ); | ||||
| 		if ( IsKeyPressed( KEY_KP_SUBTRACT ) ) | ||||
| 			CameraMoveToTarget( camera, 2.0f ); | ||||
| 		if ( IsKeyPressed( KEY_KP_ADD ) ) | ||||
| 			CameraMoveToTarget( camera, -2.0f ); | ||||
| 	} | ||||
| } | ||||
| #endif | ||||
| // !RCAMERA_STANDALONE | ||||
|  | ||||
| // Update camera movement, movement/rotation values should be provided by user | ||||
| void update_camera_pro( Camera* camera, Vector3 movement, Vector3 rotation, f32 zoom ) | ||||
| { | ||||
| 	bool lockView           = true; | ||||
| 	bool rotateAroundTarget = false; | ||||
| 	bool rotateUp           = false; | ||||
| 	bool moveInWorldPlane   = true; | ||||
|  | ||||
| 	// Camera rotation | ||||
| 	CameraPitch( camera, -rotation.y * DEG2RAD, lockView, rotateAroundTarget, rotateUp ); | ||||
| 	CameraYaw( camera, -rotation.x * DEG2RAD, rotateAroundTarget ); | ||||
| 	CameraRoll( camera, rotation.z * DEG2RAD ); | ||||
|  | ||||
| 	// Camera movement | ||||
| 	CameraMoveForward( camera, movement.x, moveInWorldPlane ); | ||||
| 	CameraMoveRight( camera, movement.y, moveInWorldPlane ); | ||||
| 	CameraMoveUp( camera, movement.z ); | ||||
|  | ||||
| 	// Zoom target distance | ||||
| 	CameraMoveToTarget( camera, zoom ); | ||||
| } | ||||
|  | ||||
| #endif | ||||
| // RCAMERA_IMPLEMENTATION | ||||
							
								
								
									
										233
									
								
								project/auxillary/vis_ast/dependencies/raylib/include/rcore.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										233
									
								
								project/auxillary/vis_ast/dependencies/raylib/include/rcore.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,233 @@ | ||||
| /********************************************************************************************** | ||||
|  * | ||||
|  *   rcore - Common types and globals (all platforms) | ||||
|  * | ||||
|  *   LIMITATIONS: | ||||
|  *       - Limitation 01 | ||||
|  *       - Limitation 02 | ||||
|  * | ||||
|  *   POSSIBLE IMPROVEMENTS: | ||||
|  *       - Improvement 01 | ||||
|  *       - Improvement 02 | ||||
|  * | ||||
|  * | ||||
|  *   LICENSE: zlib/libpng | ||||
|  * | ||||
|  *   Copyright (c) 2013-2023 Ramon Santamaria (@raysan5) and contributors | ||||
|  * | ||||
|  *   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 RCORE_H | ||||
| #define RCORE_H | ||||
|  | ||||
| #include "raylib.h" | ||||
|  | ||||
| #include "utils.h"    // Required for: TRACELOG() macros | ||||
|  | ||||
| #include "rlgl.h"    // Required for: graphics layer functionality | ||||
|  | ||||
| #define RAYMATH_IMPLEMENTATION | ||||
| #include "raymath.h"    // Required for: Vector2/Vector3/Matrix functionality | ||||
|  | ||||
| #include <stdlib.h>    // Required for: srand(), rand(), atexit() | ||||
| #include <stdio.h>     // Required for: sprintf() [Used in OpenURL()] | ||||
| #include <string.h>    // Required for: strrchr(), strcmp(), strlen(), memset() | ||||
| #include <time.h>      // Required for: time() [Used in InitTimer()] | ||||
| #include <math.h>      // Required for: tan() [Used in BeginMode3D()], atan2f() [Used in LoadVrStereoConfig()] | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Defines and Macros | ||||
| //---------------------------------------------------------------------------------- | ||||
| #ifndef MAX_FILEPATH_CAPACITY | ||||
| #define MAX_FILEPATH_CAPACITY 8192    // Maximum capacity for filepath | ||||
| #endif | ||||
| #ifndef MAX_FILEPATH_LENGTH | ||||
| #define MAX_FILEPATH_LENGTH 4096    // Maximum length for filepaths (Linux PATH_MAX default value) | ||||
| #endif | ||||
|  | ||||
| #ifndef MAX_KEYBOARD_KEYS | ||||
| #define MAX_KEYBOARD_KEYS 512    // Maximum number of keyboard keys supported | ||||
| #endif | ||||
| #ifndef MAX_MOUSE_BUTTONS | ||||
| #define MAX_MOUSE_BUTTONS 8    // Maximum number of mouse buttons supported | ||||
| #endif | ||||
| #ifndef MAX_GAMEPADS | ||||
| #define MAX_GAMEPADS 4    // Maximum number of gamepads supported | ||||
| #endif | ||||
| #ifndef MAX_GAMEPAD_AXIS | ||||
| #define MAX_GAMEPAD_AXIS 8    // Maximum number of axis supported (per gamepad) | ||||
| #endif | ||||
| #ifndef MAX_GAMEPAD_BUTTONS | ||||
| #define MAX_GAMEPAD_BUTTONS 32    // Maximum number of buttons supported (per gamepad) | ||||
| #endif | ||||
| #ifndef MAX_TOUCH_POINTS | ||||
| #define MAX_TOUCH_POINTS 8    // Maximum number of touch points supported | ||||
| #endif | ||||
| #ifndef MAX_KEY_PRESSED_QUEUE | ||||
| #define MAX_KEY_PRESSED_QUEUE 16    // Maximum number of keys in the key input queue | ||||
| #endif | ||||
| #ifndef MAX_CHAR_PRESSED_QUEUE | ||||
| #define MAX_CHAR_PRESSED_QUEUE 16    // Maximum number of characters in the char input queue | ||||
| #endif | ||||
|  | ||||
| #ifndef MAX_DECOMPRESSION_SIZE | ||||
| #define MAX_DECOMPRESSION_SIZE 64    // Maximum size allocated for decompression in MB | ||||
| #endif | ||||
|  | ||||
| // Flags operation macros | ||||
| #define FLAG_SET( n, f )    ( ( n ) |= ( f ) ) | ||||
| #define FLAG_CLEAR( n, f )  ( ( n ) &= ~( f ) ) | ||||
| #define FLAG_TOGGLE( n, f ) ( ( n ) ^= ( f ) ) | ||||
| #define FLAG_CHECK( n, f )  ( ( n ) & ( f ) ) | ||||
|  | ||||
| #if ( defined( __linux__ ) || defined( PLATFORM_WEB ) ) && ( _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 | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Types and Structures Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| typedef struct | ||||
| { | ||||
| 	int x; | ||||
| 	int y; | ||||
| } Point; | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
| 	unsigned int width; | ||||
| 	unsigned int height; | ||||
| } Size; | ||||
|  | ||||
| // Core global state context data | ||||
| typedef struct CoreData | ||||
| { | ||||
| 	struct | ||||
| 	{ | ||||
| 		const char*  title;               // Window text title const pointer | ||||
| 		unsigned int flags;               // Configuration flags (bit based), keeps window state | ||||
| 		bool         ready;               // Check if window has been initialized successfully | ||||
| 		bool         fullscreen;          // Check if fullscreen mode is enabled | ||||
| 		bool         shouldClose;         // Check if window set for closing | ||||
| 		bool         resizedLastFrame;    // Check if window has been resized last frame | ||||
| 		bool         eventWaiting;        // Wait for events before ending frame | ||||
|  | ||||
| 		Point  position;            // Window position (required on fullscreen toggle) | ||||
| 		Point  previousPosition;    // Window previous position (required on borderless windowed toggle) | ||||
| 		Size   display;             // Display width and height (monitor, device-screen, LCD, ...) | ||||
| 		Size   screen;              // Screen width and height (used render area) | ||||
| 		Size   previousScreen;      // Screen previous width and height (required on borderless windowed toggle) | ||||
| 		Size   currentFbo;          // Current render width and height (depends on active fbo) | ||||
| 		Size   render;              // Framebuffer width and height (render area, including black bars if required) | ||||
| 		Point  renderOffset;        // Offset from render area (must be divided by 2) | ||||
| 		Size   screenMin;           // Screen minimum width and height (for resizable window) | ||||
| 		Size   screenMax;           // Screen maximum width and height (for resizable window) | ||||
| 		Matrix screenScale;         // Matrix to scale screen (framebuffer rendering) | ||||
|  | ||||
| 		char**       dropFilepaths;    // Store dropped files paths pointers (provided by GLFW) | ||||
| 		unsigned int dropFileCount;    // Count dropped files strings | ||||
|  | ||||
| 	} Window; | ||||
|  | ||||
| 	struct | ||||
| 	{ | ||||
| 		const char* basePath;    // Base path for data storage | ||||
|  | ||||
| 	} Storage; | ||||
|  | ||||
| 	struct | ||||
| 	{ | ||||
| 		struct | ||||
| 		{ | ||||
| 			int  exitKey;                                  // Default exit key | ||||
| 			char currentKeyState[ MAX_KEYBOARD_KEYS ];     // Registers current frame key state | ||||
| 			char previousKeyState[ MAX_KEYBOARD_KEYS ];    // Registers previous frame key state | ||||
|  | ||||
| 			// NOTE: Since key press logic involves comparing prev vs cur key state, we need to handle key repeats specially | ||||
| 			char keyRepeatInFrame[ MAX_KEYBOARD_KEYS ];    // Registers key repeats for current frame. | ||||
|  | ||||
| 			int keyPressedQueue[ MAX_KEY_PRESSED_QUEUE ];    // Input keys queue | ||||
| 			int keyPressedQueueCount;                        // Input keys queue count | ||||
|  | ||||
| 			int charPressedQueue[ MAX_CHAR_PRESSED_QUEUE ];    // Input characters queue (unicode) | ||||
| 			int charPressedQueueCount;                         // Input characters queue count | ||||
|  | ||||
| 		} Keyboard; | ||||
|  | ||||
| 		struct | ||||
| 		{ | ||||
| 			Vector2 offset;              // Mouse offset | ||||
| 			Vector2 scale;               // Mouse scaling | ||||
| 			Vector2 currentPosition;     // Mouse position on screen | ||||
| 			Vector2 previousPosition;    // Previous mouse position | ||||
|  | ||||
| 			int  cursor;            // Tracks current mouse cursor | ||||
| 			bool cursorHidden;      // Track if cursor is hidden | ||||
| 			bool cursorOnScreen;    // Tracks if cursor is inside client area | ||||
|  | ||||
| 			char    currentButtonState[ MAX_MOUSE_BUTTONS ];     // Registers current mouse button state | ||||
| 			char    previousButtonState[ MAX_MOUSE_BUTTONS ];    // Registers previous mouse button state | ||||
| 			Vector2 currentWheelMove;                            // Registers current mouse wheel variation | ||||
| 			Vector2 previousWheelMove;                           // Registers previous mouse wheel variation | ||||
|  | ||||
| 		} Mouse; | ||||
|  | ||||
| 		struct | ||||
| 		{ | ||||
| 			int     pointCount;                                // Number of touch points active | ||||
| 			int     pointId[ MAX_TOUCH_POINTS ];               // Point identifiers | ||||
| 			Vector2 position[ MAX_TOUCH_POINTS ];              // Touch position on screen | ||||
| 			char    currentTouchState[ MAX_TOUCH_POINTS ];     // Registers current touch state | ||||
| 			char    previousTouchState[ MAX_TOUCH_POINTS ];    // Registers previous touch state | ||||
|  | ||||
| 		} Touch; | ||||
|  | ||||
| 		struct | ||||
| 		{ | ||||
| 			int   lastButtonPressed;                                             // Register last gamepad button pressed | ||||
| 			int   axisCount[ MAX_GAMEPADS ];                                     // Register number of available gamepad axis | ||||
| 			bool  ready[ MAX_GAMEPADS ];                                         // Flag to know if gamepad is ready | ||||
| 			char  name[ MAX_GAMEPADS ][ 64 ];                                    // Gamepad name holder | ||||
| 			char  currentButtonState[ MAX_GAMEPADS ][ MAX_GAMEPAD_BUTTONS ];     // Current gamepad buttons state | ||||
| 			char  previousButtonState[ MAX_GAMEPADS ][ MAX_GAMEPAD_BUTTONS ];    // Previous gamepad buttons state | ||||
| 			float axisState[ MAX_GAMEPADS ][ MAX_GAMEPAD_AXIS ];                 // Gamepad axis state | ||||
|  | ||||
| 		} Gamepad; | ||||
| 	} Input; | ||||
|  | ||||
| 	struct | ||||
| 	{ | ||||
| 		double                 current;         // Current time measure | ||||
| 		double                 previous;        // Previous time measure | ||||
| 		double                 update;          // Time measure for frame update | ||||
| 		double                 draw;            // Time measure for frame draw | ||||
| 		double                 frame;           // Time measure for one frame | ||||
| 		double                 target;          // Desired time for one frame, if 0 not applied | ||||
| 		unsigned long long int base;            // Base time measure for hi-res timer (PLATFORM_ANDROID, PLATFORM_DRM) | ||||
| 		unsigned int           frameCounter;    // Frame counter | ||||
|  | ||||
| 	} Time; | ||||
| } CoreData; | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Global Variables Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| extern CoreData CORE; | ||||
|  | ||||
| #endif | ||||
| @@ -0,0 +1,594 @@ | ||||
| /********************************************************************************************** | ||||
|  * | ||||
|  *   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 PI | ||||
| #define PI 3.14159265358979323846 | ||||
| #endif | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Defines and Macros | ||||
| //---------------------------------------------------------------------------------- | ||||
| #ifndef MAX_TOUCH_POINTS | ||||
| #define MAX_TOUCH_POINTS 8    // Maximum number of touch points supported | ||||
| #endif | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Types and Structures Definition | ||||
| // NOTE: Below types are required for standalone usage | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Boolean type | ||||
| #if ( defined( __STDC__ ) && __STDC_VERSION__ >= 199901L ) || ( defined( _MSC_VER ) && _MSC_VER >= 1800 ) | ||||
| #include <stdbool.h> | ||||
| #elif ! defined( __cplusplus ) && ! defined( bool ) && ! defined( RL_BOOL_TYPE ) | ||||
| typedef enum bool | ||||
| { | ||||
| 	false = 0, | ||||
| 	true  = ! false | ||||
| } bool; | ||||
| #endif | ||||
|  | ||||
| #if ! defined( RL_VECTOR2_TYPE ) | ||||
| // Vector2 type | ||||
| typedef struct Vector2 | ||||
| { | ||||
| 	float x; | ||||
| 	float y; | ||||
| } Vector2; | ||||
| #endif | ||||
|  | ||||
| #if defined( RGESTURES_STANDALONE ) | ||||
| // Gestures type | ||||
| // NOTE: It could be used as flags to enable only some gestures | ||||
| typedef enum | ||||
| { | ||||
| 	GESTURE_NONE        = 0, | ||||
| 	GESTURE_TAP         = 1, | ||||
| 	GESTURE_DOUBLETAP   = 2, | ||||
| 	GESTURE_HOLD        = 4, | ||||
| 	GESTURE_DRAG        = 8, | ||||
| 	GESTURE_SWIPE_RIGHT = 16, | ||||
| 	GESTURE_SWIPE_LEFT  = 32, | ||||
| 	GESTURE_SWIPE_UP    = 64, | ||||
| 	GESTURE_SWIPE_DOWN  = 128, | ||||
| 	GESTURE_PINCH_IN    = 256, | ||||
| 	GESTURE_PINCH_OUT   = 512 | ||||
| } Gesture; | ||||
| #endif | ||||
|  | ||||
| typedef enum | ||||
| { | ||||
| 	TOUCH_ACTION_UP = 0, | ||||
| 	TOUCH_ACTION_DOWN, | ||||
| 	TOUCH_ACTION_MOVE, | ||||
| 	TOUCH_ACTION_CANCEL | ||||
| } TouchAction; | ||||
|  | ||||
| // Gesture event | ||||
| typedef struct | ||||
| { | ||||
| 	int     touchAction; | ||||
| 	int     pointCount; | ||||
| 	int     pointId[ MAX_TOUCH_POINTS ]; | ||||
| 	Vector2 position[ MAX_TOUCH_POINTS ]; | ||||
| } GestureEvent; | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Global Variables Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| //... | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module Functions Declaration | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| #if defined( __cplusplus ) | ||||
| extern "C" | ||||
| {    // Prevents name mangling of functions | ||||
| #endif | ||||
|  | ||||
| 	void ProcessGestureEvent( GestureEvent event );    // Process gesture event and translate it into gestures | ||||
| 	void UpdateGestures( void );                       // Update gestures detected (must be called every frame) | ||||
|  | ||||
| #if defined( RGESTURES_STANDALONE ) | ||||
| 	void SetGesturesEnabled( unsigned int flags );    // Enable a set of gestures using flags | ||||
| 	bool IsGestureDetected( int gesture );            // Check if a gesture have been detected | ||||
| 	int  GetGestureDetected( void );                  // Get latest detected gesture | ||||
|  | ||||
| 	float   GetGestureHoldDuration( void );    // Get gesture hold time in seconds | ||||
| 	Vector2 GetGestureDragVector( void );      // Get gesture drag vector | ||||
| 	float   GetGestureDragAngle( void );       // Get gesture drag angle | ||||
| 	Vector2 GetGesturePinchVector( void );     // Get gesture pinch delta | ||||
| 	float   GetGesturePinchAngle( void );      // Get gesture pinch angle | ||||
| #endif | ||||
|  | ||||
| #if defined( __cplusplus ) | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif    // RGESTURES_H | ||||
|  | ||||
| /*********************************************************************************** | ||||
|  * | ||||
|  *   RGESTURES IMPLEMENTATION | ||||
|  * | ||||
|  ************************************************************************************/ | ||||
|  | ||||
| #if defined( RGESTURES_IMPLEMENTATION ) | ||||
|  | ||||
| #if defined( RGESTURES_STANDALONE ) | ||||
| #if defined( _WIN32 ) | ||||
| #if defined( __cplusplus ) | ||||
| extern "C" | ||||
| {    // Prevents name mangling of functions | ||||
| #endif | ||||
| 	// Functions required to query time on Windows | ||||
| 	int __stdcall QueryPerformanceCounter( unsigned long long int* lpPerformanceCount ); | ||||
| 	int __stdcall QueryPerformanceFrequency( unsigned long long int* lpFrequency ); | ||||
| #if defined( __cplusplus ) | ||||
| } | ||||
| #endif | ||||
| #elif defined( __linux__ ) | ||||
| #if _POSIX_C_SOURCE < 199309L | ||||
| #undef _POSIX_C_SOURCE | ||||
| #define _POSIX_C_SOURCE 199309L    // Required for CLOCK_MONOTONIC if compiled with c99 without gnu ext. | ||||
| #endif | ||||
| #include <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 FORCE_TO_SWIPE  0.2f      // Swipe force, measured in normalized screen units/time | ||||
| #define MINIMUM_DRAG    0.015f    // Drag minimum force, measured in normalized screen units (0.0f to 1.0f) | ||||
| #define DRAG_TIMEOUT    0.3f      // Drag minimum time for web, measured in seconds | ||||
| #define MINIMUM_PINCH   0.005f    // Pinch minimum force, measured in normalized screen units (0.0f to 1.0f) | ||||
| #define TAP_TIMEOUT     0.3f      // Tap minimum time, measured in seconds | ||||
| #define PINCH_TIMEOUT   0.3f      // Pinch minimum time, measured in seconds | ||||
| #define DOUBLETAP_RANGE 0.03f     // DoubleTap range, measured in normalized screen units (0.0f to 1.0f) | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Types and Structures Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // Gestures module state context [136 bytes] | ||||
| typedef struct | ||||
| { | ||||
| 	unsigned int current;         // Current detected gesture | ||||
| 	unsigned int enabledFlags;    // Enabled gestures flags | ||||
|  | ||||
| 	struct | ||||
| 	{ | ||||
| 		int     firstId;              // Touch id for first touch point | ||||
| 		int     pointCount;           // Touch points counter | ||||
| 		double  eventTime;            // Time stamp when an event happened | ||||
| 		Vector2 upPosition;           // Touch up position | ||||
| 		Vector2 downPositionA;        // First touch down position | ||||
| 		Vector2 downPositionB;        // Second touch down position | ||||
| 		Vector2 downDragPosition;     // Touch drag position | ||||
| 		Vector2 moveDownPositionA;    // First touch down position on move | ||||
| 		Vector2 moveDownPositionB;    // Second touch down position on move | ||||
| 		Vector2 previousPositionA;    // Previous position A to compare for pinch gestures | ||||
| 		Vector2 previousPositionB;    // Previous position B to compare for pinch gestures | ||||
| 		int     tapCounter;           // TAP counter (one tap implies TOUCH_ACTION_DOWN and TOUCH_ACTION_UP actions) | ||||
| 	} Touch; | ||||
|  | ||||
| 	struct | ||||
| 	{ | ||||
| 		bool   resetRequired;    // HOLD reset to get first touch point again | ||||
| 		double timeDuration;     // HOLD duration in seconds | ||||
| 	} Hold; | ||||
|  | ||||
| 	struct | ||||
| 	{ | ||||
| 		Vector2 vector;       // DRAG vector (between initial and current position) | ||||
| 		float   angle;        // DRAG angle (relative to x-axis) | ||||
| 		float   distance;     // DRAG distance (from initial touch point to final) (normalized [0..1]) | ||||
| 		float   intensity;    // DRAG intensity, how far why did the DRAG (pixels per frame) | ||||
| 	} Drag; | ||||
|  | ||||
| 	struct | ||||
| 	{ | ||||
| 		double startTime;    // SWIPE start time to calculate drag intensity | ||||
| 	} Swipe; | ||||
|  | ||||
| 	struct | ||||
| 	{ | ||||
| 		Vector2 vector;      // PINCH vector (between first and second touch points) | ||||
| 		float   angle;       // PINCH angle (relative to x-axis) | ||||
| 		float   distance;    // PINCH displacement distance (normalized [0..1]) | ||||
| 	} Pinch; | ||||
| } GesturesData; | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Global Variables Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| static GesturesData GESTURES = { | ||||
| 	.Touch.firstId = -1, | ||||
| 	.current       = GESTURE_NONE,         // No current gesture detected | ||||
| 	.enabledFlags  = 0b0000001111111111    // All gestures supported by default | ||||
| }; | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Declaration | ||||
| //---------------------------------------------------------------------------------- | ||||
| static float  rgVector2Angle( Vector2 initialPosition, Vector2 finalPosition ); | ||||
| static float  rgVector2Distance( Vector2 v1, Vector2 v2 ); | ||||
| static double rgGetCurrentTime( void ); | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module Functions Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
|  | ||||
| // Enable only desired gestures to be detected | ||||
| void SetGesturesEnabled( unsigned int flags ) | ||||
| { | ||||
| 	GESTURES.enabledFlags = flags; | ||||
| } | ||||
|  | ||||
| // Check if a gesture have been detected | ||||
| bool IsGestureDetected( unsigned int gesture ) | ||||
| { | ||||
| 	if ( ( GESTURES.enabledFlags & GESTURES.current ) == gesture ) | ||||
| 		return true; | ||||
| 	else | ||||
| 		return false; | ||||
| } | ||||
|  | ||||
| // Process gesture event and translate it into gestures | ||||
| void ProcessGestureEvent( GestureEvent event ) | ||||
| { | ||||
| 	// Reset required variables | ||||
| 	GESTURES.Touch.pointCount = event.pointCount;    // Required on UpdateGestures() | ||||
|  | ||||
| 	if ( GESTURES.Touch.pointCount == 1 )    // One touch point | ||||
| 	{ | ||||
| 		if ( event.touchAction == TOUCH_ACTION_DOWN ) | ||||
| 		{ | ||||
| 			GESTURES.Touch.tapCounter++;    // Tap counter | ||||
|  | ||||
| 			// Detect GESTURE_DOUBLE_TAP | ||||
| 			if ( ( GESTURES.current == GESTURE_NONE ) && ( GESTURES.Touch.tapCounter >= 2 ) | ||||
| 			     && ( ( rgGetCurrentTime() - GESTURES.Touch.eventTime ) < TAP_TIMEOUT ) | ||||
| 			     && ( rgVector2Distance( GESTURES.Touch.downPositionA, event.position[ 0 ] ) < DOUBLETAP_RANGE ) ) | ||||
| 			{ | ||||
| 				GESTURES.current          = GESTURE_DOUBLETAP; | ||||
| 				GESTURES.Touch.tapCounter = 0; | ||||
| 			} | ||||
| 			else    // Detect GESTURE_TAP | ||||
| 			{ | ||||
| 				GESTURES.Touch.tapCounter = 1; | ||||
| 				GESTURES.current          = GESTURE_TAP; | ||||
| 			} | ||||
|  | ||||
| 			GESTURES.Touch.downPositionA    = event.position[ 0 ]; | ||||
| 			GESTURES.Touch.downDragPosition = event.position[ 0 ]; | ||||
|  | ||||
| 			GESTURES.Touch.upPosition       = GESTURES.Touch.downPositionA; | ||||
| 			GESTURES.Touch.eventTime        = rgGetCurrentTime(); | ||||
|  | ||||
| 			GESTURES.Swipe.startTime        = rgGetCurrentTime(); | ||||
|  | ||||
| 			GESTURES.Drag.vector            = ( Vector2 ) { 0.0f, 0.0f }; | ||||
| 		} | ||||
| 		else if ( event.touchAction == TOUCH_ACTION_UP ) | ||||
| 		{ | ||||
| 			// A swipe can happen while the current gesture is drag, but (specially for web) also hold, so set upPosition for both cases | ||||
| 			if ( GESTURES.current == GESTURE_DRAG || GESTURES.current == GESTURE_HOLD ) | ||||
| 				GESTURES.Touch.upPosition = event.position[ 0 ]; | ||||
|  | ||||
| 			// NOTE: GESTURES.Drag.intensity dependent on the resolution of the screen | ||||
| 			GESTURES.Drag.distance  = rgVector2Distance( GESTURES.Touch.downPositionA, GESTURES.Touch.upPosition ); | ||||
| 			GESTURES.Drag.intensity = GESTURES.Drag.distance / ( float )( ( rgGetCurrentTime() - GESTURES.Swipe.startTime ) ); | ||||
|  | ||||
| 			// Detect GESTURE_SWIPE | ||||
| 			if ( ( GESTURES.Drag.intensity > FORCE_TO_SWIPE ) && ( GESTURES.current != GESTURE_DRAG ) ) | ||||
| 			{ | ||||
| 				// NOTE: Angle should be inverted in Y | ||||
| 				GESTURES.Drag.angle = 360.0f - rgVector2Angle( GESTURES.Touch.downPositionA, GESTURES.Touch.upPosition ); | ||||
|  | ||||
| 				if ( ( GESTURES.Drag.angle < 30 ) || ( GESTURES.Drag.angle > 330 ) ) | ||||
| 					GESTURES.current = GESTURE_SWIPE_RIGHT;    // Right | ||||
| 				else if ( ( GESTURES.Drag.angle >= 30 ) && ( GESTURES.Drag.angle <= 150 ) ) | ||||
| 					GESTURES.current = GESTURE_SWIPE_UP;    // Up | ||||
| 				else if ( ( GESTURES.Drag.angle > 150 ) && ( GESTURES.Drag.angle < 210 ) ) | ||||
| 					GESTURES.current = GESTURE_SWIPE_LEFT;    // Left | ||||
| 				else if ( ( GESTURES.Drag.angle >= 210 ) && ( GESTURES.Drag.angle <= 330 ) ) | ||||
| 					GESTURES.current = GESTURE_SWIPE_DOWN;    // Down | ||||
| 				else | ||||
| 					GESTURES.current = GESTURE_NONE; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				GESTURES.Drag.distance  = 0.0f; | ||||
| 				GESTURES.Drag.intensity = 0.0f; | ||||
| 				GESTURES.Drag.angle     = 0.0f; | ||||
|  | ||||
| 				GESTURES.current        = GESTURE_NONE; | ||||
| 			} | ||||
|  | ||||
| 			GESTURES.Touch.downDragPosition = ( Vector2 ) { 0.0f, 0.0f }; | ||||
| 			GESTURES.Touch.pointCount       = 0; | ||||
| 		} | ||||
| 		else if ( event.touchAction == TOUCH_ACTION_MOVE ) | ||||
| 		{ | ||||
| 			GESTURES.Touch.moveDownPositionA = event.position[ 0 ]; | ||||
|  | ||||
| 			if ( GESTURES.current == GESTURE_HOLD ) | ||||
| 			{ | ||||
| 				if ( GESTURES.Hold.resetRequired ) | ||||
| 					GESTURES.Touch.downPositionA = event.position[ 0 ]; | ||||
|  | ||||
| 				GESTURES.Hold.resetRequired = false; | ||||
|  | ||||
| 				// Detect GESTURE_DRAG | ||||
| 				if ( ( rgGetCurrentTime() - GESTURES.Touch.eventTime ) > DRAG_TIMEOUT ) | ||||
| 				{ | ||||
| 					GESTURES.Touch.eventTime = rgGetCurrentTime(); | ||||
| 					GESTURES.current         = GESTURE_DRAG; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			GESTURES.Drag.vector.x = GESTURES.Touch.moveDownPositionA.x - GESTURES.Touch.downDragPosition.x; | ||||
| 			GESTURES.Drag.vector.y = GESTURES.Touch.moveDownPositionA.y - GESTURES.Touch.downDragPosition.y; | ||||
| 		} | ||||
| 	} | ||||
| 	else if ( GESTURES.Touch.pointCount == 2 )    // Two touch points | ||||
| 	{ | ||||
| 		if ( event.touchAction == TOUCH_ACTION_DOWN ) | ||||
| 		{ | ||||
| 			GESTURES.Touch.downPositionA     = event.position[ 0 ]; | ||||
| 			GESTURES.Touch.downPositionB     = event.position[ 1 ]; | ||||
|  | ||||
| 			GESTURES.Touch.previousPositionA = GESTURES.Touch.downPositionA; | ||||
| 			GESTURES.Touch.previousPositionB = GESTURES.Touch.downPositionB; | ||||
|  | ||||
| 			// GESTURES.Pinch.distance = rgVector2Distance(GESTURES.Touch.downPositionA, GESTURES.Touch.downPositionB); | ||||
|  | ||||
| 			GESTURES.Pinch.vector.x    = GESTURES.Touch.downPositionB.x - GESTURES.Touch.downPositionA.x; | ||||
| 			GESTURES.Pinch.vector.y    = GESTURES.Touch.downPositionB.y - GESTURES.Touch.downPositionA.y; | ||||
|  | ||||
| 			GESTURES.current           = GESTURE_HOLD; | ||||
| 			GESTURES.Hold.timeDuration = rgGetCurrentTime(); | ||||
| 		} | ||||
| 		else if ( event.touchAction == TOUCH_ACTION_MOVE ) | ||||
| 		{ | ||||
| 			GESTURES.Pinch.distance          = rgVector2Distance( GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB ); | ||||
|  | ||||
| 			GESTURES.Touch.moveDownPositionA = event.position[ 0 ]; | ||||
| 			GESTURES.Touch.moveDownPositionB = event.position[ 1 ]; | ||||
|  | ||||
| 			GESTURES.Pinch.vector.x          = GESTURES.Touch.moveDownPositionB.x - GESTURES.Touch.moveDownPositionA.x; | ||||
| 			GESTURES.Pinch.vector.y          = GESTURES.Touch.moveDownPositionB.y - GESTURES.Touch.moveDownPositionA.y; | ||||
|  | ||||
| 			if ( ( rgVector2Distance( GESTURES.Touch.previousPositionA, GESTURES.Touch.moveDownPositionA ) >= MINIMUM_PINCH ) | ||||
| 			     || ( rgVector2Distance( GESTURES.Touch.previousPositionB, GESTURES.Touch.moveDownPositionB ) >= MINIMUM_PINCH ) ) | ||||
| 			{ | ||||
| 				if ( rgVector2Distance( GESTURES.Touch.previousPositionA, GESTURES.Touch.previousPositionB ) | ||||
| 				     > rgVector2Distance( GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB ) ) | ||||
| 					GESTURES.current = GESTURE_PINCH_IN; | ||||
| 				else | ||||
| 					GESTURES.current = GESTURE_PINCH_OUT; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				GESTURES.current           = GESTURE_HOLD; | ||||
| 				GESTURES.Hold.timeDuration = rgGetCurrentTime(); | ||||
| 			} | ||||
|  | ||||
| 			// NOTE: Angle should be inverted in Y | ||||
| 			GESTURES.Pinch.angle = 360.0f - rgVector2Angle( GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB ); | ||||
| 		} | ||||
| 		else if ( event.touchAction == TOUCH_ACTION_UP ) | ||||
| 		{ | ||||
| 			GESTURES.Pinch.distance   = 0.0f; | ||||
| 			GESTURES.Pinch.angle      = 0.0f; | ||||
| 			GESTURES.Pinch.vector     = ( Vector2 ) { 0.0f, 0.0f }; | ||||
| 			GESTURES.Touch.pointCount = 0; | ||||
|  | ||||
| 			GESTURES.current          = GESTURE_NONE; | ||||
| 		} | ||||
| 	} | ||||
| 	else if ( GESTURES.Touch.pointCount > 2 )    // More than two touch points | ||||
| 	{ | ||||
| 		// TODO: Process gesture events for more than two points | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Update gestures detected (must be called every frame) | ||||
| void UpdateGestures( void ) | ||||
| { | ||||
| 	// NOTE: Gestures are processed through system callbacks on touch events | ||||
|  | ||||
| 	// Detect GESTURE_HOLD | ||||
| 	if ( ( ( GESTURES.current == GESTURE_TAP ) || ( GESTURES.current == GESTURE_DOUBLETAP ) ) && ( GESTURES.Touch.pointCount < 2 ) ) | ||||
| 	{ | ||||
| 		GESTURES.current           = GESTURE_HOLD; | ||||
| 		GESTURES.Hold.timeDuration = rgGetCurrentTime(); | ||||
| 	} | ||||
|  | ||||
| 	// Detect GESTURE_NONE | ||||
| 	if ( ( GESTURES.current == GESTURE_SWIPE_RIGHT ) || ( GESTURES.current == GESTURE_SWIPE_UP ) || ( GESTURES.current == GESTURE_SWIPE_LEFT ) | ||||
| 	     || ( GESTURES.current == GESTURE_SWIPE_DOWN ) ) | ||||
| 	{ | ||||
| 		GESTURES.current = GESTURE_NONE; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Get latest detected gesture | ||||
| int GetGestureDetected( void ) | ||||
| { | ||||
| 	// Get current gesture only if enabled | ||||
| 	return ( GESTURES.enabledFlags & GESTURES.current ); | ||||
| } | ||||
|  | ||||
| // Hold time measured in ms | ||||
| float GetGestureHoldDuration( void ) | ||||
| { | ||||
| 	// NOTE: time is calculated on current gesture HOLD | ||||
|  | ||||
| 	double time = 0.0; | ||||
|  | ||||
| 	if ( GESTURES.current == GESTURE_HOLD ) | ||||
| 		time = rgGetCurrentTime() - GESTURES.Hold.timeDuration; | ||||
|  | ||||
| 	return ( float )time; | ||||
| } | ||||
|  | ||||
| // Get drag vector (between initial touch point to current) | ||||
| Vector2 GetGestureDragVector( void ) | ||||
| { | ||||
| 	// NOTE: drag vector is calculated on one touch points TOUCH_ACTION_MOVE | ||||
|  | ||||
| 	return GESTURES.Drag.vector; | ||||
| } | ||||
|  | ||||
| // Get drag angle | ||||
| // NOTE: Angle in degrees, horizontal-right is 0, counterclockwise | ||||
| float GetGestureDragAngle( void ) | ||||
| { | ||||
| 	// NOTE: drag angle is calculated on one touch points TOUCH_ACTION_UP | ||||
|  | ||||
| 	return GESTURES.Drag.angle; | ||||
| } | ||||
|  | ||||
| // Get distance between two pinch points | ||||
| Vector2 GetGesturePinchVector( void ) | ||||
| { | ||||
| 	// NOTE: Pinch distance is calculated on two touch points TOUCH_ACTION_MOVE | ||||
|  | ||||
| 	return GESTURES.Pinch.vector; | ||||
| } | ||||
|  | ||||
| // Get angle between two pinch points | ||||
| // NOTE: Angle in degrees, horizontal-right is 0, counterclockwise | ||||
| float GetGesturePinchAngle( void ) | ||||
| { | ||||
| 	// NOTE: pinch angle is calculated on two touch points TOUCH_ACTION_MOVE | ||||
|  | ||||
| 	return GESTURES.Pinch.angle; | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Module specific Functions Definition | ||||
| //---------------------------------------------------------------------------------- | ||||
| // Get angle from two-points vector with X-axis | ||||
| static float rgVector2Angle( Vector2 v1, Vector2 v2 ) | ||||
| { | ||||
| 	float angle = atan2f( v2.y - v1.y, v2.x - v1.x ) * ( 180.0f / PI ); | ||||
|  | ||||
| 	if ( angle < 0 ) | ||||
| 		angle += 360.0f; | ||||
|  | ||||
| 	return angle; | ||||
| } | ||||
|  | ||||
| // Calculate distance between two Vector2 | ||||
| static float rgVector2Distance( Vector2 v1, Vector2 v2 ) | ||||
| { | ||||
| 	float result; | ||||
|  | ||||
| 	float dx = v2.x - v1.x; | ||||
| 	float dy = v2.y - v1.y; | ||||
|  | ||||
| 	result   = ( float )sqrt( dx * dx + dy * dy ); | ||||
|  | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| // Time measure returned are seconds | ||||
| static double rgGetCurrentTime( void ) | ||||
| { | ||||
| 	double time = 0; | ||||
|  | ||||
| #if ! defined( RGESTURES_STANDALONE ) | ||||
| 	time = GetTime(); | ||||
| #else | ||||
| #if defined( _WIN32 ) | ||||
| 	unsigned long long int clockFrequency, currentTime; | ||||
|  | ||||
| 	QueryPerformanceFrequency( &clockFrequency );    // BE CAREFUL: Costly operation! | ||||
| 	QueryPerformanceCounter( ¤tTime ); | ||||
|  | ||||
| 	time = ( double )currentTime / clockFrequency;    // Time in seconds | ||||
| #endif | ||||
|  | ||||
| #if defined( __linux__ ) | ||||
| 	// NOTE: Only for Linux-based systems | ||||
| 	struct timespec now; | ||||
| 	clock_gettime( CLOCK_MONOTONIC, &now ); | ||||
| 	unsigned long long int nowTime = ( unsigned long long int )now.tv_sec * 1000000000LLU + ( unsigned long long int )now.tv_nsec;    // Time in nanoseconds | ||||
|  | ||||
| 	time                           = ( ( double )nowTime * 1e-9 );    // Time in seconds | ||||
| #endif | ||||
|  | ||||
| #if defined( __APPLE__ ) | ||||
| 	// #define CLOCK_REALTIME  CALENDAR_CLOCK    // returns UTC time since 1970-01-01 | ||||
| 	// #define CLOCK_MONOTONIC SYSTEM_CLOCK      // returns the time since boot time | ||||
|  | ||||
| 	clock_serv_t    cclock; | ||||
| 	mach_timespec_t now; | ||||
| 	host_get_clock_service( mach_host_self(), SYSTEM_CLOCK, &cclock ); | ||||
|  | ||||
| 	// NOTE: OS X does not have clock_gettime(), using clock_get_time() | ||||
| 	clock_get_time( cclock, &now ); | ||||
| 	mach_port_deallocate( mach_task_self(), cclock ); | ||||
| 	unsigned long long int nowTime = ( unsigned long long int )now.tv_sec * 1000000000LLU + ( unsigned long long int )now.tv_nsec;    // Time in nanoseconds | ||||
|  | ||||
| 	time                           = ( ( double )nowTime * 1e-9 );    // Time in seconds | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| 	return time; | ||||
| } | ||||
|  | ||||
| #endif    // RGESTURES_IMPLEMENTATION | ||||
							
								
								
									
										5679
									
								
								project/auxillary/vis_ast/dependencies/raylib/include/rlgl.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5679
									
								
								project/auxillary/vis_ast/dependencies/raylib/include/rlgl.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,82 @@ | ||||
| /********************************************************************************************** | ||||
|  * | ||||
|  *   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( SUPPORT_TRACELOG ) | ||||
| #define TRACELOG( level, ... ) TraceLog( level, __VA_ARGS__ ) | ||||
|  | ||||
| #if defined( SUPPORT_TRACELOG_DEBUG ) | ||||
| #define TRACELOGD( ... ) TraceLog( LOG_DEBUG, __VA_ARGS__ ) | ||||
| #else | ||||
| #define TRACELOGD( ... ) ( void )0 | ||||
| #endif | ||||
| #else | ||||
| #define 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  InitAssetManager( 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 | ||||
							
								
								
									
										8
									
								
								project/auxillary/vis_ast/dependencies/raylib/raylib.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								project/auxillary/vis_ast/dependencies/raylib/raylib.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| #include "raudio.c" | ||||
| #include "rcore.c" | ||||
| #include "rglfw.c" | ||||
| #include "rmodels.c" | ||||
| #include "rshapes.c" | ||||
| #include "rtext.c" | ||||
| #include "rtextures.c" | ||||
| #include "rutils.c" | ||||
| @@ -0,0 +1,9 @@ | ||||
|  __VERSION 1 | ||||
|  | ||||
|  | ||||
| word SUPPORT_MODULE_RSHAPES,   RL_SUPPORT_MODULE_RSHAPES | ||||
| word SUPPORT_MODULE_RTEXTURES, RL_SUPPORT_MODULE_RTEXTURES | ||||
| word SUPPORT_MODULE_RTEXT,     RL_SUPPORT_MODULE_RTEXT | ||||
| word SUPPORT_MODULE_RMODELS,   RL_SUPPORT_MODULE_RMODELS | ||||
| word SUPPORT_MODULE_RAUDIO,    RL_SUPPORT_MODULE_RAUDIO | ||||
|  | ||||
| @@ -0,0 +1,290 @@ | ||||
| #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    = "config.h"; | ||||
| constexpr char const* path_raylib    = "raylib.h"; | ||||
| constexpr char const* path_raymath   = "raymath.h"; | ||||
| constexpr char const* path_rcamera   = "rcamera.h"; | ||||
| constexpr char const* path_rcore     = "rcore.h"; | ||||
| constexpr char const* path_rgestures = "rgestures.h"; | ||||
| constexpr char const* path_rgl       = "rgl.h"; | ||||
| constexpr char const* path_rtext     = "rtext.h"; | ||||
|  | ||||
|  | ||||
| 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_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 ) | ||||
| { | ||||
| 	fn->Name = pascal_to_lower_snake( 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) } ); | ||||
|  | ||||
| 	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 ) | ||||
| 		{ | ||||
| 			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(); | ||||
| 		} | ||||
|  | ||||
| 		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(); | ||||
| } | ||||
|  | ||||
| int gen_main() | ||||
| { | ||||
| 	gen::init(); | ||||
|  | ||||
| 	refactor_file( path_config ); | ||||
| 	refactor_file( path_raylib ); | ||||
| 	refactor_file( path_raymath ); | ||||
| 	refactor_file( path_rcamera ); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
							
								
								
									
										10
									
								
								project/auxillary/vis_ast/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								project/auxillary/vis_ast/readme.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| # 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. | ||||
							
								
								
									
										0
									
								
								project/auxillary/vis_ast/rebuild.ps1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								project/auxillary/vis_ast/rebuild.ps1
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										178
									
								
								project/auxillary/vis_ast/update_deps.ps1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								project/auxillary/vis_ast/update_deps.ps1
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,178 @@ | ||||
| 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 | ||||
| # 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/raysan5/raylib/archive/refs/heads/master.zip' | ||||
| 	$path_raylib_zip = join-path $path_temp 'raylib.zip' | ||||
|  | ||||
| 	$path_raylib_master      = join-path $path_temp          'raylib-master' | ||||
| 	$path_raylib_src         = join-path $path_raylib_master 'src' | ||||
| 	$path_raylib_glfw_inc    = join-path $path_raylib_src    'external/glfw/include' | ||||
|  | ||||
| 	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 raylib | ||||
| 	if ( $true ) { | ||||
| 	# 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 ( $false ) { | ||||
| 		# 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 + 'BUILD_LIBTYPE_SHARED') | ||||
| 		) | ||||
| 		$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)) | ||||
| 	} | ||||
| } | ||||
| setup-raylib | ||||
| @@ -1317,6 +1317,8 @@ String AST::to_string() | ||||
| 				// Keep the chain going... | ||||
| 				if ( NextVar ) | ||||
| 					result.append_fmt( ", %S", NextVar->to_string() ); | ||||
|  | ||||
| 				break; | ||||
| 			} | ||||
|  | ||||
| 			if ( bitfield_is_equal( u32, ModuleFlags, ModuleFlag::Export )) | ||||
|   | ||||
| @@ -475,7 +475,8 @@ struct CodeParam | ||||
| 	} | ||||
| 	CodeParam end() | ||||
| 	{ | ||||
| 		return { (AST_Param*) rcast( AST*, ast)->Last }; | ||||
| 		// return { (AST_Param*) rcast( AST*, ast)->Last }; | ||||
| 		return { nullptr }; | ||||
| 	} | ||||
| 	CodeParam& operator++(); | ||||
| 	CodeParam operator*() | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
| #pragma region Constants | ||||
|  | ||||
| #ifndef GEN_GLOBAL_BUCKET_SIZE | ||||
| #	define GEN_GLOBAL_BUCKET_SIZE megabytes(4) | ||||
| #	define GEN_GLOBAL_BUCKET_SIZE megabytes(8) | ||||
| #endif | ||||
| #ifndef GEN_CODEPOOL_NUM_BLOCKS | ||||
| #	define GEN_CODEPOOL_NUM_BLOCKS kilobytes(16) | ||||
| @@ -31,7 +31,7 @@ | ||||
| #	define GEN_LEX_ALLOCATOR_SIZE megabytes(4) | ||||
| #endif | ||||
| #ifndef GEN_BUILDER_STR_BUFFER_RESERVE | ||||
| #	define GEN_BUILDER_STR_BUFFER_RESERVE megabytes(1) | ||||
| #	define GEN_BUILDER_STR_BUFFER_RESERVE megabytes(2) | ||||
| #endif | ||||
|  | ||||
| // These constexprs are used for allocation behavior of data structures | ||||
|   | ||||
| @@ -1294,7 +1294,7 @@ internal Code               parse_compilcated_definition       (); | ||||
| internal CodeBody           parse_class_struct_body            ( Parser::TokType which, Parser::Token name = Parser::NullToken ); | ||||
| internal Code               parse_class_struct                 ( Parser::TokType which, bool inplace_def ); | ||||
| internal CodeDefine         parse_define                       (); | ||||
| internal Code               parse_foward_or_definition         ( Parser::TokType which, bool is_inplace ); | ||||
| internal Code               parse_forward_or_definition         ( Parser::TokType which, bool is_inplace ); | ||||
| internal CodeFn             parse_function_after_name          ( ModuleFlag mflags, CodeAttributes attributes, CodeSpecifiers specifiers, CodeType ret_type, Parser::Token name ); | ||||
| internal Code               parse_function_body                (); | ||||
| internal Code               parse_global_nspace                (); | ||||
| @@ -1309,6 +1309,7 @@ internal Code               parse_simple_preprocess            ( Parser::TokType | ||||
| internal Code               parse_static_assert                (); | ||||
| internal void               parse_template_args                ( Parser::Token& token ); | ||||
| internal CodeVar            parse_variable_after_name          ( ModuleFlag mflags, CodeAttributes attributes, CodeSpecifiers specifiers, CodeType type, StrC name ); | ||||
| internal CodeVar            parse_variable_declaration_list    (); | ||||
|  | ||||
| internal CodeClass       parse_class           ( bool inplace_def = false ); | ||||
| internal CodeConstructor parse_constructor     (); | ||||
| @@ -1316,7 +1317,7 @@ internal CodeDestructor  parse_destructor      ( CodeSpecifiers specifiers = NoC | ||||
| internal CodeEnum        parse_enum            ( bool inplace_def = false ); | ||||
| internal CodeBody        parse_export_body     (); | ||||
| internal CodeBody        parse_extern_link_body(); | ||||
| internal CodeExtern      parse_exten_link      (); | ||||
| internal CodeExtern      parse_extern_link     (); | ||||
| internal CodeFriend      parse_friend          (); | ||||
| internal CodeFn          parse_function        (); | ||||
| internal CodeNS          parse_namespace       (); | ||||
| @@ -1783,7 +1784,9 @@ Code parse_complicated_definition( Parser::TokType which ) | ||||
| 	if ( (idx - 2 ) == tokens.Idx ) | ||||
| 	{ | ||||
| 		// Its a forward declaration only | ||||
| 		return parse_foward_or_definition( which, is_inplace ); | ||||
| 		Code result = parse_forward_or_definition( which, is_inplace ); | ||||
| 		Context.pop(); | ||||
| 		return result; | ||||
| 	} | ||||
|  | ||||
| 	Token tok = tokens[ idx - 1 ]; | ||||
| @@ -1831,7 +1834,9 @@ Code parse_complicated_definition( Parser::TokType which ) | ||||
| 	{ | ||||
| 		// Its a definition | ||||
| 		// <which> { ... }; | ||||
| 		return parse_foward_or_definition( which, is_inplace ); | ||||
| 		Code result = parse_forward_or_definition( which, is_inplace ); | ||||
| 		Context.pop(); | ||||
| 		return result; | ||||
| 	} | ||||
| 	else if ( tok.Type == TokType::BraceSquare_Close) | ||||
| 	{ | ||||
| @@ -2262,7 +2267,7 @@ CodeDefine parse_define() | ||||
| } | ||||
|  | ||||
| internal inline | ||||
| Code parse_foward_or_definition( Parser::TokType which, bool is_inplace ) | ||||
| Code parse_forward_or_definition( Parser::TokType which, bool is_inplace ) | ||||
| { | ||||
| 	using namespace Parser; | ||||
|  | ||||
| @@ -2272,22 +2277,18 @@ Code parse_foward_or_definition( Parser::TokType which, bool is_inplace ) | ||||
| 	{ | ||||
| 		case TokType::Decl_Class: | ||||
| 			result = parse_class( is_inplace ); | ||||
| 			Context.pop(); | ||||
| 			return result; | ||||
|  | ||||
| 		case TokType::Decl_Enum: | ||||
| 			result = parse_enum( is_inplace ); | ||||
| 			Context.pop(); | ||||
| 			return result; | ||||
|  | ||||
| 		case TokType::Decl_Struct: | ||||
| 			result = parse_struct( is_inplace ); | ||||
| 			Context.pop(); | ||||
| 			return result; | ||||
|  | ||||
| 		case TokType::Decl_Union: | ||||
| 			result = parse_union( is_inplace ); | ||||
| 			Context.pop(); | ||||
| 			return result; | ||||
|  | ||||
| 		default: | ||||
| @@ -2295,7 +2296,6 @@ Code parse_foward_or_definition( Parser::TokType which, bool is_inplace ) | ||||
| 				"(only supports class, enum, struct, union) \n%s" | ||||
| 				, Context.to_string() ); | ||||
|  | ||||
| 			Context.pop(); | ||||
| 			return CodeInvalid; | ||||
| 	} | ||||
|  | ||||
| @@ -2499,7 +2499,7 @@ CodeBody parse_global_nspace( CodeT which ) | ||||
| 				if ( which == Extern_Linkage_Body ) | ||||
| 					log_failure( "Nested extern linkage\n%s", Context.to_string() ); | ||||
|  | ||||
| 				member = parse_extern_link_body(); | ||||
| 				member = parse_extern_link(); | ||||
| 			break; | ||||
|  | ||||
| 			case TokType::Decl_Namespace: | ||||
| @@ -3636,16 +3636,29 @@ CodeVar parse_variable_after_name( | ||||
| 		bitfield_expr   = untyped_str( expr_tok ); | ||||
| 	} | ||||
|  | ||||
| 	Token stmt_end = currtok; | ||||
| 	eat( TokType::Statement_End ); | ||||
|  | ||||
| 	// Check for inline comment : <type> <identifier> = <expression>; // <inline comment> | ||||
| 	CodeVar     next_var   = NoCode; | ||||
| 	Token       stmt_end   = NullToken; | ||||
| 	CodeComment inline_cmt = NoCode; | ||||
| 	if (	left | ||||
| 		&&	( currtok_noskip.Type == TokType::Comment ) | ||||
| 		&&	currtok_noskip.Line == stmt_end.Line ) | ||||
| 	if ( type ) | ||||
| 	{ | ||||
| 		inline_cmt = parse_comment(); | ||||
| 		if ( currtok.Type == TokType::Comma ) | ||||
| 		{ | ||||
| 			// Were dealing with a statement with more than one declaration | ||||
| 			// This is only handled this way if its the first declaration | ||||
| 			// Otherwise its looped through in parse_variable_declaration_list | ||||
| 			next_var = parse_variable_declaration_list(); | ||||
| 		} | ||||
|  | ||||
| 		// If we're dealing with a "comma-procedding then we cannot expect a statement end or inline comment | ||||
| 		// Any comma procedding variable will not have a type provided so it can act as a indicator to skip this | ||||
| 		Token stmt_end = currtok; | ||||
| 		eat( TokType::Statement_End ); | ||||
|  | ||||
| 		// Check for inline comment : <type> <identifier> = <expression>; // <inline comment> | ||||
| 		if ( left && ( currtok_noskip.Type == TokType::Comment ) && currtok_noskip.Line == stmt_end.Line ) | ||||
| 		{ | ||||
| 			inline_cmt = parse_comment(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	using namespace ECode; | ||||
| @@ -3656,7 +3669,9 @@ CodeVar parse_variable_after_name( | ||||
| 	result->Name        = get_cached_string( name ); | ||||
| 	result->ModuleFlags = mflags; | ||||
|  | ||||
| 	result->ValueType = type; | ||||
| 	// Type can be null if we're dealing with a declaration from a variable declaration-list | ||||
| 	if ( type ) | ||||
| 		result->ValueType = type; | ||||
|  | ||||
| 	if (array_expr ) | ||||
| 		type->ArrExpr = array_expr; | ||||
| @@ -3676,6 +3691,90 @@ CodeVar parse_variable_after_name( | ||||
| 	if ( inline_cmt ) | ||||
| 		result->InlineCmt = inline_cmt; | ||||
|  | ||||
| 	if ( next_var ) | ||||
| 	{ | ||||
| 		result->NextVar         = next_var; | ||||
| 		result->NextVar->Parent = result; | ||||
| 	} | ||||
|  | ||||
| 	Context.pop(); | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| /* | ||||
| 	Note(Ed): This does not support the following: | ||||
| 	* Function Pointers | ||||
| */ | ||||
| internal CodeVar parse_variable_declaration_list() | ||||
| { | ||||
| 	using namespace Parser; | ||||
| 	push_scope(); | ||||
|  | ||||
| 	CodeVar result   = NoCode; | ||||
| 	CodeVar last_var = NoCode; | ||||
| 	while ( check( TokType::Comma ) ) | ||||
| 	{ | ||||
| 		eat( TokType::Comma ); | ||||
|  | ||||
| 		CodeSpecifiers specifiers = NoCode; | ||||
|  | ||||
| 		while ( left && currtok.is_specifier() ) | ||||
| 		{ | ||||
| 			SpecifierT spec = ESpecifier::to_type( currtok ); | ||||
|  | ||||
| 			switch ( spec ) | ||||
| 			{ | ||||
| 				case ESpecifier::Const: | ||||
| 					if ( specifiers->NumEntries && specifiers->ArrSpecs[ specifiers->NumEntries - 1 ] != ESpecifier::Ptr ) | ||||
| 					{ | ||||
| 						log_failure( "Error, const specifier must come after pointer specifier for variable declaration proceeding comma\n" | ||||
| 						"(Parser will add and continue to specifiers, but will most likely fail to compile)\n%s" | ||||
| 						, Context.to_string() ); | ||||
|  | ||||
| 						specifiers.append( spec ); | ||||
| 					} | ||||
| 				break; | ||||
|  | ||||
| 				case ESpecifier::Ptr: | ||||
| 				case ESpecifier::Ref: | ||||
| 				case ESpecifier::RValue: | ||||
| 				break; | ||||
|  | ||||
| 				default: | ||||
| 				{ | ||||
| 					log_failure( "Error, invalid specifier '%s' proceeding comma\n" | ||||
| 					"(Parser will add and continue to specifiers, but will most likely fail to compile)\n%s" | ||||
| 					, currtok.Text, Context.to_string() ); | ||||
| 					continue; | ||||
| 				} | ||||
| 				break; | ||||
| 			} | ||||
|  | ||||
| 			if ( specifiers ) | ||||
| 				specifiers.append( spec ); | ||||
| 			else | ||||
| 				specifiers = def_specifier( spec ); | ||||
| 		} | ||||
|  | ||||
| 		StrC name = currtok; | ||||
| 		eat( TokType::Identifier ); | ||||
|  | ||||
| 		CodeVar var = parse_variable_after_name( ModuleFlag::None, NoCode, specifiers, NoCode, name ); | ||||
|  | ||||
| 		// TODO(Ed) : CodeVar is going to need a procedure to append comma-defined vars to itself. | ||||
| 		if ( ! result ) | ||||
| 		{ | ||||
| 			result.ast   = var.ast; | ||||
| 			last_var.ast = var.ast; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			last_var->NextVar.ast         = var.ast; | ||||
| 			last_var->NextVar->Parent.ast = rcast(AST*, var.ast); | ||||
| 			last_var.ast                  = var.ast; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	Context.pop(); | ||||
| 	return result; | ||||
| } | ||||
| @@ -4837,16 +4936,16 @@ CodeType parse_type( bool* typedef_is_function ) | ||||
| 	// Check if native type keywords are used, eat them for the signature. | ||||
| 	else if ( currtok.Type >= TokType::Type_Unsigned && currtok.Type <= TokType::Type_MS_W64 ) | ||||
| 	{ | ||||
| 		// TODO(Ed) : Review this... Its necessary for parsing however the algo's path to this is lost... | ||||
| 		name = currtok; | ||||
| 		eat( currtok.Type ); | ||||
|  | ||||
| 		while (currtok.Type >= TokType::Type_Unsigned && currtok.Type <= TokType::Type_MS_W64 ) | ||||
| 		while ( left && currtok.Type >= TokType::Type_Unsigned && currtok.Type <= TokType::Type_MS_W64 ) | ||||
| 		{ | ||||
| 			eat( currtok.Type ); | ||||
| 		} | ||||
|  | ||||
| 		name.Length = ( (sptr)prevtok.Text + prevtok.Length ) - (sptr)name.Text; | ||||
| 		Context.Scope->Name = name; | ||||
| 	} | ||||
|  | ||||
| 	// The usual Identifier type signature that may have namespace qualifiers | ||||
| @@ -4925,7 +5024,8 @@ CodeType parse_type( bool* typedef_is_function ) | ||||
| 			last_capture = scanner; | ||||
| 		} | ||||
|  | ||||
| 		bool is_for_opcast = str_compare( Context.Scope->Prev->ProcName, "parse_operator_cast" ) == 0; | ||||
| 		bool has_context = Context.Scope && Context.Scope->Prev; | ||||
| 		bool is_for_opcast = has_context && str_compare( Context.Scope->Prev->ProcName, "parse_operator_cast" ) == 0; | ||||
| 		if ( is_for_opcast && is_function_typename && last_capture ) | ||||
| 		{ | ||||
| 			// If we're parsing for an operator cast, having one capture start is not enough | ||||
| @@ -5203,6 +5303,7 @@ CodeTypedef parse_typedef() | ||||
| 			||	currtok.Type == TokType::Decl_Struct | ||||
| 			||	currtok.Type == TokType::Decl_Union; | ||||
|  | ||||
| 		// This code is highly correlated with parse_compilcated_definition | ||||
| 		if ( is_complicated ) | ||||
| 		{ | ||||
| 			TokArray tokens = Context.Tokens; | ||||
| @@ -5224,7 +5325,7 @@ CodeTypedef parse_typedef() | ||||
| 			if ( (idx - 2 ) == tokens.Idx ) | ||||
| 			{ | ||||
| 				// Its a forward declaration only | ||||
| 				type = parse_foward_or_definition( currtok.Type, from_typedef ); | ||||
| 				type = parse_forward_or_definition( currtok.Type, from_typedef ); | ||||
| 			} | ||||
|  | ||||
| 			Token tok = tokens[ idx - 1 ]; | ||||
| @@ -5263,13 +5364,15 @@ CodeTypedef parse_typedef() | ||||
| 					return CodeInvalid; | ||||
| 				} | ||||
|  | ||||
| 				type = parse_type(); | ||||
| 				// TODO(Ed) : I'm not sure if I have to use parse_type here, I'd rather not as that would complicate parse_type. | ||||
| 				// type = parse_type(); | ||||
| 				type = parse_forward_or_definition( currtok.Type, from_typedef ); | ||||
| 			} | ||||
| 			else if ( tok.Type == TokType::BraceCurly_Close ) | ||||
| 			{ | ||||
| 				// Its a definition | ||||
| 				// <which> { ... }; | ||||
| 				type = parse_foward_or_definition( currtok.Type, from_typedef ); | ||||
| 				type = parse_forward_or_definition( currtok.Type, from_typedef ); | ||||
| 			} | ||||
| 			else if ( tok.Type == TokType::BraceSquare_Close) | ||||
| 			{ | ||||
| @@ -5327,7 +5430,12 @@ CodeTypedef parse_typedef() | ||||
| 		result->IsFunction = false; | ||||
| 	} | ||||
|  | ||||
| 	result->UnderlyingType = type; | ||||
| 	if ( type ) | ||||
| 	{ | ||||
| 		result->UnderlyingType         = type; | ||||
| 		result->UnderlyingType->Parent = rcast(AST*, result.ast); | ||||
| 	} | ||||
| 	// Type needs to be aware of its parent so that it can be serialized properly. | ||||
|  | ||||
| 	if ( type->Type == Typename && array_expr && array_expr->Type != Invalid ) | ||||
| 		type.cast<CodeType>()->ArrExpr = array_expr; | ||||
|   | ||||
| @@ -3,14 +3,23 @@ | ||||
| # That or just rewrite it in an sh script and call it a day. | ||||
|  | ||||
| Import-Module ./helpers/target_arch.psm1 | ||||
| $devshell  = Join-Path $PSScriptRoot 'helpers/devshell.ps1' | ||||
| $target_arch        = Join-Path $PSScriptRoot 'helpers/target_arch.psm1' | ||||
| $devshell           = Join-Path $PSScriptRoot 'helpers/devshell.ps1' | ||||
| $format_cpp	        = Join-Path $PSScriptRoot 'helpers/format_cpp.psm1' | ||||
| $incremental_checks = Join-Path $PSScriptRoot 'helpers/incremental_checks.ps1' | ||||
| $vendor_toolchain   = Join-Path $PSScriptRoot 'helpers/vendor_toolchain.ps1' | ||||
|  | ||||
| $path_root = git rev-parse --show-toplevel | ||||
|  | ||||
| Import-Module $target_arch | ||||
| Import-Module $format_cpp | ||||
|  | ||||
| Push-Location $path_root | ||||
|  | ||||
| #region Arguments | ||||
|        $vendor       = $null | ||||
|        $release      = $null | ||||
| 	   $verbose      = $false | ||||
| [bool] $bootstrap    = $false | ||||
| [bool] $singleheader = $false | ||||
| [bool] $test         = $false | ||||
| @@ -21,7 +30,8 @@ Push-Location $path_root | ||||
|  | ||||
| if ( $args ) { $args | ForEach-Object { | ||||
| 	switch ($_){ | ||||
| 		{ $_ -in $vendors }   { $vendor      = $_; break } | ||||
| 		{ $_ -in $vendors }   { $vendor       = $_; break } | ||||
| 		"verbose"			  { $verbose      = $true } | ||||
| 		"release"             { $release      = $true } | ||||
| 		"debug"               { $release      = $false } | ||||
| 		"bootstrap"           { $bootstrap    = $true } | ||||
| @@ -47,295 +57,24 @@ if ( $release -eq $null ) { | ||||
| 	write-host "No build type specified, assuming debug" | ||||
| 	$release = $false | ||||
| } | ||||
| elseif ( $release -eq $false ) { | ||||
| 	$debug = $true | ||||
| } | ||||
| else { | ||||
| 	$optimize = treu | ||||
| } | ||||
|  | ||||
| if ( $bootstrap -eq $false -and $singleheader -eq $false -and $test -eq $false ) { | ||||
| 	throw "No build target specified. One must be specified, this script will not assume one" | ||||
| } | ||||
|  | ||||
|  | ||||
| . $vendor_toolchain | ||||
| . $incremental_checks | ||||
|  | ||||
| write-host "Building gencpp with $vendor" | ||||
| write-host "Build Type: $(if ($release) {"Release"} else {"Debug"} )" | ||||
|  | ||||
| function run-compiler | ||||
| { | ||||
| 	param( $compiler, $unit, $compiler_args ) | ||||
|  | ||||
| 	write-host "`Compiling $unit" | ||||
| 	write-host "Compiler config:" | ||||
| 	$compiler_args | ForEach-Object { | ||||
| 		write-host $_ -ForegroundColor Cyan | ||||
| 	} | ||||
|  | ||||
| 	$time_taken = Measure-Command { | ||||
| 		& $compiler $compiler_args 2>&1 | ForEach-Object { | ||||
| 			$color = 'White' | ||||
| 			switch ($_){ | ||||
| 				{ $_ -match "error"   } { $color = 'Red'   ; break } | ||||
| 				{ $_ -match "warning" } { $color = 'Yellow'; break } | ||||
| 			} | ||||
| 			write-host `t $_ -ForegroundColor $color | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if ( Test-Path($unit) ) { | ||||
| 		write-host "$unit compile finished in $($time_taken.TotalMilliseconds) ms" | ||||
| 	} | ||||
| 	else { | ||||
| 		write-host "Compile failed for $unit" -ForegroundColor Red | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function run-linker | ||||
| { | ||||
| 	param( $linker, $binary, $linker_args ) | ||||
|  | ||||
| 	write-host "`Linking $binary" | ||||
| 	write-host "Linker config:" | ||||
| 	$linker_args | ForEach-Object { | ||||
| 		write-host $_ -ForegroundColor Cyan | ||||
| 	} | ||||
|  | ||||
| 	$time_taken = Measure-Command { | ||||
| 		& $linker $linker_args 2>&1 | ForEach-Object { | ||||
| 			$color = 'White' | ||||
| 			switch ($_){ | ||||
| 				{ $_ -match "error"   } { $color = 'Red'   ; break } | ||||
| 				{ $_ -match "warning" } { $color = 'Yellow'; break } | ||||
| 			} | ||||
| 			write-host `t $_ -ForegroundColor $color | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if ( Test-Path($binary) ) { | ||||
| 		write-host "$binary linking finished in $($time_taken.TotalMilliseconds) ms" | ||||
| 	} | ||||
| 	else { | ||||
| 		write-host "Linking failed for $binary" -ForegroundColor Red | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function run-compile-and-link | ||||
| { | ||||
| 	param( $vendor, $unit, $compiler_args, $linker_args ) | ||||
|  | ||||
| 	write-host "`Compiling & Linking $unit" | ||||
| 	write-host "Compiler config:" | ||||
| 	$compiler_args | ForEach-Object { | ||||
| 		write-host $_ -ForegroundColor Cyan | ||||
| 	} | ||||
| 	write-host "Linker config:" | ||||
| 	$linker_args | ForEach-Object { | ||||
| 		write-host $_ -ForegroundColor Cyan | ||||
| 	} | ||||
|  | ||||
| 	$time_taken = Measure-Command { | ||||
| 		& $vendor $compiler_args $linker_args 2>&1 | ForEach-Object { | ||||
| 			$color = 'White' | ||||
| 			switch ($_){ | ||||
| 				{ $_ -match "error"   } { $color = 'Red'   ; break } | ||||
| 				{ $_ -match "warning" } { $color = 'Yellow'; break } | ||||
| 			} | ||||
| 			write-host `t $_ -ForegroundColor $color | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	# if ( Test-Path($binary) ) { | ||||
| 	# 	write-host "$binary compile & link finished in $($time_taken.TotalMilliseconds) ms" | ||||
| 	# } | ||||
| 	# else { | ||||
| 	# 	write-host "Compile & Link failed for $binary" -ForegroundColor Red | ||||
| 	# } | ||||
| } | ||||
|  | ||||
| if ( $vendor -match "clang" ) | ||||
| { | ||||
| 	# https://clang.llvm.org/docs/ClangCommandLineReference.html | ||||
| 	$flag_compile                    = '-c' | ||||
| 	$flag_color_diagnostics          = '-fcolor-diagnostics' | ||||
| 	$flag_no_color_diagnostics       = '-fno-color-diagnostics' | ||||
| 	$flag_debug                      = '-g' | ||||
| 	$flag_debug_codeview             = '-gcodeview' | ||||
| 	$flag_define                     = '-D' | ||||
| 	$flag_preprocess 			     = '-E' | ||||
| 	$flag_include                    = '-I' | ||||
| 	$flag_library					 = '-l' | ||||
| 	$flag_library_path				 = '-L' | ||||
| 	$flag_link_win                   = '-Wl,' | ||||
| 	$flag_link_win_subsystem_console = '/SUBSYSTEM:CONSOLE' | ||||
| 	$flag_link_win_machine_32        = '/MACHINE:X86' | ||||
| 	$flag_link_win_machine_64        = '/MACHINE:X64' | ||||
| 	$flag_link_win_debug             = '/DEBUG' | ||||
| 	$flag_link_win_pdb 			     = '/PDB:' | ||||
| 	$flag_link_win_path_output       = '/OUT:' | ||||
| 	$flag_no_optimization 		     = '-O0' | ||||
| 	$flag_path_output                = '-o' | ||||
| 	$flag_preprocess_non_intergrated = '-no-integrated-cpp' | ||||
| 	$flag_profiling_debug            = '-fdebug-info-for-profiling' | ||||
| 	$flag_target_arch				 = '-target' | ||||
| 	$flag_wall 					     = '-Wall' | ||||
| 	$flag_warning 					 = '-W' | ||||
| 	$flag_warning_as_error 		     = '-Werror' | ||||
| 	$flag_win_nologo 			     = '/nologo' | ||||
|  | ||||
| 	$ignore_warning_ms_include = 'no-microsoft-include' | ||||
|  | ||||
| 	$target_arch = Get-TargetArchClang | ||||
|  | ||||
| 	$warning_ignores = @( | ||||
| 		$ignore_warning_ms_include | ||||
| 	) | ||||
|  | ||||
| 	# https://learn.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=msvc-170 | ||||
| 	$libraries = @( | ||||
| 		'Kernel32' # For Windows API | ||||
| 		# 'msvcrt', # For the C Runtime (Dynamically Linked) | ||||
| 		# 'libucrt', | ||||
| 		'libcmt'    # For the C Runtime (Static Linkage) | ||||
| 	) | ||||
|  | ||||
| 	function build-simple | ||||
| 	{ | ||||
| 		param( $includes, $unit, $executable ) | ||||
| 		Write-Host "build-simple: clang" | ||||
|  | ||||
| 		$object = $executable -replace '\.exe', '.obj' | ||||
| 		$pdb    = $executable -replace '\.exe', '.pdb' | ||||
|  | ||||
| 		$compiler_args = @( | ||||
| 			$flag_no_color_diagnostics, | ||||
| 			$flag_target_arch, $target_arch, | ||||
| 			$flag_wall, | ||||
| 			$flag_preprocess_non_intergrated, | ||||
| 			( $flag_define + 'GEN_TIME' ), | ||||
| 			# ( $flag_path_output + $object ), | ||||
| 			( $flag_path_output + $executable ) | ||||
| 			( $flag_include + $includes ) | ||||
| 		) | ||||
| 		if ( $release -eq $false ) { | ||||
| 			$compiler_args += ( $flag_define + 'Build_Debug' ) | ||||
| 			$compiler_args += $flag_debug, $flag_debug_codeview, $flag_profiling_debug | ||||
| 			$compiler_args += $flag_no_optimization | ||||
| 		} | ||||
|  | ||||
| 		$warning_ignores | ForEach-Object { | ||||
| 			$compiler_args += $flag_warning + $_ | ||||
| 		} | ||||
|  | ||||
| 		# $compiler_args += $flag_preprocess | ||||
|  | ||||
| 		# $compiler_args += $flag_compile, $unit | ||||
| 		# run-compiler $compiler $unit $compiler_args | ||||
|  | ||||
| 		$linker_args = @( | ||||
| 			$flag_link_win_subsystem_console, | ||||
| 			$flag_link_win_machine_64, | ||||
| 			$( $flag_link_win_path_output + $executable ) | ||||
| 		) | ||||
| 		if ( $release -eq $false ) { | ||||
| 			$linker_args += $flag_link_win_debug | ||||
| 			$linker_args += $flag_link_win_pdb + $pdb | ||||
| 		} | ||||
| 		else { | ||||
| 		} | ||||
|  | ||||
| 		$libraries | ForEach-Object { | ||||
| 			$linker_args += $_ + '.lib' | ||||
| 		} | ||||
|  | ||||
| 		# $linker_args += $object | ||||
| 		# run-linker $linker $executable $linker_args | ||||
|  | ||||
| 		$compiler_args += $unit | ||||
| 		# $linker_args += $object | ||||
| 		run-compile-and-link $compiler $unit $compiler_args | ||||
| 	} | ||||
|  | ||||
| 	$compiler = 'clang++' | ||||
| 	$linker   = 'lld-link' | ||||
| } | ||||
|  | ||||
| if ( $vendor -match "msvc" ) | ||||
| { | ||||
| 	# https://learn.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-by-category?view=msvc-170 | ||||
| 	$flag_compile			      = '/c' | ||||
| 	$flag_debug                   = '/Zi' | ||||
| 	$flag_define		          = '/D' | ||||
| 	$flag_include                 = '/I' | ||||
| 	$flag_full_src_path           = '/FC' | ||||
| 	$flag_nologo                  = '/nologo' | ||||
| 	$flag_dll 				      = '/LD' | ||||
| 	$flag_dll_debug 			  = '/LDd' | ||||
| 	$flag_linker 		          = '/link' | ||||
| 	$flag_link_debug 			  = '/DEBUG' | ||||
| 	$flag_link_pdb 				  = '/PDB:' | ||||
| 	$flag_link_machine_32         = '/MACHINE:X86' | ||||
| 	$flag_link_machine_64         = '/MACHINE:X64' | ||||
| 	$flag_link_path_output 	      = '/OUT:' | ||||
| 	$flag_link_rt_dll             = '/MD' | ||||
| 	$flag_link_rt_dll_debug       = '/MDd' | ||||
| 	$flag_link_rt_static          = '/MT' | ||||
| 	$flag_link_rt_static_debug    = '/MTd' | ||||
| 	$flag_link_subsystem_console  = '/SUBSYSTEM:CONSOLE' | ||||
| 	$flag_link_subsystem_windows  = '/SUBSYSTEM:WINDOWS' | ||||
| 	$flag_no_optimization		  = '/Od' | ||||
| 	$flag_out_name                = '/OUT:' | ||||
| 	$flag_path_interm             = '/Fo' | ||||
| 	$flag_path_debug              = '/Fd' | ||||
| 	$flag_path_output             = '/Fe' | ||||
| 	$flag_preprocess_conform      = '/Zc:preprocessor' | ||||
|  | ||||
| 	# This works because this project uses a single unit to build | ||||
| 	function build-simple | ||||
| 	{ | ||||
| 		param( $includes, $unit, $executable ) | ||||
| 		Write-Host "build-simple: msvc" | ||||
|  | ||||
| 		$object = $executable -replace '\.exe', '.obj' | ||||
| 		$pdb    = $executable -replace '\.exe', '.pdb' | ||||
|  | ||||
| 		$compiler_args = @( | ||||
| 			$flag_nologo, | ||||
| 			$flag_preprocess_conform, | ||||
| 			$flag_debug, | ||||
| 			( $flag_define + 'GEN_TIME' ), | ||||
| 			$flag_full_src_path, | ||||
| 			( $flag_path_interm + $path_build + '\' ), | ||||
| 			( $flag_path_output + $path_build + '\' ) | ||||
| 		) | ||||
| 		if ( $release -eq $false ) { | ||||
| 			$compiler_args += ( $flag_define + 'Build_Debug' ) | ||||
| 			$compiler_args += ( $flag_path_debug + $path_build + '\' ) | ||||
| 			$compiler_args += $flag_link_rt_static_debug | ||||
| 			$compiler_args += $flag_no_optimization | ||||
| 		} | ||||
| 		else { | ||||
| 			$compiler_args += $flag_link_rt_static | ||||
| 		} | ||||
| 		$compiler_args += $includes | ForEach-Object { $flag_include + $_ } | ||||
| 		$compiler_args += $flag_compile, $unit | ||||
| 		run-compiler $compiler $unit $compiler_args | ||||
|  | ||||
| 		$linker_args = @( | ||||
| 			$flag_nologo, | ||||
| 			$flag_link_machine_64, | ||||
| 			$flag_link_subsystem_console, | ||||
| 			( $flag_link_path_output + $executable ) | ||||
| 		) | ||||
| 		if ( $release -eq $false ) { | ||||
| 			$linker_args += $flag_link_debug | ||||
| 			$linker_args += $flag_link_pdb + $pdb | ||||
| 		} | ||||
| 		else { | ||||
| 		} | ||||
|  | ||||
| 		$linker_args += $object | ||||
| 		run-linker $linker $executable $linker_args | ||||
| 	} | ||||
|  | ||||
| 	$compiler = 'cl' | ||||
| 	$linker   = 'link' | ||||
| } | ||||
| #endregion Configuration | ||||
|  | ||||
| #region Building | ||||
| $path_build        = Join-Path $path_root build | ||||
| $path_project      = Join-Path $path_root project | ||||
| @@ -359,11 +98,18 @@ if ( $bootstrap ) | ||||
| 		New-Item -ItemType Directory -Path $path_comp_gen | ||||
| 	} | ||||
|  | ||||
| 	$compiler_args = @() | ||||
| 	$compiler_args += ( $flag_define + 'GEN_TIME' ) | ||||
|  | ||||
| 	$linker_args   = @( | ||||
| 		$flag_link_win_subsystem_console | ||||
| 	) | ||||
|  | ||||
| 	$includes   = @( $path_project) | ||||
| 	$unit       = join-path $path_project "bootstrap.cpp" | ||||
| 	$executable = join-path $path_build   "bootstrap.exe" | ||||
|  | ||||
| 	build-simple $includes $unit $executable | ||||
| 	build-simple $path_build $includes $compiler_args $linker_args $unit $executable | ||||
|  | ||||
| 	Push-Location $path_project | ||||
| 		if ( Test-Path( $executable ) ) { | ||||
| @@ -394,7 +140,14 @@ if ( $singleheader ) | ||||
| 	$unit       = join-path $path_singleheader "singleheader.cpp" | ||||
| 	$executable = join-path $path_build        "singleheader.exe" | ||||
|  | ||||
| 	build-simple $includes $unit $executable | ||||
| 	$compiler_args = @() | ||||
| 	$compiler_args += ( $flag_define + 'GEN_TIME' ) | ||||
|  | ||||
| 	$linker_args   = @( | ||||
| 		$flag_link_win_subsystem_console | ||||
| 	) | ||||
|  | ||||
| 	build-simple $path_build $includes $compiler_args $linker_args $unit $executable | ||||
|  | ||||
| 	Push-Location $path_singleheader | ||||
| 		if ( Test-Path( $executable ) ) { | ||||
| @@ -431,7 +184,14 @@ if ( $test ) | ||||
| 	$unit       = join-path $path_test  "test.cpp" | ||||
| 	$executable = join-path $path_build "test.exe" | ||||
|  | ||||
| 	build-simple $includes $unit $executable | ||||
| 	$compiler_args = @() | ||||
| 	$compiler_args += ( $flag_define + 'GEN_TIME' ) | ||||
|  | ||||
| 	$linker_args   = @( | ||||
| 		$flag_link_win_subsystem_console | ||||
| 	) | ||||
|  | ||||
| 	build-simple $path_build $includes $compiler_args $linker_args $unit $executable | ||||
|  | ||||
| 	Push-Location $path_test | ||||
| 		Write-Host $path_test | ||||
| @@ -449,29 +209,7 @@ if ( $test ) | ||||
| #endregion Building | ||||
|  | ||||
| #region Formatting | ||||
| function format-cpp | ||||
| { | ||||
| 	param( $path, $include, $exclude ) | ||||
|  | ||||
| 	# Format generated gencpp | ||||
| 	Write-Host "`nBeginning format" | ||||
| 	$formatParams = @( | ||||
| 		'-i'          # In-place | ||||
| 		'-style=file:./scripts/.clang-format' | ||||
| 		'-verbose' | ||||
| 	) | ||||
|  | ||||
| 	$targetFiles = @( | ||||
| 		Get-ChildItem -Recurse -Path $path -Include $include -Exclude $exclude | ||||
| 			| Select-Object -ExpandProperty FullName | ||||
| 	) | ||||
|  | ||||
| 	$time_taken = Measure-Command { | ||||
| 		clang-format $formatParams $targetFiles | ||||
| 	} | ||||
| 	Write-Host "`nFormatting complete in $($time_taken.TotalMilliseconds) ms" | ||||
| } | ||||
|  | ||||
| push-location $path_scripts | ||||
| if ( $bootstrap -and (Test-Path (Join-Path $path_project "gen/gen.hpp")) ) | ||||
| { | ||||
| 	$path_gen      = join-path $path_project gen | ||||
| @@ -485,6 +223,7 @@ if ( $bootstrap -and (Test-Path (Join-Path $path_project "gen/gen.hpp")) ) | ||||
| 	$exclude  = $null | ||||
| 	format-cpp $path_gen $include $exclude | ||||
| 	format-cpp $path_comp_gen @( 'ast_inlines.hpp', 'ecode.hpp', 'especifier.hpp', 'eoperator.hpp', 'etoktype.cpp' ) $null | ||||
|  | ||||
| } | ||||
|  | ||||
| if ( $singleheader -and (Test-Path (Join-Path $path_singleheader "gen/gen.hpp")) ) | ||||
| @@ -506,6 +245,7 @@ if ( $test -and $false ) | ||||
| 	$exclude  = $null | ||||
| 	format-cpp $path_gen $include $exclude | ||||
| } | ||||
| pop-location | ||||
| #endregion Formatting | ||||
|  | ||||
| Pop-Location # $path_root | ||||
|   | ||||
| @@ -23,5 +23,6 @@ if ( -not (Test-Path $vs_devshell) ) { | ||||
|  | ||||
| # Launch the Visual Studio Developer Shell | ||||
| Push-Location | ||||
| write-host @args | ||||
| & $vs_devshell @args | ||||
| Pop-Location | ||||
|   | ||||
							
								
								
									
										26
									
								
								scripts/helpers/format_cpp.psm1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								scripts/helpers/format_cpp.psm1
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| # format_cpp.psm1 | ||||
|  | ||||
| function format-cpp | ||||
| { | ||||
| 	param( $path, $include, $exclude ) | ||||
|  | ||||
| 	# Format generated gencpp | ||||
| 	Write-Host "Beginning format" | ||||
| 	$formatParams = @( | ||||
| 		'-i'          # In-place | ||||
| 		'-style=file:.clang-format' | ||||
| 		'-verbose' | ||||
| 	) | ||||
|  | ||||
| 	$targetFiles = @( | ||||
| 		Get-ChildItem -Recurse -Path $path -Include $include -Exclude $exclude | ||||
| 			| Select-Object -ExpandProperty FullName | ||||
| 	) | ||||
|  | ||||
| 	$time_taken = Measure-Command { | ||||
| 		clang-format $formatParams $targetFiles | ||||
| 	} | ||||
| 	Write-Host "Formatting complete in $($time_taken.TotalMilliseconds) ms`n" | ||||
| } | ||||
|  | ||||
| Export-ModuleMember -Function format-cpp | ||||
							
								
								
									
										73
									
								
								scripts/helpers/incremental_checks.ps1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								scripts/helpers/incremental_checks.ps1
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| # This is meant to be used with build.ps1, and is not a standalone script. | ||||
|  | ||||
| function check-FileForChanges | ||||
| { | ||||
|     param( | ||||
|         [Parameter(Mandatory=$true)] | ||||
|         [string]$path_file | ||||
|     ) | ||||
|  | ||||
|     if (-not (Test-Path $path_file -PathType Leaf)) { | ||||
|         Write-Error "The provided path is not a valid file: $path_file" | ||||
|         return $false | ||||
|     } | ||||
|     $file_name = Split-Path $path_file -Leaf | ||||
|     $path_csv  = Join-Path $path_build ($file_name + "_file_hash.csv") | ||||
|  | ||||
|     $csv_file_hash = $null | ||||
|     if (Test-Path $path_csv) { | ||||
|         $csv_file_hash = Import-Csv $path_csv | Select-Object -ExpandProperty value | ||||
|     } | ||||
|  | ||||
|     $current_hash_info = Get-FileHash -Path $path_file -Algorithm MD5 | ||||
|     $current_file_hash = $current_hash_info.Hash | ||||
|  | ||||
|     # Save the current hash to the CSV | ||||
|     [PSCustomObject]@{ | ||||
|         name  = $path_file | ||||
|         value = $current_file_hash | ||||
|     } | Export-Csv $path_csv -NoTypeInformation | ||||
|  | ||||
|     if ($csv_file_hash -and $csv_file_hash -eq $current_file_hash) { | ||||
|         return $false | ||||
|     } else { | ||||
|         return $true | ||||
|     } | ||||
| } | ||||
|  | ||||
| # Check to see if the module has changed files since the last build | ||||
| function check-ModuleForChanges | ||||
| { | ||||
| 	param( [string]$path_module, [array]$excludes ) | ||||
|  | ||||
| 	$module_name = split-path $path_module -leaf | ||||
| 	$path_csv    = Join-Path $path_build ($module_name + "_module_hashes.csv") | ||||
|  | ||||
| 	$csv_file_hashes = $null | ||||
| 	if ( test-path $path_csv ) { | ||||
| 		$csv_file_hashes = @{} | ||||
| 		import-csv $path_csv | foreach-object { | ||||
| 			$csv_file_hashes[ $_.name ] = $_.value | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	$file_hashes = @{} | ||||
| 	get-childitem -path $path_module -recurse -file -Exclude $excludes | foreach-object { | ||||
| 		$id                 = $_.fullname | ||||
| 		$hash_info          = get-filehash -path $id -Algorithm MD5 | ||||
| 		$file_hashes[ $id ] = $hash_info.Hash | ||||
| 	} | ||||
|  | ||||
| 	$file_hashes.GetEnumerator() | foreach-object { [PSCustomObject]$_ } | | ||||
| 		export-csv $path_csv -NoTypeInformation | ||||
|  | ||||
| 	if ( -not $csv_file_hashes )                         { return $true } | ||||
| 	if ( $csv_file_hashes.Count -ne $file_hashes.Count ) { return $true } | ||||
|  | ||||
| 	foreach ( $key in $csv_file_hashes.Keys ) { | ||||
| 		if ( $csv_file_hashes[ $key ] -ne $file_hashes[ $key ] ) { | ||||
| 			return $true | ||||
| 		} | ||||
| 	} | ||||
| 	return $false | ||||
| } | ||||
							
								
								
									
										525
									
								
								scripts/helpers/vendor_toolchain.ps1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										525
									
								
								scripts/helpers/vendor_toolchain.ps1
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,525 @@ | ||||
| # This is meant to be used with build.ps1, and is not a standalone script. | ||||
|  | ||||
| if ($IsWindows) { | ||||
| 	# This HandmadeHero implementation is only designed for 64-bit systems | ||||
|     & $devshell -arch amd64 | ||||
| } | ||||
|  | ||||
| if ( $vendor -eq $null ) { | ||||
| 	write-host "No vendor specified, assuming clang available" | ||||
| 	$vendor = "clang" | ||||
| } | ||||
|  | ||||
| if ( $dev ) { | ||||
| 	if ( $debug -eq $null ) { | ||||
| 		$debug = $true | ||||
| 	} | ||||
| 	if ( $optimize -eq $null ) { | ||||
| 		$optimize = $false | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function run-compiler | ||||
| { | ||||
| 	param( $compiler, $unit, $compiler_args ) | ||||
|  | ||||
| 	if ( $analysis ) { | ||||
| 		$compiler_args += $flag_syntax_only | ||||
| 	} | ||||
|  | ||||
| 	write-host "`Compiling $unit" | ||||
| 	if ( $verbose ) { | ||||
| 		write-host "Compiler config:" | ||||
| 		$compiler_args | ForEach-Object { | ||||
| 			write-host $_ -ForegroundColor Cyan | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	$time_taken = Measure-Command { | ||||
| 		& $compiler $compiler_args 2>&1 | ForEach-Object { | ||||
| 			$color = 'White' | ||||
| 			switch ($_){ | ||||
| 				{ $_ -match "error"   } { $color = 'Red'   ; break } | ||||
| 				{ $_ -match "warning" } { $color = 'Yellow'; break } | ||||
| 			} | ||||
| 			write-host `t $_ -ForegroundColor $color | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if ( $LASTEXITCODE -eq 0 ) { | ||||
| 		write-host "$unit compile finished in $($time_taken.TotalMilliseconds) ms`n" | ||||
| 		return $true | ||||
| 	} | ||||
| 	else { | ||||
| 		write-host "Compile failed for $unit`n" -ForegroundColor Red | ||||
| 		return $false | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function run-linker | ||||
| { | ||||
| 	param( $linker, $binary, $linker_args ) | ||||
|  | ||||
| 	write-host "`Linking $binary" | ||||
| 	if ( $verbose ) { | ||||
| 		write-host "Linker config:" | ||||
| 		$linker_args | ForEach-Object { | ||||
| 			write-host $_ -ForegroundColor Cyan | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	$time_taken = Measure-Command { | ||||
| 		& $linker $linker_args 2>&1 | ForEach-Object { | ||||
| 			$color = 'White' | ||||
| 			switch ($_){ | ||||
| 				{ $_ -match "error"   } { $color = 'Red'   ; break } | ||||
| 				{ $_ -match "warning" } { $color = 'Yellow'; break } | ||||
| 			} | ||||
| 			write-host `t $_ -ForegroundColor $color | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if ( $LASTEXITCODE -eq 0 ) { | ||||
| 		write-host "$binary linking finished in $($time_taken.TotalMilliseconds) ms`n" | ||||
| 		return $true | ||||
| 	} | ||||
| 	else { | ||||
| 		write-host "Linking failed for $binary`n" -ForegroundColor Red | ||||
| 		return $false | ||||
| 	} | ||||
| } | ||||
|  | ||||
| if ( $vendor -match "clang" ) | ||||
| { | ||||
| 	# https://clang.llvm.org/docs/ClangCommandLineReference.html | ||||
| 	$flag_all_c 					   = '/TC' | ||||
| 	$flag_all_cpp                      = '/TP' | ||||
| 	$flag_compile                      = '-c' | ||||
| 	$flag_color_diagnostics            = '-fcolor-diagnostics' | ||||
| 	$flag_no_color_diagnostics         = '-fno-color-diagnostics' | ||||
| 	$flag_debug                        = '-g' | ||||
| 	$flag_debug_codeview               = '-gcodeview' | ||||
| 	$flag_define                       = '-D' | ||||
| 	$flag_exceptions_disabled		   = '-fno-exceptions' | ||||
| 	$flag_preprocess 			       = '-E' | ||||
| 	$flag_include                      = '-I' | ||||
| 	$flag_section_data                 = '-fdata-sections' | ||||
| 	$flag_section_functions            = '-ffunction-sections' | ||||
| 	$flag_library					   = '-l' | ||||
| 	$flag_library_path				   = '-L' | ||||
| 	$flag_linker                       = '-Wl,' | ||||
| 	if ( $IsWindows ) { | ||||
| 		$flag_link_dll                 = '/DLL' | ||||
| 		$flag_link_mapfile 		       = '/MAP:' | ||||
| 		$flag_link_optimize_references = '/OPT:REF' | ||||
| 	} | ||||
| 	if ( $IsLinux ) { | ||||
| 		$flag_link_mapfile              = '--Map=' | ||||
| 		$flag_link_optimize_references  = '--gc-sections' | ||||
| 	} | ||||
| 	$flag_link_win_subsystem_console    = '/SUBSYSTEM:CONSOLE' | ||||
| 	$flag_link_win_subsystem_windows    = '/SUBSYSTEM:WINDOWS' | ||||
| 	$flag_link_win_machine_32           = '/MACHINE:X86' | ||||
| 	$flag_link_win_machine_64           = '/MACHINE:X64' | ||||
| 	$flag_link_win_debug                = '/DEBUG' | ||||
| 	$flag_link_win_pdb 			        = '/PDB:' | ||||
| 	$flag_link_win_path_output          = '/OUT:' | ||||
| 	$flag_no_optimization 		        = '-O0' | ||||
| 	$flag_optimize_fast 		        = '-O2' | ||||
| 	$flag_optimize_size 		        = '-O1' | ||||
| 	$flag_optimize_intrinsics		    = '-Oi' | ||||
| 	$flag_path_output                   = '-o' | ||||
| 	$flag_preprocess_non_intergrated    = '-no-integrated-cpp' | ||||
| 	$flag_profiling_debug               = '-fdebug-info-for-profiling' | ||||
| 	$flag_set_stack_size			    = '-stack=' | ||||
| 	$flag_syntax_only				    = '-fsyntax-only' | ||||
| 	$flag_target_arch				    = '-target' | ||||
| 	$flag_time_trace					= '-ftime-trace' | ||||
| 	$flag_verbose 					    = '-v' | ||||
| 	$flag_wall 					        = '-Wall' | ||||
| 	$flag_warning 					    = '-W' | ||||
| 	$flag_warnings_as_errors            = '-Werror' | ||||
| 	$flag_win_nologo 			        = '/nologo' | ||||
|  | ||||
| 	$ignore_warning_ms_include            = 'no-microsoft-include' | ||||
| 	$ignore_warning_return_type_c_linkage = 'no-return-type-c-linkage' | ||||
|  | ||||
| 	$target_arch = Get-TargetArchClang | ||||
|  | ||||
| 	$warning_ignores = @( | ||||
| 		$ignore_warning_ms_include, | ||||
| 		$ignore_warning_return_type_c_linkage | ||||
| 	) | ||||
|  | ||||
| 	# https://learn.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=msvc-170 | ||||
| 	if ( $IsWindows ) { | ||||
| 		$libraries = @( | ||||
| 			'Kernel32' # For Windows API | ||||
| 			# 'msvcrt', # For the C Runtime (Dynamically Linked) | ||||
| 			# 'libucrt', | ||||
| 			'libcmt'    # For the C Runtime (Static Linkage) | ||||
| 		) | ||||
| 	} | ||||
|  | ||||
| 	function build | ||||
| 	{ | ||||
| 		param( [string]$path_output, [array]$includes, [array]$compiler_args, [array]$linker_args, [array]$units, [string]$binary ) | ||||
| 		$result = $false | ||||
| 		#Write-Host "build: clang" | ||||
|  | ||||
| 		$map    = $binary -replace '\.(exe|dll)$', '.map' | ||||
| 		$map    = join-path $path_output (split-path $map    -Leaf) | ||||
|  | ||||
| 		# This allows dll reloads at runtime to work (jankily, use below if not interested) | ||||
| 		$pdb    = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb" | ||||
| 		# $pdb    = $binary -replace '\.(exe|dll)$', ".pdb" | ||||
|  | ||||
| 		$compiler_args += @( | ||||
| 			$flag_no_color_diagnostics, | ||||
| 			$flag_exceptions_disabled, | ||||
| 			$flag_target_arch, $target_arch, | ||||
| 			$flag_wall, | ||||
| 			$flag_preprocess_non_intergrated | ||||
| 			# $flag_section_data, | ||||
| 			# $flag_section_functions, | ||||
| 		) | ||||
| 		if ( $verbose ) { | ||||
| 			# $compiler_args += $flag_verbose | ||||
| 			# $compiler_args += $flag_time_trace | ||||
| 		} | ||||
| 		if ( $optimize ) { | ||||
| 			$compiler_args += $flag_optimize_fast | ||||
| 		} | ||||
| 		else { | ||||
| 			$compiler_args += $flag_no_optimization | ||||
| 		} | ||||
| 		if ( $debug ) { | ||||
| 			$compiler_args += ( $flag_define + 'Build_Debug=1' ) | ||||
| 			$compiler_args += $flag_debug, $flag_debug_codeview, $flag_profiling_debug | ||||
| 		} | ||||
| 		else { | ||||
| 			$compiler_args += ( $flag_define + 'Build_Debug=0' ) | ||||
| 		} | ||||
|  | ||||
| 		$warning_ignores | ForEach-Object { | ||||
| 			$compiler_args += $flag_warning + $_ | ||||
| 		} | ||||
| 		$compiler_args += $includes | ForEach-Object { $flag_include + $_ } | ||||
|  | ||||
| 		$objects = @() | ||||
| 		foreach ( $unit in $units ) | ||||
| 		{ | ||||
| 			$object = $unit -replace '\.(cpp|c)$', '.obj' | ||||
| 			$object = join-path $path_output (split-path $object -Leaf) | ||||
| 			$objects += $object | ||||
|  | ||||
| 			$unit_compiler_args  = $compiler_args | ||||
| 			$unit_compiler_args += ( $flag_path_output + $object ) | ||||
|  | ||||
| 			$unit_compiler_args += $flag_compile, $unit | ||||
| 			run-compiler $compiler $unit $unit_compiler_args | ||||
| 		} | ||||
|  | ||||
| 		$linker_args += @( | ||||
| 			$flag_link_win_machine_64, | ||||
| 			$( $flag_link_win_path_output + $binary ) | ||||
| 		) | ||||
| 		if ( $debug ) { | ||||
| 			$linker_args += $flag_link_win_debug | ||||
| 			$linker_args += $flag_link_win_pdb + $pdb | ||||
| 			$linker_args += $flag_link_mapfile + $map | ||||
| 		} | ||||
|  | ||||
| 		$libraries | ForEach-Object { | ||||
| 			$linker_args += $_ + '.lib' | ||||
| 		} | ||||
|  | ||||
| 		$linker_args += $objects | ||||
| 		return run-linker $linker $binary $linker_args | ||||
| 	} | ||||
|  | ||||
| 	function build-simple | ||||
| 	{ | ||||
| 		param( [string]$path_output, [array]$includes, [array]$compiler_args, [array]$linker_args, [string]$unit, [string]$binary ) | ||||
| 		$result = $false | ||||
| 		#Write-Host "build-simple: clang" | ||||
|  | ||||
| 		$object = $unit -replace '\.(cpp|c)$', '.obj' | ||||
| 		$map    = $unit -replace '\.(cpp|c)$', '.map' | ||||
| 		$object = join-path $path_output (split-path $object -Leaf) | ||||
| 		$map    = join-path $path_output (split-path $map    -Leaf) | ||||
|  | ||||
| 		# This allows dll reloads at runtime to work (jankily, use below if not interested) | ||||
| 		$pdb    = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb" | ||||
| 		# $pdb    = $binary -replace '\.(exe|dll)$', ".pdb" | ||||
|  | ||||
| 		$compiler_args += @( | ||||
| 			$flag_no_color_diagnostics, | ||||
| 			$flag_exceptions_disabled, | ||||
| 			$flag_target_arch, $target_arch, | ||||
| 			$flag_wall, | ||||
| 			$flag_preprocess_non_intergrated, | ||||
| 			# $flag_section_data, | ||||
| 			# $flag_section_functions, | ||||
| 			( $flag_path_output + $object ) | ||||
| 		) | ||||
| 		if ( $verbose ) { | ||||
| 			# $compiler_args += $flag_verbose | ||||
| 			# $compiler_args += $flag_time_trace | ||||
| 		} | ||||
| 		if ( $optimize ) { | ||||
| 			$compiler_args += $flag_optimize_fast | ||||
| 		} | ||||
| 		else { | ||||
| 			$compiler_args += $flag_no_optimization | ||||
| 		} | ||||
| 		if ( $debug ) { | ||||
| 			$compiler_args += ( $flag_define + 'Build_Debug=1' ) | ||||
| 			$compiler_args += $flag_debug, $flag_debug_codeview, $flag_profiling_debug | ||||
| 		} | ||||
| 		else { | ||||
| 			$compiler_args += ( $flag_define + 'Build_Debug=0' ) | ||||
| 		} | ||||
|  | ||||
| 		$warning_ignores | ForEach-Object { | ||||
| 			$compiler_args += $flag_warning + $_ | ||||
| 		} | ||||
| 		$compiler_args += $includes | ForEach-Object { $flag_include + $_ } | ||||
|  | ||||
| 		$compiler_args += $flag_compile, $unit | ||||
| 		if ( (run-compiler $compiler $unit $compiler_args) -eq $false ) { | ||||
| 			return $false | ||||
| 		} | ||||
|  | ||||
| 		$linker_args += @( | ||||
| 			$flag_link_win_machine_64, | ||||
| 			$( $flag_link_win_path_output + $binary ) | ||||
| 		) | ||||
| 		if ( $debug ) { | ||||
| 			$linker_args += $flag_link_win_debug | ||||
| 			$linker_args += $flag_link_win_pdb + $pdb | ||||
| 			$linker_args += $flag_link_mapfile + $map | ||||
| 		} | ||||
|  | ||||
| 		$libraries | ForEach-Object { | ||||
| 			$linker_args += $_ + '.lib' | ||||
| 		} | ||||
|  | ||||
| 		$linker_args += $object | ||||
| 		return run-linker $linker $binary $linker_args | ||||
| 	} | ||||
|  | ||||
| 	$compiler = 'clang++' | ||||
| 	$linker   = 'lld-link' | ||||
| } | ||||
|  | ||||
| if ( $vendor -match "msvc" ) | ||||
| { | ||||
| 	# https://learn.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-by-category?view=msvc-170 | ||||
| 	$flag_all_c 					 = '/TC' | ||||
| 	$flag_all_cpp                    = '/TP' | ||||
| 	$flag_compile			         = '/c' | ||||
| 	$flag_debug                      = '/Zi' | ||||
| 	$flag_define		             = '/D' | ||||
| 	$flag_exceptions_disabled		 = '/EHsc-' | ||||
| 	$flag_RTTI_disabled				 = '/GR-' | ||||
| 	$flag_include                    = '/I' | ||||
| 	$flag_full_src_path              = '/FC' | ||||
| 	$flag_nologo                     = '/nologo' | ||||
| 	$flag_dll 				         = '/LD' | ||||
| 	$flag_dll_debug 			     = '/LDd' | ||||
| 	$flag_linker 		             = '/link' | ||||
| 	$flag_link_dll                   = '/DLL' | ||||
| 	$flag_link_no_incremental 	     = '/INCREMENTAL:NO' | ||||
| 	$flag_link_mapfile 				 = '/MAP:' | ||||
| 	$flag_link_optimize_references   = '/OPT:REF' | ||||
| 	$flag_link_win_debug 	         = '/DEBUG' | ||||
| 	$flag_link_win_pdb 		         = '/PDB:' | ||||
| 	$flag_link_win_machine_32        = '/MACHINE:X86' | ||||
| 	$flag_link_win_machine_64        = '/MACHINE:X64' | ||||
| 	$flag_link_win_path_output       = '/OUT:' | ||||
| 	$flag_link_win_rt_dll            = '/MD' | ||||
| 	$flag_link_win_rt_dll_debug      = '/MDd' | ||||
| 	$flag_link_win_rt_static         = '/MT' | ||||
| 	$flag_link_win_rt_static_debug   = '/MTd' | ||||
| 	$flag_link_win_subsystem_console = '/SUBSYSTEM:CONSOLE' | ||||
| 	$flag_link_win_subsystem_windows = '/SUBSYSTEM:WINDOWS' | ||||
| 	$flag_no_optimization		     = '/Od' | ||||
| 	$flag_optimize_fast 		     = '/O2' | ||||
| 	$flag_optimize_size 		     = '/O1' | ||||
| 	$flag_optimize_intrinsics		 = '/Oi' | ||||
| 	$flag_optimized_debug			 = '/Zo' | ||||
| 	$flag_out_name                   = '/OUT:' | ||||
| 	$flag_path_interm                = '/Fo' | ||||
| 	$flag_path_debug                 = '/Fd' | ||||
| 	$flag_path_output                = '/Fe' | ||||
| 	$flag_preprocess_conform         = '/Zc:preprocessor' | ||||
| 	$flag_set_stack_size			 = '/F' | ||||
| 	$flag_syntax_only				 = '/Zs' | ||||
| 	$flag_wall 					     = '/Wall' | ||||
| 	$flag_warnings_as_errors 		 = '/WX' | ||||
|  | ||||
| 	function build | ||||
| 	{ | ||||
| 		param( [string]$path_output, [array]$includes, [array]$compiler_args, [array]$linker_args, [array]$units, [string]$binary ) | ||||
| 		$result = $false | ||||
| 		#Write-Host "build-simple: msvc" | ||||
|  | ||||
| 		$map    = $binary -replace '\.(exe|dll)$', '.map' | ||||
| 		$map    = join-path $path_output (split-path $map    -Leaf) | ||||
|  | ||||
| 		# This allows dll reloads at runtime to work (jankily, use below if not interested) | ||||
| 		$pdb    = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb" | ||||
| 		# $pdb    = $binary -replace '\.(exe|dll)$', ".pdb" | ||||
|  | ||||
| 		$compiler_args += @( | ||||
| 			$flag_nologo, | ||||
| 			# $flag_all_cpp, | ||||
| 			$flag_exceptions_disabled, | ||||
| 			( $flag_define + '_HAS_EXCEPTIONS=0' ), | ||||
| 			$flag_RTTI_disabled, | ||||
| 			$flag_preprocess_conform, | ||||
| 			$flag_full_src_path, | ||||
| 			( $flag_path_interm + $path_output + '\' ), | ||||
| 			( $flag_path_output + $path_output + '\' ) | ||||
| 		) | ||||
|  | ||||
| 		if ( $verbose ) { | ||||
| 		} | ||||
|  | ||||
| 		if ( $optimize ) { | ||||
| 			$compiler_args += $flag_optimize_fast | ||||
| 		} | ||||
| 		else { | ||||
| 			$compiler_args += $flag_no_optimization | ||||
| 		} | ||||
|  | ||||
| 		if ( $debug ) | ||||
| 		{ | ||||
| 			$compiler_args += $flag_debug | ||||
| 			$compiler_args += ( $flag_define + 'Build_Debug=1' ) | ||||
| 			$compiler_args += ( $flag_path_debug + $path_output + '\' ) | ||||
| 			$compiler_args += $flag_link_win_rt_static_debug | ||||
|  | ||||
| 			if ( $optimize ) { | ||||
| 				$compiler_args += $flag_optimized_debug | ||||
| 			} | ||||
| 		} | ||||
| 		else { | ||||
| 			$compiler_args += ( $flag_define + 'Build_Debug=0' ) | ||||
| 			$compiler_args += $flag_link_win_rt_static | ||||
| 		} | ||||
| 		$compiler_args += $includes | ForEach-Object { $flag_include + $_ } | ||||
|  | ||||
| 		$objects = @() | ||||
| 		foreach ( $unit in $units ) | ||||
| 		{ | ||||
| 			$object   = $unit -replace '\.(cpp|c)$', '.obj' | ||||
| 			$object   = join-path $path_output (split-path $object -Leaf) | ||||
| 			$objects += $object | ||||
|  | ||||
| 			$unit_compiler_args  = $compiler_args | ||||
| 			# $unit_compiler_args += ( $flag_path_output + $object ) | ||||
|  | ||||
| 			$unit_compiler_args += $flag_compile, $unit | ||||
| 			run-compiler $compiler $unit $unit_compiler_args | ||||
| 		} | ||||
|  | ||||
| 		$linker_args += @( | ||||
| 			$flag_nologo, | ||||
| 			$flag_link_win_machine_64, | ||||
| 			$flag_link_no_incremental, | ||||
| 			( $flag_link_win_path_output + $binary ) | ||||
| 		) | ||||
| 		if ( $debug ) { | ||||
| 			$linker_args += $flag_link_win_debug | ||||
| 			$linker_args += $flag_link_win_pdb + $pdb | ||||
| 			$linker_args += $flag_link_mapfile + $map | ||||
| 		} | ||||
| 		else { | ||||
| 		} | ||||
|  | ||||
| 		$linker_args += $objects | ||||
| 		return run-linker $linker $binary $linker_args | ||||
| 	} | ||||
|  | ||||
| 	function build-simple | ||||
| 	{ | ||||
| 		param( [string]$path_output, [array]$includes, [array]$compiler_args, [array]$linker_args, [string]$unit, [string]$binary ) | ||||
| 		$result = $false | ||||
| 		#Write-Host "build-simple: msvc" | ||||
|  | ||||
| 		$object = $unit -replace '\.(cpp|c)$', '.obj' | ||||
| 		$map    = $unit -replace '\.(cpp|c)$', '.map' | ||||
| 		$object = join-path $path_output (split-path $object -Leaf) | ||||
| 		$map    = join-path $path_output (split-path $map    -Leaf) | ||||
|  | ||||
| 		# This allows dll reloads at runtime to work (jankily, use below if not interested) | ||||
| 		$pdb    = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb" | ||||
| 		# $pdb    = $binary -replace '\.(exe|dll)$', ".pdb" | ||||
|  | ||||
| 		$compiler_args += @( | ||||
| 			$flag_nologo, | ||||
| 			# $flag_all_cpp, | ||||
| 			$flag_exceptions_disabled, | ||||
| 			( $flag_define + '_HAS_EXCEPTIONS=0' ), | ||||
| 			$flag_RTTI_disabled, | ||||
| 			$flag_preprocess_conform, | ||||
| 			$flag_full_src_path, | ||||
| 			( $flag_path_interm + $path_output + '\' ), | ||||
| 			( $flag_path_output + $path_output + '\' ) | ||||
| 		) | ||||
|  | ||||
| 		if ( $verbose ) { | ||||
| 		} | ||||
|  | ||||
| 		if ( $optimize ) { | ||||
| 			$compiler_args += $flag_optimize_fast | ||||
| 		} | ||||
| 		else { | ||||
| 			$compiler_args += $flag_no_optimization | ||||
| 		} | ||||
|  | ||||
| 		if ( $debug ) | ||||
| 		{ | ||||
| 			$compiler_args += $flag_debug | ||||
| 			$compiler_args += ( $flag_define + 'Build_Debug=1' ) | ||||
| 			$compiler_args += ( $flag_path_debug + $path_output + '\' ) | ||||
| 			$compiler_args += $flag_link_win_rt_static_debug | ||||
|  | ||||
| 			if ( $optimize ) { | ||||
| 				$compiler_args += $flag_optimized_debug | ||||
| 			} | ||||
| 		} | ||||
| 		else { | ||||
| 			$compiler_args += ( $flag_define + 'Build_Debug=0' ) | ||||
| 			$compiler_args += $flag_link_win_rt_static | ||||
| 		} | ||||
| 		$compiler_args += $includes | ForEach-Object { $flag_include + $_ } | ||||
|  | ||||
| 		$compiler_args += $flag_compile, $unit | ||||
| 		if ( (run-compiler $compiler $unit $compiler_args) -eq $false ) { | ||||
| 			return $false; | ||||
| 		} | ||||
|  | ||||
| 		$linker_args += @( | ||||
| 			$flag_nologo, | ||||
| 			$flag_link_win_machine_64, | ||||
| 			$flag_link_no_incremental, | ||||
| 			( $flag_link_win_path_output + $binary ) | ||||
| 		) | ||||
| 		if ( $debug ) { | ||||
| 			$linker_args += $flag_link_win_debug | ||||
| 			$linker_args += $flag_link_win_pdb + $pdb | ||||
| 			$linker_args += $flag_link_mapfile + $map | ||||
| 		} | ||||
| 		else { | ||||
| 		} | ||||
|  | ||||
| 		$linker_args += $object | ||||
| 		return run-linker $linker $binary $linker_args | ||||
| 	} | ||||
|  | ||||
| 	$compiler = 'cl' | ||||
| 	$linker   = 'link' | ||||
| } | ||||
		Reference in New Issue
	
	Block a user