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